Example project findings

HEC-RAS 7.0 Example Projects — Findings for RAS Agent Middleware

Investigated 2026-10-12 (read-only) from ~/workspace/hec-ras-research/example-projects-7.0/. Priority was the TEXT files (.prj / .g## / .p## / .u## / .rasmap) — the middleware's actual interface surface — plus one HDF peek for mesh statistics.

The big caveat, first

Muncie's own .prj description says it outright:

"The 2D areas are not detailed models (i.e. not a lot of time was spent laying out breaklines and testing cell size, time step, etc..."

These are demonstration models, not best-practice exemplars for mesh settings. Treat them as an anatomy reference (how a well-formed HEC project is structured, linked, and stored) and a parser specification (exact text formats the middleware must read/write) — not as QC calibration targets for cell sizing or breakline density. Glenn's mesh templates come from CHAMP production models; these examples are the reference shelf the middleware validates against, not the standard it validates to.


1. Muncie — 2D Unsteady Flow Hydraulics/Muncie/ (the classic 2D example)

Project anatomy

2D geometry text (Muncie.g02, Muncie.g04)

Plan file (Muncie.p04)

Unsteady flow (Muncie.u01)

RAS Mapper state (Muncie.rasmap)

HDF peek (Muncie.g02.hdf, via h5py)


2. BaldEagleCrkMulti2D — 2D Unsteady Flow Hydraulics/BaldEagleCrkMulti2D/

A pattern catalog, not one model: 10 geometries × 10 unsteady files × 12 plans, each geometry demonstrating one 2D configuration. The .prj lists them all; Current Plan=p05.

Geometry Title pattern 2D areas Nominal cell Cells
g01 SA to 2D Flow Area – Detailed 1 100 ft 87,039
g02 Single 2D Area – With Infiltration 1 200 ft 28,449
g03 Single 2D Area with Bridges and Breaklines 1 250 ft 24,718
g06 Multi 2D Areas 3 200 ft 974 / 1,191 / 1,955
g08 1D-2D Dam Break, Refined Grid 1 250 ft 14,206
g09 Single 2D Area – Internal Dam Structure 1 250 ft 18,066
g10 U.S. 2D – D.S. 1D, No Dam 2 200 ft 2,005 / 5,330
g11 2D to 2D Connection 2 500 ft 3,359 / 1,066
g12 SA to 2D Connection 2 500 ft 3,439 / 1,066
g13 SA to 2D Flow Area 2 250/500 ft 14,364 / 1,066

Findings


3. 2D Sediment Transport — Chippewa_2D/, Weise_2D/


4. Consolidated middleware implications

Project validator (new capability — high value, low cost): 1. Parse the .prj as the manifest; assert every referenced .g/.f/.u/.p file exists. 2. Assert every plan's Geom File= / Flow File= (Unsteady File=) points at the intended files — misconfiguration, not modeling, is the common failure. 3. Cross-check 2D BC lines: every (area, line) named in the .u file must exist as a BC Line in the .g file and vice versa. 4. Require meaningful Geom Title= / Plan Title= (reject defaults/empties on write). 5. Never trust Program Version= for provenance — record generating RAS version per artifact in the catalog.

Plan parser/writer: 6. Section-aware parsing: global 2D defaults, then per-area overrides after each UNET D2 Name= — this is the single most bug-prone format detail found. 7. Emit a deliberate computation-settings block on every generated plan (interval, equation set, theta, tolerances, solver, cores, eddy viscosity, ramp-up) and record it; derive Computation Interval from nominal cell size by a documented rule. 8. Set output intervals (Output/Instantaneous/Mapping) and HDF write flags as a conscious storage-vs-diagnostic choice.

Geometry parser/writer: 9. Key 2D areas on Storage Area Is2D=-1; parse Point Generation Data tolerantly (,,50,50 / 0,0,, / ,,,); derive nominal size from the text, never the title. 10. Normalize breakline CellSize Min/Max: empty ≡ 0 ≡ "use nominal"; preserve breakline names; use semantic names on write. 11. Standardize the two-level roughness design: LCMann Table (land-cover lookup) + Storage Area Mannings= default; support LCMann Region polygons as calibration levers with per-variant provenance (same mesh, different tables — diffable). 12. Emit the 2D cell property-table tolerances on write; validate their presence on read.

Mesh QC gates: 13. Read compiled-HDF mesh statistics attributes (Cell Average/Minimum/Maximum Size, Cell Maximum Index, Extents) and bound them against nominal cell size — cheap mesh-quality check without parsing points. 14. Read .rasmap ProjectSettings mesh tolerances (MeshTolerance_MinFaceLength, MeshTolerance_EnsureCellPoint) and enforce the project's own definitions. 15. Reference ranges observed (field scale, English units): nominal cells 100–500 ft; cell counts from ~1k (small areas) to ~87k (100 ft detailed); computation intervals 5 s–1 min scaling roughly with cell size. Calibrate real QC bounds from CHAMP production models, not these demos — but these are sane order-of-magnitude anchors.

Terrain/land-cover pipeline: 16. Mirror HEC's folder pattern: Terrain/<name>.tif source + .hdf compiled + .vrt; keep the channel-burned variant distinct and record which variant the geometry used (the .rasmap-checked terrain). 17. Version land cover as source → authoritative grid → combined product, with the LCMann table provenance pointing at the combined product.

Mesh-library specific: 18. Geometry variants as named, titled alternatives (Muncie's g01→g02→g04 progression) is the right model for library tiers: same HUC-10, multiple mesh/roughness variants, titles naming the pattern. 19. Inter-2D-area Connection= blocks (named upstream/downstream areas + weir/gate parameters) are the mechanism for study areas spanning tiles — the library's subset/assembly logic will need to author these. 20. The .rasmap is display state — the middleware should read mesh tolerances and active-terrain/land-cover selections from it but never treat layer visibility or symbology as model content.

Files referenced