Extract HEC-RAS hydraulic results from HDF files including water surface elevations (WSE), depths, velocities, and flows for both steady and unsteady simulations...
When the user asks to extract HEC-RAS results, use the patterns below. Read the primary sources for complete details -- do not duplicate their content here.
Primary Sources:
ras_commander/hdf/AGENTS.md - Canonical HDF package contract, module families, lazy loading rules, decoratorsras_commander/AGENTS.md - HDF architecture overview, subpackage organizationexamples/400_1d_hdf_data_extraction.ipynb - 1D cross section results (unsteady)examples/410_2d_hdf_data_extraction.ipynb - 2D mesh results (comprehensive)examples/401_steady_flow_analysis.ipynb - Steady state results (complete workflow)examples/420_breach_results_extraction.ipynb - Dam breach resultsfrom ras_commander import init_ras_project, HdfResultsPlan, HdfResultsMesh
# Initialize project
init_ras_project("path/to/project", "7.0")
# Check simulation type
is_steady = HdfResultsPlan.is_steady_plan("01")
# Extract results based on type
if is_steady:
profiles = HdfResultsPlan.get_steady_profile_names("01")
wse = HdfResultsPlan.get_steady_wse("01", profile_name="100 year")
else:
max_wse = HdfResultsMesh.get_mesh_maximum("01", variable="Water Surface")
Read First: ras_commander/hdf/AGENTS.md
Read this first for:
@staticmethod, @log_call, @standardize_input)Key Sections:
1D Unsteady Results: examples/400_1d_hdf_data_extraction.ipynb
Read this notebook when you need:
HdfResultsXsec)2D Unsteady Results: examples/410_2d_hdf_data_extraction.ipynb
Read this notebook when you need:
HdfResultsMesh.get_mesh_maximum)Steady Flow Results: examples/401_steady_flow_analysis.ipynb
Read this notebook when you need:
get_steady_profile_names)list_steady_variables)Dam Breach Results: examples/420_breach_results_extraction.ipynb
Read this notebook when you need:
HdfStruc.list_sa2d_connections)HdfResultsBreach.get_breach_timeseries)Core HDF Classes (all in ras_commander/hdf/):
| Class | Purpose | Primary Use |
|---|---|---|
| HdfResultsPlan | Plan-level results | Steady profiles, metadata, plan info, output times, computation messages |
| HdfResultsMesh | 2D mesh results | Maximum envelopes, time series, spatial grids |
| HdfResultsXsec | Cross section results | 1D time series, longitudinal profiles |
| HdfResultsBreach | Breach results | Dam breach time series, summary statistics, geometry evolution |
| HdfMesh | Mesh geometry | Cell polygons, face points, perimeter extraction |
| HdfXsec | XS geometry | Cross section coordinates, attributes |
| HdfStruc | Structure geometry | SA/2D connections, breach capability info |
| HdfHydraulicTables | HTAB extraction | Rating curves, property tables |
Read: ras_commander/hdf/AGENTS.md for the class families and package organization.
Instead of duplicating API documentation here, use these strategies:
from ras_commander import HdfResultsPlan
help(HdfResultsPlan.get_steady_wse) # Complete parameter docs
Navigate to class files in ras_commander/hdf/:
HdfResultsPlan.py - Lines 1-500 contain all steady/unsteady methodsHdfResultsMesh.py - Lines 1-400 contain mesh extraction methodsHdfResultsXsec.py - Lines 1-300 contain cross section methodsHdfResultsBreach.py - Lines 1-400 contain breach methodsExample notebooks show actual usage with real HEC-RAS projects:
is_steady = HdfResultsPlan.is_steady_plan("02")
plan_info = HdfResultsPlan.get_plan_info("02")
Return: Boolean for is_steady_plan(), DataFrame with program version, run type, etc. for get_plan_info()
# List profiles
profiles = HdfResultsPlan.get_steady_profile_names("02")
# Extract specific profile
wse = HdfResultsPlan.get_steady_wse("02", profile_name="100 year")
# Extract all profiles
wse_all = HdfResultsPlan.get_steady_wse("02")
# Discover variables
vars_dict = HdfResultsPlan.list_steady_variables("02")
Returns: List of profile names, DataFrame with River/Reach/Station/WSE columns
Full Details: examples/401_steady_flow_analysis.ipynb
# Get all variables as xarray Dataset
xsec_data = HdfResultsXsec.get_xsec_timeseries("01")
# Access specific variable
wse_ts = xsec_data["Water_Surface"] # (time, cross_section)
velocity_ts = xsec_data["Velocity_Total"]
# Select specific cross section
target_xs = "River Reach 12345.6"
wse_at_xs = wse_ts.sel(cross_section=target_xs)
Returns: xarray Dataset with dimensions (time, cross_section), coordinates for River/Reach/Station
Full Details: examples/400_1d_hdf_data_extraction.ipynb
# Get maximum water surface
max_wse = HdfResultsMesh.get_mesh_maximum("01", variable="Water Surface")
# Get maximum depth
max_depth = HdfResultsMesh.get_mesh_maximum("01", variable="Depth")
# Get maximum velocity
max_vel = HdfResultsMesh.get_mesh_maximum("01", variable="Velocity")
Returns: GeoDataFrame with columns: cell_id, max_value, max_time, geometry (Polygon)
Full Details: examples/410_2d_hdf_data_extraction.ipynb
from ras_commander import HdfStruc, HdfResultsBreach
# List structures
structures = HdfStruc.list_sa2d_connections("02")
# Get breach info
breach_info = HdfStruc.get_sa2d_breach_info("02")
# Extract time series
breach_ts = HdfResultsBreach.get_breach_timeseries("02", "Dam")
# Get summary statistics
summary = HdfResultsBreach.get_breach_summary("02", "Dam")
Returns: DataFrames with structure names, breach timing, flows, geometry evolution
Full Details: examples/420_breach_results_extraction.ipynb
Use this skill for standard API-based extraction. Delegate to hdf-analyst agent for custom HDF path navigation, advanced xarray operations, or performance optimization.
Example Handoff:
# You handle standard extraction
max_wse = HdfResultsMesh.get_mesh_maximum("01", variable="Water Surface")
# Delegate to hdf-analyst for:
# - Custom HDF group navigation
# - Non-standard path queries
# - Advanced xarray transformations
# - Memory optimization for large files
Issue: Structure names differ between plan files and HDF
Solution: Always use HdfStruc.list_sa2d_connections() to get HDF names
Example: Plan file "Dam" might be "BaldEagleCr Dam" in HDF
Issue: Fewer timesteps than expected in results
Solution: Check if simulation completed with HdfResultsPlan.get_compute_messages()
Details: Partial runs will have truncated output
Issue: Mesh time series extraction uses too much RAM
Solution: Extract specific timesteps, not all
Example: Use timestep_indices=[0, 50, 100] instead of timestep_indices="all"
Issue: Cannot find expected variable in HDF
Solution: Use HdfResultsPlan.list_steady_variables() or inspect HDF structure directly
Note: Variable names differ between HEC-RAS versions
Rules (auto-loaded context):
.claude/rules/hec-ras/hdf-files.md -- Read for HDF domain overview and steady/unsteady detection.claude/rules/python/api-first-principle.md -- Follow the API-first mandate for all extractionAgents (delegate when needed):
hdf-analyst -- Delegate for advanced HDF analysis beyond standard APIhecras-results-analyst -- Delegate for results interpretation and quality assessmentSkills (related workflows):
hecras_compute_plans -- Upstream: run simulations that produce HDF resultshecras_parse_compute-messages -- Use to verify execution completed before extractingPrimary sources:
ras_commander/hdf/AGENTS.md -- Complete class hierarchy and architectureexamples/400_1d_hdf_data_extraction.ipynb -- 1D unsteady extraction workflowexamples/410_2d_hdf_data_extraction.ipynb -- 2D mesh results workflowexamples/401_steady_flow_analysis.ipynb -- Steady state extraction workflowexamples/420_breach_results_extraction.ipynb -- Dam breach results workflow