RRASSLER Fills A Need by Paying (Geospatial) Technical Debt

Goals:

  • To set the background for the state and status of HEC-RAS model data.

Outcomes and Takeaways:

  • A deeper understanding of the technical friction experienced working with legacy models and the sorts of questions that are hard to answer without something like RRASSLER.

Slide layout: default     Items linked/bordered in green are cited in the tooltip on hover.

: interactive elements     Items linked/bordered in blue are hyperlinked to relevant resources.

Refresher: The HEC-RAS model format

The Theoretical Standard

Files to Track

File grep Pattern (# denotes single numeric wildcard) HEC-RAS Model Use
.g## Geometry definitions
.prj Projection (can be non-standard proj4 string defined file)
.prj Project (same extension, defines how RAS models are wired)
.p## Plan file, used to drive the model
.f## Steady Flow file. Profile information, flow data and boundary conditions
.h## Hydraulic Design data file
.v## Velocity file
.o## Output file
.r## Run file for steady flow
.u## unsteady Flow file. Profile information, flow data and boundary conditions
.x## Run file for unsteady flow
.dss Data files
.rasmap Output plan

These files, followed by a .hdf, are transformations of their counterparts needed for newer versions of HEC-RAS and are automatically created as needed.

Refresher: The HEC-RAS model format

Model Standards

Files to Track

File grep Pattern (# denotes single numeric wildcard) HEC-RAS Model Use
.g## Geometry definitions
.prj Projection (can be non-standard proj4 string defined file)
.prj Project (same extension, defines how RAS models are wired)
.p## Plan file, used to drive the model
.f## Steady Flow file. Profile information, flow data and boundary conditions
.h## Hydraulic Design data file
.v## Velocity file
.o## Output file
.r## Run file for steady flow
.u## unsteady Flow file. Profile information, flow data and boundary conditions
.x## Run file for unsteady flow
.dss Data files
.rasmap Output plan

These files, followed by a .hdf, are transformations of their counterparts needed for newer versions of HEC-RAS and are automatically created as needed.

Refresher: The HEC-RAS model format

A “real-world” example

Files to Track

File grep Pattern (# denotes single numeric wildcard) HEC-RAS Model Use
.g## Geometry definitions
.prj Projection (can be non-standard proj4 string defined file)
.prj Project (same extension, defines how RAS models are wired)
.p## Plan file, used to drive the model
.f## Steady Flow file. Profile information, flow data and boundary conditions
.h## Hydraulic Design data file
.v## Velocity file
.o## Output file
.r## Run file for steady flow
.u## unsteady Flow file. Profile information, flow data and boundary conditions
.x## Run file for unsteady flow
.dss Data files
.rasmap Output plan

These files, followed by a .hdf, are transformations of their counterparts needed for newer versions of HEC-RAS and are automatically created as needed.

Even After Overcoming the Pain of Reading in a HEC-RAS model…

Other Potential Readers

  • Point and click through the HEC-RAS interface to export
    • Con: Unaccountable and unsustainable
    • Pro: I can do it Yay
  • MCAT-RAS
    • Con: After 2 days of banging my head against the wall, I was not able to get this to run Sad
    • Docker builds with 13/14 failing tests.
Expand for my specific errors

The container builds, and I’m sure the issue is between the keyboard and the chair, but this is very unhelpful and configuration and procedures are very opaque to this simpleton external end user.

user@Brains:/mnt/c/WINDOWS/system32$ cd /mnt/g/Dropbox/root/projects/mcat-ras/Dewberry/mcat-ras/
user@Brains:/mnt/g/Dropbox/root/projects/mcat-ras/Dewberry/mcat-ras$ docker-compose up
[+] Running 2/1
 ✔ Container mcat-ras-api     Created        0.1s
 ✔ Container mcat-ras-newman  Created        0.0s
Attaching to mcat-ras-api, mcat-ras-newman
mcat-ras-api     | /bin/sh: /app/main: not found
mcat-ras-api exited with code 127
mcat-ras-newman  | newman
mcat-ras-newman  |
mcat-ras-newman  | mcat-ras-testing
mcat-ras-newman  |
mcat-ras-newman  |
mcat-ras-newman  | ❏ Forcing Data / Positvies / 2D Unsteady Flow
mcat-ras-newman  | ↳ BaldEagleCrkMulti2D
mcat-ras-newman  |
mcat-ras-newman  |   GET http://api:5600/forcingdata?definition_file=mcat-ras-testing/Example_Projects/2D Unsteady Flow Hydraulics/BaldEagleCrkMulti2D/BaldEagleDamBrk.prj
mcat-ras-newman  | [errored]
mcat-ras-newman  |      getaddrinfo ENOTFOUND api
mcat-ras-newman  |   2. response must be valid and have a body
mcat-ras-newman  |   3. Status code is 200
mcat-ras-newman  |   4. response should have Unsteady
mcat-ras-newman  |   5⠄ JSONError in test-script
mcat-ras-newman  |
mcat-ras-newman  | ❏ Forcing Data / Positvies / General
mcat-ras-newman  |
mcat-ras-newman  | ↳ Bare minimum project
mcat-ras-newman  |
mcat-ras-newman  |   GET http://api:5600/forcingdata?definition_file=mcat-ras-testing/mocked-data/bare-minimum-project/BaldEagleDamBrk.prj
mcat-ras-newman  | [errored]
mcat-ras-newman  |      getaddrinfo ENOTFOUND api
mcat-ras-newman  |   7. response must be valid and have a body
mcat-ras-newman  |   8. Status code is 200
mcat-ras-newman  |   9. response should have Unsteady
mcat-ras-newman  |
mcat-ras-newman  | ↳ No flow files
mcat-ras-newman  |
mcat-ras-newman  |   GET http://api:5600/forcingdata?definition_file=mcat-ras-testing/mocked-data/no-flow-file/BaldEagleDamBrk.prj
mcat-ras-newman  | [errored]
mcat-ras-newman  |      getaddrinfo ENOTFOUND api
mcat-ras-newman  |  11. response must be valid and have a body
mcat-ras-newman  |  12. Status code is 200
mcat-ras-newman  |  13. response should be empty json
mcat-ras-newman  |
mcat-ras-newman  | ❏ Forcing Data / Negatives
mcat-ras-newman  | ↳ File does not exist
mcat-ras-newman  |
mcat-ras-newman  |   GET http://api:5600/forcingdata?definition_file=mcat-ras-testing/Example_Projects/not-exist.prj
mcat-ras-newman  | [errored]
mcat-ras-newman  |      getaddrinfo ENOTFOUND api
mcat-ras-newman  |  15. response must be valid and have a body
mcat-ras-newman  |  16. Status code is equar or greater than 400
mcat-ras-newman  |  17. Bad Reqest
mcat-ras-newman  |
mcat-ras-newman  | ❏ General / Positives
mcat-ras-newman  | ↳ shapefile not a model
mcat-ras-newman  |
mcat-ras-newman  |   GET http://api:5600/isamodel?definition_file=mcat-ras-testing/Example_Projects/2D Unsteady Flow Hydraulics/BaldEagleCrkMulti2D/GISData/MainChannelBanks.prj
mcat-ras-newman  | [errored]
mcat-ras-newman  |      getaddrinfo ENOTFOUND api
mcat-ras-newman  |  19. response must be valid and have a body
mcat-ras-newman  |   ✓  Shapefile not a model
mcat-ras-newman  |
mcat-ras-newman  | ┌─────────────────────────┬──────────┬──────────┐
mcat-ras-newman  | │                         │ executed │   failed │
mcat-ras-newman  | ├─────────────────────────┼──────────┼──────────┤
mcat-ras-newman  | │              iterations │        1 │        0 │
mcat-ras-newman  | ├─────────────────────────┼──────────┼──────────┤
mcat-ras-newman  | │                requests │        5 │        5 │
mcat-ras-newman  | ├─────────────────────────┼──────────┼──────────┤
mcat-ras-newman  | │            test-scripts │       19 │        1 │
mcat-ras-newman  | ├─────────────────────────┼──────────┼──────────┤
mcat-ras-newman  | │      prerequest-scripts │       14 │        0 │
mcat-ras-newman  | ├─────────────────────────┼──────────┼──────────┤
mcat-ras-newman  | │              assertions │       14 │       13 │
mcat-ras-newman  | ├─────────────────────────┴──────────┴──────────┤
mcat-ras-newman  | │ total run duration: 299ms                     │
mcat-ras-newman  | ├───────────────────────────────────────────────┤
mcat-ras-newman  | │ total data received: 0B (approx)              │
mcat-ras-newman  | └───────────────────────────────────────────────┘
mcat-ras-newman  |
mcat-ras-newman  |
mcat-ras-newman  |    #  failure         detail
mcat-ras-newman  |
mcat-ras-newman  |  01.  Error
mcat-ras-newman  |                       getaddrinfo ENOTFOUND api
mcat-ras-newman  |                       at request
mcat-ras-newman  |                       inside ""
mcat-ras-newman  |
mcat-ras-newman  |  02.  AssertionError  response must be valid and have a body
mcat-ras-newman  |                       expected response to have content in body
mcat-ras-newman  |                       at assertion:0 in test-script
mcat-ras-newman  |                       inside "Forcing Data / Positvies / 2D Unsteady Flow / BaldEagleCrkMulti2D"
mcat-ras-newman  |
mcat-ras-newman  |  03.  AssertionError  Status code is 200
mcat-ras-newman  |                       expected PostmanResponse{ …(5) } to have property 'code'
mcat-ras-newman  |                       at assertion:0 in test-script
mcat-ras-newman  |                       inside "Forcing Data / Positvies / 2D Unsteady Flow / BaldEagleCrkMulti2D"
mcat-ras-newman  |
mcat-ras-newman  |  04.  AssertionError  response should have Unsteady
mcat-ras-newman  |                       expected PostmanResponse{ …(5) } to have property 'code'
mcat-ras-newman  |                       at assertion:0 in test-script
mcat-ras-newman  |                       inside "Forcing Data / Positvies / 2D Unsteady Flow / BaldEagleCrkMulti2D"
mcat-ras-newman  |
mcat-ras-newman  |  05.  JSONError
mcat-ras-newman  |                       Unexpected token u in JSON at position 0
mcat-ras-newman  |                       at test-script
mcat-ras-newman  |                       inside "Forcing Data / Positvies / 2D Unsteady Flow / BaldEagleCrkMulti2D"
mcat-ras-newman  |
mcat-ras-newman  |  06.  Error
mcat-ras-newman  |                       getaddrinfo ENOTFOUND api
mcat-ras-newman  |                       at request
mcat-ras-newman  |                       inside ""
mcat-ras-newman  |
mcat-ras-newman  |  07.  AssertionError  response must be valid and have a body
mcat-ras-newman  |                       expected response to have content in body
mcat-ras-newman  |                       at assertion:0 in test-script
mcat-ras-newman  |                       inside "Forcing Data / Positvies / General / Bare minimum project"
mcat-ras-newman  |
mcat-ras-newman  |  08.  AssertionError  Status code is 200
mcat-ras-newman  |                       expected PostmanResponse{ …(5) } to have property 'code'
mcat-ras-newman  |                       at assertion:0 in test-script
mcat-ras-newman  |                       inside "Forcing Data / Positvies / General / Bare minimum project"
mcat-ras-newman  |
mcat-ras-newman  |  09.  AssertionError  response should have Unsteady
mcat-ras-newman  |                       expected PostmanResponse{ …(5) } to have property 'code'
mcat-ras-newman  |                       at assertion:0 in test-script
mcat-ras-newman  |                       inside "Forcing Data / Positvies / General / Bare minimum project"
mcat-ras-newman  |
mcat-ras-newman  |  10.  Error
mcat-ras-newman  |                       getaddrinfo ENOTFOUND api
mcat-ras-newman  |                       at request
mcat-ras-newman  |                       inside ""
mcat-ras-newman  |
mcat-ras-newman  |  11.  AssertionError  response must be valid and have a body
mcat-ras-newman  |                       expected response to have content in body
mcat-ras-newman  |                       at assertion:0 in test-script
mcat-ras-newman  |                       inside "Forcing Data / Positvies / General / No flow files"
mcat-ras-newman  |
mcat-ras-newman  |  12.  AssertionError  Status code is 200
mcat-ras-newman  |                       expected PostmanResponse{ …(5) } to have property 'code'
mcat-ras-newman  |                       at assertion:0 in test-script
mcat-ras-newman  |                       inside "Forcing Data / Positvies / General / No flow files"
mcat-ras-newman  |
mcat-ras-newman  |  13.  JSONError       response should be empty json
mcat-ras-newman  |                       Unexpected token u in JSON at position 0
mcat-ras-newman  |                       at assertion:0 in test-script
mcat-ras-newman  |                       inside "Forcing Data / Positvies / General / No flow files"
mcat-ras-newman  |
mcat-ras-newman  |  14.  Error
mcat-ras-newman  |                       getaddrinfo ENOTFOUND api
mcat-ras-newman  |                       at request
mcat-ras-newman  |                       inside ""
mcat-ras-newman  |
mcat-ras-newman  |  15.  AssertionError  response must be valid and have a body
mcat-ras-newman  |                       expected response to have content in body
mcat-ras-newman  |                       at assertion:0 in test-script
mcat-ras-newman  |                       inside "Forcing Data / Negatives / File does not exist"
mcat-ras-newman  |
mcat-ras-newman  |  16.  AssertionError  Status code is equar or greater than 400
mcat-ras-newman  |                       expected undefined to be a number or a date
mcat-ras-newman  |                       at assertion:0 in test-script
mcat-ras-newman  |                       inside "Forcing Data / Negatives / File does not exist"
mcat-ras-newman  |
mcat-ras-newman  |  17.  AssertionError  Bad Reqest
mcat-ras-newman  |                       expected response to have status reason 'BAD REQUEST' but got 'UNDEFINED'
mcat-ras-newman  |                       at assertion:0 in test-script
mcat-ras-newman  |                       inside "Forcing Data / Negatives / File does not exist"
mcat-ras-newman  |
mcat-ras-newman  |  18.  Error
mcat-ras-newman  |                       getaddrinfo ENOTFOUND api
mcat-ras-newman  |                       at request
mcat-ras-newman  |                       inside ""
mcat-ras-newman  |
mcat-ras-newman  |  19.  AssertionError  response must be valid and have a body
mcat-ras-newman  |                       expected response to have content in body
mcat-ras-newman  |                       at assertion:0 in test-script
mcat-ras-newman  |                       inside "General / Positives / shapefile not a model"
mcat-ras-newman  |
mcat-ras-newman exited with code 1
user@Brains:/mnt/g/Dropbox/root/projects/mcat-ras/Dewberry/mcat-ras$
    • It is unclear from documentation what I should do to resolve this, and only loose guesses as to what the next step would be, assuming this was working for me.
    • I am unfamiliar with go, it’s implemented language.
  • pyHMT2D is primarily oriented towards 2D.

Can you answer these questions?

  • Where are models?
  • What cross sections do I have for my network?
  • Is this the same model?

Models from Different Providers?

asynchronous update cycles

Models from Broad Geographies

Clashing spatial units

Models at street scale: Example Austin FloodPro

Manual subsetting

RRASSLER Can!

“Where are models?” – See the mapping vignette!

Thank you for your time - looking forward?

Outcomes and Takeaways:

  • A deeper understanding of the technical friction experienced working with legacy models and the sorts of questions that are hard to answer without something like RRASSLER.

Next Steps: