Set USE_LOCAL_SOURCE = True when running from a local ras-commander checkout. The committed default uses the installed package; repository test execution can still use local source through PYTHONPATH.
Author bridge deck, pier, abutment, approach-section, coefficient, and HTAB
records in a real HEC-RAS geometry file, then compute the plan, inspect
compute messages for bridge-related problems, and extract bridge results
from the HDF output.
Scope: This notebook covers 1D river/reach bridge structures
(Bridge Culvert- blocks) parsed by GeomBridge. For SA/2D and 2D-to-2D
bridge connections (Conn BR: blocks), see notebook 215.
Python
# =============================================================================# DEVELOPMENT MODE TOGGLE# =============================================================================USE_LOCAL_SOURCE=FalseifUSE_LOCAL_SOURCE:importsysfrompathlibimportPathcwd=Path.cwd()local_path=cwdif(cwd/"ras_commander").exists()elsecwd.parentifstr(local_path)notinsys.path:sys.path.insert(0,str(local_path))print(f"LOCAL SOURCE MODE: loading from {local_path/'ras_commander'}")else:print("PIP PACKAGE MODE: loading installed ras-commander")frompathlibimportPathimportloggingimportosimportreimporttimeimportwarningsimportmatplotlib.pyplotaspltimportpandasaspdfromIPython.displayimportdisplayfromras_commanderimportHdfResultsPlan,RasCmdr,RasExamples,RasPrj,init_ras_projectfromras_commander.geomimportGeomBridge,GeomCrossSection,GeomCulvertfromras_commander.resultsimportResultsParserwarnings.filterwarnings("ignore",category=FutureWarning)logging.getLogger("ras_commander").setLevel(logging.CRITICAL)pd.set_option("display.max_columns",None)pd.set_option("display.max_colwidth",120)importras_commanderprint(f"Loaded: {ras_commander.__file__}")
defbuild_internal_approach_sections(geom_file,river,reach,rs):adjacent=GeomCulvert.get_adjacent_cross_sections(geom_file,river,reach,rs)ifnotadjacent["upstream"]ornotadjacent["downstream"]:raiseValueError("Bridge must have adjacent upstream and downstream cross sections")frames=[]banks={}forlocationin["upstream","downstream"]:xs_rs=adjacent[location]["RS"]sta_elev=GeomCrossSection.get_station_elevation(geom_file,river,reach,xs_rs).copy()sta_elev.insert(0,"Location",location)sta_elev.insert(1,"DataType","station_elevation")frames.append(sta_elev)mannings=GeomCrossSection.get_mannings_n(geom_file,river,reach,xs_rs).copy()mannings=mannings.rename(columns={"n_value":"N_Value"})[["Station","N_Value"]]mannings.insert(0,"Location",location)mannings.insert(1,"DataType","mannings_n")frames.append(mannings)banks[location]=list(GeomCrossSection.get_bank_stations(geom_file,river,reach,xs_rs))returnpd.concat(frames,ignore_index=True),banks,adjacentdefbridge_related_problem_lines(messages):target_terms=re.compile(r"(bridge|deck|pier|abut|approach|htab|geometry|geom|hydraulic table)",re.IGNORECASE,)problem_terms=re.compile(r"(error|warning|failed|unable|cannot|invalid)",re.IGNORECASE,)return[line.strip()forlineinmessages.splitlines()iftarget_terms.search(line)andproblem_terms.search(line)]defrequire_backup(path_like):backup_path=Path(path_like)ifnotbackup_path.exists():raiseFileNotFoundError(f"Expected backup was not created: {backup_path}")returnbackup_pathprint("Helper functions ready")
start=time.perf_counter()compute_result=RasCmdr.compute_plan(PLAN_NUMBER,ras_object=ras_obj,force_geompre=True,force_rerun=True,num_cores=NUM_CORES,verify=True,)runtime_sec=time.perf_counter()-startdata_errors_path=plan_path.parent/f"{plan_path.name}.data_errors.txt"ifdata_errors_path.exists():raiseRuntimeError(data_errors_path.read_text(encoding="utf-8",errors="replace"))ifnotcompute_result:raiseRuntimeError(f"HEC-RAS compute failed for plan {PLAN_NUMBER}: {compute_result!r}")hdf_path=Path(ras_obj.plan_df.loc[ras_obj.plan_df["plan_number"].astype(str).str.zfill(2).eq(PLAN_NUMBER),"HDF_Results_Path",].iloc[0])messages=HdfResultsPlan.get_compute_messages(PLAN_NUMBER,ras_object=ras_obj)parsed=ResultsParser.parse_compute_messages(messages)bridge_problems=bridge_related_problem_lines(messages)asserthdf_path.exists(),f"Expected result HDF was not created: {hdf_path}"assertparsed["completed"],"Compute messages did not report Complete Process"assertnotparsed["has_errors"],parsed["first_error_line"]assertnotbridge_problems,"Bridge-related compute problems:\n"+"\n".join(bridge_problems)validation=pd.DataFrame([{"Compute Result":repr(compute_result),"Runtime (s)":round(runtime_sec,2),"Results HDF Exists":hdf_path.exists(),"Compute Completed":parsed["completed"],"Compute Error Count":parsed["error_count"],"Compute Warning Count":parsed["warning_count"],"Bridge Problem Lines":len(bridge_problems),"Compute Message Characters":len(messages),}])display(validation)print(messages[:700])
Compute Result
Runtime (s)
Results HDF Exists
Compute Completed
Compute Error Count
Compute Warning Count
Bridge Problem Lines
Compute Message Characters
0
ComputeResult(SUCCESS, results_df_row=available)
2.35
True
True
0
0
0
722
Text Only
Plan: 'WSPRO Bridge Analysis' (BOGCHIT.p01)
Simulation started at: 11Jun2026 01:14:13 PM
Writing Plan GIS Data...
Completed Writing Plan GIS Data
Writing Geometry...
Computing Bank Lines
Bank lines generated in 34 ms
Computing Edge Lines
Edge Lines generated in 21 ms
Computing XS Interpolation Surface
XS Interpolation Surface generated in 49 ms
Completed Writing Geometry
Writing Event Conditions ...
Completed Writing Event Condition Data
Steady Flow Simulation HEC-RAS 7.0 April 2026
Finished Steady Flow Simulation
Computations Summary
Computation Task Time(hh:mm:ss)
Completing Geometry, Flow and Plan 1
Steady Flow Computations <1
Compl
The compute validation above proves HEC-RAS accepted the modified bridge
geometry. As final proof that the bridge actively participated in the
simulation, extract the bridge structure's hydraulic results from the HDF
output using HdfStruc1D (max HW/TW/flow) and HdfResultsPlan.get_steady_results()
(per-profile water surface and flow at flanking cross sections).
Python
fromras_commander.hdfimportHdfStruc1Dbridge_max=HdfStruc1D.get_structure_max_values(hdf_path,river,reach,rs)print(f"HdfStruc1D.get_structure_max_values at RS {rs}:")forkey,valueinbridge_max.items():print(f" {key}: {value}")assertbridge_max["found"],f"Bridge at RS {rs} not found in HDF results"max_flow=bridge_max["max_flow"]max_us_ws=bridge_max["max_hw"]max_ds_ws=bridge_max["max_tw"]steady_df=HdfResultsPlan.get_steady_results(hdf_path)us_rs=bridge_max["hw_source"].split("/")[-1].split(" ")[0]ds_rs=bridge_max["tw_source"].split("/")[-1].split(" ")[0]us_results=steady_df[steady_df["node_id"]==us_rs][["profile","node_id","wsel","flow","energy"]]ds_results=steady_df[steady_df["node_id"]==ds_rs][["profile","node_id","wsel","flow","energy"]]bridge_results=pd.merge(us_results.rename(columns={"wsel":"US WS (ft)","flow":"US Flow (cfs)","energy":"US EG (ft)","node_id":"US XS"}),ds_results.rename(columns={"wsel":"DS WS (ft)","flow":"DS Flow (cfs)","energy":"DS EG (ft)","node_id":"DS XS"}),on="profile",)display(bridge_results)print(f"\n{'='*70}")print(f"STRUCTURE VALIDATION: Bridge at RS {rs} carried flow in simulation")print(f" Max flow: {max_flow:,.1f} cfs ({bridge_max['flow_source']})")print(f" Max US WS: {max_us_ws:.2f} ft ({bridge_max['hw_source']})")print(f" Max DS WS: {max_ds_ws:.2f} ft ({bridge_max['tw_source']})")print(f" WS differential: {max_us_ws-max_ds_ws:.2f} ft")print(f"{'='*70}")
Text Only
HdfStruc1D.get_structure_max_values at RS 52.37:
max_hw: 573.1385498046875
max_tw: 334.4490966796875
max_flow: 31500.0
hw_source: Bogue Chitto/Johnston Sta/52.38 (US of 52.37)
tw_source: Bogue Chitto/Johnston Sta/52.00 (DS of 52.37)
flow_source: Bogue Chitto/Johnston Sta/52.38 (US of 52.37)
found: True
profile
US XS
US WS (ft)
US Flow (cfs)
US EG (ft)
DS XS
DS WS (ft)
DS Flow (cfs)
DS EG (ft)
0
50 yr
52.38
548.656494
25000.0
NaN
52.00
333.679321
25000.0
NaN
1
100 yr
52.38
573.138550
31500.0
NaN
52.00
334.449097
31500.0
NaN
Text Only
======================================================================
STRUCTURE VALIDATION: Bridge at RS 52.37 carried flow in simulation
Max flow: 31,500.0 cfs (Bogue Chitto/Johnston Sta/52.38 (US of 52.37))
Max US WS: 573.14 ft (Bogue Chitto/Johnston Sta/52.38 (US of 52.37))
Max DS WS: 334.45 ft (Bogue Chitto/Johnston Sta/52.00 (DS of 52.37))
WS differential: 238.69 ft
======================================================================