![]() |
OpenSWMM Engine
6.0.0-alpha.4
Data-oriented, plugin-extensible SWMM Engine (6.0.0-alpha.4)
|
All SWMM simulation options parsed from [OPTIONS] section. More...
#include <SimulationOptions.hpp>
Public Member Functions | |
| double | totalDurationMs () const |
| Total simulation duration in milliseconds (legacy TotalDuration). | |
Public Attributes | |
| double | start_date = 2453006.0 |
| Simulation start date/time (decimal days, OADate (days since 12/30/1899)). | |
| double | end_date = 0.0 |
| Simulation end date/time (decimal days, OADate (days since 12/30/1899)). | |
| double | total_duration_ms = -1.0 |
| Total simulation duration in milliseconds, or -1 if not set. | |
| double | report_start = 0.0 |
| Report start date/time. | |
| double | routing_step = 20.0 |
| Hydraulic routing timestep in seconds. Legacy default: 20. | |
| double | min_routing_step = 0.5 |
| Minimum routing timestep in seconds (CFL floor). | |
| double | dry_step = 3600.0 |
| Dry-weather runoff timestep in seconds. | |
| double | wet_step = 300.0 |
| Wet-weather runoff timestep in seconds. | |
| double | report_step = 900.0 |
| Reporting output interval in seconds. | |
| double | dry_days = 0.0 |
| Antecedent dry days. | |
| double | variable_step = 0.75 |
| Courant factor for variable time stepping (0 = fixed step). | |
| double | lengthening_step = 0.0 |
| Conduit lengthening timestep (seconds, 0 = use routing_step). | |
| int | sweep_start = 1 |
| Street sweeping start day-of-year (1-365). 0 = not set. | |
| int | sweep_end = 365 |
| Street sweeping end day-of-year (1-365). 0 = not set. | |
| FlowUnits | flow_units = FlowUnits::CFS |
| Flow units system. | |
| RoutingModel | routing_model = RoutingModel::DYNWAVE |
| Routing method. Legacy default: DYNWAVE. | |
| QualitySolverKind | quality_solver = QualitySolverKind::LEGACY |
Water-quality engine selection ([OPTIONS] QUALITY_SOLVER). | |
| double | quality_step = 0.0 |
[OPTIONS] QUALITY_STEP — transport substep, seconds (HH:MM:SS or seconds; 0 = follow ROUTING_STEP). | |
| int | max_segments_per_link = 100 |
[OPTIONS] MAX_SEGMENTS_PER_LINK — LARD slab capacity per link (strategy §4.1; default 100, the EPANET MAXSEGS shape). | |
| bool | lard_rwpt = false |
[OPTIONS] DISPERSION RWPT|OFF — LARD RWPT dispersion (X3b; strategy §5; the GUI plan's Lagrangian-group key). | |
| int | rwpt_seed = 0 |
[OPTIONS] RWPT_SEED — deterministic counter-RNG seed (D-L6). Same seed ⇒ bit-identical runs at any thread count. | |
| bool | water_age = false |
[OPTIONS] WATER_AGE ON|OFF — transported water-age tracking (water age plan §1, reserved species WATER_AGE). | |
| bool | outfall_backflow_zero = false |
[OPTIONS] OUTFALL_BACKFLOW_QUALITY LAST|ZERO — quality carried by reverse flow at outfalls (false = LAST, the default). | |
| bool | heat_transport = false |
[OPTIONS] HEAT_TRANSPORT ON|OFF — transported temperature (heat plan §1, reserved species TEMPERATURE). | |
| double | humidity [12] = {50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50} |
Monthly relative humidity, % ([TEMPERATURE] HUMIDITY). | |
| int | humidity_type = 0 |
| Humidity source: 0=CONSTANT, 1=MONTHLY, 2=TIMESERIES. | |
| int | humidity_var = 0 |
| Humidity quantity: 0=RELATIVE (%), 1=DEWPOINT (deg F US / deg C SI). | |
| std::string | humidity_ts_name |
| Timeseries name for humidity (humidity_type == 2). | |
| double | water_density = 1000.0 |
Water density, kg/m³ ([OPTIONS] WATER_DENSITY; CSH Table 4.1). | |
| double | water_specific_heat = 4184.0 |
Water specific heat capacity, J/kg/°C (WATER_SPECIFIC_HEAT_CAPACITY). | |
| double | wind_func_coeff_a = 1.505e-8 |
Wind-function coefficients (WIND_FUNC_COEFF_A / _B), CSH Table 4.1 — f(w) = a + b·w, Dunne & Leopold (1978) defaults. | |
| double | wind_func_coeff_b = 1.6e-8 |
| double | pressure_ratio = 1.0 |
Pa/P elevation correction in the Bowen ratio (PRESSURE_RATIO). | |
| fv::FvOptions | fv |
| Knobs for FLOW_ROUTING FV, grouped rather than spread across this struct (plan §4.2 — first-class [OPTIONS] keys, no new section). | |
| InfiltrationModel | infiltration = InfiltrationModel::HORTON |
| Infiltration method for subcatchments. | |
| RunoffModel | runoff_model = RunoffModel::NL_POND |
| Runoff routing method. | |
| int | max_trials = 8 |
| Maximum number of flow routing iterations (dynamic wave). | |
| int | surcharge_method = 0 |
| Surcharge method: 0=EXTRAN, 1=SLOT, 2=DYNAMIC_SLOT (DPS). | |
| double | tpa_celerity = 100.0 |
| TPA acoustic celerity a for SURCHARGE_METHOD TPA (PROJECT length units per second, converted like FV_SLOT_CELERITY). Sets the constant slot width w = g·A_full/a² (issue #156). | |
| double | dps_target_celerity = 25.0 |
| DPS target pressure celerity (m/s, converted to ft/s at init). | |
| double | dps_alpha = 3.0 |
| DPS surcharge shock parameter (dimensionless, >= 2). | |
| double | dps_decay_time = 0.5 |
| DPS decay time scale (seconds). | |
| int | unsteady_friction = 0 |
| Unsteady friction model: 0=NONE (default, inert), 1=VITKOVSKY. | |
| int | report_signed_heads = 0 |
| Report signed piezometric heads: 0 = NO (default, legacy bit-parity — NODE_HEAD is rebuilt as f32(floored depth) + f32(invert)), 1 = YES — the .out HEAD field carries the TRUE signed head (point-in-time), so sub-atmospheric TPA columns are observable (issue #156 O-6). DEPTH stays floored either way. | |
| double | uf_k3 = 0.015 |
| Unsteady friction coefficient k3 (dimensionless). | |
| NodeContinuity | node_continuity = NodeContinuity::EXPLICIT |
| Node continuity formulation for depth update. Default: EXPLICIT (legacy). | |
| int | virtual_junction_momentum = 0 |
| Virtual-junction momentum treatment. Always 0 (BASIC). | |
| bool | anderson_accel = false |
| Enable Anderson acceleration for Picard iteration convergence. | |
| int | normal_flow_ltd = 2 |
| Normal flow limitation: 0=SLOPE, 1=FROUDE, 2=BOTH, 3=NEITHER. | |
| int | force_main_eqn = 0 |
| Force main equation: 0=Hazen-Williams, 1=Darcy-Weisbach. | |
| int | inertial_damping = 1 |
| Inertial damping: 0=NONE, 1=PARTIAL, 2=FULL. | |
| int | link_offsets = 0 |
| Link offset mode: 0=DEPTH_OFFSET, 1=ELEV_OFFSET. | |
| double | min_slope = 0.0 |
| Minimum conduit slope (ft/ft). | |
| double | min_surf_area = 0.0 |
| Minimum node surface area (ft²). | |
| double | head_tol = 0.005 |
| Convergence head tolerance in project length units. | |
| double | sys_flow_tol = 0.05 |
| System flow tolerance (fraction, e.g., 0.05 = 5%). | |
| double | lat_flow_tol = 0.05 |
| Lateral inflow tolerance (fraction, e.g., 0.05 = 5%). | |
| bool | skip_steady_state = false |
| Skip routing when system is in steady state. | |
| bool | write_absolute_paths = false |
| Slice IO-4 opt-out: emit external-file paths verbatim absolute. | |
| bool | quality_routing = false |
| True if quality routing is enabled. | |
| bool | allow_ponding = false |
| True if evaporation is included. | |
| bool | ignore_rainfall = false |
| Ignore rainfall (for hot start runs). | |
| bool | ignore_snow_melt = false |
| Ignore snowmelt. | |
| bool | ignore_groundwater = false |
| Ignore groundwater. | |
| bool | ignore_rdii = false |
| Ignore RDII. | |
| bool | ignore_routing = false |
| Ignore routing. | |
| bool | ignore_quality = false |
| Ignore water quality. | |
| bool | ignore_2d = false |
| Ignore the 2D surface-routing module. | |
| double | rule_step = 0.0 |
| Control rule evaluation interval (seconds). | |
| int | num_threads = 1 |
| Number of OpenMP threads for parallel solver loops. | |
| std::string | crs |
| Coordinate reference system string. | |
| std::unordered_map< std::string, std::string > | ext_options |
| Key-value map for unknown [OPTIONS] keys. | |
| int | evap_type = 0 |
| Evaporation type: 0=CONSTANT, 1=MONTHLY, 2=TIMESERIES, 3=TEMPERATURE, 4=FILE. | |
| double | evap_values [12] = {0,0,0,0,0,0,0,0,0,0,0,0} |
| Monthly evaporation values (used when evap_type == 0 or 1). | |
| std::string | evap_ts_name |
| Timeseries name for evaporation (evap_type == 2). | |
| std::string | evap_recovery_pat |
| Recovery pattern name for evaporation. | |
| bool | evap_dry_only = false |
| If true, evaporation only occurs on dry days. | |
| double | pan_coeff [12] = {1,1,1,1,1,1,1,1,1,1,1,1} |
| Monthly pan coefficients (used when evap_type == 4/FILE). | |
| int | temp_source = 0 |
| Temperature source: 0=NONE, 1=TIMESERIES, 2=FILE. | |
| std::string | temp_ts_name |
| Timeseries name for temperature data. | |
| FilePathPair | temp_file |
| File path for temperature data. Carries {absolute, original}. | |
| double | temp_file_start = 0.0 |
| Temperature file start date (OADate). | |
| int | temp_units = -1 |
| Climate-file temperature units: 0=tenths-degC (C10), 1=degC (C), 2=degF (F); -1 = unspecified (reader keeps its per-format default). | |
| int | wind_type = 0 |
| Wind speed type: 0=MONTHLY, 1=FILE. | |
| double | wind_speed [12] = {0,0,0,0,0,0,0,0,0,0,0,0} |
| Monthly wind speed values (12 months). | |
| double | snow_divt = 34.0 |
| Snowmelt: dividing temperature. | |
| double | snow_ati_wt = 0.5 |
| Snowmelt: ATI weight (0–1). | |
| double | snow_nrg_ratio = 0.6 |
| Snowmelt: negative melt ratio. | |
| double | snow_lat = 0.0 |
| Snowmelt: latitude (degrees). | |
| double | snow_dtlong = 0.0 |
| Snowmelt: longitude/solar-time correction (minutes). | |
| double | snow_elev = 0.0 |
| Snowmelt: site elevation above sea level (ft, internal units). | |
| double | snow_min_melt = 0.0 |
| Snowmelt: minimum melt coefficient. | |
| double | snow_max_melt = 0.0 |
| Snowmelt: maximum melt coefficient. | |
| double | adc_imperv [10] = {1,1,1,1,1,1,1,1,1,1} |
| Areal depletion curve for impervious surfaces (10 fractions). | |
| double | adc_perv [10] = {1,1,1,1,1,1,1,1,1,1} |
| Areal depletion curve for pervious surfaces (10 fractions). | |
| bool | rpt_disabled = false |
| TRUE if all reporting is disabled. | |
| int | rpt_subcatchments = 1 |
| Subcatchment reporting: 0=NONE, 1=ALL, 2=SOME. Default ALL. | |
| int | rpt_nodes = 1 |
| Node reporting: 0=NONE, 1=ALL, 2=SOME. Default ALL. | |
| int | rpt_links = 1 |
| Link reporting: 0=NONE, 1=ALL, 2=SOME. Default ALL. | |
| bool | rpt_input = false |
| Report input summary. | |
| bool | rpt_continuity = true |
| Report continuity errors (default true). | |
| bool | rpt_flowstats = true |
| Report flow statistics (default true). | |
| bool | rpt_controls = false |
| Report control actions (default false). | |
| bool | rpt_averages = false |
| Report time-averaged results (default false). | |
| std::vector< std::string > | rpt_subcatch_names |
| Named subcatchments to report (used when rpt_subcatchments == 2). | |
| std::vector< std::string > | rpt_node_names |
| Named nodes to report (used when rpt_nodes == 2). | |
| std::vector< std::string > | rpt_link_names |
| Named links to report (used when rpt_links == 2). | |
All SWMM simulation options parsed from [OPTIONS] section.
This struct consolidates all options that were previously global variables in src/solver/globals.h (e.g., FlowUnits, RouteModel, RouteStep, etc.) into a single value type that lives inside SimulationContext.
The ext_options map stores any key in [OPTIONS] that is not recognized as a standard SWMM option. A SWMM_WARN_UNKNOWN_OPTION warning is issued. Extension options are available to plugins via the C API.
|
inline |
Total simulation duration in milliseconds (legacy TotalDuration).
Returns the legacy-exact value stored by the INP options handler when available; otherwise falls back to flooring the combined serial difference to whole seconds (mirroring legacy swmm5.c:3198-3200 as closely as the combined representation allows).
| double openswmm::SimulationOptions::adc_imperv[10] = {1,1,1,1,1,1,1,1,1,1} |
Areal depletion curve for impervious surfaces (10 fractions).
| double openswmm::SimulationOptions::adc_perv[10] = {1,1,1,1,1,1,1,1,1,1} |
Areal depletion curve for pervious surfaces (10 fractions).
| bool openswmm::SimulationOptions::allow_ponding = false |
True if evaporation is included.
| bool openswmm::SimulationOptions::anderson_accel = false |
Enable Anderson acceleration for Picard iteration convergence.
When true, uses depth-2 Anderson mixing to accelerate node depth convergence, typically reducing iteration count by 25-50%. Falls back to standard Picard for nodes that violate physical bounds.
| std::string openswmm::SimulationOptions::crs |
Coordinate reference system string.
Set via the CRS key in [OPTIONS]:
or using a PROJ string:
Empty string if not specified. Also stored in SpatialFrame::crs.
| double openswmm::SimulationOptions::dps_alpha = 3.0 |
DPS surcharge shock parameter (dimensionless, >= 2).
Controls the celerity shock at the mixed-flow transition. Larger values → initial P closer to 1 → bigger shock. Recommended: alpha = 3.
| double openswmm::SimulationOptions::dps_decay_time = 0.5 |
DPS decay time scale (seconds).
Time for Preissmann Number to decay from P_hat_0 to ~1. Shorter r → faster transition to target celerity but potential oscillations. Should be meaningful physical/numerical time scale.
| double openswmm::SimulationOptions::dps_target_celerity = 25.0 |
DPS target pressure celerity (m/s, converted to ft/s at init).
Controls the maximum modeled pressure wave speed. Lower values allow larger timesteps but reduce transient fidelity.
| double openswmm::SimulationOptions::dry_days = 0.0 |
Antecedent dry days.
| double openswmm::SimulationOptions::dry_step = 3600.0 |
Dry-weather runoff timestep in seconds.
| double openswmm::SimulationOptions::end_date = 0.0 |
Simulation end date/time (decimal days, OADate (days since 12/30/1899)).
| bool openswmm::SimulationOptions::evap_dry_only = false |
If true, evaporation only occurs on dry days.
| std::string openswmm::SimulationOptions::evap_recovery_pat |
Recovery pattern name for evaporation.
| std::string openswmm::SimulationOptions::evap_ts_name |
Timeseries name for evaporation (evap_type == 2).
| int openswmm::SimulationOptions::evap_type = 0 |
Evaporation type: 0=CONSTANT, 1=MONTHLY, 2=TIMESERIES, 3=TEMPERATURE, 4=FILE.
| double openswmm::SimulationOptions::evap_values[12] = {0,0,0,0,0,0,0,0,0,0,0,0} |
Monthly evaporation values (used when evap_type == 0 or 1).
| std::unordered_map<std::string, std::string> openswmm::SimulationOptions::ext_options |
Key-value map for unknown [OPTIONS] keys.
Any key in [OPTIONS] that is not a recognized SWMM keyword is stored here as a string pair. A SWMM_WARN_UNKNOWN_OPTION warning is issued for each unknown key.
Plugins can retrieve values via swmm_options_get_ext(). Keys are stored uppercase-normalized.
Example:
| FlowUnits openswmm::SimulationOptions::flow_units = FlowUnits::CFS |
Flow units system.
| int openswmm::SimulationOptions::force_main_eqn = 0 |
Force main equation: 0=Hazen-Williams, 1=Darcy-Weisbach.
| fv::FvOptions openswmm::SimulationOptions::fv |
Knobs for FLOW_ROUTING FV, grouped rather than spread across this struct (plan §4.2 — first-class [OPTIONS] keys, no new section).
Length-dimensioned members are stored here in the PROJECT's display units exactly as parsed; Router::init converts them to internal feet, the same treatment HEAD_TOLERANCE gets. FV_* keys are accepted and inert under any other routing model, so switching FLOW_ROUTING never invalidates a file.
| double openswmm::SimulationOptions::head_tol = 0.005 |
Convergence head tolerance in project length units.
Legacy default: 0.0 (sentinel → runtime default 0.005 ft).
| bool openswmm::SimulationOptions::heat_transport = false |
[OPTIONS] HEAT_TRANSPORT ON|OFF — transported temperature (heat plan §1, reserved species TEMPERATURE).
H1 scope: TRANSPORT ONLY. Temperature is advected and mixed as a conservative tracer under the LEGACY CSTR engine and reported as a trailing species column; per-source inlet temperatures come from the heat component's [HEAT_SOURCES]. The surface/radiative/sediment flux modules of plan §2 — the terms that make temperature change rather than merely move — arrive with H2–H4.
| double openswmm::SimulationOptions::humidity[12] = {50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50} |
Monthly relative humidity, % ([TEMPERATURE] HUMIDITY).
H2. ClimateState::humidity has existed with a 50 % default since before this program and nothing ever wrote to it — the GeoPackage climate format reads a humidity column that never reached the running state. Surface heat exchange is the first consumer, so the deck key arrives with it. Monthly like WINDSPEED; a single value fills all twelve months.
Holds RH (%) when humidity_var == 0, dew point (project temperature units) when humidity_var == 1. Used when humidity_type is CONSTANT (0) or MONTHLY (1).
| std::string openswmm::SimulationOptions::humidity_ts_name |
Timeseries name for humidity (humidity_type == 2).
| int openswmm::SimulationOptions::humidity_type = 0 |
Humidity source: 0=CONSTANT, 1=MONTHLY, 2=TIMESERIES.
| int openswmm::SimulationOptions::humidity_var = 0 |
Humidity quantity: 0=RELATIVE (%), 1=DEWPOINT (deg F US / deg C SI).
Dew point is converted to RH each step from the effective air temperature: RH = 100·e_s(Td)/e_s(Ta), clamped to [0, 100].
| bool openswmm::SimulationOptions::ignore_2d = false |
Ignore the 2D surface-routing module.
Parsed from IGNORE_2D in [OPTIONS] (OpenSWMM extension — not a legacy key, so the InpWriter emits it only when YES). When set, the 2D solver never activates even if the model carries a mesh: the GUI's "2D Surface Routing" module checkbox writes this so unchecking it genuinely runs the model 1D-only without stripping the mesh sections.
| bool openswmm::SimulationOptions::ignore_groundwater = false |
Ignore groundwater.
| bool openswmm::SimulationOptions::ignore_quality = false |
Ignore water quality.
| bool openswmm::SimulationOptions::ignore_rainfall = false |
Ignore rainfall (for hot start runs).
| bool openswmm::SimulationOptions::ignore_rdii = false |
Ignore RDII.
| bool openswmm::SimulationOptions::ignore_routing = false |
Ignore routing.
| bool openswmm::SimulationOptions::ignore_snow_melt = false |
Ignore snowmelt.
| int openswmm::SimulationOptions::inertial_damping = 1 |
Inertial damping: 0=NONE, 1=PARTIAL, 2=FULL.
| InfiltrationModel openswmm::SimulationOptions::infiltration = InfiltrationModel::HORTON |
Infiltration method for subcatchments.
| bool openswmm::SimulationOptions::lard_rwpt = false |
[OPTIONS] DISPERSION RWPT|OFF — LARD RWPT dispersion (X3b; strategy §5; the GUI plan's Lagrangian-group key).
Resolved vertical-shear dispersion on the segments (RwptDispersion.hpp). LARD-only; warns under other solvers (the ARD engine's dispersion is E3's transport.ard machinery, deliberately separate).
| double openswmm::SimulationOptions::lat_flow_tol = 0.05 |
Lateral inflow tolerance (fraction, e.g., 0.05 = 5%).
Legacy default: 0.05. Input is in percent, divided by 100.
| double openswmm::SimulationOptions::lengthening_step = 0.0 |
Conduit lengthening timestep (seconds, 0 = use routing_step).
Used to compute modified conduit lengths for CFL stability.
| int openswmm::SimulationOptions::link_offsets = 0 |
Link offset mode: 0=DEPTH_OFFSET, 1=ELEV_OFFSET.
| int openswmm::SimulationOptions::max_segments_per_link = 100 |
[OPTIONS] MAX_SEGMENTS_PER_LINK — LARD slab capacity per link (strategy §4.1; default 100, the EPANET MAXSEGS shape).
Values below 2 are clamped to 2 at solver init. Consumed by the LARD engine only; warns at open under other solvers.
| int openswmm::SimulationOptions::max_trials = 8 |
Maximum number of flow routing iterations (dynamic wave).
| double openswmm::SimulationOptions::min_routing_step = 0.5 |
Minimum routing timestep in seconds (CFL floor).
| double openswmm::SimulationOptions::min_slope = 0.0 |
Minimum conduit slope (ft/ft).
| double openswmm::SimulationOptions::min_surf_area = 0.0 |
Minimum node surface area (ft²).
| NodeContinuity openswmm::SimulationOptions::node_continuity = NodeContinuity::EXPLICIT |
Node continuity formulation for depth update. Default: EXPLICIT (legacy).
| int openswmm::SimulationOptions::normal_flow_ltd = 2 |
Normal flow limitation: 0=SLOPE, 1=FROUDE, 2=BOTH, 3=NEITHER.
| int openswmm::SimulationOptions::num_threads = 1 |
Number of OpenMP threads for parallel solver loops.
Parsed from the THREADS keyword in [OPTIONS]. Resolution (core/ThreadInfo.hpp, THREAD_LIMITS_AND_OVERSUBSCRIPTION_PLAN):
Model-size gates still apply to explicit values (warned): dynamic wave keeps >= 100 conduits per thread; the 2D marcher needs >= 4 triangles per thread. The 2D Kokkos OpenMP backend receives the raw value via the plugin ABI (v4) and initialises once per process.
Environment overrides (each warned when active): SWMM_DW_THREADS forces the dynamic-wave count; OPENSWMM_2D_THREADS forces the Kokkos backend.
| bool openswmm::SimulationOptions::outfall_backflow_zero = false |
[OPTIONS] OUTFALL_BACKFLOW_QUALITY LAST|ZERO — quality carried by reverse flow at outfalls (false = LAST, the default).
LAST is the legacy convention (src/legacy/engine/qualrout.c findNodeQual): an outfall that takes no inflow keeps its last mixed concentration while wet, and backflow re-injects that held value — under WATER_AGE the held boundary water also keeps aging 1:1, so a permanently supplying outfall becomes an unbounded age source. ZERO makes a supplying outfall a fresh boundary: whenever it takes no volume inflow its held state reads zero for every pollutant AND WATER_AGE, so re-entering water carries no mass and no age (the EPANET-reservoir picture). ZERO deliberately does NOT return the mass that left through the outfall — the receiving water is an infinite fresh reservoir; tidal-flushing studies where returned mass matters keep LAST.
| double openswmm::SimulationOptions::pan_coeff[12] = {1,1,1,1,1,1,1,1,1,1,1,1} |
Monthly pan coefficients (used when evap_type == 4/FILE).
| double openswmm::SimulationOptions::pressure_ratio = 1.0 |
Pa/P elevation correction in the Bowen ratio (PRESSURE_RATIO).
| bool openswmm::SimulationOptions::quality_routing = false |
True if quality routing is enabled.
| QualitySolverKind openswmm::SimulationOptions::quality_solver = QualitySolverKind::LEGACY |
Water-quality engine selection ([OPTIONS] QUALITY_SOLVER).
LEGACY = the legacy-parity CSTR QualitySolver (default, bit-identical behavior). EULERIAN_ARD = the solver-agnostic Eulerian ARD engine on the FV cell mesh (plans/transport/EULERIAN_ARD_TRANSPORT_PLAN.md rev. 2; master plan D-UT6). LAGRANGIAN = the LARD segment engine — X1 wiring only: the dispatch exists, transport does not, so quality state reads zero and the open() warning says so (plans/transport/LARD_AGE_EXPEDITE_SUBPLAN_2026-08-23.md).
| double openswmm::SimulationOptions::quality_step = 0.0 |
[OPTIONS] QUALITY_STEP — transport substep, seconds (HH:MM:SS or seconds; 0 = follow ROUTING_STEP).
X3a: consumed by the LARD engine only, which splits each routing step into ceil(dt_routing / quality_step) equal substeps (strategy §4.2). Setting it under LEGACY or EULERIAN_ARD warns at open — those engines do not substep on this key.
| int openswmm::SimulationOptions::report_signed_heads = 0 |
Report signed piezometric heads: 0 = NO (default, legacy bit-parity — NODE_HEAD is rebuilt as f32(floored depth) + f32(invert)), 1 = YES — the .out HEAD field carries the TRUE signed head (point-in-time), so sub-atmospheric TPA columns are observable (issue #156 O-6). DEPTH stays floored either way.
| double openswmm::SimulationOptions::report_start = 0.0 |
Report start date/time.
| double openswmm::SimulationOptions::report_step = 900.0 |
Reporting output interval in seconds.
| RoutingModel openswmm::SimulationOptions::routing_model = RoutingModel::DYNWAVE |
Routing method. Legacy default: DYNWAVE.
| double openswmm::SimulationOptions::routing_step = 20.0 |
Hydraulic routing timestep in seconds. Legacy default: 20.
| bool openswmm::SimulationOptions::rpt_averages = false |
Report time-averaged results (default false).
| bool openswmm::SimulationOptions::rpt_continuity = true |
Report continuity errors (default true).
| bool openswmm::SimulationOptions::rpt_controls = false |
Report control actions (default false).
| bool openswmm::SimulationOptions::rpt_disabled = false |
TRUE if all reporting is disabled.
| bool openswmm::SimulationOptions::rpt_flowstats = true |
Report flow statistics (default true).
| bool openswmm::SimulationOptions::rpt_input = false |
Report input summary.
| std::vector<std::string> openswmm::SimulationOptions::rpt_link_names |
Named links to report (used when rpt_links == 2).
| int openswmm::SimulationOptions::rpt_links = 1 |
Link reporting: 0=NONE, 1=ALL, 2=SOME. Default ALL.
| std::vector<std::string> openswmm::SimulationOptions::rpt_node_names |
Named nodes to report (used when rpt_nodes == 2).
| int openswmm::SimulationOptions::rpt_nodes = 1 |
Node reporting: 0=NONE, 1=ALL, 2=SOME. Default ALL.
| std::vector<std::string> openswmm::SimulationOptions::rpt_subcatch_names |
Named subcatchments to report (used when rpt_subcatchments == 2).
| int openswmm::SimulationOptions::rpt_subcatchments = 1 |
Subcatchment reporting: 0=NONE, 1=ALL, 2=SOME. Default ALL.
| double openswmm::SimulationOptions::rule_step = 0.0 |
| RunoffModel openswmm::SimulationOptions::runoff_model = RunoffModel::NL_POND |
Runoff routing method.
| int openswmm::SimulationOptions::rwpt_seed = 0 |
[OPTIONS] RWPT_SEED — deterministic counter-RNG seed (D-L6). Same seed ⇒ bit-identical runs at any thread count.
| bool openswmm::SimulationOptions::skip_steady_state = false |
Skip routing when system is in steady state.
When true, routing is skipped if no control actions were taken, flow error is below sys_flow_tol, and no inflows changed.
| double openswmm::SimulationOptions::snow_ati_wt = 0.5 |
Snowmelt: ATI weight (0–1).
| double openswmm::SimulationOptions::snow_divt = 34.0 |
Snowmelt: dividing temperature.
| double openswmm::SimulationOptions::snow_dtlong = 0.0 |
Snowmelt: longitude/solar-time correction (minutes).
Legacy [TEMPERATURE] SNOWMELT longitude field. Stored verbatim in minutes; converted to hours (÷60) into ClimateState::dtlong at init, matching legacy climate.c (Temp.dtlong = x[5]/60.0). 0 = use true solar time.
| double openswmm::SimulationOptions::snow_elev = 0.0 |
Snowmelt: site elevation above sea level (ft, internal units).
Used to compute atmospheric pressure for psychrometric constant. Legacy field: Temp.elev (from [TEMPERATURE] SNOWMELT section). Default 0.0 = sea level → pa = 29.9 in-Hg → gamma ≈ 0.01073.
| double openswmm::SimulationOptions::snow_lat = 0.0 |
Snowmelt: latitude (degrees).
| double openswmm::SimulationOptions::snow_max_melt = 0.0 |
Snowmelt: maximum melt coefficient.
| double openswmm::SimulationOptions::snow_min_melt = 0.0 |
Snowmelt: minimum melt coefficient.
| double openswmm::SimulationOptions::snow_nrg_ratio = 0.6 |
Snowmelt: negative melt ratio.
| double openswmm::SimulationOptions::start_date = 2453006.0 |
Simulation start date/time (decimal days, OADate (days since 12/30/1899)).
Legacy default: Jan 1, 2004 = datetime_encodeDate(2004,1,1).
| int openswmm::SimulationOptions::surcharge_method = 0 |
Surcharge method: 0=EXTRAN, 1=SLOT, 2=DYNAMIC_SLOT (DPS).
| int openswmm::SimulationOptions::sweep_end = 365 |
Street sweeping end day-of-year (1-365). 0 = not set.
| int openswmm::SimulationOptions::sweep_start = 1 |
Street sweeping start day-of-year (1-365). 0 = not set.
| double openswmm::SimulationOptions::sys_flow_tol = 0.05 |
System flow tolerance (fraction, e.g., 0.05 = 5%).
Legacy default: 0.05. Input is in percent, divided by 100.
| FilePathPair openswmm::SimulationOptions::temp_file |
File path for temperature data. Carries {absolute, original}.
| double openswmm::SimulationOptions::temp_file_start = 0.0 |
Temperature file start date (OADate).
| int openswmm::SimulationOptions::temp_source = 0 |
Temperature source: 0=NONE, 1=TIMESERIES, 2=FILE.
| std::string openswmm::SimulationOptions::temp_ts_name |
Timeseries name for temperature data.
| int openswmm::SimulationOptions::temp_units = -1 |
Climate-file temperature units: 0=tenths-degC (C10), 1=degC (C), 2=degF (F); -1 = unspecified (reader keeps its per-format default).
Maps the legacy [TEMPERATURE] FILE units keyword (TempUnitsWords {"C10","C","F"} in climate.c) and ClimateFile TempUnits enum.
| double openswmm::SimulationOptions::total_duration_ms = -1.0 |
Total simulation duration in milliseconds, or -1 if not set.
PARITY legacy swmm5.c:3198-3200 / project.c:173: legacy forms TotalDuration from the SEPARATE date and time parts — floor((EndDate-StartDate)*86400 + (EndTime-StartTime)*86400) * 1000 — which yields EXACT whole-second ms (e.g. 172680000.0), whereas (end_date - start_date)*86400000 from the combined serials rounds (e.g. 172679999.99999997). The INP options handler stores the legacy-exact value here; writers that only set the combined serials must reset it to -1 so total_duration_ms() falls back.
| double openswmm::SimulationOptions::tpa_celerity = 100.0 |
TPA acoustic celerity a for SURCHARGE_METHOD TPA (PROJECT length units per second, converted like FV_SLOT_CELERITY). Sets the constant slot width w = g·A_full/a² (issue #156).
| double openswmm::SimulationOptions::uf_k3 = 0.015 |
Unsteady friction coefficient k3 (dimensionless).
Brunone-type coefficient; used only when unsteady_friction != 0. Paper-calibrated range 0.005–0.020 (tested to 0.045).
| int openswmm::SimulationOptions::unsteady_friction = 0 |
Unsteady friction model: 0=NONE (default, inert), 1=VITKOVSKY.
Adds the Pinto/Vasconcelos/Soares (2025) unsteady-friction source term S_fu = (k3/g)(dV/dt + c·sgn(V)|dV/dx|) with regime-dependent celerity c to the momentum equation. CONSUMED BY THE FV SOLVER as of issue #156 Phase 2 (copied into FvOptions by Router::initFv; applied by kernels::ufUpdate after the steady-friction stage, with the convective term precomputed per substep). Under DYNWAVE the key is still parsed, round-tripped and echoed but inert — the dynamic wave source term is Phase 3.
| double openswmm::SimulationOptions::variable_step = 0.75 |
Courant factor for variable time stepping (0 = fixed step).
Legacy default: 0.75 (enabled).
| int openswmm::SimulationOptions::virtual_junction_momentum = 0 |
Virtual-junction momentum treatment. Always 0 (BASIC).
BASIC applies zero storage, the shared junction sigma and cross-junction upwinding of area/hydraulic radius; it transmits no cross-junction convective momentum. FULL, which added the dq4_j correction, is RETIRED (2026-08-14): the term was sign-inverted relative to the per-link convective term and applied to both adjacent links, destroying 224-325 % of the routed volume on SWASHES macdonald-periodic. The keyword is still parsed, warns, and is treated as BASIC; the field is kept only so existing writers/readers keep their layout.
| bool openswmm::SimulationOptions::water_age = false |
[OPTIONS] WATER_AGE ON|OFF — transported water-age tracking (water age plan §1, reserved species WATER_AGE).
A1a scope: the age species rides the EULERIAN_ARD mesh (unit zero-order aging + volume-weighted mixing); per-source initial ages come from the waterage component's [WATER_AGE_SOURCES]. LEGACY-engine age arrives with A1b and warns until then.
| double openswmm::SimulationOptions::water_density = 1000.0 |
Water density, kg/m³ ([OPTIONS] WATER_DENSITY; CSH Table 4.1).
H2. Load-bearing from this phase on: it sets the weight of a surface flux against advected heat. H1 deliberately shipped without it because with no fluxes it cancelled identically and no gate could observe its value.
| double openswmm::SimulationOptions::water_specific_heat = 4184.0 |
Water specific heat capacity, J/kg/°C (WATER_SPECIFIC_HEAT_CAPACITY).
| double openswmm::SimulationOptions::wet_step = 300.0 |
Wet-weather runoff timestep in seconds.
| double openswmm::SimulationOptions::wind_func_coeff_a = 1.505e-8 |
Wind-function coefficients (WIND_FUNC_COEFF_A / _B), CSH Table 4.1 — f(w) = a + b·w, Dunne & Leopold (1978) defaults.
| double openswmm::SimulationOptions::wind_func_coeff_b = 1.6e-8 |
| double openswmm::SimulationOptions::wind_speed[12] = {0,0,0,0,0,0,0,0,0,0,0,0} |
Monthly wind speed values (12 months).
| int openswmm::SimulationOptions::wind_type = 0 |
Wind speed type: 0=MONTHLY, 1=FILE.
| bool openswmm::SimulationOptions::write_absolute_paths = false |
Slice IO-4 opt-out: emit external-file paths verbatim absolute.
Default (false) makes InpWriter rebase every external-file reference relative to the destination .inp directory for portability. Set true to disable rebasing — paths are emitted in their resolved absolute form. Used by power users locked to legacy tools that don't accept relative paths in .inp. See IO_PORTABILITY_PLAN.md §1A & §5.4.