PYSWMM lidcontrols.py Summary
Below is an extended summary of this module, highlighting its purpose, class structure, and how it facilitates the management of Low Impact Development (LID) usage data for SWMM subcatchments:
Purpose and Context
This module provides a high-level, Pythonic interface to the LID usage section of a SWMM model. In particular, it helps users discover which subcatchments have LIDs, how many LID units exist per subcatchment, and the parameters and real-time results of each LID unit. By building on PySWMM’s low-level API (toolkitapi), these classes enable both pre-simulation configuration and dynamic, mid-simulation manipulation of LID settings (for those parameters allowed to be changed at runtime).
Key ideas:
- One LidGroups object corresponds to all subcatchments in the model.
- Each LidGroup object is associated with one subcatchment but may contain multiple LID units.
- A LidUnit represents a single LID instance (e.g., “Permeable Pavement #1”) in that subcatchment, exposing both configuration parameters (like area, drain node) and runtime results (like drain flow or evaporation).
Class-by-Class Overview
1. LidGroups
- Role: Acts as a top-level container for LID usage across all subcatchments in the SWMM model.
- Initialization:
lid_groups = LidGroups(simulation)- Checks if the SWMM model is open; raises
PYSWMMExceptionotherwise.
- Checks if the SWMM model is open; raises
- Key Behaviors:
- Iteration (
__iter__,__next__):- Iterates over each subcatchment in the model by ID, returning a LidGroup object.
- Uses
__len__to report the total number of subcatchments.
- Lookup (
__getitem__):lid_groups[subcatchment_id]yields the LidGroup for that specific subcatchment, if it exists.
- Contains (
__contains__):- Enables expressions like
"S1" in lid_groupsto check if subcatchment “S1” is valid.
- Enables expressions like
- Iteration (
Example:
for group in LidGroups(sim):
print(group) # Prints each subcatchment ID that has LID usage defined
2. LidGroup
- Role: Represents all LID units associated with a single subcatchment.
- Initialization:
LidGroup(model, "SubcatchmentID")- Ensures that the subcatchment exists and the model is open.
- Key Behaviors:
- Iteration / Lookup (
__iter__,__next__,__getitem__):- Iterates through each LID unit index (0, 1, 2, …) in the subcatchment, yielding LidUnit objects.
lid_group[i]returns thei-th LID unit in that subcatchment.len(lid_group)reveals how many LIDs are defined in this subcatchment.
- Aggregated Results:
pervious_area: Total pervious area associated with these LID units.flow_to_pervious: Flow directed from the LID(s) to pervious surfaces.old_drain_flow,new_drain_flow: The previous and current drain flows, summed across all LID units in this subcatchment.
- Iteration / Lookup (
- Typical Use:
lid_group_S1 = LidGroups(sim)["S1"] print(len(lid_group_S1)) # e.g., number of LID units in subcatchment S1 for lid_unit in lid_group_S1: print(lid_unit.index, lid_unit.unit_area)
3. LidUnit
- Role: Encapsulates a single LID instance (e.g., one green roof, one bioretention cell) within a subcatchment.
- Initialization:
LidUnit(model, subcatchment_id, lid_index)lid_indexis the 0-based index for a particular LID usage record in that subcatchment’s[LID_USAGE]section.
- Sub-Components:
surface,pavement,soil,storage: Layer-specific objects (defined inpyswmm.lidunits) that manage the physical parameters of each layer (thickness, porosity, infiltration, etc.).water_balance: Provides aggregated infiltration, evaporation, drain flow, etc.
- Key Properties:
- LID Setup:
unit_area,full_width,initial_saturationfrom_impervious,from_pervious: Fraction of runoff from impervious/pervious areas that is treated by this LID.
- Routing and Drainage:
drain_subcatchment,drain_node: Where underdrain flow is directed (other subcatchment or a node).to_pervious: Whether outflow is sent to a pervious area (1) or not (0).
- Runtime Results:
dry_time: Time since last rainfall (in seconds).old_drain_flow,new_drain_flow: Drain flow amounts in previous vs. current time step.evaporation,native_infiltration: Real-time rates for evaporation and infiltration.
- IDs & Indices:
index: The ID for the LID Control (matchingObjectType.LID) in the overall model.lid_control: Returns the textual ID of the LID control used (ifindexis known).
- LID Setup:
Typical Workflow:
lid_group_s1 = LidGroups(sim)['S1']
lid_unit0 = lid_group_s1[0]
# Check or adjust parameters before/after simulation
lid_unit0.unit_area = 200 # Set area in square feet (or model units)
lid_unit0.drain_node = "J5" # Route underdrain flow to node J5
# During the simulation
for step_idx, step_time in enumerate(sim):
if step_idx == 100:
# Switch drain node mid-run
lid_unit0.drain_node = "J6"
Typical Use Cases
- Pre-Run Configuration:
- Adjusting the LID area, fraction of impervious/pervious inflow, or drain routing node to experiment with different LID designs.
- Dynamic Control:
- During a SWMM simulation, changing
drain_nodeor other runtime-adjustable parameters to test how real-time management might affect system performance.
- During a SWMM simulation, changing
- Data Extraction:
- After or during the run, retrieving LID results like
new_drain_floworevaporationhelps measure performance, infiltration capacity, or water balance.
- After or during the run, retrieving LID results like
Key Takeaways
- Hierarchical Design
LidGroups>LidGroup>LidUnitmirrors SWMM’s data organization:- Model has multiple subcatchments (each subcatchment can have LID usage)
- Each subcatchment’s LID usage can have multiple LID units.
- Property Access
- Clear “getter” and “setter” properties for each LID parameter.
- Some parameters (e.g.,
drain_subcatchment,drain_node) can be altered during simulation. Others (e.g.,unit_area) must typically be set before starting the simulation.
- Integration with
pyswmm.lidunits- A
LidUnitautomatically includes references to sub-layer classes (Surface,Pavement,Soil,Storage,WaterBalance), which further expands the user’s control over LID components.
- A
Final Notes
- Error Handling:
- Raises
PYSWMMExceptionif the model is not open or if an invalid subcatchment/LID unit index is requested.
- Raises
- Scalability:
- By iterating over
LidGroupsand eachLidGroup, this design gracefully handles large models with many subcatchments and multiple LID units per subcatchment.
- By iterating over
- Real-Time Flexibility:
- The code supports dynamic adjustments to certain LID parameters mid-simulation, enabling advanced scenario testing and real-time control strategies in PySWMM.
Overall, these classes significantly streamline the process of configuring and analyzing SWMM’s LID usage in Python, bridging the gap between low-level toolkit functions and high-level environmental modeling needs.