Hydraulic Subdomains¶
Split a large 2D parent model, typically rain-on-grid, into breakout subdomains whose boundaries sit where normal depth holds. Each subdomain can then run on its own with simple normal-depth and inflow-hydrograph boundaries instead of backwater-driven forcing.
Placing a model boundary where normal depth can be assumed is standard practice.
What RasSubdomain adds is a numerical way to find those places, directly from
the parent's own plan HDF:
- Pour points: candidate boundaries come from terrain-derived channels. Each
pour point is the outlet of a TauDEM stream link (
RasTauDem.delineate), and its contributing area is the union of that link's catchment and every catchment upstream. - Scoring: each candidate line is scored against the parent's native
Face Flowand cell stage, through the conveyance of the parent's own face property tables. - Extent: each subdomain's extent is traced from the parent's cell-to-cell flow.
The method is expected to suit steep and moderate-slope domains. Where backwater controls (flat, tidal or reservoir-influenced reaches), few lines pass and the remainder stays large; the search reports that rather than forcing a split.
from ras_commander.terrain import RasTauDem
from ras_commander.subdomain import RasSubdomain
taudem = RasTauDem.delineate("Terrain/dem.tif", "work/taudem",
stream_area_sqmi=0.5, cell_size=100.0)
search = RasSubdomain.find_split_lines(
["Model.p01.hdf", "Model.p02.hdf"], # events of one geometry, with native Face Flow
taudem.streams, taudem.catchments)
partition = RasSubdomain.build_subdomains(search)
partition.subdomains[["subdomain_id", "tier", "upstream_subdomain_ids", "area_sqmi", "labels"]]
Requirements¶
- Parent plan HDFs: one or more events of one geometry, each with native
Face Flowoutput. Add it withRasPlan.add_hdf_output_variable(plan, "Face Flow")and rerun the plan. Face flow is never estimated from Face Velocity. - Units: US Customary (feet) models only in this release; SI raises
NotImplementedError. - Python packages: geopandas, shapely 2 and pyproj (
pip install ras-commander[full]). - TauDEM: TauDEM 5 for the stream network (see Terrain Modules).
Finding split lines¶
RasSubdomain.find_split_lines(plan_hdf_paths, streams, catchments, *, mesh_name=None, growth_plan_hdf_path=None, criteria=None, link_ids=None)
- Walk-up. From each pour point whose contributing area is at least
min_contributing_area_sqmi, the search walks up the link (and its larger upstream link) instep_spacing_ftsteps, out towalk_length_ft. - Line growth. At each step a line grows across the valley from the face
the channel crosses. It follows the faces carrying the most downstream
volume in the growth event (default: the event with the most volume) and
stops at the edge of the
wet_depth_ftwet extent. - Scoring. In every event the line is scored as a normal-depth boundary.
Native
Q(t)across the line is set against the stage of the cell above the seed face throughK(z) = sum (1.486/n) A R^(2/3), at the best single slope. The scores are RMSE, peak error, rising/falling loop width, reverse fraction and the share of the contributing area's outflow. - Acceptance. A line passes in an event when all of these hold:
- both banks close;
- reverse flow is at most 5%;
- RMSE, peak error and loop width are each at most 0.5 ft;
- the best slope is within 1/3 to 3 times the link slope;
- the line carries 80% to 120% of the contributing area's outflow.
A split line must pass in every event at its step and at a neighbouring step; the lowest mean RMSE wins.
These defaults are the project-engineer values of 2026-10-14
(SplitLineCriteria). link_ids limits the search to chosen TauDEM links, for
example one headwater.
SplitLineSearch.split_lines (schema subdomain_split_lines) holds the
accepted lines. candidates (schema subdomain_split_candidates) holds every
scored step and event, with the criteria it failed.
Building subdomains¶
RasSubdomain.build_subdomains(search, *, split_line_ids=None)
- Footprints: the footprint of a split line is every cell whose drainage path (each cell to the neighbour receiving most of its event volume) crosses the line, in any event, with holes filled.
- Nesting: footprints nest, and each cell goes to the smallest footprint
holding it. Tier 1 has nothing upstream; cells no line drains form the
remainder. - Outputs:
subdomains(schemasubdomain_partition) andcell_owner(schemasubdomain_cell_owner, every physical cell once).
Labels are information, not gates:
CLOSED_EDGE_LEAKAGE: gross exchange across closed edges is over 5% of outlet volume.FOOTPRINT_OVERLAPFOOTPRINT_PARTS_DROPPEDMULTIPARTSTRUCTURE_ON_SPLIT_LINEINTERIOR_SUBDOMAIN: touches no parent perimeter face (for example a band between two split lines on one stem). It can still be cut.HOLES: a nested subdomain lies wholly inside this one, so this one has a hole.
The authoring step refuses HOLES, MULTIPART and STRUCTURE_ON_SPLIT_LINE
in this release.
On the Salt Draw HEC-RAS 6.6 parent (794,332 cells, 1% AEP, native Face Flow) with TauDEM links at 100 ft and 0.5 sq mi, the search scored 1,304 pour points in 27,188 walk-up steps. It accepted 148 split lines, which nest into 30 tiers. The search took 16 minutes and the partition 5 more on a workstation; most of the time goes to streaming the 12.6 GB of face flow.
Authoring, running and comparing breakouts¶
breakout_plan = RasSubdomain.plan_breakouts(partition, "01", ras_object=parent, subdomain_ids=["2568"])
assert breakout_plan.is_ready
breakouts = RasSubdomain.apply_breakouts(breakout_plan, "work/breakouts")
checks = RasSubdomain.validate_breakouts(breakouts)
runs = RasSubdomain.compute_subdomains(breakouts, max_workers=2, num_cores=4)
comparison = RasSubdomain.compare_to_parent(breakouts, "Model.p01.hdf")
plan_breakouts¶
plan_breakouts(partition, plan_number, *, ras_object, perimeter_friction_slope=0.01, subdomain_ids=None, closed_edge_outflow=False, closed_edge_friction_slope=0.00033, boundary_gap_cells=2)
writes nothing. Per subdomain it records:
- the exact parent cells to keep;
- the BC lines:
- the outlet split line as Normal Depth at its fitted slope;
- one Flow Hydrograph line per upstream subdomain, carrying the parent's own
flow across that split line until the upstream child has run. The flow comes
from the parent run of the same plan: the search event whose plan HDF was
forced by that plan's unsteady file. Without one, the
inflow_event_matches_plancheck blocks the plan; - Normal Depth along each stretch of the parent perimeter.
Every other edge, the divide with a neighbouring subdomain, is a closed wall
unless closed_edge_outflow is set. It runs RasBreakout2D.preflight against
the parent and checks that the parent geometry HDF is the mesh that was searched.
HOLES, MULTIPART and STRUCTURE_ON_SPLIT_LINE become blocking checks.
Optional closed-edge outflow¶
In a rain-on-grid parent, sheet flow does not respect a terrain-derived divide exactly, and some water leaves the subdomain across its closed edges. A wall holds that water back: on Salt Draw headwater 2864, cells just inside the walls peaked up to 0.53 ft higher than in the parent.
closed_edge_outflow=True puts Normal Depth outflow lines along the closed
edges so that water can leave as it does in the parent:
- Slope:
closed_edge_friction_slope, default 0.00033. This is a conservative minimum that stays numerically stable while letting water escape. - Spacing: each line stops
boundary_gap_cellscell faces (default 2) short of the outlet, inflow and perimeter lines along the perimeter. No two BC lines then share a boundary face, which HEC-RAS rejects. - Outflow only: a normal-depth edge only lets water out. Inflow the parent received across the divide is still not represented.
It is off by default because it is not always appropriate. Where significant flow passes between basins in both directions, extend the breakout domain to include both basins instead.
On Salt Draw headwater 2864 (HEC-RAS 6.4.1, 1% AEP) the option made agreement with the parent worse, so the walled default is kept there:
| Headwater 2864 vs parent | Walled (default) | closed_edge_outflow=True |
|---|---|---|
| Max-WSE diff p95 / p99 / max (ft) | 0.017 / 0.083 / 1.15 | 0.032 / 0.42 / 2.98 |
| Cells within 300 ft of a closed edge, p95 (ft) | 0.26 | 1.23 (mean −0.28) |
| Outlet volume | +2.0% | −1.8% |
The three closed-edge lines passed 4.1% of the outlet volume, against the parent's net 1.7% (2.6% out, 0.8% in) across the same edges. They also drained a 4.7 ft pond that the parent's terrain and the water on the far side of the divide hold. Use the option where the parent shows mostly one-way spill across a divide with no ponded storage against it.
apply_breakouts¶
apply_breakouts(breakout_plan, dest_folder, *, overwrite_dest=False, hecras_version=None, time_step="parent_minimum"):
- Working copy: copies the parent project to
dest_folder. The copy roots at the smallest folder holding the project file and its RAS Mapper assets (so eBFE layouts withTerrain/besideInput/keep resolving), and leaves out parent result HDFs. - Per subdomain:
- clones plan, geometry and unsteady file (
RasBreakout2D.clone_plan_components); - removes the parent's perimeter BC lines from the cloned geometry;
- cuts the clone to the exact parent cells in the parent's HEC-RAS version
(6.4.1 or 6.6)
(
prepare_cloned_geometry(parent_cell_ids=...)); - writes the BC lines and their forcing (
GeomBcLines.replace_bc_lines). - BC line placement: HEC-RAS can misclassify a line drawn on the perimeter or assign a short line to the whole ring. After each full preprocess, a line that HEC-RAS rejects, that attaches to no face, that shares faces with another line, or that spreads over the whole perimeter moves to its next placement. The placements, in order: on the perimeter; offset 1 ft outward with ends trimmed; extended 50 ft; following the perimeter 200, 400 or 800 ft past each end.
- Time step:
time_step="parent_minimum"fixes each child at the shortest step the parent can take, with the Courant-adaptive step off. A child must not out-step its parent, whose adaptive step is set by its most restrictive cells anywhere in the domain.
validate_breakouts, compute_subdomains and compare_to_parent¶
validate_breakoutspreprocesses every child and checks each line against its compiled external faces (schemasubdomain_breakout_checks).compute_subdomainsruns one tier at a time throughRasCmdr.compute_parallel. Before each tier, each upstream child's outlet flow is written into the matching inflow line downstream (schemasubdomain_compute_runs).compare_to_parentcompares each child cell with the same parent cell (schemasubdomain_parent_comparison):- maximum-WSE difference percentiles over cells wet in both;
- wet-extent IoU;
- outlet peak, timing, volume and NSE against the parent's native flow across the same faces.
Salt Draw headwater 2568¶
5.1 sq mi, 2,407 parent cells, 1% AEP. The breakout ran in 1 min on a workstation (4 cores).
| Child time step | Max-WSE diff p50 / p95 / p99 / max (ft) | Outlet peak | Outlet volume | Outlet NSE |
|---|---|---|---|---|
| Inherited adaptive (30 s, Courant 2) | 0.007 / 0.67 / 1.53 / 3.10 | +2.1% | -0.4% | 0.58 |
| Parent minimum (fixed 15 s), the default | 0.0015 / 0.018 / 0.079 / 0.26 | +2.6% | +2.0% | 0.89 |
The parent dropped to 15 s at 12:03 on the event day, forced by its most restrictive cells elsewhere in the HUC. The child alone stayed at 30 s until 12:30, and a transient at its wetting front set summary maxima up to 3 ft high.
Salt Draw headwater 2864, run in the delivered version (HEC-RAS 6.4.1)¶
The parent is the delivered 6.4.1 model with its delivered mesh, re-run in 6.4.1 with native Face Flow for the 1% and 0.2% AEP events. The two-event search accepted 116 split lines in 25 tiers. Headwater 2864 (5.9 sq mi, 2,592 cells) was cut, preprocessed and run in 6.4.1, held at the parent's 15 s:
| Max-WSE diff p50 / p95 / p99 / max (ft) | Outlet peak | Outlet volume | Outlet NSE |
|---|---|---|---|
| 0.0005 / 0.017 / 0.083 / 1.15 | +2.1% | +2.0% | 0.9994 |
Running in the parent's own version needs no mesh repair. HEC-RAS 6.6 rejects 48 cells of the delivered mesh that have more than eight sides.
Example notebook¶
examples/237_hydraulic_subdomain_breakout.ipynb runs the whole workflow on
Salt Draw in the delivered version, HEC-RAS 6.4.1:
- organize the eBFE delivery;
- run the delivered parent once with native Face Flow for the 1% and 0.2% AEP events (cached; no re-mesh);
- delineate TauDEM links;
- search the HUC for split lines that pass in both events;
- author, validate and run one headwater subdomain;
- compare it with the parent.
Provenance¶
Ported from fim-commander's rain-on-grid subdomain research on Salt Draw (HUC-8 13070004, one HEC-RAS 6.6 parent of about 794,000 cells). Six cookie-cut children plus the main channel reproduced the parent's 1% AEP results:
- Main channel: maximum WSE p95 within 0.008 ft over 466,000 cells; HUC outlet peak within 0.2%, volume within 0.13%, NSE 0.99999.
- Wall clock: the subdomain runs took about 28% less time than the parent run.
That research took its pour points from the NextGen hydrofabric. This port uses TauDEM links and catchments instead.
Source reference¶
Hydraulic subdomains of a 2D parent model: normal-depth split lines and nested footprints.
A large 2D (often rain-on-grid) parent is divided into breakout subdomains whose
boundaries sit where normal depth holds. Placing a model boundary where normal
depth can be assumed is standard practice; here the locations are found
numerically from the parent's own plan HDF (native Face Flow and cell
stage) along terrain-derived (TauDEM) stream links, and each subdomain's extent
is traced from the parent's own cell-to-cell flow.
Workflow::
streams + catchments = RasTauDem.delineate(dem, folder)
search = RasSubdomain.find_split_lines(plan_hdf_paths, streams, catchments)
partition = RasSubdomain.build_subdomains(search)
Labels are information, not gates; nothing here is hydraulic approval.
Ported from fim-commander fim_commander.methods.pic.split_lines and
fim_commander.step.rog_split_lines (same owner), with TauDEM pour points and
contributing areas in place of the NextGen hydrofabric.
RasSubdomain
¶
Static methods for finding and building hydraulic subdomains of a 2D parent model.
find_split_lines
staticmethod
¶
find_split_lines(plan_hdf_paths: Union[str, Path, Sequence[Union[str, Path]]], streams: Any, catchments: Any, *, mesh_name: Optional[str] = None, growth_plan_hdf_path: Union[str, Path, None] = None, criteria: Optional[SplitLineCriteria] = None, link_ids: Optional[Sequence[int]] = None) -> SplitLineSearch
Find normal-depth split lines in a parent's native face flow.
Pour points are the downstream ends (outlets) of the TauDEM stream links
inside the mesh whose contributing area is at least
criteria.min_contributing_area_sqmi. A pour point's contributing area
U is the union of the catchments of its link and every link upstream.
From each pour point the search walks up the link (and its larger upstream
link) in step_spacing_ft steps to walk_length_ft. At each step a
line grows across the valley from the face the channel crosses, along
the faces carrying the most downstream volume in the growth event, to the
edge of the wet_depth_ft wet extent. Each line is then scored in every
event as a normal-depth boundary: native Q(t) across it against the
stage of the cell above the seed face, through the conveyance K(z) of
the line's face property tables, at the best single slope.
A line passes in an event when both banks close; reverse flow is at most
max_reverse_fraction; RMSE, peak error and loop width are each at most
max_fit_error_ft; the best slope is within slope_ratio_bounds of
the link slope; and the line carries outflow_share_bounds of U's
outflow. A split line passes in every event at its step and at a
neighbouring step; the lowest mean RMSE wins.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
plan_hdf_paths
|
Union[str, Path, Sequence[Union[str, Path]]]
|
One or more plan HDFs (events) of one geometry, each
with native |
required |
streams
|
Any
|
TauDEM links ( |
required |
catchments
|
Any
|
TauDEM catchments (schema |
required |
mesh_name
|
Optional[str]
|
2D flow area; required when the plan has more than one. |
None
|
growth_plan_hdf_path
|
Union[str, Path, None]
|
Event the lines grow on; default the event with the largest total face volume (widest wet extent). |
None
|
criteria
|
Optional[SplitLineCriteria]
|
Thresholds; default :class: |
None
|
link_ids
|
Optional[Sequence[int]]
|
Limit pour points to these TauDEM |
None
|
Returns:
| Type | Description |
|---|---|
SplitLineSearch
|
SplitLineSearch |
Raises:
| Type | Description |
|---|---|
ValueError
|
Missing Face Flow, differing geometries, or no 2D area. |
NotImplementedError
|
SI-unit parent. |
build_subdomains
staticmethod
¶
build_subdomains(search: SplitLineSearch, *, split_line_ids: Optional[Sequence[int]] = None) -> SubdomainPartition
Trace each split line's footprint and nest the footprints into subdomains.
The footprint of a split line is every cell whose drainage path (each cell to the neighbour receiving most of its event volume) crosses the line in any event, with holes filled. Footprints nest; each cell goes to the smallest footprint holding it, so a subdomain is its footprint less the subdomains upstream of it. Tier 1 has nothing upstream. Cells no line drains form the remainder.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
search
|
SplitLineSearch
|
From :meth: |
required |
split_line_ids
|
Optional[Sequence[int]]
|
Keep only these split lines (default: all). |
None
|
Returns:
| Type | Description |
|---|---|
SubdomainPartition. Labels (information only
|
|
SubdomainPartition
|
|
SubdomainPartition
|
|
SubdomainPartition
|
parent perimeter face) and |
plan_breakouts
staticmethod
¶
plan_breakouts(partition: SubdomainPartition, plan_number: Union[str, int], *, ras_object: Any, perimeter_friction_slope: float = 0.01, subdomain_ids: Optional[Sequence[str]] = None, closed_edge_outflow: bool = False, closed_edge_friction_slope: float = 0.00033, boundary_gap_cells: int = 2) -> SubdomainBreakoutPlan
Plan one exact-cell breakout per subdomain; nothing is written.
For each subdomain (default: all, including the remainder) this records
the parent cell ids to keep and the BC lines to author, and runs the
read-only :meth:RasBreakout2D.preflight against ras_object:
- the outlet split line as Normal Depth at the fitted slope;
- one Flow Hydrograph line per upstream subdomain, carrying the parent's
own flow across that split line until the upstream child has run. The
flow is taken from the search event forced by this plan's unsteady
file; without one, the
inflow_event_matches_plancheck blocks; - Normal Depth at
perimeter_friction_slopealong each stretch of the parent perimeter.
Every other edge (the divide with a neighbouring subdomain) is a closed
wall unless closed_edge_outflow is set. Labels this release cannot cut
(HOLES, MULTIPART, STRUCTURE_ON_SPLIT_LINE) become blocking
checks.
Closed-edge outflow (optional). In a rain-on-grid parent, sheet flow
crosses a terrain-derived divide; a wall there holds back water the
parent let leave. closed_edge_outflow=True puts Normal Depth outflow
lines at closed_edge_friction_slope (0.00033 by default, a
conservative minimum that stays stable while letting water escape) along
those edges. Each line stops boundary_gap_cells cell faces short of
the outlet, inflow and perimeter lines along the perimeter, so no two BC
lines share a boundary face. A normal-depth edge only lets water out. It is
off by default because it is not always appropriate: where significant
flow passes between basins in both directions, extend the model domain to
include both basins instead.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
partition
|
SubdomainPartition
|
From :meth: |
required |
plan_number
|
Union[str, int]
|
Parent plan whose geometry the cells come from. Its geometry HDF must be the compiled geometry of the searched events. |
required |
ras_object
|
Any
|
Initialized parent project (read only). |
required |
perimeter_friction_slope
|
float
|
Normal-depth slope on parent-perimeter stretches. |
0.01
|
subdomain_ids
|
Optional[Sequence[str]]
|
Plan only these subdomains. |
None
|
closed_edge_outflow
|
bool
|
Add Normal Depth outflow lines along closed edges. |
False
|
closed_edge_friction_slope
|
float
|
Friction slope of those lines. |
0.00033
|
boundary_gap_cells
|
int
|
Minimum cell faces, along the perimeter, between a closed-edge outflow line and any other BC line. |
2
|
Returns:
| Type | Description |
|---|---|
SubdomainBreakoutPlan
|
SubdomainBreakoutPlan; |
apply_breakouts
staticmethod
¶
apply_breakouts(breakout_plan: SubdomainBreakoutPlan, dest_folder: Union[str, Path], *, overwrite_dest: bool = False, hecras_version: Optional[str] = None, time_step: str = 'parent_minimum', timeout: int = 1800) -> SubdomainBreakoutSet
Author every planned breakout in one staged working copy of the parent.
RasProject.stage_project copies the parent project to dest_folder.
In that copy each subdomain becomes a cloned plan, geometry and unsteady
file (:meth:RasBreakout2D.clone_plan_components), cut to its exact parent
cells (prepare_cloned_geometry(parent_cell_ids=...), HEC-RAS 6.6), with
its BC lines and forcing written by :meth:GeomBcLines.replace_bc_lines.
Meteorology, initial conditions and solver settings are inherited from
the parent plan. The parent is never modified.
Every BC line is checked against its compiled external faces after a full preprocess; a line HEC-RAS rejects, attaches to no face, shares faces with another line, or spreads over the whole perimeter moves to its next placement (on the perimeter; offset 1 ft outward with ends trimmed; extended; following the perimeter 200, 400 or 800 ft past each end).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
breakout_plan
|
SubdomainBreakoutPlan
|
From :meth: |
required |
dest_folder
|
Union[str, Path]
|
New folder for the working copy. The copied root is the smallest folder holding the project and its RAS Mapper assets; parent result HDFs are not copied. |
required |
overwrite_dest
|
bool
|
Replace an existing |
False
|
hecras_version
|
Optional[str]
|
Version for the working project (default the parent's). |
None
|
time_step
|
str
|
|
'parent_minimum'
|
timeout
|
int
|
Seconds allowed per native step. |
1800
|
Returns:
| Type | Description |
|---|---|
SubdomainBreakoutSet
|
SubdomainBreakoutSet |
validate_breakouts
staticmethod
¶
validate_breakouts(breakout_set: SubdomainBreakoutSet, *, max_wait: int = 3600) -> pd.DataFrame
Preprocess every child and check each BC line against its compiled external faces.
A BC line HEC-RAS attaches to no face, or spreads over the whole
perimeter, fails. Returns a checks DataFrame (subdomain_id, check,
passed, blocking, detail).
compute_subdomains
staticmethod
¶
compute_subdomains(breakout_set: SubdomainBreakoutSet, *, max_workers: int = 2, num_cores: int = 2) -> pd.DataFrame
Run the children tier by tier, handing each outlet hydrograph downstream.
Each tier is one :meth:RasCmdr.compute_parallel call in the working
project. Before a tier runs, the summed flow of each upstream child's
outlet BC line is written as the inline hydrograph of the matching inflow
line (:meth:RasUnsteady.set_boundary_inline_hydrograph). Returns one row
per subdomain: subdomain_id, tier, plan_number, success,
tier_wall_clock_s, plan_hdf_path.
compare_to_parent
staticmethod
¶
compare_to_parent(breakout_set: SubdomainBreakoutSet, parent_plan_hdf_path: Union[str, Path], *, depth_threshold_ft: float = 0.1) -> pd.DataFrame
Compare each computed child with the parent on the same cells and outlet.
Child cells are the parent's own cells, matched by centre. Per subdomain:
maximum-WSE difference (p50, p95, p99, max, mean) over cells wet above
depth_threshold_ft in both, wet-extent IoU, and the outlet hydrograph's
peak, peak time, volume and NSE against the parent's native flow across
the same split line. No pass/fail: the table reports.
SplitLineCriteria
dataclass
¶
Thresholds of the split-line search. Defaults are the project-engineer values of 2026-10-14.
Distances are feet; slopes and fractions are dimensionless.
SplitLineSearch
dataclass
¶
Result of :meth:RasSubdomain.find_split_lines.
Attributes:
| Name | Type | Description |
|---|---|---|
split_lines |
Any
|
One row per accepted split line (schema |
candidates |
Any
|
Every scored walk-up step and event (schema |
criteria |
SplitLineCriteria
|
The thresholds used. |
mesh_name |
str
|
Parent 2D flow area. |
events |
Tuple[str, ...]
|
Event labels, in |
plan_hdf_paths |
Tuple[Path, ...]
|
Parent plan HDFs. |
plan_hdf_sha256 |
Tuple[str, ...]
|
SHA-256 of each plan HDF, in the same order. |
growth_event |
str
|
The event the lines grew on. |
SubdomainPartition
dataclass
¶
Result of :meth:RasSubdomain.build_subdomains.
Attributes:
| Name | Type | Description |
|---|---|---|
subdomains |
Any
|
One row per subdomain plus the remainder (schema |
cell_owner |
Any
|
|
remainder_id |
str
|
|
run_order |
Tuple[Tuple[str, ...], ...]
|
Subdomain ids by tier, upstream first; the remainder runs last. |
search |
SplitLineSearch
|
The split-line search this partition was built from. |
Breakout authoring, execution and comparison for hydraulic subdomains.
Builds on :class:RasBreakout2D (clone and exact cell-subset cut),
:meth:GeomBcLines.replace_bc_lines (BC lines with their forcing), and
:meth:RasCmdr.compute_parallel. The parent project is never modified: every
child is a cloned plan, geometry and unsteady file inside one staged working
copy of the parent.
SubdomainBreakout
dataclass
¶
One planned breakout: the parent cells it keeps and the BC lines it gets.
SubdomainBreakoutPlan
dataclass
¶
Read-only plan of :meth:RasSubdomain.plan_breakouts.
checks uses the ras_breakout_2d_checks columns plus subdomain_id.
is_ready is False while any blocking check fails for a planned subdomain.
SubdomainBreakoutSet
dataclass
¶
Authored breakouts in one staged working project (:meth:RasSubdomain.apply_breakouts).
children has one row per subdomain: subdomain_id, tier,
plan_number, geometry_number, unsteady_number, geometry_path,
unsteady_path, plan_path.