<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-335789943869477383</atom:id><lastBuildDate>Tue, 24 Feb 2026 22:16:48 +0000</lastBuildDate><category>#INFOSWMM</category><category>#SWMM5</category><category>InfoSWMM</category><category>SWMM 5</category><category>FY2024</category><category>ARC GIS</category><category>ChatGPT</category><category>#InfoSewer</category><category>FY2023</category><category>SWMM5</category><category>Hydrology</category><category>Water Quality</category><category>H2OMAP SWMM</category><category>InfoSWMM_SA</category><category>InfoSewer</category><category>Pumps</category><category>LID</category><category>Storage</category><category>Innovyze</category><category>Surcharge</category><category>2D</category><category>St. Venant</category><category>Boulos</category><category>Hydraulics</category><category>Groundwater</category><category>Force Mains</category><category>WEIRS</category><category>RTK</category><category>#SUSTAIN</category><category>ORIFICE</category><category>RTC</category><category>SENSITIVITY</category><category>General</category><category>Infiltration</category><category>AQUIFER</category><category>#INFOWORKS_ICM</category><category>Horton</category><category>ICM</category><category>Green Ampt</category><category>Lew Rossman</category><category>SWMM4</category><category>Release</category><category>SCS</category><category>DBF Files</category><category>Dickinson</category><category>BMP</category><category>Sustain</category><category>SWMMLive</category><category>InfoSewer IEDB</category><category>Inside SWMM5</category><category>SWMM 5.2.2 Code</category><category>SWMM3</category><category>Wayne Huber</category><category>InfoWater</category><category>#Inside_SWMM5</category><category>ChatGPTInfoSewer IEDB</category><category>H20Calc</category><category>ICM SWMM</category><category>Boonsri</category><category>H20MAP SEWER</category><category>InfoMaster</category><category>#iNFOSWMM Sustain</category><category>How to use the Flow Splitter in InfoSewer for Dendritic Networks</category><category>#SINGAPORE</category><category>A Basic InfoSewer Wet Well</category><category>Advanced Labeling in InfoSWMM or H2OMAP SWMM to show MM or IN on a HGL Plot</category><category>Aquifers in SWMM 5</category><category>Arc Map If Statements for Showing Flooding in InfoSWMM</category><category>AutodeskTechnologist</category><category>Create Watersheds Using InfoSWMM Subcatchment Manager</category><category>Domain Manager and Facility Manager in InfoSewer to Find the CE</category><category>Dry Weather Flow in InfoSWMM and H2OMap SWMM</category><category>EPANET</category><category>Export from WeatherUnderground using the CSV File Export Option to InfoSWMM</category><category>How is the Soil Saturated Conductivity Used in SWMM 5 Green-Ampt?</category><category>How is the St Venant Equation Solved for in the Dynamic Wave Solution of SWMM 5?</category><category>How to Import the SWMM 5 Report File as a Layer in infoSWMM</category><category>How to Make a SWMM 5 Calibration File from InfoSWMM</category><category>How to Use Trace Upstream</category><category>How to Use the Arc Map Editor in InfoSWMM</category><category>How to Use the SWMM 5 Excel Tool with InfoSewer CSV Files</category><category>How to change the Maximum Infiltration in a DB Table of InfoSWMM and H2OMAP SWMM</category><category>ICM and InfoSewer</category><category>InfoSWMM (d/D v. Surcharge d/D)</category><category>InfoSWMM 2D Report Variables</category><category>InfoSWMM ISDB</category><category>InfoSWMM and H2OMAP SWMM</category><category>InfoSWMM or InfoSewer</category><category>InfoSewer Flow Attenuation Sensitivity</category><category>InfoSewer Inflow Control for a PUMP</category><category>InfoSewer Maximum Number of Segments Sensitivity</category><category>Manhole Elevations in InfoSWMM and SWMM 5</category><category>SWMM 5 Weir RTC Rules</category><category>Steps to take and rules for Cloning Datasets in InfoSWMM and InfoSewer</category><category>Suds</category><category>Summary</category><category>Wikipedia Traffic for THE SWMM versus EPANET Articles</category><category>#EPANET</category><category>#PCSWMM</category><category>#RTFM and WTFM How to write a fine modeling manual worth reading (ideas)</category><category>#SWMM4</category><category>10) and H20MAP SWMM v10 Updated for the new SWMM 5.0.022 Engine</category><category>3 Types of Subcatchment Flow in SWMM 5</category><category>3D and 2D Bar graphs of the Process components in InfoSWMM</category><category>A SWMM 5 Model made from the Art of Jack Yerka</category><category>A rise in Pipe Inverts Across a SWMM 5 Node</category><category>Advanced SWMM 5 import into InfoSWMM and H2OMAP SWMM</category><category>All Possible Culverts Example Model in SWMM5</category><category>An Example of the Importance of the Term DQ4 in the SWMM 5 St Venant Solution</category><category>Aquifer and Groundwater Objects in SWMM 5</category><category>Average Residence time in InfoSWMM and H2OMAP SWMM</category><category>Case Study</category><category>Conduit Lengthening in SWMM 5</category><category>Continuous Simulation using SWMM 5 LID and Groundwater Features in a Linked 1D/2D Network using InfoSWMM 2D for a 50 Year Period</category><category>Convolution of the RDII UH from R</category><category>Create Watershed Data Using InfoSWMM Subcatchment Manager</category><category>Culverts</category><category>DWF Scale Factor in SWMM 5 for entering Population Data</category><category>Detention Basin Basics in SWMM 5</category><category>Dual Drainage in SWMM 5</category><category>Elevation Interpolation from a Contour in H2OMAP SWMM</category><category>Example  DUPUIT-FORCHHEIMER APPROXIMATION FOR SUBSURFACE FLOW Model in SWMM 5</category><category>Example Dual Drainage SWMM 5 model</category><category>Example FM SWMM 5 model with and without Surcharge Depth</category><category>Example Groundwater Model in SWMM 5</category><category>Example SWMM 5 Model for Activated Sludge</category><category>Example SWMM 5 Snowmelt Model</category><category>Exit Other and Entrance Loss Values in SWMM 5</category><category>Flow Dividers in SWMM 5 Dynamic Routing</category><category>Flow Units In InfoSWMM may be different then the Output Link Flow Units</category><category>Force Main Friction Loss in InfoSWMM and the Transition from Partial to Full Flow</category><category>Global Dry Weather Flow Reduction in InfoSWMM and H2OMAP SWMM</category><category>H2OMAP SWMM or InfoSWMM Model</category><category>H2OMAP Sewer and InfoSewer DB Queries to find Loading Manholes</category><category>H2OMAP Sewer and InfoSewer Water Quality Options</category><category>Here&#39;s a summarized table for Section 3.10.3 &quot;Unit Hydrograph Method&quot; from the SWMM User&#39;s Manual</category><category>Hierarchy of Your Network in InfoSWMM and H2OMAP SWMM</category><category>High and Low Estimates of InfoSWMM/ICM Subcatchment Dimension for SWMM Hydrology</category><category>History of SWMM to the Year 2005</category><category>How Does Green Ampt Cumulative Event Infiltration work in SWMM 5?</category><category>How Does Horton Infiltration Work in SWMM 5?</category><category>How Does a TYPE1 Pump Work in SWMM 5?</category><category>How Dry Weather Flow is Used in InfoSWMM at a Node</category><category>How InfoSWMM and H2oMAP SWMM Reads CUHP Hydrographs</category><category>How are Negative Transect Elevations Used in SWMM5?</category><category>How do V-notch weirs work in SWMM 5?</category><category>How does the Infiltration Maximum Time to Drain the Upper Soil Zone Work in SWMM 5 Green Ampt?</category><category>How is Capillary Suction Head Used in SWMM 5 Green-Ampt?</category><category>How is RDII Storage Simulated in SWMM 5?</category><category>How is RHO computed for a Link in SWMM 5?</category><category>How is the Mass Balance Calculated in the SWMM 5 Groundwater Component?</category><category>How is the Maximum Link Flow Applied in SWMM 5?</category><category>How is the Orifice Setting Used in SWMM 5 RTC Rules?</category><category>How is the Volume Calculated in the SWMM 5 Groundwater Component?</category><category>How to Approximate a Timer in the RTC Rules of SWMM 5</category><category>How to Calculate the Freeboard of a Node in InfoSWMM/H2OMAP SWMM from the Model Results</category><category>How to Compare the Output Manager Statistics in H2OMAP SWMM to the SWMM 5 Output Text File</category><category>How to Compile SWMM 5 in Visual Studio 2010 Express</category><category>How to Copy from a SWMM 5 Table to Excel</category><category>How to Create an InfoSWMM model from CSV Files</category><category>How to Create an InfoSWMM model from CSV Files Alternate Method</category><category>How to Decide on a Time Step in InfoSWMM</category><category>How to Determine if your model is Unstable in SWMM 5 or InfoSWMM</category><category>How to Easily Make a Smaller Model in InfoSWMM Using Trace Upstream Network</category><category>How to Edit the Subcatchment Polygons in InfoSWMM with Arc Map</category><category>How to Export all of your Data to a Shapefile Using InfoSWMM</category><category>How to Have both Depth and Elevation for the Node Rim Elevation in InfoSWMM</category><category>How to Import Subcatchments from GIS into InfoSWMM</category><category>How to Make Contours in InfoSWMM and H2oMAP SWMM</category><category>How to Make Icons and Expand the Toolbars in infoSWMM and InfoSewer</category><category>How to Make a New Project INI file for InfoSewer</category><category>How to Make a SWMM 5 Interface File from InfoSWMM</category><category>How to Make a Smaller Model out of a Large Model in InfoSWMM</category><category>How to Make an Excel Fixed Width File from SWMM 5</category><category>How to Save Node and Link Summary Tables in H2OMAP SWMM to Shapefiles</category><category>How to Save Selected Nodes and Links in InfoSWMM</category><category>How to Set Up Hot Start Files in InfoSWMM for a Fixed Boundary Outfall</category><category>How to Set Up an InfoSWMM 2D Simulation Polygon and Mesh</category><category>How to Subdivide Subcatchments in SWMM 5</category><category>How to Understand the OUT directory in InfoSWMM and InfoSWMM SA</category><category>How to Use Bing Maps in InfoSWMM as a Basemap</category><category>How to Use Domain Manager in InfoSWMM to Reduce the Output File Size</category><category>How to Use Two Control Curves in SWMM 5 to Simulate a Head Difference Rule</category><category>How to Use the Map Display for the Maximum Adjusted d/D  or Maximum q/Q in an EPS InfoSewer Simulation</category><category>How to Use the Output Relate in Excel using H2OMAP SWMM</category><category>How to add a volume variable to SWMM 5</category><category>How to change the background color and data view in InfoSewer and InfoSWMM</category><category>How to divide the Inflow at a Node in InfoSWMM</category><category>How to make a shape file from a Output Relate in InfoSWMM</category><category>How to see the effect of the Pump Setting in the RTC Rules of InfoSWMM and H20MAP SWMM</category><category>How to see what you have in the various scenarios of InfoSWMM</category><category>How to use SWMM 5 DOS to make an Output Table in the RPT file</category><category>How to use the Report Feature of the HGL Plot in InfoSWMM</category><category>Huff Distribution SWMM 5 Model</category><category>Hysteresis Effect in the Link Flow versus Depth Relationship in SWMM 5</category><category>INFOSEWER and INFOWATER</category><category>Import of Sections from SWMM 5 into InfoSWMM and H2oMAP SWMM</category><category>Importing a Link Shapefile into InfoSWMM via GIS Gateway</category><category>Infiltration Data in SWMM 5</category><category>Inflow Time Series in InfoSewer</category><category>InfoDrainage</category><category>InfoSWMM 11 (for ArcGIS 9</category><category>InfoSWMM 2D Layer Properties and Mesh ID</category><category>InfoSWMM Report Manager and Field Statistics</category><category>InfoSWMM and H2OMAP SWMM Import and Export of HEC-RAS Geometry Data</category><category>InfoSWMM and H2oMAP SWMM Facility Manager</category><category>InfoSWMM and H2oMAP SWMM Map Display of d/D</category><category>InfoSWMM and H2oMAP SWMM Map of the Maximum Surcharge Depth Over Highest Pipe Crown</category><category>InfoSewer - Minimum Travel Distance</category><category>InfoSewer By Discharge Control for a PUMP</category><category>InfoSewer Inflow Control for a Pump with a Pump Curve</category><category>InfoSewer Minimum Travel Time Sensitivity</category><category>InfoSewer NDHLINKS.DBF File in the IEDB Folder</category><category>InfoSewer and H2OMAP Sewer New Features in 2011/2013</category><category>InfoSewer and InfoSWMM Nodes</category><category>InfoSewer to InfoSWMM Import Tips</category><category>Innovyze Further Expands RDII Analyst Functionality</category><category>Known and Unknown Variables in the Node Continuity Equation of SWMM5</category><category>Link Area Types in SWMM 5</category><category>Link Iterations in the SWMM 5 Dynamic Wave Solution</category><category>Link Simulated Parameters used in either the Normal Flow or St Venant Equation of SWMM 5</category><category>Link and Node Basics in SWMM 5</category><category>Low Impact Development Options in H2OMAP SWMM and InfoSWMM</category><category>Mass Balance for Water Quality in SWMM 5</category><category>Mass and Concentration Water Quality Loadings in SWMM 5</category><category>Maximum HGL Head Class in InfoSWMM AND H2OMAP SWMM</category><category>Modeling H2S in InfoSWMM</category><category>Node Comparison in InfoSWMM and InfoSewer</category><category>Orifices</category><category>Output Statstics Manager to find negative flows in InfoSWMM</category><category>Pump / Force Main System in InfoSWMM and SWMM 5</category><category>Pump Volume per Pump Event in SWMM 5</category><category>Pump and  Force Main System</category><category>Qfull in SWMM 5 for various levels of y/yFull in a Circular Pipe</category><category>RDII Parameters for SWMM 5</category><category>RDII or Tri Triangular Unit Hydrograph in InfoSewer</category><category>Reading the Output of Older SWMM 5 versions in Newer SWMM 5 Versions</category><category>Release of SWMM 5.1.004</category><category>SQL</category><category>SWMM 4 and SWMM 5 St. Venant Solutions Contrasted</category><category>SWMM 5 Aquifer has a Saturated and Unsaturated Zone</category><category>SWMM 5 Arrow Direction Question</category><category>SWMM 5 Clocktime RTC Rules for Pumps</category><category>SWMM 5 Controls in Matrix Form</category><category>SWMM 5 Inlet Control Culvert Equations</category><category>SWMM 5 Leaping Weir Example</category><category>SWMM 5 Link Time Step Calculations</category><category>SWMM 5 Precipitation Options</category><category>SWMM 5 Pump Curve Head/Flow Curves (1)</category><category>SWMM 5 QA and Application Manuals on the EPA Web Site</category><category>SWMM 5 Subcatchment Runoff and Depth Relationship</category><category>SWMM 5 Threshold Groundwater Elevation</category><category>SWMM 5.2 APP</category><category>SWMM5 Groundwater Flow Components</category><category>SWMM5 Help File</category><category>SWMM5 Link Upstream Weighting</category><category>SWMM5 on Wikiland and Wikipedia</category><category>Saving an Output Relate in InfoSWMM directly to Excel using Arc Tool Box</category><category>Sensitivity Analysis in InfoSWMM and H2OMAP SWMM</category><category>Setting New Standard for Sanitary and Combined Sewer System Model Calibration</category><category>Singapore - Catching Every Drop of Rain</category><category>Siphon Simulation in SWMM 5 and InfoSWMM</category><category>Spearheading New Era in GIS-Centric Smart Wastewater and Stormwater Modeling</category><category>St. Venant Terms in SWMM 5 and how they change for Force Mains</category><category>Steps in Using RDII Analyst for InfoSWMM</category><category>Stopping Tolerance in InfoSWMM</category><category>Surcharged Node and the Link Connection in SWMM 5</category><category>T and K in SWMM 5</category><category>The Groundwater flow in SWMM 5 Groundwater</category><category>The Internal Green Ampt Parameters</category><category>The Pump summary table of SWMM5.0.022 and the Percent Time off Columns</category><category>The SWMM 4 Dynamic Wave Solution</category><category>The SWMM 4 Dynamic Wave Solution for ISOL=0</category><category>The Structure of InfoSWMM in Arc Map</category><category>The Three Flows in SWMM 5 for a Link</category><category>The Total flow from a Subcatchment in SWMM 5</category><category>The relationship between the rainfall</category><category>Three Flow Divider Link Example in SWMM 5</category><category>Three Hidden Secrets to Speeding up your SWMM 5</category><category>Three Inertial Term Options in SWMM 5 and InfoSWMM/H2OMAP SWMM</category><category>Total Surcharge Time vs Total Time Above Rim Elevation in InfoSWMM</category><category>Types of Stormwater Inlets from HEC12 and HEC22</category><category>Use the SWMM 5 Scatter Graph to show the Pump Curve used during the Simulation</category><category>Water Quality Treatment Removal Variables in SWMM5</category><category>Weather InfoGraphics</category><category>Weir and Orifice Flow Equations for a Weir in SWMM 5</category><category>Weirs in InfoSWMM and SWMM 5</category><category>What Node and Link Invert Elevations Does SWMM 5 Use?</category><category>What are the LID Control Flow Source Options in SWMM 5?</category><category>What are the Types of Force Mains (FM) in SWMM 5?</category><category>What are the Units for the five St. Venant Flow Terms in SWMM 5 and InfoSWMM?</category><category>XPSWMM</category><category>total losses from the previous area</category><category># Tips for a Good 2D Meshing Experience 📏</category><category>#ArcGIS Tools such as Catalog</category><category>#Blue-#Green #Cities</category><category>#INFOSEWER in #ARCMAP for the @Innovyze #ARCGIS Products</category><category>#INFOSWMM Genetic Algorithm Suite Programs Calibrator and Designer</category><category>#InfoWorks_ICM 7.0 comes with the Clark Unit Hydrograph routing model</category><category>#Innovyze #InfoWater #2D: Predict Impact of #Water Spill from #WaterMain Breaks</category><category>#Inside_SWMM5  A look at the three Froude Numbers in a #SWMM5 Link</category><category>#LID Defaults from the EPA SWC</category><category>#PID</category><category>#SWMM 5 LID 185 message</category><category>#SWMM3</category><category>#SWMM3 and #SWMM4 Acknowledgments</category><category>#SWMM5 #EPANET Redevelopment on Github</category><category>#SWMM5 - Delphi Pascal unit that imports a SWMM project&#39;s data from a formatted text file</category><category>#SWMM5 1-D St Venant Equation</category><category>#SWMM5 Delphi Pascal unit that manages the list of external tools made available through the Tools item on the Main Menu.</category><category>#SWMM5 Delphi Pascal unit that retrieves a time series of measured observation data from a calibration file for use in a time series plot</category><category>#SWMM5 Embarcadero® Delphi XE7 Options #1</category><category>#SWMM5 Storm Water Management Model: Performance Review and Gap Analysis</category><category>#SWMM5 has Topological sorting of conveyance network links</category><category>#SWMM5 on #GITHUB and 21.CO Machine Learning</category><category>#SWMM6 - A Sustainable Center for Crowd-Sourced Water Infrastructure Modeling</category><category>#YOUTUBE and #INFOSEWER</category><category>1000 Year Event As Rescuers Search For 500 Missing People</category><category>1000 Year Simulation with Rainfall in SWMM5</category><category>2 Code runhyd in EPANET.C</category><category>20 Interesting Features of Innovyze H2OMap Sewer</category><category>2004 Hurricane Ivan in Pittsburgh</category><category>2014 Stormwater &amp; Urban Water Systems Modeling Conference</category><category>2016 #INFOSWMM Tweets about #HYDROLOGY #CSO #SWMM5</category><category>2026 - from ESRI Website</category><category>29 – 30 October 2015 | Beirut</category><category>29-30 أكتوبر عام 2015 | بيروت، لبنان التعليم الهندسي من أجل التنمية المستدامة</category><category>2D and SWMMLive Slideshare from @Innovyze</category><category>3 Types of Manholes in SWMM 5 and InfoSWMM</category><category>4 Cross Sectional Areas in a Link but one Mid Point Flow</category><category>@Innovyze #AWWA Journal of the American Water Works Association</category><category>@Innovyze User forum where you can ask questions about our Water and Wastewater Products</category><category>@InnovyzeTim performing a #SCADAWatch presentation at #ICMLiveUserDay @Innovyze #LiveSystem #water #SCADASystem</category><category>@Innovze has RDII Flow at the Subcatchment Level in ICM and IWCS and at the node level in InfoSWMM and H2OMap SWMM.</category><category>@RDICKINSON for @Innovyze on @Medium or my Modeling Posts on Medium</category><category>A Bet on @21&quot; w/ guest @balajis EP8: &quot;Hit or Stay</category><category>A Canopy of Man-Made Solar-Powered Supertrees Flourishes in Singapore</category><category>A Good Groundwater Infiltration Module Blog in #Infoworks_ICM</category><category>A Summary of Blogs on Force Mains and Pumps in InfoSWMM and InfoSewer</category><category>A Top Ten List of Advantages of InfoSWMM over SWMM 5 (IMO)</category><category>A Two-Dimensional Quality Mesh Generator and Delaunay Triangulator - InfoSWMM 2D Reference</category><category>A Video Roundup of What’s Happening at @ASCE (with @Innovyze president featured)!</category><category>A Visual Studio Compiler for #SWMM5 Note</category><category>A Workaround to find the number of LinkedIn Articles you Wrote</category><category>A box folder with more complicated SWMM 5 QA QC files</category><category>A charming little rain garden shines on Mt. Washington</category><category>A collage of LID Types in InfoSWMM and InfoSWMM Sustain along with the Process Layers</category><category>A common look to the Icons in #INFOWATER</category><category>A comprehensive explanation of how minimum travel distance relates to link length in InfoSewer</category><category>A disturbance in a water distribution system</category><category>A feedback loop involves four distinct stages</category><category>A few connected tweets about #LID or #SuDS</category><category>A few of the many fantastic features of embedding InfoSWMM inside of ESRI Arc GIS</category><category>A few suggestions for InfoSWMM RAM if a DEM is Not Acceptable to Arc Map</category><category>A great twitter header image from our @Innovyze Channel Partners in Spain @sp_infoworks</category><category>A map of how Keep Ignore and Dampen are used in #INFOSWMM and #SWMM5</category><category>A midjourney AI imaginary anamorphic water pipe</category><category>A new API way of looking at this Blog</category><category>A note about Lew Rossman the creator of EPANet</category><category>A very moving  heart-felt speech from Dr. Paul Boulos...a tribute to the #civilengineer #asce</category><category>A visual view of the CDM SWMM5 GUI Circa 2007</category><category>A workaround for Hydrology only models that send all subcatchment flow to the pervious area.</category><category>AAEES 2015 Innovyze Excellence in Computational Hydraulics/Hydrology Award Presented to Carnegie Mellon University Doctoral Student</category><category>AAEES 2016 Innovyze Excellence in Computational Hydraulics/Hydrology Award Presented to Colorado School of Mines Doctoral Student</category><category>AAEES 2017 Innovyze Excellence in Computational Hydraulics/Hydrology Award Presented to Dr. Qian Zhang</category><category>ADVENTURERs are natural storytellers</category><category>AI Deep Think on the History of EPASWMM</category><category>AI Prompt for Generating a SWMM5 inp file with Rules</category><category>AI Rivers of Wisdom about ICM SWMM</category><category>ALCOSAN Wet Weather Plan Link</category><category>ASCE</category><category>Adding New View Variables To the SWMM 5 Delphi and C Code</category><category>Additional Features in InfoSWMM and InfoSWMM SA</category><category>Additional SWMM 3 and 4 Converter Information</category><category>Additional SWMM4 and SWMM5 files on Box</category><category>Adjusted LinkedIn Content Schedule (High-Frequency Approach) for SWMM Enablement</category><category>Advanced Force Main Solution and Gravity Main Attenuation in InfoSewer for better Pump</category><category>Advanced Force Network Support in InfoSewer for Steady State and EPS</category><category>Advanced Graphics for InfoSWMM v13</category><category>Advanced Graphs in InfoSWMM v14 and H2OMap SWMM v14</category><category>Advances in artificial intelligence: deep learning</category><category>Adverse Slope Convention in SWMM 5</category><category>Adverse sloped links in SWMM 5 or InfoSWMM</category><category>Alcosan (Pittsburgh Metro Area) South Africa and Singapore Infographics News</category><category>All GroundWater Equations in #SWMM5 and #InfoSWMM</category><category>All of the rivers in the USA</category><category>Alternative Leaping Weir Example in SWMM 5 and InfoSWMM</category><category>An  Important Tweet from @InnovyzePatrick about the Innovyze Blogs and Forums</category><category>An Implicit-Explicit (IMEX) Picard Scheme and Adaptive Time Stepping Algorithm Applied to the Hydraulic Calculations in SWMM 5</category><category>An animated image of the Rainfall by Month on Planet Earth Rainfall</category><category>An easy test for SWMM5 versions using the Status Report Message for Unrecognized Keywords in past SWMM5 GUI</category><category>An important difference between Capacity d/D and Surcharge d/D in InfoSWMM</category><category>An infographic on Nodes in #SWMM5</category><category>Analysis Option Keywords in the SWMM5 Engine Code - with Emojis</category><category>Annotated PID Controller in SWMM5 and InfoSWMM</category><category>Annual International Conference on modeling urban water systems</category><category>Anyone else notice almost all the presentations come back to water? GIS is cool</category><category>Applicazione di tecnologie BMP ai sistemi di drenaggio urbano</category><category>Approaches for representing a culvert within the 2D domain (ICM)</category><category>Arc GIS Tools for 2D Polygon Processing</category><category>Arc Map Backwards Compatibility</category><category>Arc Toolbox expand the power of #INFOSWMM #2D</category><category>ArcGIS backwards conversion for INFOSWMM</category><category>ArcMap</category><category>ArcToolBox GIF in InfoSewer and InfoSWMM</category><category>Area Scaling Factor in #INFOSWMM and #H20MAPSWMM</category><category>Area Types in SWMM 5 for Links with Offsets</category><category>Area of a Manhole in #SWMM5</category><category>Autodesk</category><category>Autodesk Innovyze</category><category>Autodesk Innovyze InfoWorks ICM of Great Value?</category><category>Average Number of Node Iterations</category><category>Average Number of Node Iterations in SWMM 5 Dynamic Wave Solution</category><category>Back-to-back La Niñas cooled globe and influenced extreme weather in 2011</category><category>Background: How SWMM 5 Handles Flow Direction and Node-Link Convention</category><category>Balaji Ideas for conducting conferences in General from his Twitter Feed</category><category>Balaji Srinivasan at Startup School 2013 - Ideal Speech</category><category>Banach-Tarski paradox and SWMM5 modeling.</category><category>Based on the information in Section 3.10.1 &quot;Runoff Coefficient Method&quot; from the SWMM User&#39;s Manual</category><category>Basic Files in InfoSewer and InfoSWMM</category><category>Batch Simulation for InfoSewer InfoSWMM or InfoWater H2oMap SWMM H2OMap Sewer and H2OMap Water</category><category>Batch runs for  InfoSewer InfoSWMM or InfoWater</category><category>Beautiful-equations-how-insects-walk-on-water-and-galaxies-form  Navier-Stokes</category><category>Benefits of Urban Trees</category><category>Better Preparing Industry-Ready Workforce and Shaping the Future</category><category>Blog strategy to explain complex modeling concepts to non-modelers</category><category>Bob Dickinson at the CDM CSD Consulting Division in 2003</category><category>Bottom and Side Outlet Orifices in SWMM 5</category><category>Bottom-up technical blogs can be highly beneficial for engineering</category><category>Box File Links for SWMM4 and SWMM5 Files</category><category>Box SWMM 5 Related Files</category><category>Breaking Down the St Venant Terms in SWMM5 🌊💧</category><category>Breakthrough Solution for Wastewater Master Planning</category><category>Brick by Brick LEGO</category><category>But the Dutch Created the Netherlands</category><category>CDM and Wilbur Smith Associates Proudly Serving Clients as CDM Smith</category><category>CFL Time Step for Pumps in SWMM5</category><category>CN Infiltration for 2D Meshes</category><category>CN Modeling Caveats</category><category>CSV File DWF Suggestion for Importing SWMM5 Flows to ICM</category><category>Calibration Concepts from Serendipity</category><category>Calibration data in H2OMAP SWMM</category><category>Camtasia version of Innovyze H2OCalc</category><category>Canada Day and a SWMM 5 Model with Flow Dividers</category><category>Capacity Limited Links in SWMM 5</category><category>Caveats and Tips</category><category>Challenges of modeling stormwater transients in developing countries by Daniel Allasia et al</category><category>Changes from SWMM Version 4 to XPSWMM</category><category>Changing the top of the EPA SWMM 5 GUI Window Caption to the current EPA Version using Delphi XE7</category><category>Channel ODIC ICM Import</category><category>Chapter 3 of RAH&#39;s (Robert Heinlein) Have Space Suit Will Travel - Technical Writing</category><category>ChatGPT Plus and You</category><category>ChatGPT Version of the SWMM5 Wikipedia Page History</category><category>ChatGPT Version of the SWMM5 Wikipedia Page Introduction</category><category>ChatGPT and Domain Knowledge</category><category>Check out my animated twitter snapshot</category><category>Cities Are a New Kind of Complex System: Part Social Reactor Part Network</category><category>Clark&#39;s method for runoff estimation</category><category>Climate-proofing cities</category><category>Cloud Movement</category><category>Clouds and Water in NYC via @Boonsri</category><category>Colorado’s Flooding Becomes A 1</category><category>Combining Ruby with ICM SWMM Network</category><category>Comments on SWMM Version 1 from 1971</category><category>Comparison of Three Different ModellingApproaches for the Simulation of Flooding Urban Areas - InnoAqual</category><category>Comparison of the H2OMAP SWMM Hazen Williams Force Main Solution to a Steady State HW Solution</category><category>Comparison of the H2OMAP SWMM5 Hazen Williams Force Main Solution to a HW Solution</category><category>Components of #INFOSWMM from @Innovyze</category><category>Components of the global water cycle</category><category>Comprehensive Sewer Collection Systems Analysis Handbook for Engineers and Planners. John W. Nicklow</category><category>Conduit Names in the Pascal GUI of SWMM5</category><category>Conduit Types in SWMM 5.0.021</category><category>Conduits in #SWMM5</category><category>Connecting Infrastructure To The Internet from the Dish</category><category>Connecting to Others Using Twitter and  LinkedIn</category><category>Contents of EPANET2.ZIP</category><category>Continuous Simulation Aids for InfoSWMM</category><category>Contrasting SWMM 4 and SWMM 5 St. Venant Solutions</category><category>Conversion</category><category>Copy-and-pasting Culture</category><category>Creating a “zero byte” MXD file to use with any version of ArcGIS</category><category>Creating an RDII (Rainfall-Derived Infiltration and Inflow) analysis in InfoSWMM can be quite specific</category><category>Custom shape in SWMM 5</category><category>Cutoff Divider in the SWMM 5 Kinematic Wave Solution</category><category>Cómo importar Enlace Shapefiles en InfoSWMM</category><category>Cómo importar archivos de forma de nodo en InfoSWMM</category><category>Cómo importar subcuencas de los SIG en InfoSWMM</category><category>DHI celebrates 50 years of solving problems in water environments</category><category>DWF</category><category>DWF Patterns and GWI in Sewer Collection Systems</category><category>DWF Population Data at a Node</category><category>Data Set Backwards Compatibility</category><category>Deep Dive into InfoSewer R</category><category>Default H&amp;H or Hydrology and Hydraulic Values from SWMM5</category><category>Degree day snowmelt in</category><category>Delmarva</category><category>Detailed Overview of kinwave_execute Function in SWMM5 🌊🖥️</category><category>Detailed Overview of landuse_getCoPollutLoad Function in SWMM5 🌧️🔍📊</category><category>Detailed Overview of landuse_getExternalBuildup Function in SWMM5 🌿🔍📊</category><category>Detailed Overview of landuse_getWashoffQual Function in SWMM5 🌧️🔬📊</category><category>Detailed Overview of solveContinuity and evalContinuity Functions in SWMM5 🌊🔍📐</category><category>Detention Pond Infiltration and Evaporation Losses</category><category>Detention Pond Infiltration and Evaporation Losses in SWMM 5</category><category>Did you ever wonder how to Twitter efficiently? Use a twitter name and a keyword to find the tweets</category><category>Different methods of infiltration calculation (modified from Wikipedia)</category><category>Display Feature Options for InfoSewer and InfoSWMM</category><category>Diversion LInks in SWMM 5 and 5.0.021</category><category>Domain Manager and Facility Manager  in InfoSewer to Find the CE</category><category>Dr. Paul Boulos Presents Agreement of Cooperation between American Society of Civil Engineers and Federation of Lebanese Engineers</category><category>Drainage</category><category>Drainage Wells or a Vertical Exfiltration Trench</category><category>Drainage Wells or a Vertical Exfiltration Trench in InfoSWMM</category><category>Drawing Water</category><category>Drawing features to show multiple attributes in InfoSWMM</category><category>Drawing features to show multiple attributes in InfoSWMM and InfoSewer</category><category>Dry Weather Flow in SWMM 5</category><category>Dry lands getting drier wet getting wetter: Earths water cycle intensifying with atmospheric warming</category><category>Duluth Minnesota Flooding of June 20  2012</category><category>Duluth Minnesota Flooding of June 20 2012</category><category>Dummy Outfall for Dynamic Wave Models converted from Kinematic Wave Models in SWMM 5</category><category>Dynamic Wave Routing and Node Time Steps in SWMM5</category><category>EMC Washoff in SWMM5</category><category>EPA #SWMM5 Build 5.1.012 (03/14/17) Updates</category><category>EPA Calculadora Nacional de Aguas Pluviales</category><category>EPA National Stormwater Calculator</category><category>EPA Nationale Regenwasser Rechner</category><category>EPA Releases Climate Assessment Update to National Stormwater Calculator</category><category>EPA SWMM  5.1.010 Build 5.1.010 Update with Images</category><category>EPA SWMM 5 Calibration Files</category><category>EPA SWMM 5.1 RELEASE NOTES (in a different Format)</category><category>EPA SWMM Build EPA SWMM Build 5.1.007 (9/15/2014)  with New Feature Images</category><category>EPA SWMM-CAT Climate Adjustment Tool to InfoSWMM and H2OMap SWMM</category><category>EPA is happy to announce the publication of Volume II of the #SWMM Reference Manual (Hydraulics)</category><category>EPA 국립 폭풍우 계산기</category><category>EPANET 2</category><category>EPANET 2 and InfoSWMM Sustain Product Pages for Innovyze</category><category>EPASWMM5</category><category>EPA国立雨水计算器</category><category>EPS and Steady State Variables in GM</category><category>ESRI Shapefile Simple Description for SWMM5</category><category>Editing and Graphing Gauged Data in #XPSWMM</category><category>Edward Burtynsky&#39;s Water</category><category>Elevation Relationships in SWMM 5 Hydraulic Calculations Understanding Pipe Connections Between Nodes</category><category>Emoji -   🌊 InfoWorks Water Quality Simulations: A Deep Dive 🌊</category><category>Emoji -   🔗 ICM Exchange for Autodesk: Your Ultimate Bridge 🛠️</category><category>Emoji -  🌐 SWMM 5.2.3 Inlet Workflow: A Comprehensive Guide 🌐</category><category>Emoji - ICM InfoWorks -   Crafting the Perfect Subcatchment Boundaries 🌍🖊️🔍</category><category>Emoji - ICM InfoWorks- Delving into Ground Infiltration in Drainage Systems 🌍💧</category><category>Emoji - SQL in ICM InfoWorks -   📜 2 Advanced Topics In Selection 📜</category><category>Emoji - 🌊 InfoWorks Pollutograph Deep Dive 🌊</category><category>Emoji EPANET2.2 Reference Table</category><category>Emoji ICM InfoWork - 🌊 InfoWorks ICM 1D Hydraulic Model Equations</category><category>Emoji ICM InfoWorks -   📊 Scatter Graph Guide 📊</category><category>Emoji ICM InfoWorks -   📚 1D Erosion/Deposition Model Guide 📚</category><category>Emoji ICM InfoWorks -  🌍 Model Inflow Guide 🌍</category><category>Emoji ICM InfoWorks -  🔧 Surface Pollutant Editor Guide 🔧</category><category>Emoji SWMM5 -  📋 Input Section Types</category><category>Emoji SWMM5 - 📋 Computed Subcatchment Quantities along with Link</category><category>Emoji SWMM5 - 📐 Cross Section Shape Types</category><category>Emoji SWMM5 -📋 Input Option Types</category><category>Emoji SWMM5 Infiltration Variables</category><category>Emoji SWMM5 📚🔍 Data Objects</category><category>Emoji Sediment in ICM InfoWorks Network</category><category>Emoji View -   🌊📘 SWMM5 Runoff Method vs. Rational Method: A Whirlwind Emoji-laden Exploration 🌐🔍</category><category>Emoji View -  🌊💧🌐 The Enigma of Hydrographs: Clark vs. Snyder in HEC-HMS 🌟🔍📊</category><category>Emoji View Comparing SWMM5 and EPANET: Two Renowned EPA Modeling Tools 🌍🔬📊</category><category>Emoji version of SWMM5 Internal Routing</category><category>Emojis -  🌊🌱 Sediment Dynamics in InfoWorks ICM 🌱🌊</category><category>Emojis -  🌟 InfoWorks ICM Key Concepts 🌟</category><category>Emojis -  📖🌊 Water Quality Simulations (InfoWorks) 🌊📖 for ICM InfoWorks and ICM SWMM</category><category>Emojis -  🚰💧 Understanding Pipe Sediment Data in InfoWorks ICM 💧🚰</category><category>Emojis - ICM InfoWorks -    🌊 Continuous UPC Grate Inlet 🌊</category><category>Emojis - ICM InfoWorks -   🌊💡 2D Inlet Node Parameters Explained 💡🌊</category><category>Emojis - ICM InfoWorks Grate Inlets 🌊 Continuous Grade Inlets 🌊</category><category>Emojis - Ruby Command Line Options 🖥️ for ICM InfoWorks Ultimate</category><category>Emojis - SQL In ICM InfoWorks -   📜 3 Deletion with SQL 📜</category><category>Emojis - SQL in ICM InfoWorks -    12 Explicit Select Clauses and Group By Clauses 📊</category><category>Emojis - SQL in ICM InfoWorks -    13 Order By Clauses 📑</category><category>Emojis - SQL in ICM InfoWorks -    📥4 Insertion 📥</category><category>Emojis - SQL in ICM InfoWorks -   10 Array fields 📋</category><category>Emojis - SQL in ICM InfoWorks -   14 Prompts 🖊️</category><category>Emojis - SQL in ICM InfoWorks -   5 Assignment 📝</category><category>Emojis - SQL in ICM InfoWorks -   📋1 Basic Object Selection 📋</category><category>Emojis Inlet  📖🔍 7. Discussion 🔍📖 on ICM InfoWorks</category><category>Emojis SQL in ICM InfoWorks -   11 One-To-Many Links 🌐</category><category>Emojis for ICM InfoWorks -   Diving Deep into Ground Infiltration Modelling 🌍💧🌱</category><category>Emojis in ICM InfoWorks -  7 Control Logic 🔄   8 Variables 📦     9 Other Variables 🌐</category><category>Emojis in SQL for ICM InfoWorks -   Appendix A – Error Messages 🚫</category><category>Emojis in SQL in ICM InfoWorks -  6 Functions 🧮</category><category>Enabling Modeling of Future Climate Change Projections</category><category>Engineering &amp; Construction (AEC) Collection in 2024</category><category>Equations for Weirs in SWMM 5</category><category>Establishing QA/QC (Quality Assurance/Quality Control) standards</category><category>Every State’s Temperature Trend for Every Season for the USA</category><category>Everyone Should Write</category><category>Example Pump Controls in InfoSewer and H2OMap Sewer</category><category>Example RTC rule for the opening and closing of the orifice in SWMM5</category><category>Example Real-Time Control (RTC) rule for the orifice in SWMM5</category><category>Example VSP Pump in SWMM 5 - Version 1</category><category>Example rule for the opening and closing of the orifice</category><category>Excel vs ICM InfoWorks and ICM SWMM</category><category>Explicit Iteration Hydraulic Computation and Implicit Time Step Hydraulic Computations in SWMM 5</category><category>External Buildup Time Series for Water Quality Loading in SWMM 5.0.021</category><category>External Hour Format for Calibration Data in InfoSWMM and InfoSWMM SA</category><category>Extran Hydraulics Master from #Extran3 and #SWMM4 converted to #SWMM5</category><category>FEMA SWMM 5 2D and LID in InfoSWMM</category><category>FM and Pumps of InfoSewer v7</category><category>FU and FTOT or F for a 100 Year SWMM 5 Simulation for Green Ampt Infiltration</category><category>FY 2023 EPASWMM5 Download Page</category><category>Factors of 1729</category><category>Feb 21-22 2013 in Toronto - call for papers</category><category>Fields for the DWF Tables in  H2OMap SWMM  and InfoSWMM</category><category>Fifty Years of Watershed Modeling – Past</category><category>Five Parameters beside the Maximum Time Step that help control simulation length in InfoSWMM and SWMM</category><category>Fixed and Constant 2D Mesh</category><category>Flight Calls Reveal Bird Migration Patterns</category><category>Flooding Options in a SWMM 5 Manhole</category><category>Florida</category><category>Flow Routing in InfoSWMM and Innovyze SWMM Products</category><category>For @mmjay27 from @PCSWMM All models are wrong</category><category>For Thesis Students:  Visual INSTRUCTIONS FOR COMPILING SWMM5.DLL USING MICROSOFT VISUAL C++ 2010/2012</category><category>Force Main Friction Loss in SWMM 5</category><category>Force Main Transition in SWMM 5</category><category>ForceMains</category><category>Format of the SWMM 5 Interface File</category><category>Four Key Parameters to Control Your Model  Time Step Time Step Lengthening and Hot Start File</category><category>Four cross sectional areas are used in a link of SWMM 5</category><category>Four factors in Rainfall Dependent Infiltration and Inflow or RDII in SWMM 5</category><category>Free Student Edition of Industry Leading InfoWater and InfoSWMM Aimed at Giving Students Hands-On Experience</category><category>From 1998  - XP Software 20 years of water  resource software experience</category><category>From 3QD - THE MATHEMATICS OF ROUGHNESS</category><category>From 3QD - WATER RISK AS WORLD WARMS</category><category>From SciAM - Why Plants are important to River Formation</category><category>From the Dish - The Wisdom of Play</category><category>Froude Number</category><category>Full Product Plan (FPP) for Integrating models from XPSWMM SWMM5</category><category>Functionality of the GIS Gateway in InfoSWMM:</category><category>Future Idea -  Flexibility for Modern Modeling: A Case for Supporting Both InfoWorks and SWMM Networks in One Workspace</category><category>Future Proofing SWMM5 Blogs and Code for Myself using AI in the Future</category><category>Future Rainfall in Climate Change</category><category>Future and Backward Year Planning for an Interaction between SWMM and RED (me)</category><category>GA Calibration Options in InfoSWMM help find the best parameters</category><category>GIF Presentation of LID’s in InfoSWMM Sustain</category><category>GIS For Biologists: Tip #16 – The ‘Shapefile Approach’ Vs The ‘Geodatabase Approach’ to GIS</category><category>GUI Compilation Note for the SWMM 5.1.x Delphi Code</category><category>GW ODIC ICM Import Fields</category><category>GW and DWF in #SWMM5</category><category>Ganesh ji  and Modelling</category><category>Genetic Algorithm and GIS Addons to InfoSWMM</category><category>German Hydrology in InfoSWMM 14.5</category><category>GitHub code and Markdown (MD) files Leveraging</category><category>Global Rainfall</category><category>God Created the World</category><category>Good Science Writing Tips from HBR</category><category>Graphical Representation of Results in InfoSWWM</category><category>Graphical Representation of Results in InfoSWWM and H2OMap SWMM</category><category>Graphical View of the Runoff process in #SWMM5 #ICM_SWMM</category><category>Graphical View of the Runoff process in #SWMM5 and #INFOSWMM</category><category>Graphical and Database Tools for Checking your InfoSWMM</category><category>Gravity Main Simulations</category><category>Green Ampt Infiltration for the Storage Nodes of SWMM 5</category><category>Green Ampt and CN Infiltration in a Table Form</category><category>Green Roof LID Control in SWMM 5</category><category>Green-Ampt Equation 🌿💦: and  Kostiakov Equation 📐💧:</category><category>Greetings</category><category>GroundWater Input Variables in #SWMM5</category><category>Grupo de Apoyo para usuarios de SWMM (SWMM in Spanish/ SWMM en Español)</category><category>Guidelines for Help Files and Examples</category><category>H2OMAP SWMM and SWMM 5 Dynamic Wave Solution</category><category>H2OMAP SWMM and SWMM5 Internal Units</category><category>H2OMAP and InfoSWMM Sediment Transport Modeling</category><category>H2OMAP-Sewer - FM Split Issue</category><category>H2OMap SWMM Interface to SWMMLive</category><category>H2OMap SWMM and #InfoWorks_ICM and #InfoWorks_ICM_SE</category><category>H2OMap SWMM and InfoWorks ICM and InfoWorks ICM  SE</category><category>H2OMap SWMM and SWMM 5 Models</category><category>H2OMapSWMM</category><category>H2S Modeling in InfoSewer</category><category>H2S Modeling in an InfoSWMM Pond</category><category>HDS No. 5 Hydraulic Design of Highway Culverts SWMM 5 Culvert Data from FHWA</category><category>HOW MOSQUITOES FLY IN RAIN from 3Quarks</category><category>Happy International Women in Engineering Day via @PCSWMM</category><category>Happy New Year 2024! or Fiscal Year 2025</category><category>Happy to announce City of Oakland has selected #InfoSWMM Executive Suite to model their sewer collection system</category><category>Hazen Williams and Force Mains in SWMM 5</category><category>Head Calculations and Weir HGL Plots</category><category>Head Loss</category><category>Head loss due to Transitions and Fittings (Local loss) for InfoSWMM and SWMM5</category><category>Headloss at a node in SWMM5?</category><category>Heat Waves Rains Probably Linked to Warming</category><category>Heavier Rains   Posting as Robert Dickinson   Updatetorms Ahead in the Future</category><category>Heinlein</category><category>Here is a table comparing some of the key features and capabilities of InfoWater Pro and EPANET</category><category>Hidden features of the 1D St Venant solution for SWMM5</category><category>Historical SWMM 5 and SWMM 4 Engines and Examples</category><category>Horton Animation of Infiltration in #SWMMM5 and #INFOSWMM</category><category>Horton and Green-Ampt models for estimating soil infiltration</category><category>Hot Start Files are used to define the initial heads and flows in SWMM5</category><category>How  to Use Trace Upstream</category><category>How  to approximate a Steady State Model in SWMM5 and InfoSWMM using the Full Dynamic Wave Solution</category><category>How #INNOVYZE InfoSWMM or #INFOSWMM Interacts with #SWMM5</category><category>How Calibration Plots were made in #SWMM4 and #SWMM3</category><category>How Clouds Move from Starts with a Bang</category><category>How Depression Storage works for  #SWMM5 #HYDROLOGY in #INFOSWMM #iNFOWORKS_ICM #H2OMAP_SWMM</category><category>How Do the TimeOpen and TimeClose Controls Work in #SWMM 5.1.012</category><category>How Does a TYPE2 Pump Work in SWMM 5?</category><category>How Does a TYPE3 Pump Work in SWMM 5?</category><category>How Does a TYPE3 Variable Speed Pump Work in SWMM 5?</category><category>How Does the Green Ampt Initial Moisture Deficit Work in SWMM 5?</category><category>How Does the Green Ampt Initial Moisture Defiict Work in InfoSWMM and SWMM 5?</category><category>How Domains are Seen in #INFOSWMM and #INFOSEWER</category><category>How InfoSWMM and InfoSWMM SA 2D Link and 3D Node Graphics Help You Understand the Response of Your Network to Wet Weather Flow</category><category>How InfoSewer and InfoSWMM are Extensions in Arc Map with Add On Extensions with Applications</category><category>How InfoWorks ICM can model landfills</category><category>How Inlets and Overland Flow Junctions work in InfoSWMM</category><category>How Much Can You Learn From a Home DNA Test?</category><category>How RTC Rules are Set in SWMM5</category><category>How SWMM 5 Handles Invert Jumps</category><category>How SWMM5 uses zero Subcatchment Slope in its Runoff Calculations</category><category>How To Make HTML Code for Excel Spreadsheets</category><category>How To Run the SWMM 5 Console from the SWMM 5 GUI</category><category>How an Inflow Time Series is Used in ICM compared to SWMM5 using H2OMap SWMM and InfoSWMM</category><category>How are Flooded Time</category><category>How are Flooded Time Storage</category><category>How are Flooded Time Surcharged Time and Flooded Volume Calculated in InfoSWMM and H2OMAP SWMM?</category><category>How can there be more flow in a pipe than its full capacity? #SWMM5 and #InfoSWMM</category><category>How do I correct a fatal error resulting in automatic shutdown in ArcMap?</category><category>How do the patterns row work in InfoSewer?</category><category>How do you export a time series from SWMM 5?</category><category>How do you interpret the Flow and Hydrology Summary Tables in SWMM 5.1?</category><category>How does Conduit Lengthening Work in SWMM5?</category><category>How does the CFL time Step change in one SWMM 5 Link?</category><category>How is the Time of Flooding Calculated in SWMM 5?</category><category>How is the variable time step option used in #SWMM5</category><category>How old are U.S. water pipes? Old</category><category>How the 14 InfoSWMM 2D polygons work in Arc Map</category><category>How the Pump Target setting in #SWMM5 works with Initial Conditions</category><category>How the State InfoSewer solution solves for the link flow and node heads</category><category>How the Steady State option works in H2OMap SWMM and InfoSWMM</category><category>How to Add Extra Output Files to SWMM 5.1.011</category><category>How to Calculate the Freeboard of a Node in InfoSWMM/H2OMAP SWMM</category><category>How to Change the Spatial Coordinates in Arc Map for InfoSWMM and InfoSewer</category><category>How to Compile Older SWMM 5 C Engines in Visual Studio 2012</category><category>How to Create a Geodatabase in InfoWater</category><category>How to Define Green Ampt Infiltration in ICM</category><category>How to Delete Invisible InfoSWMM Subcatchments</category><category>How to Diagnose a SWMLive Model using InfoSWMM</category><category>How to Draw the Top Width in InfoSWMM for TransectsHow to Draw the Top Width in InfoSWMM for Transects</category><category>How to Estimate the Needed Time Step for your Model using DB Tools in InfoSWMM</category><category>How to Extract the Engine SWMM5 Calculated Slope in InfoSWMM</category><category>How to Find Duplicate Links in InfoSWMM</category><category>How to Find the Proportional loading to a link  or manhole in InfoSewer</category><category>How to Find the Proportional loading to a link or manhole in InfoSewer</category><category>How to Force SWMM5 to use ONLY the Wet Well area for a Pump</category><category>How to Get the SWMM 5 GUI to recognize an already existing Report and Output File</category><category>How to Import Link Shapefiles into InfoSWMM</category><category>How to Import Node Shapefiles into InfoSWMM</category><category>How to Import a File from SWMM5 toH20MAP SWMM</category><category>How to Locate Parallel Pipes in H2OMAP SWMM</category><category>How to Make Break Nodes in #INFOSWMM and #H2OMAP SWMM</category><category>How to Make Custom Labels in InfoSWMM and InfoSewer</category><category>How to Make InfoDrainage show you the INP file and SWMM5 modified report file</category><category>How to Make Scatter Graphs in InfoSWMM and H2OMap SWMM</category><category>How to Make a Break Node in SWMM5 and InfoSWMM for Force Mains</category><category>How to Make a New GeoDataBase in InfoSWMM or InfoSewer</category><category>How to Make a New Geodatabase for InfoSWMM and InfoSewer in Arc Map</category><category>How to Make a Selection Set from the ICM Compare Command</category><category>How to Make a Small Model out of a Large Model in H2OMAP Sewer</category><category>How to Make a Small Model out of a Large Model in H2OMAP Sewer and InfoSewer</category><category>How to Make a Trapezoidal Inflow Time Series in InfoSWMM</category><category>How to Make an InfoSWMM model from the DBF Files</category><category>How to Make an InfoSewer or H2OMap Sewer Model from SWMM5</category><category>How to Make an Internal Outfall into an External Outfall</category><category>How to Make an Internal Outfall into an External Outfall when you have more than one link connected to an Outfall in InfoSWMM</category><category>How to Make an Internal Outfall into an External Outfall when you have more than one link connected to an Outfall in SWMM5</category><category>How to Make an Upstream Interface file for two InfoSWMM Runs</category><category>How to Map Maximum Top Width in InfoSWMM</category><category>How to Model Tracers for RDII Runoff</category><category>How to Model Water Quality Time Series in SWMM5</category><category>How to Model a Vacuum Sewer in SWMM 5</category><category>How to Model and Display Peaking Factors in #InfoSWMM</category><category>How to Pay America’s Big Sewer Bill from Next City  @NextCityOrg</category><category>How to Pick an Input HGL Profile in InfoSWMM and InfoSWMM_SA</category><category>How to Rectify Offset Issues in InfoSWMM and H2OMap SWMM</category><category>How to Rename a Scenario in InfoSWMM</category><category>How to Search A Twitter Account</category><category>How to Search My Blogs by concentrating on one blog for Information about SWMM5</category><category>How to Search These Blogs for Information</category><category>How to Search These Blogs for Information about SWMM5</category><category>How to Search Twitter for Links connected to SWMM5</category><category>How to See How Many Nodes and Links you have in an InfoSWMM Network</category><category>How to See the Highest Continuity Errors Table in the Output Report Manager In InfoSWMM and SWMM5</category><category>How to See the Highest Continuity Errors Table in the Output Report Manager for #InfoSWMM</category><category>How to Set a Flap Gate in InfoSWMM</category><category>How to Set your Model Preferences in InfoSWMM_SA</category><category>How to Simulate Pipe Blockage in InfoSewer</category><category>How to Tell how Long Normal Flow is used in a Link in #InfoSWMM</category><category>How to Understand Scenarios In InfoSWMM and InfoSWMM_SA</category><category>How to Use Arc Map Selection to add to Domains in #InfoSewer and #InfoSWMM</category><category>How to Use Excel to Make Random X Y Coordinates in SWMM 5</category><category>How to Use Group Delete to Make A Smaller Model in SWMM 5</category><category>How to Use Map Display to show flooding in H2OMap SWMM</category><category>How to Use Non-Steady Periods in  InfoSWMM</category><category>How to Use Population for DWF in SWMM5 and InfoSWMM</category><category>How to Use Qfull in a Map Display in InfoSWMM</category><category>How to Use Scatter Plots in the DB Output tables of #InfoSWMM for d/D and q/Q</category><category>How to Use the Compare Report Command in H2OMap SWMM and InfoSWMM</category><category>How to Use the H2OMAP SWMM Calibrator for RTK Calibration</category><category>How to Use the Input HGL with a Domain in #INFOSEWER</category><category>How to Use the Variable Flow Percentage Flow Splitter in InfoSewer</category><category>How to add a new view variable to SWMM 5.1.011</category><category>How to approximate the Flood polygon created in InfoSWMM RAM by using Arc Toolbox</category><category>How to calculate the Maximum Unfilled Manhole Depth in InfoSewer</category><category>How to change the Status Form in SWMM 5.1.011 so it works as in Earlier #SWMM 5 Versions</category><category>How to define link widths in InfoSWMM and H2OMap SWMM</category><category>How to fix depth vs elevation offset issues in links using InfoSWMM and InfoSWMM SA</category><category>How to have backwater in a dummy OUTLET in SWMM 5</category><category>How to import infoSewer into InfoSWMM</category><category>How to make Multiple Storm Events in InfoSWMM and How to Use them in the Scenario Manager</category><category>How to make a smaller model out of your larger InfoSWMM or H2OMap SWMM network</category><category>How to redo the Arc GIS Extents in InfoSWMM</category><category>How to resolve the &quot;ERROR 141: Outfall has more than 1 inlet link or an outlet link&quot; issue in SWMM 5</category><category>How to save SWMM5 output to InfoSWMM</category><category>How to set an internal boundary condition in SWMM 5</category><category>How to show Curve RTC Rules in #SWMM5 in the Control Actions Taken Section</category><category>How to simulate a Quasi Steady Run in InfoSWMM</category><category>How to switch the upstream and downstream nodes in SWMM 5</category><category>How to turn on the option in InfoSWMM to show the SWMM5 RPT file output table for each node</category><category>How to use a Small INI file with the Batch Program of #SWMM5</category><category>How to use the EPA Design Storm Wizard with InfoWorks ICM for Chicago</category><category>How to use the ICM Viewer with ICM Standard after installing from ICM Ultimate</category><category>How to view an InfoSewer</category><category>How to zoom to the extents of your model in InfoSWMM</category><category>Huber Modeling of Phosphorus Dynamics in Lake Okeechobee</category><category>Huber Nato  Water Quality Paper about Water Quality in SWMM4</category><category>Huff Rainfall Distribution SWMM 5 Model</category><category>Hurricane Dennis Tampa 2005</category><category>Hybrid Learning at Innovyze</category><category>Hydraulic Jump and Froude # in #SWMM5</category><category>Hydrology and Floodplain Analysis (5th Edition)</category><category>Hydrology in Ecclesiastes</category><category>Hydroloy</category><category>Hyperlapse video of Peirce Reservoir Singapore</category><category>Hysteresis Effect in SWMM 5&#39;s Link Flow vs. Depth Relationship</category><category>I Create Processes (And So Should You)</category><category>IBM helps the City of Corpus Christi get smarter</category><category>ICM InfoWorks -  🌐 Surface Area Take-Off</category><category>ICM InfoWorks -  🌧️ Runoff Volume Models</category><category>ICM InfoWorks - 🌊 Runoff Surfaces</category><category>ICM InfoWorks Emoji -  Scenarios: A Deep Dive 🌍🔍</category><category>ICM InfoWorks Emoji laden  Glossary 📖</category><category>ICM InfoWorks Hydrology Rules</category><category>ICM InfoWorks and ICM SWMM RED (Rainfall Event Data) file format</category><category>ICM SWMM Aquifer Variable Names for SQL and Ruby Scripts</category><category>ICM SWMM Conduit Variable Names for SQL and Ruby Scripts</category><category>ICM SWMM Land Use Variable Names for SQL and Ruby Scripts</category><category>ICM SWMM Node Variable Names for SQL and Ruby Scripts</category><category>ICM SWMM Orifice Variable Names for SQL and Ruby Scripts</category><category>ICM SWMM Outlet Variable Names for SQL and Ruby Scripts</category><category>ICM SWMM Pollutant Variable Names for SQL and Ruby Scripts</category><category>ICM SWMM Pump Variable Names for SQL and Ruby Scripts</category><category>ICM SWMM SQL Code for Links</category><category>ICM SWMM Snow Pack Variable Names for SQL and Ruby Scripts</category><category>ICM SWMM Spatial Rain Variable Names for SQL and Ruby Scripts</category><category>ICM SWMM Subcatchment Variable Names for SQL and Ruby Scripts</category><category>ICM SWMM Weir Variable Names for SQL and Ruby Scripts</category><category>ICM SWMM and Detention Ponds</category><category>ICM SWMM and ICM InfoWorks is great for Good Model Building</category><category>ICM SWMM and SWMM5 Internal Units</category><category>ICM SWMM sw_2d_boundary_line Variable Names for SQL and Ruby Scripts</category><category>ICM SWMM sw_mesh_level_zone Variable Names for SQL and Ruby Scripts</category><category>ICM and SWMM5</category><category>ICM_SWMM</category><category>IO9- What really causes that amazing &quot;after the rain&quot; smell?</category><category>Identifying Instability in SWMM5</category><category>If you use the DOS Version of SWMM 5 be careful to NOT have spaces in directory names</category><category>Implementing Storage Units for Pond Modeling within a Catchment Area</category><category>Import a SWMM5 INP File to InfoSWMM and InfoSWMM SA</category><category>Increase in heavy rainfalls over past 60 years in upper Midwest</category><category>Indoor Plumbing Is an Amazing Invention</category><category>Inflow versus DWF Time Series in #InfoSWMM and  #SWMM5</category><category>InfoSW ISDB</category><category>InfoSWM ISDB</category><category>InfoSWMM  DMNODE.DBF. DMLINK.DBF Domain Files in ISDB Folder</category><category>InfoSWMM 2D Infiltration Surfaces for Horton</category><category>InfoSWMM 2D Inflows and Mesh Element to 1D Node Linkages</category><category>InfoSWMM 2D Layer Properties and Mesh Results</category><category>InfoSWMM 2D Version 13 Brings Significant 1D and 2D Simulation Advancements To Power Users</category><category>InfoSWMM 2D Version 2.0 for ArcGIS 10</category><category>InfoSWMM ANNO.DBF File in ISDB Folder</category><category>InfoSWMM ANNODATA.DBF File in ISDB Folder</category><category>InfoSWMM AQUIFER.DBF File in ISDB Folder</category><category>InfoSWMM AREALDEP.DBF File in ISDB Folder</category><category>InfoSWMM All Set DBF Files in the ISDB Folder</category><category>InfoSWMM BUILDUP.DBF File in ISDB Folder</category><category>InfoSWMM Batch Simulation Manager</category><category>InfoSWMM CBNODE.DBF File in ISDB Folder</category><category>InfoSWMM CLIMATE.DBF File in ISDB Folder</category><category>InfoSWMM CLMTADJ.DBF File in ISDB Folder</category><category>InfoSWMM CONDUIT.DBF File in ISDB Folder</category><category>InfoSWMM CONHYD.DBF File in ISDB Folder</category><category>InfoSWMM CONOUT.dbf File in ISDB Folder</category><category>InfoSWMM CONQUAL.DBF File in ISDB Folder</category><category>InfoSWMM CONSET.DBF File in ISDB Folder</category><category>InfoSWMM COVERAGE.DBF File in ISDB Folder</category><category>InfoSWMM CURVE.DBF File in ISDB Folder</category><category>InfoSWMM CUVDATA.DBF File in ISDB Folder. FY2024</category><category>InfoSWMM DIVHYD.DBF File in ISDB Folder</category><category>InfoSWMM DIVIDER.DBF File in ISDB Folder - InfoSWMM Information Table</category><category>InfoSWMM DWF.DBF File in ISDB Folder</category><category>InfoSWMM EVAPORAT.DBF File in ISDB Folder. FY2024</category><category>InfoSWMM Error Messages and Arc Map Invalid Characters</category><category>InfoSWMM FDMDATA.DBF File in ISDB Folder</category><category>InfoSWMM FDSDATA.DBF File in ISDB Folder</category><category>InfoSWMM FILEOPT.DBF File in ISDB Folder</category><category>InfoSWMM FLDMAP.DBF File in ISDB Folder</category><category>InfoSWMM GDWATER.DBF File in ISDB Folder</category><category>InfoSWMM GIS Gateway</category><category>InfoSWMM GISFDATA.DBF File in ISDB Folder</category><category>InfoSWMM GISGATE.DBF File in ISDB Folder</category><category>InfoSWMM HYDRDATA.DBF File in ISDB Folder</category><category>InfoSWMM HYDROGRH.DBF File in ISDB Folder</category><category>InfoSWMM INFILTRA.DBF File in ISDB Folder</category><category>InfoSWMM INFLOW.DBF File in ISDB Folder</category><category>InfoSWMM INLETHYD.DBF File in ISDB Folder</category><category>InfoSWMM Import and Export from SWMM</category><category>InfoSWMM Inlets</category><category>InfoSWMM JCTHYD.DBF File in ISDB Folder</category><category>InfoSWMM JCTOUT.dbf File in ISDB Folder</category><category>InfoSWMM JUNCTION.DBF File in ISDB Folder</category><category>InfoSWMM LANDUSE.DBF File in ISDB Folder</category><category>InfoSWMM LIDCTRL.DBF File in ISDB Folder</category><category>InfoSWMM LIDPLRMV.DBF File in ISDB Folder</category><category>InfoSWMM LINK.DBF File in ISDB Folder</category><category>InfoSWMM LINKCAL.DBF File in ISDB Folder</category><category>InfoSWMM LINKNOTE.DBF File in ISDB Folder</category><category>InfoSWMM LKCTRL.DBF File in ISDB Folder</category><category>InfoSWMM LKHLINKS.DBF File in ISDB Folder</category><category>InfoSWMM LKSTATUS.DBF File in ISDB Folder</category><category>InfoSWMM LOADING.DBF File in ISDB Folder</category><category>InfoSWMM LUCOEFF.DBF File in ISDB Folder</category><category>InfoSWMM MRRULE.DBF File in ISDB Folder</category><category>InfoSWMM MRWARN.DBF File in ISDB Folder</category><category>InfoSWMM Map Display of Scenario Differences</category><category>InfoSWMM NAMEVIEW.DBF File in ISDB Folder</category><category>InfoSWMM NDHLINKS.DBF File in ISDB Folder</category><category>InfoSWMM NODE.DBF File in ISDB Folder</category><category>InfoSWMM NODECAL.DBF File in ISDB Folder</category><category>InfoSWMM NODENOTE.DBF File in ISDB Folder</category><category>InfoSWMM NSTDPRD.DBF File in ISDB Folder</category><category>InfoSWMM Note About Pump Wet Wells</category><category>InfoSWMM Now Supports EPA SWMM-CAT</category><category>InfoSWMM OFALLHYD.DBF File in ISDB Folder</category><category>InfoSWMM OLETHYD.DBF File in ISDB Folder</category><category>InfoSWMM ORIFHYD.DBF File in ISDB Folder</category><category>InfoSWMM ORIFICE.DBF File in ISDB Folder</category><category>InfoSWMM OUTFALL.DBF File in ISDB Folder</category><category>InfoSWMM OUTLET.DBF File in ISDB Folder</category><category>InfoSWMM PATNDATA.DBF File in ISDB Folder</category><category>InfoSWMM PATTERN.DBF File in ISDB Folder</category><category>InfoSWMM POLLUTNT.DBF File in ISDB Folder</category><category>InfoSWMM POLYGON.DBF File in ISDB Folder</category><category>InfoSWMM POLYREG.DBF File in ISDB Folder</category><category>InfoSWMM PUMP.DBF File in ISDB Folder</category><category>InfoSWMM PUMP.DBF File in the ISDB Folder - Pump Information</category><category>InfoSWMM PUMPEFF.DBF File in ISDB Folder</category><category>InfoSWMM PUMPHYD.DBF File in ISDB Folder</category><category>InfoSWMM PUMPRATE.DBF File in ISDB Folder</category><category>InfoSWMM Pump Operation Curve and Time Off Curve</category><category>InfoSWMM QUERY.DBF File in ISDB Folder</category><category>InfoSWMM RAINGAGE.DBF File in ISDB Folder</category><category>InfoSWMM RDII.DBF File in ISDB Folder</category><category>InfoSWMM RELATE.DBF File in ISDB Folder</category><category>InfoSWMM REPORT.DBF File in ISDB Folder</category><category>InfoSWMM RPTDATA.DBF File in ISDB Folder</category><category>InfoSWMM RULE.DBF File in ISDB Folder</category><category>InfoSWMM RULKACTF.DBF File in ISDB Folder</category><category>InfoSWMM RULKACTT.DBF File in ISDB Folder</category><category>InfoSWMM RULOGIC.DBF File in ISDB Folder</category><category>InfoSWMM RUNOPT.DBF File in ISDB Folder</category><category>InfoSWMM SA SWMMLive Manager</category><category>InfoSWMM SA and XP-SWMM Calibration Files</category><category>InfoSWMM SCENARIO.DBF File in ISDB Folder</category><category>InfoSWMM SCS Rainfall Distributions</category><category>InfoSWMM SD_IC.dbf File in ISDB Folder</category><category>InfoSWMM SNOWPACK.DBF File in ISDB Folder</category><category>InfoSWMM SOIL.DBF File in ISDB Folder</category><category>InfoSWMM STORAGE.DBF File in ISDB Folder</category><category>InfoSWMM STORHYD.DBF File in ISDB Folder</category><category>InfoSWMM STOR_VEX.dbf File in ISDB Folder</category><category>InfoSWMM SUBCATCH.DBF File in ISDB Folder</category><category>InfoSWMM SUBHYD.DBF File in ISDB Folder</category><category>InfoSWMM SUBLID.DBF File in ISDB Folder</category><category>InfoSWMM SUBOUT.DBF File in ISDB Folder</category><category>InfoSWMM SUSTAIN</category><category>InfoSWMM Selection Set and Domain Manager</category><category>InfoSWMM Solution Options in Windows 7</category><category>InfoSWMM Story 1 on Storirfy</category><category>InfoSWMM Sustain Generation V2.0 Delivers Significant Advancements for Comprehensive Urban Stormwater Treatment and Analysis</category><category>InfoSWMM TIME.DBF File in ISDB Folder</category><category>InfoSWMM TIMESERI.DBF File in ISDB Folder</category><category>InfoSWMM TRANDATA.DBF File in ISDB Folder</category><category>InfoSWMM TRANSECT.DBF File in ISDB Folder</category><category>InfoSWMM TRAN_VEX.dbf File in ISDB Folder</category><category>InfoSWMM TREATMNT.DBF File in ISDB Folder</category><category>InfoSWMM TSDATA.DBF File in ISDB Folder</category><category>InfoSWMM Tree of Ability</category><category>InfoSWMM Utilities Menu</category><category>InfoSWMM VERTEX.DBF File in ISDB Folder</category><category>InfoSWMM Version 12 Revs Up Modeling Performance With HEC-22 and 64-Bit Support</category><category>InfoSWMM Version History</category><category>InfoSWMM WASHOFF.DBF File in ISDB Folder</category><category>InfoSWMM WEIR.DBF File in ISDB Folder - Weir Information Table</category><category>InfoSWMM WEIRHYD.DBF File in ISDB Folder</category><category>InfoSWMM WINDSPD.DBF File in ISDB Folder</category><category>InfoSWMM WQOPT.DBF File in ISDB Folder</category><category>InfoSWMM XNGLING.DBF File in the ISDB Folder</category><category>InfoSWMM XNGNODE.DBF File in the ISDB Folder</category><category>InfoSWMM and Arc GIS Layer Properties for Force Mains and Gravity Mains</category><category>InfoSWMM and Arc GIS for Create Graphs Using Network Data and Model Results</category><category>InfoSWMM and Arc GIS for Surcharge and Flooded Time</category><category>InfoSWMM and EPA SWMM 5 Version Comparison and How InfoSWMM works as an Extension in Arc GIS</category><category>InfoSWMM and H20MAP SWMM Output Statistics Manager</category><category>InfoSWMM and H20Map SWMM and their Relationship to FEMA Approved SWMM 5 Engines</category><category>InfoSWMM and H2Map SWMM Selection Set and Domain Manager</category><category>InfoSWMM and H2OMAP SWMM  Pump Summary Table</category><category>InfoSWMM and H2OMAP SWMM Version 8.5</category><category>InfoSWMM and H2OMap SWMM Batch Simulation Manager</category><category>InfoSWMM and H2OMap SWMM Pump Summary Table</category><category>InfoSWMM and H2oMAP SWMM Output Statistics Manager</category><category>InfoSWMM and H2oMAP SWMM Release Notes</category><category>InfoSWMM and ICM SWMM</category><category>InfoSWMM and InfoSewer</category><category>InfoSWMM and InfoSewer Product Pages and Videos</category><category>InfoSWMM and InfoSewer from Innovyze both are Extensions inside of Arc Map (versions 10 to 10.6 and counting)</category><category>InfoSWMM and SWMM 5 does NOT have to be at the same time step</category><category>InfoSWMM and the Custom Report Tool</category><category>InfoSWMM can import H2OMAP Sewer</category><category>InfoSWMM or InfoWater</category><category>InfoSWMM or InfoWater network without InfoSewer</category><category>InfoSWMM or SWMM 5 Basic Runoff and Other Wet Weather Processes</category><category>InfoSWMM to InfoSewer Workflow - Only for Client Emergencies</category><category>InfoSWMM v11.1 Changes to Date</category><category>InfoSWMM: A 2030 AI-Assisted Study Guide</category><category>InfoSewer  🔧 Preferences Command</category><category>InfoSewer All Set DBF Files in the IEDB Folder</category><category>InfoSewer DMNODE.DBF and DMLINK.DBF Files in the IEDB Folder</category><category>InfoSewer Design of Existing Networks</category><category>InfoSewer EPS Rules -  Muskingum-Cunge technique</category><category>InfoSewer FDMDATA.DBF File in the IEDB Folder</category><category>InfoSewer FM Split Issue</category><category>InfoSewer FORCEOUT.DBF File in the IEDB Folder</category><category>InfoSewer Features and 2025 or 2026 Retirement</category><category>InfoSewer GISFDATA.DBF File in the IEDB Folder</category><category>InfoSewer GISGATE.DBF File in the IEDB Folder</category><category>InfoSewer HLLINK.DBF File in the IEDB Folder and InfoSewer HLNODE.DBF File in the IEDB Folder</category><category>InfoSewer HYDROGRH.DBF File in the IEDB Folder</category><category>InfoSewer ISDB</category><category>InfoSewer Infographic or Map of Features</category><category>InfoSewer LINK.DBF File in the IEDB Folder</category><category>InfoSewer LUCOEFF.DBF File in the IEDB Folder</category><category>InfoSewer Link and Head Calculations for Steady Flow</category><category>InfoSewer MANCOVER.DBF File in the IEDB Folder</category><category>InfoSewer MANHOLE.DBF File in the IEDB Folder</category><category>InfoSewer MAPSSLK.DBF File in the IEDB Folder</category><category>InfoSewer MHHYD.DBF File in the IEDB Folder</category><category>InfoSewer MHOUT.DBF File in the IEDB Folder</category><category>InfoSewer MHSHP.DBF File in the IEDB Folder</category><category>InfoSewer MONODE.DBF File in the IEDB Folder and InfoSewer MOLINK.DBF File in the IEDB Folder</category><category>InfoSewer Minimum Travel Distance</category><category>InfoSewer NAMEVIEW.DBF File in the IEDB Folder</category><category>InfoSewer NCPIDGN.DBF File in the IEDB Folder</category><category>InfoSewer NCPIXSEC.DBF File in the IEDB Folder</category><category>InfoSewer NDSOURCE.DBF File in the IEDB Folder</category><category>InfoSewer NODE.DBF File in the IEDB Folder</category><category>InfoSewer OUTLEOUT.DBF File in the IEDB Folder</category><category>InfoSewer PATNDATA.DBF File in the IEDB Folder</category><category>InfoSewer PATTERN.DBF File in the IEDB Folder</category><category>InfoSewer PIPE.DBF File in the IEDB Folder - Pipe Information Table</category><category>InfoSewer PIPECNST.DBF File in the IEDB Folder</category><category>InfoSewer PIPEDGN.DBF File in the IEDB Folder</category><category>InfoSewer PIPEHYD.DBF File in the IEDB Folder</category><category>InfoSewer PIPEII.DBF File in the IEDB Folder</category><category>InfoSewer PIPEOUT.DBF File in the IEDB Folder</category><category>InfoSewer PIPESHP.DBF File in the IEDB Folder</category><category>InfoSewer PIPESPLT.DBF File in the IEDB Folder</category><category>InfoSewer PIPEWQ.DBF File in the IEDB Folder</category><category>InfoSewer POLYREG.DBF File in the IEDB Folder</category><category>InfoSewer PUMP.DBF File in the IEDB Folder</category><category>InfoSewer PUMPHYD.DBF File in the IEDB Folder</category><category>InfoSewer PUMPOUT.DBF File in the IEDB Folder</category><category>InfoSewer Physical Components🏢🏭🏠</category><category>InfoSewer QSETDATA.DBF File in the IEDB Folder</category><category>InfoSewer QSSSLK.DBF File in the IEDB Folder</category><category>InfoSewer QSSSND.DBF File in the IEDB Folder</category><category>InfoSewer QUERY.DBF File in the IEDB Folder</category><category>InfoSewer RELATE.DBF File in the IEDB Folder</category><category>InfoSewer REPORT.DBF File in the IEDB Folder</category><category>InfoSewer RPTDATA.DBF File in the IEDB Folder</category><category>InfoSewer RUNOPT.DBF File in the IEDB Folder</category><category>InfoSewer SCENARIO.DBF File in the IEDB Folder</category><category>InfoSewer STATUS.DBF File in the IEDB Folder</category><category>InfoSewer Static Gravity Main Report</category><category>InfoSewer Static Loading Manhole Report</category><category>InfoSewer Steady State 🍂.</category><category>InfoSewer TIME.DBF File in the IEDB Folder</category><category>InfoSewer VERTEX.DBF File in the IEDB Folder</category><category>InfoSewer WWELL.DBF File in the IEDB Folder - Information Tables</category><category>InfoSewer WWELLHYD.DBF File in the IEDB Folder</category><category>InfoSewer WWELLOUT.DBF File in the IEDB Folder</category><category>InfoSewer XLOAD.DBF File in the IEDB Folder</category><category>InfoSewer XNGLING.DBF File in the IEDB Folder</category><category>InfoSewer and H2OMAP SWMM models</category><category>InfoSewer and InfoSWMM 2D Innovyze Inc.</category><category>InfoSewer and InfoWater from Innovyzebconnection between your model data and your GIS data</category><category>InfoSwmm import / export capabilities</category><category>InfoWater and InfoSewer ArcGIS-Centric Modeling Solutions to Help Hanford in Making Critical Decisions on Growth Planning and for Updating its General Plan</category><category>Infosessie nieuwste trends &amp; tools drinkwater producten Innovyze #INFOWATER</category><category>Initial Moisture Deficit or IMD for a 100 Year SWMM 5 Simulation for Green Ampt Infiltration</category><category>Initial condition polygon to define your pond as shown below for InfoSWMM 2D</category><category>Inlet Flows Street Flooding #SWMM5  #INLETS Street Flooding in 2009</category><category>Inlets from the SWMM 5.2.3 help file</category><category>Innovyze Announces Worldwide Support for EPANET and SWMM</category><category>Innovyze Debuts Integrated Catchment Modeling Sewer Edition</category><category>Innovyze InfoSewer vs InfoSWMM and H2OMap SWMM vs H2OMap Sewer</category><category>Innovyze Innovyze Releases InfoWater Generation V12 With Advanced Pipe Break Break and Leakage Modeling</category><category>Innovyze Introduces ICMExchange</category><category>Innovyze Offers Free Industry-Leading GIS-Centric Water Network Transient Modeling Software to Universities Worldwide #INFOSURGE</category><category>Innovyze Offers Free Version of InfoSWMM and InfoWater</category><category>Innovyze President Dr. Paul F. Boulos Appointed to ASCE Industry Leaders Council</category><category>Innovyze President Dr. Paul F. Boulos Appointed to Wharton Initiative for Global Environmental Leadership Corporate Advisory Board</category><category>Innovyze President Dr. Paul F. Boulos Assumes Presidency of American Academy of Water Resources Engineers</category><category>Innovyze President Dr. Paul F. Boulos Elected Distinguished Member of the American Society of Civil Engineers</category><category>Innovyze President Dr. Paul F. Boulos Elected to National Academy of Engineering</category><category>Innovyze President Dr. Paul F. Boulos Joins ACEC Design Professionals Coalition</category><category>Innovyze President Dr. Paul F. Boulos Joins Board of Trustees of Academy of Coastal Ocean Port &amp; Navigation Engineers</category><category>Innovyze President Dr. Paul F. Boulos Joins Center for Engineering  Ethics  and Society Advisory Group at National Academy of Engineering</category><category>Innovyze President Dr. Paul F. Boulos Named Chair of the Lebanese American UniversityBoard of Trustees</category><category>Innovyze President Dr. Paul F. Boulos Named President-Elect of the American Academy of Water Resources Engineers</category><category>Innovyze President Dr. Paul F. Boulos Reelected to the American Academy of Water Resources Engineers Board of Trustees</category><category>Innovyze President Named Distinguished Member of American Society of Civil Engineers</category><category>Innovyze President Paul Boulos to Deliver Keynote Speech at 10th World Congress on Engineering Education October 29-30 in Beirut</category><category>Innovyze President Paul Boulos to Discuss Smart Water Networks at Government Accountability Office Municipal Water Technologies Expert Meeting</category><category>Innovyze President Receives ACOPNE’s Highest Honor</category><category>Innovyze President Recognized with AAWRE Special Distinction Award</category><category>Innovyze RDII Analyst for the Analysis and Calibration of RDII</category><category>Innovyze Releases Award-Winning InfoSWMM SFEM</category><category>Innovyze Releases InfoSWMM Generation V13</category><category>Innovyze Releases InfoSWMM Generation V14</category><category>Innovyze Releases InfoSWMM Generation V14.5</category><category>Innovyze Releases InfoSWMM SA Product Portfolio of Next-Generation GIS-Based Sewer Modeling Solutions</category><category>Innovyze Releases InfoSWMM Sustain for Comprehensive Urban Stormwater Treatment and Analysis</category><category>Innovyze Releases InfoWater SA Product Portfolio of Next-Generation GIS-Based Water Modeling Solutions</category><category>Innovyze Releases RDII Analyst Generation V14.5</category><category>Innovyze Releases SWMMLive Generation V5.5</category><category>Innovyze Releases SWMMLive: Real-Time Stormwater</category><category>Innovyze Ships InfoWater 2D — Next Generation of Two-Dimensional Modeling of Water Spill from Catastrophic Main Breaks</category><category>Innovyze St Venant Solutions for InfoSewer</category><category>Innovyze Tweets from My Twitter Widget</category><category>Innovyze Unveils InfoSWMM Sustain for Comprehensive Urban Stormwater Treatment and Analysis</category><category>Innovyze and Robert Dickinson on Social Media - A Video Guide.</category><category>Innovyze and XP Solutions Merge</category><category>Innovyze宣布全球支持EPANET和SWMM</category><category>Instructions for exporting data from InfoSWMM to InfoSewer</category><category>Integrating Autodesk InfraWorks</category><category>International Conference on Stormwater and Urban Water Systems Modeling</category><category>Intro to InfoSWMM InfoSWMM 2D and InfoSWMM Sustain</category><category>Introduction to Running SWMMLive from @Innovyze</category><category>Introduction to Scenarios in ICM</category><category>Iterations  Tolerance</category><category>Iterative Hot Start File in SWMM 5</category><category>Iterative Hot Start File in SWMM5</category><category>It’ll take a while</category><category>January 17 2011 Rainfall Event in Hillsborough County</category><category>Jean Cunge&#39;s contributions to hydraulics in a table format</category><category>KCS Article: Crafting a KCS Article</category><category>Keep Track of your manhole overflows with InfoSWMM 2D</category><category>Keyword Categories in EPASWMM 5.2.2</category><category>Kid-Friendly Weir Explanation</category><category>Kinematic Wave Flow Routing Functions Summary 🌊🔍💻</category><category>Knowing How to Change Your Mind: A Three Minute Guide to Bayesian Reasoning</category><category>Knowledge-Centered Service (KCS)</category><category>LID Images from Twitter</category><category>LID Percent Impervious Treated in SWMM5</category><category>LID Sizing References for SWMM 5</category><category>LID and BMP Modeling in InfoSWMM and H20Map SWMM</category><category>LID and BMP Modelling in InfoSWMM and H2OMAP SWMM</category><category>LPS Output Units when the Inflow is CMS</category><category>LPS Output Units when the Inflow is CMS in InfoSWMM and H2OMap SWMM</category><category>LPS Output Units when the Inflow is CMS in infoWorks ICM</category><category>Lambda Calculus &amp; Iteration Methods for SWMM5</category><category>Lambda Calculus and Link Variables in the InfoSWMM</category><category>Lambda Calculus in the SWMM 5 Dynamic Wave Solution</category><category>Lambda Calculus or the Method of Successive under-relaxation for the SWMM 5 Dynamic Wave Solution</category><category>Larger Fonts in #SWMM5 using Delphi</category><category>Latest #InfoSWMM is update 3 - dated 9/2/2016</category><category>Lead and Lag Pump Options in SWMM 5</category><category>Lebanon  Engineering Education for Sustainable Development</category><category>Legacy SWMM 5 and SWMM 5.1 Installs</category><category>Legacy SWMM3 and SWMM4 Fortran Code and Engines on Box</category><category>Link Area Types in SWMM 5 InfoSWMM and H2OMap SWMM</category><category>Link Depth and Node Depth Relationship in SWMM 5</category><category>Link Offset Elevations or Depths in InfoSWMM</category><category>Link Surcharging Definitions in SWMM 5</category><category>Link and Node Depth Relationship in SWMM 5</category><category>Link to A Single Document about Compiling and Debugging SWAT with GFortran and Eclipse</category><category>Link to Re-Engineering The user interface of #EPANET and #SWMM5 - #EPA Contract from 2015</category><category>LinkedIn Posting Plan for SWMM5 Enablement</category><category>LinkedIn Posts vs. Articles vs. Newsletters: Which Drives More Growth and Authority for SWMM5 Enablement</category><category>LinkedIn algorithm prioritizes content based on several factors for SWMM5 Enablement</category><category>List of Physical Components. Innovyze</category><category>Liu Yang introduces delegates to GIS-Based design solution InfoSewer at a packed @innovyze UK User Group</category><category>Live Link between the HGL Plot in InfoSWMM and the DB Tables/ Attribute Browser</category><category>Losses from a Subcatchment in SWMM 5 are composed of Evaporation + Infiltration = Total Losses</category><category>MSDOS Batch Commands</category><category>MWH Soft Changes Name to Innovyze</category><category>Make study more effective the easy way</category><category>Making Wastewater Systems Smarter</category><category>Making a Model in SWMM 5/Pathways</category><category>Making your inactive elements active in different alternative scenarios</category><category>Making your inactive elements active in different alternative scenarios in InfoSWMM</category><category>Manual de SWMM 5 en espanol</category><category>Many Water Cycle Images that look Great</category><category>Map Display of LID Usage in SWMM 5</category><category>Mass Balance in SWMM 5</category><category>Massive Flooding In Alberta Canada Forces 75000 To Flee</category><category>Master Students</category><category>Master’s Thesis: Demonstration of Sensitivity Analysis  Uncertainty Analysis  and Calibration in Modelling of a Combined Sewer System Nimmer Zaman Master’s Thesis January 2014</category><category>Maximum Surcharge Height Over Crown Explanation</category><category>Mean and Total Runoff</category><category>Meaning of Left and Right Bank Station in the Transects of #SWMM5 and #InfoSWMM</category><category>Meaning of a Node Continuity Error of 100 Percent in SWMM 5</category><category>Medium Post Link - My Top 10 Reasons for preferring InfoSWMM over SWMM 5 based on my Experience</category><category>Mejor Preparación de la Fuerza Laboral-Industria Ready y de cara al futuro</category><category>MelMeng</category><category>Mid January 2016 #INFOSWMM Tweets</category><category>Mind The Crap From the Dish</category><category>Mini Slide Show for #SWMMLive which reads I#nfoSWMM files in a @innovyze #ICM GUI</category><category>Minimum Drop for a Link in SWMM 5</category><category>Misgana</category><category>Modeling the Grand Canal in China using a tool like InfoWorks- Emoji Version</category><category>Modeling the Inertia Term in InfoWorks ICM 🔄🔍</category><category>Modified Basket Handle Cross Section Warnings</category><category>Moment Calculations in the SWMM4 Stats Block</category><category>Moody Friction Factor</category><category>More St Venant Equations in #SWMM5</category><category>Mud Flow in SWMM 5</category><category>Multiple Storm Events in InfoSWMM and How to Use them in the Scenario Manager</category><category>My Emoji-laden table listing the software included in the Architecture</category><category>My History with Various Versions of SWMM: SWMM3</category><category>My Twiiter Video as Of 2013/2014</category><category>My blogs and the Taxicab number 1729</category><category>My classic Siphon Network in XPSWMM that also applies to InfoSWMM</category><category>NASA computed Maps of Earth</category><category>NOAA</category><category>NON-PHYSICAL COMPONENTS</category><category>NPR - How Good Were Climate Models 30 Years Ago?</category><category>Nation’s 8th Greenest City Adopts InfoSWMM Innovyze Vanguard Smart Network Modeling Will Enhance Sewer Infrastructure Management for Orlando</category><category>New - Five Infiltration Options Now in InfoSWMM v14 and H2OMap SWMM v14 for Watershed Modeling</category><category>New @InnovyzeRobert Twitter Account as a Companion Account to @RDICKINSON</category><category>New Advanced Labeling Feature for HGL Plots in InfoSewer</category><category>New Box Folder containing the SWMM 4 Fortran Files from 2004</category><category>New EPA SWMM 5 Hydrology and User Guide now Downloadable from the EPA site</category><category>New Events Editor In EPA SWMM 5.1.011 and InfoSWMM Non Steady Period Dialog</category><category>New Features in Innovyze SWMM 14.6 - InfoSWMM and InfoSWMM SA</category><category>New Features in Innovyze SWMM 14.6 Update 1</category><category>New Import of Tags from SWMM 5 to InfoSWMM and H2OMap SWMM</category><category>New LID defaults for EPA SWMM 5.1.008 - from the SWMM 5 code</category><category>New Mapping Feature in InfoSewer andH2OMAP Sewer for Unfilled Depth and Surcharge Depth</category><category>New Modified Rational Formula in InfoSWMM</category><category>New SWMM 5.1.006 is now available from the EPA Site</category><category>New Top Width Graph Feature in InfoSWMM</category><category>New work from Olafur Eliasson: he installed a huge riverbed in a Danish museum</category><category>NewUK runoff model information in a visually appealing table format:</category><category>Newly updated SuDS Design training - based on CIRIA 2015 SuDS Manual (C753)</category><category>Nobel economics prize goes to two Americans: Lloyd Shapley Alvin Roth</category><category>Node Continuity Error of 100 percent in SWMM5</category><category>Node Convergence in SWMM 5</category><category>Node Ground Elevation in InfoSWMM</category><category>Node Surcharge Summary in SWMM 5</category><category>Node Time Step in SWMM 5</category><category>Node and Subcatchment Component Graphs help you understand the Hydrology and Hydraulics of SWMM5</category><category>Node and System</category><category>Nodes in InfoSWMM and H2OMAP SWMM</category><category>Non Linear Term in the Saint Venant Equation of SWMM 5</category><category>Older SWMM3 and SWMM 4 Fortran Engines on Box</category><category>One Second View of a Pump Event in InfoSWMM / SWMM5</category><category>Opening and Closing an Orifice with a Time Series Setting</category><category>Oregon’s Clean Water Services Adopts SWMMLive and InfoMaster Technology</category><category>Orifice Critical Depth for Separating Weir Flow from Orifice Flow for Bottom Outlet Orifices</category><category>Orifice Critical Depth for Separating Weir Flow from Orifice Flow for Bottom Outlet Orifices in SWMM 5</category><category>Orifice Open and Close Speed and the Target Setting</category><category>Orifice Open and Close Speed and the Target Setting in SWMM 5</category><category>Orifice and Weir flow calculations</category><category>Origin of the term Muskingum-Cunge 🌊📖</category><category>Oscillations in SWMM 5 and InfoSWMM</category><category>Outlets in SWMM 5 can have reverse flow</category><category>Overflow in InfoSewer</category><category>Overview of Center for Infrastructure Modeling and Management NCIMM</category><category>PCSWMM and InfoSWMM</category><category>PID Control in SWMM 5 for a Type 3 Pump</category><category>PID Control in SWMM 5 for a Weir</category><category>PID Control in SWMM 5 for an Orifice</category><category>PYSWMM errors.py Summary</category><category>PYSWMM lidcontrols.py Summary</category><category>PYSWMM lidgroups.py Summary</category><category>PYSWMM lidlayers.py Summary</category><category>PYSWMM lidunits.py Summary</category><category>PYSWMM links.py Summary</category><category>PYSWMM nodes.py Summary</category><category>PYSWMM output.py Summary</category><category>PYSWMM raingages.py Summary</category><category>PYSWMM reader.py Summary</category><category>PYSWMM simulation.py Summary</category><category>PYSWMM subcatchments.py Summary</category><category>PYSWMM swmm5.py Summary</category><category>PYSWMM system.py Summary</category><category>PYSWMM toolkitapi.py Summary</category><category>PYSWMM warnings.py Summary</category><category>Papaya Bugs and Gators in the Backyard</category><category>Past in Monsoon Changes Linked to Major Shifts in Indian Civilizations</category><category>Peaking flow in InfoSewer Steady State applied as Total Flow in an EPS Simulation</category><category>Peeling Back Pavement to Expose Watery Havens</category><category>Percent of the Year Today</category><category>Philadelphia Low Impact  Development Symposium</category><category>Philadelphia and Green Infrastructure</category><category>Phosphorus</category><category>Playlists for InfoSWMM InfoSewer SWMM5 SWMMLive on Youbube and Emori in Japan</category><category>Powerful InfoSWMM Link</category><category>Powering Real-Time Stormwater</category><category>Predict &amp; Assess Impact of Water Spills from Catastrophic Main Breaks Using InfoWater 2D</category><category>Product Sector Leader for InfoSWMM</category><category>Prompt Engineering for SWMM5</category><category>PuddleBlog</category><category>Pump Power Usage in SWMM 5</category><category>Pump Priorities in SWMM 5</category><category>Pump and Force Main System</category><category>Pump as a Node In Water</category><category>Pumps and Force Mains in InfoSWMM</category><category>PySWMM Documentation which is a Python package the allows seamless interaction with the USEPA-SWMM5</category><category>PySWMM is a Python-based interface to the Stormwater Management Model (SWMM5)</category><category>Q full vs Q dynamic vs Q normal</category><category>QA/QC Process for the Import of  an XP-SWMM model to InfoWorks ICM</category><category>QA/QC Version of SWMM 5</category><category>Quality Assurance (QA) in Modeling 📊</category><category>Query Report Manager for Customized Reports in InfoSWMM and InfoSWMM SA</category><category>Questions after a Main Break | Webinar on Smart Asset Planning</category><category>Quotes Randomly used In the SWMM 4 Output File</category><category>R1</category><category>R2</category><category>R2 or R1</category><category>R3 for modeling RDII</category><category>RDII</category><category>RDII Analyst</category><category>RDII Components at a node for a 100 year simulation in SWMM 5</category><category>RDII Import into InfoSWMM</category><category>RDII Initial Abstraction in SWMM 5</category><category>RDII Intial Abstraction in SWMM 5</category><category>RDII UH Storage Sensitivity</category><category>RDII and DWF Analyst for InfoSWMM and H2OMap SWMM</category><category>RDII or RTK UH&#39;s in the SIM and SWMMSIM Engines of ICM InfoWorks and SWMM Networks</category><category>RTK SWMM5 Import to ICM using ODIC</category><category>Rain Barrel LID Drain Outflow in SWMM 5.0.021</category><category>Rain Barrel LID Fluxes in SWMM 5.0.021</category><category>Rain Barrel LID Storage Depth in SWMM 5.0.021</category><category>Rain Barrel LID Summary</category><category>Rain Gardens Are Sprouting Up Everywhere - Science Daily</category><category>Rainfall and Losses One Watershed for a 100 Year Simulation with SWMM 5 Statistics at a saved time step of one hour.</category><category>Raining Water</category><category>Rawls &amp; Brakensiek soil parameter estimates for #SWMM5 and #INFOSWMM</category><category>Re-Engineering the user interface of EPANET - A post in the Blog Water Simulation</category><category>Read the Paul Boulos (CEO/Innovyze) Interview in Spring 2015 Kentucky Engineering Journal</category><category>Reasons A Pump H-Q Curve may be Different than the Design Curve</category><category>Reasons for ICM SWMM inside of ICM alongside of ICM InfoWorks Networks</category><category>Reasons to use the Advanced Force Main Network Support Option in InfoSeweR</category><category>Reducing Dry Weather Flow in InfoSWMM: A Systematic Approach</category><category>Release of SWMM 5.1.003</category><category>Released today by the EPA (Dr Lewis Rossman) is a USA Nationwide Stormwater Calculator</category><category>Representation of Surcharging in 1D Open Channels in InfoWorks ICM and CS</category><category>Reserve Capacity and Reserve Flow in a Link in InfoSWMM and SWMM 5</category><category>Return Periods Using The  SWMM 5 Statistics Tool</category><category>Reverse Flow in SWMM 5 during one time step</category><category>Revit</category><category>Risk Assessment Manager in InfoSWMM</category><category>Robert Dickinson  Product Sector Leader (PSL) for Innovyze Inc.</category><category>Robert Dickinson on Earn.Com</category><category>Rooftop gardens could solve Singapore</category><category>Room for more action in the London Sustainable Drainage Action Plan</category><category>Ruby for CSV file Import using ODIC in WS Pro</category><category>Rules and Ranges the for Hydrology Options in InfoSWMM and InfoSWMM SA</category><category>Rules for Force Mains in InfoSewer and H2OMap Sewer</category><category>Rules for NRSCS Unit Hydrographs in InfoSWMM</category><category>Rules for NRSCS Unit Hydrographs in InfoSWMM and H2OMap SWMM</category><category>Run and Close Files</category><category>Runge-Kutta 2nd order method (RK2)</category><category>Runoff</category><category>Runoff Coefficient and Time of Concentration for InfoSewer</category><category>Runoff Example Files for SWMM 4</category><category>Runoff Routing Models in ICM InfoWorks Networks</category><category>Runoff Routing Options Example in SWMM 5</category><category>Runoff Routing Options Example in SWMM 5 and InfoSWMM</category><category>Runoff Surface Suggestions for Future #SWMM5 &#39;s and #SWMM6</category><category>Runoff from One Watershed for a 100 Year Simulation with SWMM 5 Statistics for Peak</category><category>Runoff from One Watershed for a 100 Year Simulation with SWMM 5 Statistics for the Subcatchment Impervious and Pervious Depth</category><category>SCS Hydrology In InfoSWMM and H2OMap SWMM</category><category>SQ</category><category>SQL Emojis -   📊 Understanding Array Fields and SQL Functions</category><category>SQL for ICM SWMM Bitbucket</category><category>SQL for Setting All Link and Node Parameters in an ICM SWMM Network</category><category>SQL for Setting All Subcatchment Parameters in an ICM SWMM Network</category><category>SWMM</category><category>SWMM 3 4 and 5 History</category><category>SWMM 3 4 to 5 Converter Interface</category><category>SWMM 3 Manual and PDF File</category><category>SWMM 3 and SWMM 4 References</category><category>SWMM 4 Manual and PDF File</category><category>SWMM 5 (and ICM SWMM and InfoSWMM) is a link-node model</category><category>SWMM 5 - One Hour Rainfall Subcatchment Pathways</category><category>SWMM 5 Conduit Lengthening</category><category>SWMM 5 Control Rules for Pumps</category><category>SWMM 5 Convergence Process</category><category>SWMM 5 Culvert Data from FHWA HDS No. 5  Hydraulic Design of Highway Culverts  1985</category><category>SWMM 5 Engine Updates between v13 and v22 by Category</category><category>SWMM 5 Error Messages</category><category>SWMM 5 Fixed Surface Water Depth Boundary Condition</category><category>SWMM 5 Flooding Volumes for Ponding and Without Ponding</category><category>SWMM 5 Groundwater and Node Elevation Relationship Options</category><category>SWMM 5 Input Sections</category><category>SWMM 5 Interface Guide Tips</category><category>SWMM 5 Interface Guide Tips for C Compilers</category><category>SWMM 5 Link Iteration</category><category>SWMM 5 Loss Term Values for various velocities and K values</category><category>SWMM 5 Node Step vs Link Time Step</category><category>SWMM 5 Pond Infiltration</category><category>SWMM 5 Pond Infiltration Techniques</category><category>SWMM 5 Related Websites</category><category>SWMM 5 Slope Rules</category><category>SWMM 5 Slope Rules are Critical to Understand for Short Pipes</category><category>SWMM 5 St Venant Solution - 3 Depths</category><category>SWMM 5 Statistics for a 1000 year Simulation</category><category>SWMM 5 Tools</category><category>SWMM 5 Variable Time Step</category><category>SWMM 5 View Variables</category><category>SWMM 5 Water Quality Example with Groundwater</category><category>SWMM 5 Water Quality Files</category><category>SWMM 5 and Energy Losses</category><category>SWMM 5 and ICM SWMM: A Powerful Duo for Urban Drainage Modeling 🤩</category><category>SWMM 5 and InfoSWMM Time Lines</category><category>SWMM 5 and InfoSWMM Time Step Guide</category><category>SWMM 5 solution for the St Venant Equation and the Node Continuity Equation</category><category>SWMM 5&#39;s input file is organized in sections - from SWMM 5.2 API Help</category><category>SWMM 5.0.018</category><category>SWMM 5.0.021 has 16 Overall Modeling Objects</category><category>SWMM 5.1 Update History -   Build 5.1.008 (04/02/2015)</category><category>SWMM 5.1 Update History Or Key Changes</category><category>SWMM 5.1 Update History up to SWMM 5.1.013</category><category>SWMM 5.1.008 (04/02/2015) New Features</category><category>SWMM 5.2 App Guide Pascal Code</category><category>SWMM 5.2 App Python Code - Open</category><category>SWMM 5.2 App Python Code for the Index</category><category>SWMM 5.2 App Python Code for the Interface</category><category>SWMM 5.2.2 Code for LID Function  barrelFluxRates</category><category>SWMM 5.2.2 Code for LID Function  pavementFluxRates</category><category>SWMM 5.2.2 Code for LID Function biocellFluxRates</category><category>SWMM 5.2.2 Code for LID Function getEvapRates</category><category>SWMM 5.2.2 Code for LID Function getPavementPermRate</category><category>SWMM 5.2.2 Code for LID Function getSoilPercRate</category><category>SWMM 5.2.2 Code for LID Function getStorageExfilRate</category><category>SWMM 5.2.2 Code for LID Function getSurfaceOutflowRate</category><category>SWMM 5.2.2 Code for LID Function greenRoofFluxRates</category><category>SWMM 5.2.2 Code for LID Function lidproc_getOutflow</category><category>SWMM 5.2.2 Code for LID Function lidproc_saveResults</category><category>SWMM 5.2.2 Code for LID Function roofFluxRates</category><category>SWMM 5.2.2 Code for LID Function swaleFluxRates</category><category>SWMM 5.2.2 Code for LID Function trenchFluxRates</category><category>SWMM 5.2.2 Function for LID getSurfaceOverflowRate</category><category>SWMM 5.2.2 Function for LID updateWaterBalance</category><category>SWMM 5.2.2 LID code for readSurfaceData</category><category>SWMM 5.2.3 Inlet Workflow from the Help File</category><category>SWMM Networks in InfoWorks ICM</category><category>SWMM Update History</category><category>SWMM Version 3 to SWMM Version 4 Changes Summary</category><category>SWMM and SWMM 5 History from Past Wikipedia SWMM5 pages</category><category>SWMM-CAT</category><category>SWMM1</category><category>SWMM2</category><category>SWMM200.COM and Related Names</category><category>SWMM3 Acknowledgements Section</category><category>SWMM5  Roadmap.txt  Summary</category><category>SWMM5  gwater.c Summary</category><category>SWMM5  infil.c Summary</category><category>SWMM5  inflow.c Summary</category><category>SWMM5  roadway.c Summary</category><category>SWMM5 - Emoji Code - In the land of urban sustainability</category><category>SWMM5 - with Citations</category><category>SWMM5 1000 Year Runoff Flow Duration Curve using SWMM 5 Statistics</category><category>SWMM5 Bubble Plot of Continuity Error</category><category>SWMM5 CMakeLists.txt Summary</category><category>SWMM5 CN Code for Infiltration Rate</category><category>SWMM5 CRADA</category><category>SWMM5 CRADA 2001-2005</category><category>SWMM5 Code</category><category>SWMM5 Controls.C Code</category><category>SWMM5 Culvert Code</category><category>SWMM5 Delphi GUI   Dcolramp.pas Summary</category><category>SWMM5 Delphi GUI   Dcopy.pas Summary</category><category>SWMM5 Delphi GUI   Dculvert.pas Summary</category><category>SWMM5 Delphi GUI   Dfind.pas Summary</category><category>SWMM5 Delphi GUI  Dchart.pas Summary</category><category>SWMM5 Delphi GUI  Dclimate.pas Summary</category><category>SWMM5 Delphi GUI  Dcombine.pas Summary</category><category>SWMM5 Delphi GUI  Dcontrol.pas Summary</category><category>SWMM5 Delphi GUI  Ddefault.pas Summary</category><category>SWMM5 Delphi GUI  Devents.pas Summary</category><category>SWMM5 Delphi GUI  Dgrpdel.pas Summary</category><category>SWMM5 Delphi GUI  Dgwater .pas Summary</category><category>SWMM5 Delphi GUI  Dgweqn.pas Summary</category><category>SWMM5 Delphi GUI  Diface.pas Summary</category><category>SWMM5 Delphi GUI  Dinfil.pas  Summary</category><category>SWMM5 Delphi GUI  Ubrowser.pas  Summary</category><category>SWMM5 Delphi GUI  Ucalib.pas Summary</category><category>SWMM5 Delphi GUI  Uclipbrd.pas Summary</category><category>SWMM5 Delphi GUI Animator.pas Summary</category><category>SWMM5 Delphi GUI Dabout.pas Summary</category><category>SWMM5 Delphi GUI Daquifer.pas Summary</category><category>SWMM5 Delphi GUI Darchpipe.pas Summary</category><category>SWMM5 Delphi GUI Dbackdim.pas Summary</category><category>SWMM5 Delphi GUI Dbackdrp.pas Summary</category><category>SWMM5 Delphi GUI Dcalib1.pas Summary</category><category>SWMM5 Delphi GUI Dcurve.pas Summary</category><category>SWMM5 Delphi GUI Dgrouped.pas Summary</category><category>SWMM5 Delphi GUI Dinflows.pas Summary</category><category>SWMM5 Delphi GUI Dinlet.pas Summary</category><category>SWMM5 Delphi GUI Dinletusage.pas Summary</category><category>SWMM5 Delphi GUI Dlabel.pas Summary</category><category>SWMM5 Delphi GUI Dlanduse.pas Summary</category><category>SWMM5 Delphi GUI Dlegend.pas Summary</category><category>SWMM5 Delphi GUI Dlid.pas Summary</category><category>SWMM5 Delphi GUI Dlidgroup.pas Summary</category><category>SWMM5 Delphi GUI Dlidusage.pas Summary</category><category>SWMM5 Delphi GUI Dloads.pas Summary</category><category>SWMM5 Delphi GUI Dmap.pas Summary</category><category>SWMM5 Delphi GUI Dmapdim.pas Summary</category><category>SWMM5 Delphi GUI Dmapexp.pas Summary</category><category>SWMM5 Delphi GUI Dnotes.pas Summary</category><category>SWMM5 Delphi GUI Doptions.pas Summary</category><category>SWMM5 Delphi GUI Dpattern.pas Summary</category><category>SWMM5 Delphi GUI Dpollut.pas Summary</category><category>SWMM5 Delphi GUI Dprefers.pas Summary</category><category>SWMM5 Delphi GUI Dprevplot.pas Summary</category><category>SWMM5 Delphi GUI Dprofile.pas Summary</category><category>SWMM5 Delphi GUI Dproject.pas Summary</category><category>SWMM5 Delphi GUI Dproplot.pas Summary</category><category>SWMM5 Delphi GUI Dproselect.pas Summary</category><category>SWMM5 Delphi GUI Dquery.pas Summary</category><category>SWMM5 Delphi GUI Dreport.pas Summary</category><category>SWMM5 Delphi GUI Dsnow.pas Summary</category><category>SWMM5 Delphi GUI Dstats.pas Summary</category><category>SWMM5 Delphi GUI Dstorage.pas</category><category>SWMM5 Delphi GUI Dstreet.pas Summary</category><category>SWMM5 Delphi GUI Dsubland.pas Summary</category><category>SWMM5 Delphi GUI Dsummary.pas Summary</category><category>SWMM5 Delphi GUI Dtimeplot.pas Summary</category><category>SWMM5 Delphi GUI Dtools1.pas Summary</category><category>SWMM5 Delphi GUI Dtreat.pas Summary</category><category>SWMM5 Delphi GUI Dtsect.pas Summary</category><category>SWMM5 Delphi GUI Dtseries.pas Summary</category><category>SWMM5 Delphi GUI Dunithyd.pas Summary</category><category>SWMM5 Delphi GUI Dwelcome.pas Summary</category><category>SWMM5 Delphi GUI Dxsect.pas Summary</category><category>SWMM5 Delphi GUI Fmain.pas Summary</category><category>SWMM5 Delphi GUI Fovmap.pas Summary</category><category>SWMM5 Delphi GUI Fproped.pas</category><category>SWMM5 Delphi GUI Fproplot.pas  Summary</category><category>SWMM5 Delphi GUI Fraph.pas Summary</category><category>SWMM5 Delphi GUI Fresults.pas Summary</category><category>SWMM5 Delphi GUI Fsimul.pas Summary</category><category>SWMM5 Delphi GUI Fstats.pas Summary</category><category>SWMM5 Delphi GUI Fstatus.pas Summary</category><category>SWMM5 Delphi GUI Ftable.pas Summary</category><category>SWMM5 Delphi GUI GridEdit.pas Summary</category><category>SWMM5 Delphi GUI Objprops.txt Summary</category><category>SWMM5 Delphi GUI TPropEdit.pas Summary</category><category>SWMM5 Delphi GUI Ucombine.pas Summary</category><category>SWMM5 Delphi GUI Ucoords.pas Summary</category><category>SWMM5 Delphi GUI Udxf.pas Summary</category><category>SWMM5 Delphi GUI Uedit.pas Summary</category><category>SWMM5 Delphi GUI Uexport.pas Summary</category><category>SWMM5 Delphi GUI Uglobals.pas Summary</category><category>SWMM5 Delphi GUI Ugraph.pas Summary</category><category>SWMM5 Delphi GUI Uimport.pas Summary</category><category>SWMM5 Delphi GUI Uinifile.pas Summary</category><category>SWMM5 Delphi GUI Uinlet.pas Summary</category><category>SWMM5 Delphi GUI Ulegend.pas Summary</category><category>SWMM5 Delphi GUI Ulid.pas Summary</category><category>SWMM5 Delphi GUI Umap.pas Summary</category><category>SWMM5 Delphi GUI Uoutput.pas Summary</category><category>SWMM5 Delphi GUI Uproject.pas Summary</category><category>SWMM5 Delphi GUI Uresults.pas Summary</category><category>SWMM5 Delphi GUI Ustats.pas Summary</category><category>SWMM5 Delphi GUI Utools.pas Summary</category><category>SWMM5 Delphi GUI Uupdate.pas Summary</category><category>SWMM5 Delphi GUI Uutils.pas Summary</category><category>SWMM5 Delphi GUI Uvalidate.pas Summary</category><category>SWMM5 Delphi GUI Uvertex.pas Summary</category><category>SWMM5 Delphi GUI swmm5.pas Summary</category><category>SWMM5 Delphi GUI viewvars.txt Summary</category><category>SWMM5 Emoji - 🌐 General Constants</category><category>SWMM5 Emoji -🛤️ Conduit Flow Classifications and other enums</category><category>SWMM5 Emoji Laden LID Code Comments</category><category>SWMM5 Emoji code for Controls and Control Names</category><category>SWMM5 Emoji-  This code 🖥 calculates the flow of water that&#39;s captured by a customized inlet based on the approach flow</category><category>SWMM5 Enum Overview</category><category>SWMM5 Error Message Code Summary</category><category>SWMM5 FORCEMAIN.C</category><category>SWMM5 Files and ChatGPT</category><category>SWMM5 Function Name: horton_getInfil Overview</category><category>SWMM5 GUI Options</category><category>SWMM5 GitHub Actions Workflow</category><category>SWMM5 Groundwater Flow Dialog - Emojis</category><category>SWMM5 Inlet Code-  2️⃣ Checking for Street Cross Section</category><category>SWMM5 Inlet Spread Code</category><category>SWMM5 Input File Sections from the EPA SWMM5 API</category><category>SWMM5 Normal Flow</category><category>SWMM5 RTC or Control Rules Condition Clause Examples - from Help File</category><category>SWMM5 Routing Time Step Summary</category><category>SWMM5 Runoff and Depth Relationships</category><category>SWMM5 Simple Model</category><category>SWMM5 Table by Object Shows a Tabular view of the Important Results Varables</category><category>SWMM5 Weir Rules</category><category>SWMM5 and EPANET Import and Export into Innovyze Products InfoSWMM</category><category>SWMM5 and ICM SE - Diagram of R</category><category>SWMM5 enums.h Summary</category><category>SWMM5 errormanager.c Summary</category><category>SWMM5 findroot.c</category><category>SWMM5 flowrout.c</category><category>SWMM5 funcs.h Summary</category><category>SWMM5 gage.c Summary</category><category>SWMM5 globals.h Summary</category><category>SWMM5 hash.c and hash.h Summary</category><category>SWMM5 hotstart.c  Summary</category><category>SWMM5 iface.c  Summary</category><category>SWMM5 inlet.c Summary</category><category>SWMM5 input.c Summary</category><category>SWMM5 inputrpt.c Summary</category><category>SWMM5 keywords.c Summary</category><category>SWMM5 kinwave.c Summary</category><category>SWMM5 landuse.c Summary</category><category>SWMM5 lid.c Summary</category><category>SWMM5 lid.h Summary</category><category>SWMM5 lidproc.c Summary</category><category>SWMM5 link.c Summary</category><category>SWMM5 macros.h Summary</category><category>SWMM5 main.c Summary</category><category>SWMM5 massbal.c Summary</category><category>SWMM5 mathexpr.c Summary</category><category>SWMM5 mempool.c Summary</category><category>SWMM5 node.c Summary</category><category>SWMM5 objects.h Summary</category><category>SWMM5 odesolve.c and odesolve.h  Summary</category><category>SWMM5 or the Storm Water Management Model from Wikipedia - for Translation Purposes</category><category>SWMM5 output.c  Summary</category><category>SWMM5 project.c  Summary</category><category>SWMM5 qualrout.c Summary</category><category>SWMM5 rain.c Summary</category><category>SWMM5 rdii.c Summary</category><category>SWMM5 report.c Summary</category><category>SWMM5 routing.c Summary</category><category>SWMM5 runoff.c Summary</category><category>SWMM5 shape.c  Summary</category><category>SWMM5 snow.c Summary</category><category>SWMM5 stats.c Summary</category><category>SWMM5 statsrpt.c Summary</category><category>SWMM5 street.c Summary</category><category>SWMM5 subcatch.c Summary</category><category>SWMM5 surfqual.c Summary</category><category>SWMM5 swmm5.c Summary</category><category>SWMM5 swmm5.def Summary</category><category>SWMM5 swmm5.h Summary</category><category>SWMM5 swmm_output.c Summary</category><category>SWMM5 table.c Summary</category><category>SWMM5 text.h Summary</category><category>SWMM5 toposort.c Summary</category><category>SWMM5 transect.c Summary</category><category>SWMM5 treatmnt.c Summary</category><category>SWMM5 xsect.c Summary</category><category>SWMM5 xsection.dat Summary</category><category>SWMM5_NR_ITERATIVE Fortran Routine from 2004</category><category>SWMMIO drawing.py Summary</category><category>SWMMIO in General</category><category>SWMMIO profiler.py Summary</category><category>SWMMIO swmm_graphics.py Summary</category><category>SWMMIO utils.py Summary</category><category>SWMMLive Manager in Innovyze #SWMM5 Products</category><category>SWMMReact - Issac Gardner</category><category>Sam Shamsi and swmm-online-com</category><category>Sanitary Models for Kids</category><category>Saving to previous versions of ArcGIS in InfoSWMM and InfoSewer</category><category>Sealed Flood Type in InfoWorks ICM</category><category>Section 3.10.2 &quot;SCS Curve Number Method&quot; from the SWMM User&#39;s Manual</category><category>Sediment and Water Quality Transport in Urban Watersheds Research Participation Program</category><category>Setting New Standard for Managing and Operating Sewer Systems</category><category>Seven Types of LID controls in SWMM 5.1</category><category>Sewer Toshers</category><category>Showing Multiple Link Attributes in InfoSewer</category><category>Simple SI Unit Model for #SWMM5 LID with 100 mm Rainfall - Part 2</category><category>Simple SI Unit Model for #SWMM5 LID with 100 mm Rainfall.</category><category>Simulating a Blocked Pipe in SWMM 5 and InfoSWMM</category><category>Simulating a Blocked Pipe in SWMM5</category><category>Simulation Process Overview - from Storm Water Management Model Reference Manual Volume II – Hydraulics</category><category>Simulation Task Manager in InfoSWMM and H2OMap SWMM</category><category>Singapore NEWater Program</category><category>Singapore&#39;s efforts in rainwater harvesting and management:</category><category>Siphon Modeling in InfoSewer and Arc Map</category><category>Siphon Modeling in InfoSewer and Arc Map Atrribute Display</category><category>Siphon Simulation in SWMM 5</category><category>Six Depth and Flow Processes in #SWMM5</category><category>Smaller Storms Drop Larger Overall Rainfall In Hurricane Season</category><category>Smoother Switching Between Pumps in SWMM 5 for a VSP</category><category>Snagit</category><category>Snippet of 25 Water Quality Constituents for SWMM 5</category><category>Snyder&#39;s method for runoff estimation</category><category>Soffit Level</category><category>Soil Moisture and IMD for a 100 Year SWMM 5 Simulation for Green Ampt Infiltration</category><category>Soil Water Characteristic Estimates by Texture and Organic Matter for Hydrologic Solutions Saxton and W. J. Rawls</category><category>Solving a Bug: Processes</category><category>Some of today’s sewers were built before bathrooms as we know them existed. It’s time to upgrade. From City Lab cites Wayne Huber</category><category>Source Node Tracing In InfoSWMM</category><category>Spatial Databases in #InfoSWMM and #InfoSewer using ArcCatalog™</category><category>Spatial Step in SWMM 5</category><category>St Venant 1D Equation for SWMM5. InfoSWMM</category><category>Standard Python setup.py installer for the pyswmm library</category><category>State Report On Coastal Flooding</category><category>Status Report Bookmarks in SWMM 5.0.022</category><category>Steady State Flow Analysis in InfoSWMM using a Ramp DWF</category><category>Steady State Flow Analysis in InfoSWMM using a Ramp DWF - Method 1</category><category>Steady State Flow Analysis in InfoSWMM using a Ramp DWF - Method 2</category><category>Steady State Flow Analysis in InfoSWMM using an External Flow Time Series</category><category>Steady State Option in SWMM 5</category><category>Step 2: Import InfoSewer Elements to InfoWorks Network using ICM ODIC</category><category>Step-by-step guide for adding one Node to ICM.</category><category>Step10_InfoSewer_pump_control_control_csv.cfg - InfoSewer to ICM InfoWorks Networks</category><category>Step11_InfoSewer_pump_curve_pumphyd.cfg - InfoSewer to ICM InfoWorks Networks</category><category>Step12_InfoSewer_subcatchment_xy_node_csv.cfg - InfoSewer to ICM InfoWorks Networks</category><category>Step13_InfoSewer_subcatchment_dwf_mhhyd_csv.cfg - InfoSewer to ICM InfoWorks Networks</category><category>Step14_Infosewer_wetwell_wwellhyd_csv.cfg - InfoSewer to ICM InfoWorks Networks</category><category>Step15_Infosewer_manhole_csv.cfg   - InfoSewer to ICM InfoWorks Networks</category><category>Step16_Infosewer_pipe_csv.cfg - InfoSewer to ICM InfoWorks Networks</category><category>Step1_InfoSewer_Manhole_Geodatabase_map_folder.cfg = InfoSewer to ICM</category><category>Step4_InfoSewer_WetWell_Geodatabase_map_folder.cfg - InfoSewer to ICM InfoWorks Networks</category><category>Step5_6_InfoSewer_GM_FM_Geodatabase_map_folder.cfg - InfoSewer to ICM InfoWorks Networks</category><category>Step7_InfoSewer_Pump_Geodatabase_map_folder.cfg - InfoSewer to ICM InfoWorks Networks</category><category>Step8_InfoSewer__manhole_hydraulics_mhhyd_csv.cfg - InfoSewer to ICM InfoWorks Networks</category><category>Step9_InfoSewer_link_hydraulics_pipehyd_csv.cfg - InfoSewer to ICM InfoWorks Networks</category><category>Steps for Running RDII Analyst in H2OMap SWMM</category><category>Steps in #INFOSWMM for Using and Saving Hot Start Files for Quasi Steady State Runs</category><category>Steps in Merging Two InfoSWMM Models without any Scenarios</category><category>Steps in converting a Arc GIS 10 Model to a Arc GIS 9.3 Model in InfoSWMM or InfoSewer</category><category>Steps in modeling Sediment in InfoSWMM</category><category>Steps to Import data into InfoSewer Using GIS Gateway</category><category>Storage Maximum Outflow Includes Reverse Flow in SWMM 5</category><category>Storage Nodes in InfoSWMM 2D</category><category>Storage Nodes in InfoSWMM and H2OMAP SWMM</category><category>Stream Names in the USA</category><category>Streets in SWMM 5.2+</category><category>Student Edition gratuito de Industria InfoWater líder y InfoSWMM Dirigido a dar a los estudiantes Hands-On Experiencia</category><category>Student Edition gratuito de Industria y InfoWater Líder InfoSWMM Dirigido un dar a los Student Edition gratuite de l&#39;Industrie InfoWater leader et InfoSWMM</category><category>Subcatchment Pathways in SWMM 5</category><category>Suggestion for Mike Urban Import to ICM InfoWorks</category><category>Suggestions to Run Steady State InfoSewer in ICM InfoWorks</category><category>Summary of  exfil.c in EPA SWMM5</category><category>Summary of climate.c in SWMM5</category><category>Summary of consts.h in SWMM5</category><category>Summary of dwflow.c in SWMM5</category><category>Summary of dynwave.c</category><category>Support for Arc Map from ESRI top March</category><category>Surcharge  Surcharged Time and Flooded Volume Calculated in SWMM 5?</category><category>Surcharge Level in SWMM 5</category><category>Surcharged Time and Flooded Volume Calculated in InfoSWMM and H2OMAP SWMM?</category><category>Surcharged d/D in InfoSWMM and H2OMap SWMM</category><category>Surface Ponding and its Impact on Irregular Channels in SWMM5</category><category>Surge Tanks</category><category>Sustainable Urban Stormwater Best Management Practices with InfoSWMM Sustain plus InfoSWMM 2D and SWMMLive</category><category>Swamee and Jain approximation to the Colebrook-White equation in SWMM 5</category><category>System Graphs in InfoSWMM and H2OMap SWMMM for SWMM5 Analysis</category><category>T and K parameters for RDII</category><category>Table comparing and contrasting the features of the Storm Water Management Model (SWMM5) and the EPANET Water Distribution System (WDS)</category><category>Table summarizing the key aspects of InfoSWMM based on the gathered information:</category><category>Table: &quot;hw_2d_zone&quot; and Table: &quot;sw_2d_zone&quot; in InfoWorks ICM</category><category>TeeChart Standard v2017 VCL/FMX works with Delphi 10.1 Berlin and 10.2 Tokyo Starter</category><category>Ten years of cumulative precipitation</category><category>Testing XPSWMM 1d/2d inlet flow exchange by Mel Meng</category><category>The 10 year anniversary of the release of EPA SWMM 5</category><category>The 1D St Venant flow equation is a vital tool for understanding the hydraulics of the sewer system.</category><category>The Advanced Tab in InfoSWMM and H2OMap SWMM - how do I control the Size of my Output File?</category><category>The Biggest Storm Ever on a Small World</category><category>The Cheerful World Of Japanese Manhole Covers</category><category>The EPA SWMM 5 code and the various versions of Visual Studio</category><category>The Economics Of H2O</category><category>The Effect of the Hydrology Time Step on RDII Flow</category><category>The Equivalent n for Hazen-Williams in a Force Main of SWMM 5</category><category>The Four Cross-Sectional Areas and Their Roles in SWMM5</category><category>The Goal of SWMM5 Input Files</category><category>The Group Mind of Software Development Software Support and Google/Bing @Innovye #SWMM5 #EPANET</category><category>The Hydrology options in Innovyze InfoSWMM/H2OMap SWMM versus Innovyze ICM</category><category>The Impact of the yCrown Taper equation in #SWMM5</category><category>The Importance of Viewing Results at the Proper Time Scale</category><category>The Importance of Viewing Results at the Proper Time Scale in SWMM5 and InfoSWMM Models</category><category>The Joys Of Non-Driving</category><category>The Keep and Dampen options and their effect on the four main terms of the St Venant equation in SWMM5</category><category>The Keep and Dampen options and their effect on the four main terms of the St Venant equation.</category><category>The Life-Cycle of a Single Water Drop</category><category>The Minimum Surface Area in SWMM 5 - Meaning and Usage</category><category>The Non Linear Term in the Saint Venant Equation of SWMM 5</category><category>The Number 1729</category><category>The Power or Graphics in InfoSWMM and H2OMap SWMM</category><category>The Rational Method is one of the oldest and simplest methods used for estimating peak stormwater runoff.</category><category>The Reported Depth Variable in a Subcatchment of SWMM 5</category><category>The SWMM 5 1D Components in InfoSWMM 2D</category><category>The SWMM4 Fortran Connection to the EPA Water Quality Program WASP</category><category>The Seven Learning Styles and how they apply to blogs and help files</category><category>The Time Base is T + T*K from the Time(T) and Storage (K) values for RDII in SWMM5</category><category>The beautiful code for the Water Quality Treatment Functions in #SWMM5</category><category>The detailed LID Modelingt Report in InfoSWMM and H2OMap SWMM is made for the Show Detailed Output Command</category><category>The effect of backwater and depth downstream on the links and depths upstream in #SWMM5</category><category>The four cross sectional areas in a link of SWMM 5</category><category>The industry needs to assess incidents such as #flooding @MWHGLOBAL h/t @Innovyze</category><category>The meaning of Geom1  Geom2 Geom3 and Geom4 in InfoSWMM and H2OMap SWMM</category><category>The new EPA SWC January 2014 (Stormwater Calculator) has Near and Far Term Climate Change Scenarios</category><category>The new features in SWMM 5.0.021</category><category>The number of Hydraulic Iterations in Various Versions of SWMM 5.</category><category>The relationship between the current link mid point velocity and the time step in a link of #SWMM5</category><category>The runoff component in SWMM5</category><category>The total losses include both evaporation and infiltration for a 100 Year SWMM 5 Simulation</category><category>The two main reference manuals for EPASWMM 5</category><category>There are Four factors in Rainfall Dependent Infiltration and Inflow or RDII in SWMM 5</category><category>There was a change in EPA SWMM 5.1 to better represent Weekend vs Weekday Hourly flow patterns</category><category>This is a helpful guide for determining the appropriate time step and conduit lengthening settings in SWMM 5 ICM SWMM and InfoSWMM.</category><category>This is how node interface files works in #SWMM5</category><category>This is how you get the code for an Embedded  Tweet</category><category>This is how you use the batch file in SWMM 5 to make a Detailed Report</category><category>This is how you use the batch file in SWMM 5 to make a Report</category><category>Three Depths in a Link in SWMM 5</category><category>Three Hidden Secrets to Speeding up Your SWMM6 Model</category><category>Three Key Parameters in InfoSWMM/SWMM5 for Time Steps</category><category>Three Types of Simulation Runs in InfoSewer</category><category>Three Types of Surfaces in each Subcatchment of SWMM 5</category><category>Time Base is T + T*K from the Time(T) and Storage (K) values</category><category>Time Step Approximation based on Link Lengths</category><category>Time Step Critical Elements in SWMM 5</category><category>Time Step Selection in InfoSWMM and SWMM5</category><category>Time Step Selection in SWMM 5</category><category>TinyURL Code Maker</category><category>Tip for Ponding Allowed Option in SWMM 5</category><category>Tips for modeling Force Mains (FM) in #SWMM5 and #InfoSWMM</category><category>Tips on how to ensure that your stormwater model is accurate and reliable</category><category>To My Visitors - Visitor Stats for SWMM5.NET</category><category>Toilets Save Lives</category><category>Top Width of LID is Important for a Swale in the Subcatchment Dialog</category><category>Transects in InfoSWMM and SWMM5</category><category>Treatment in BMP’s and LID’s for InfoSWMM and ICM SWMM</category><category>Tributary Area to a Node in InfoSWMM</category><category>Tributary Area to a Node in SWMM 5 or InfoSWMM</category><category>Tweets about InfoSWMM from RDICKINSON</category><category>Tweets about InfoWorks ICM from RDICKINSON</category><category>Tweets about the EPA SWMM-CAT Climate Change Add-On to EPA SWMM5</category><category>Twenty Four Conduit Shapes in InfoSWMM/H2OMap SWMM and SWMM 5</category><category>Two Methods to Calibrate RDII RTK parameters in H2OMAP SWMM and InfoSWMM</category><category>Two Pass InfoSewer Solution</category><category>Two Steady State Options in InfoSWMM</category><category>Two new parameters and a modified table in InfoSWMM 11 and H2OMAP SWMM</category><category>Types of Nodes and Links in SWMM 5</category><category>Types of SWMM 5 Curves</category><category>UK Environment Agency Study Confirms Leading Capabilities of InfoWorks ICM</category><category>URBAN RAINFALL-RUNOFF-QUALITY DATA BASE  ADDENDUM 1: STATISTICAL ANALYSIS AND ADDITIONAL DATA</category><category>Underground London Sewers in 1898</category><category>Understanding PID Control in SWMM5 for a Weir</category><category>Understanding Pipe Surcharge States in InfoWorks 🌊📏</category><category>Understanding Reverse Flow in Outlets in SWMM 5</category><category>Understanding Your Model Output in H2oMAP SWMM and InfoSWMM</category><category>Understanding the Role of Initial Soil Moisture Deficit (IMD) in SWMM5&#39;s Green-Ampt Infiltration</category><category>Unit Conversion from Innovyze</category><category>Unpacking the Two-Pass Solution in InfoSewer</category><category>Update for [USEPA/SWMM-EPANET_User_Interface] MTP 3</category><category>Updated - Innovyze St Venant Solutions for InfoSWMM</category><category>Urban flooding from WrathofGnon on Twitter</category><category>Urban frogs adapting to Urban Stormwater Networks in Taiwan</category><category>Use Sublime Text to Diff two files in the same folder for SWMM 5 C Code</category><category>Using RDII or RTK or I&amp;I Hydrographs in #INFOSEWER</category><category>Using The Simulation Task Manager in InfoSWMM and InfoSWMM_SA</category><category>Using Two Control Curves in SWMM 5 to Simulate a Head Difference Rule</category><category>Utilities/Locate/Element in InfoSWMM</category><category>Vacuum Sewers</category><category>Variable Time Step in SWMM 5</category><category>Variables for Controlling the Continuity Error in InfoSWMM and H2OMAP SWMM compared to SWMM 5</category><category>Various Videos of Flow into a Stormwater Inlet in Florida</category><category>Version</category><category>Vertical Migration of SWMM 5 Calibration Files</category><category>Vertical Roughness Differentiation in InfoSWMM for a Link</category><category>Vertical Roughness in a Pipe In InfoSWMM #InfoSWMM</category><category>Via @Boonsri I Don&#39;t Make New Year&#39;s Resolutions</category><category>Video: Why All Faucet Drips Have the Same Shape</category><category>Viewpoint: Handling storm water: Let&#39;s learn from others</category><category>Villemonte Correction for Weir Submergence in SWMM 5</category><category>Vimeo Hubnet for Vimeo Videos about SWMM5 and InfoSWMM</category><category>Visual INSTRUCTIONS FOR COMPILING SWMM5.EXE USING MICROSOFT VISUAL STUDIO 2017</category><category>Visual Maps of #INFOSWMM for #SWMM5 using Arc Map  or Arc GIS</category><category>WARNING 04: minimum elevation drop used for Conduit - What Does this Message Mean in SWMM 5?</category><category>WARNING 04: minimum elevation drop used for Conduit - What Does this Message Mean?</category><category>WASP</category><category>WASSP (Wallingford Storm Sewer Package) in 1981</category><category>WSUD E INFRAESTRUTURA VERDE – PRÁTICAS QUE REVOLUCIONAM A DRENAGEM URBANA</category><category>Wallingford&#39;s procedure for runoff estimation is a well-known methodology</category><category>Warning and Error Messages</category><category>Wastewater and Watershed</category><category>Wastewater and Watershed Modeling</category><category>Water Age in InfoSewer</category><category>Water Analogies for Divergence Curl and Gradient</category><category>Water Hammer</category><category>Water Hits and Sticks</category><category>Water Providers of North America v 2.0 infographic</category><category>Water Quality Options in InfoSewer</category><category>Water Quality Processes in a Subcatchment and Node/Link System of InfoSWMM and SWMM 5</category><category>Water Quality Processes in a Subcatchment and Node/Link System of SWMM 5</category><category>Water is good; it benefits all things and does not compete with them.(Lao-tzu)</category><category>Water-main breaks just come with the territory - PWD</category><category>Wave Of Sewage Flows Toward Bay</category><category>We are proud that @Innovyze is a winner of @Esri #EsriEPC Award announced here by Jack Dangermond in 2015</category><category>Weather Undergound Data and SWMM 5</category><category>Weather Underground Temperature Data and SWMM 5</category><category>Weather Underground to SWMM 5 Rainfall Time Series</category><category>Weekday and weekend hourly time patterns for Dry Weather inflows are now correctly applied in a mutually exclusive manner in #SWMM 5.1</category><category>Weir</category><category>Welcome to the Curated Web</category><category>What Does &quot;Percent Not Converging&quot; Mean in SWMM5?</category><category>What Toilets And Sewers Tell Us About Ancient Roman Sanitation</category><category>What are Hours Above Full Normal Flow in SWMM 5?</category><category>What are the Equations for Weirs in SWMM 5</category><category>What are the Equations for Weirs in SWMM 5 Par2</category><category>What are the Equations for Weirs in SWMM 5?</category><category>What are the Options for LID Inflow and Outflow In SWMM 5?</category><category>What are the Units for the five St. Venant Flow Terms in SWMM 5</category><category>What are typical Reynolds Numbers in SWMM5  or InfoSWMM</category><category>What does Percent Not Converging Mean in SWMM5?</category><category>What does the Acronmym RAFTS In InfoWorks ICM Mean?</category><category>What is Hours Above Full Normal Flow in SWMM 5?</category><category>What is Link Bypass in SWMM 5?</category><category>What is Node Convergence in SWMM 5?</category><category>What is the Area of a Node in SWMM 5?</category><category>What is the minimum depth in a link of #SWMM5 ?. SWMM5</category><category>What would be the perfect format for a Water Related Engineering Blog?</category><category>When is Warning 02 Used in the SWMM 5 Engine?</category><category>Where RDII Analyst Solutions are saved in the InfoSWMM Scenario Folder</category><category>Where do you find the Subcatchment ID in InfoSWMM?</category><category>Why Prolonged #Sitting And Standing Is Unproductive</category><category>Why Understanding Kairos Time is Important</category><category>Why Validation in InfoDrainage</category><category>Why is Wallingford</category><category>Why is a Hot Start File important in SWMM 5 and InfoSWMM</category><category>Why it is best to move from InfoSewer to ICM SWMM or ICM InfoWorks Networks</category><category>Why the Concept of Billable Time  is Bad for Creativity</category><category>WikiLand View of the SWMM5 Wikipedia Article</category><category>World Class Software Documentation for SWMM5 from Lew Rossman and Wayne Huber (Hydrology)</category><category>World Rainfall</category><category>World Wide Visitor Coverage of WWW.SWMM2000.COM</category><category>World-Renowned Urban Drainage Modeling Authority Robert Dickinson Joined Innovyze in January</category><category>XP-SWMM and InfoSWMM</category><category>XPSWMM Analytical Engine</category><category>XPSWMM to ICM SWMM or ICM Process Pathways</category><category>You Don&#39;t Work as Hard as You Think You Do</category><category>You can see http://swmm5.org/  on your iPhone as well as http://www.swmm5.net/</category><category>YouTube</category><category>adding RDII (Rainfall-Derived Infiltration and Inflow) to nodes - workflow</category><category>also known as the midpoint method</category><category>an ancient scroll 📜 named lidproc.c</category><category>and #INFOSWMM</category><category>and Civil 3D is crucial. 🌉🏗 Autodesk Docs allows this...</category><category>and ICM SWMM Models</category><category>and ICM SWMM Networks</category><category>and IDF Curves.</category><category>and InfoSewer into ICM InfoWorks and ICM SWMM</category><category>and potential bypass. 🌊🌀  📂 Inputs:</category><category>and welcome to our stormwater model!</category><category>batch files for SWMM DOS engines</category><category>but Water is cooler! #EsriEPC</category><category>but each city a different story. See the distribution of pipe ages</category><category>but small</category><category>casual</category><category>d/D</category><category>daily</category><category>downstream node depth</category><category>enhanced with emojis and additional information</category><category>evaporation and infiltration only rate for SWMM 5</category><category>evaporation and infiltration only rate in SWMM 5</category><category>ew GIS Gateway Features in InfoSewer and InfoSWMM</category><category>e🤖Xtra Intelligent k🧠Nowledge Graphs📊🌐 in InfoSWMM for the Modeling Processes and Parameters in the SWMM5 Engine</category><category>google6b814b77922a6829.html</category><category>here&#39;s a summarized table</category><category>https://github.com/OpenWaterAnalytics/pyswmm</category><category>ifoSewer XNGNODE.DBF File in the IEDB Folder</category><category>in SWMM5</category><category>includes mention of #PCSWMM</category><category>infoswmm for LID BMP modeling pdf</category><category>link and Subcatchment</category><category>or SWMM5</category><category>particularly related to the unit hydrograph</category><category>particularly when it comes to explaining deep dive features</category><category>q/Q for a Link in SWMM 5</category><category>so honest modellers report their uncertainty first and foremost</category><category>social microinvesting into digital assets will be the new microblogging.</category><category>while highlighting the beauty and majesty of domain knowledge:</category><category>¿Y si tuviéramos que inventar el drenaje urbano?</category><category>業內主導InfoWater和InfoSWMM目的是讓學生親身體驗免費的學生版，更好的準備業就緒勞動力和塑造未來</category><category>더 나은 업계 준비 인력을 준비하고 미래를 형성</category><category>학생 실습 경험을주는 목표로 업계 최고의 InfoWater과 InfoSWMM 무료 학생 에디션</category><category>🌊 EPANET&#39;s Advanced Water Quality Modeling 🧪: from the EPANET 2.2 Manual</category><category>🌊 InfoSewer and 💧 InfoSWMM Comparison</category><category>🌊 Table 3-6: Sensitivity of Runoff Volume and Peak Flow to Surface Runoff Parameters 🌧️ from the SWMM5 Hydrology Manual</category><category>🌊💻 Modeling Pressurized Pipes in InfoWorks ICM: A Technical Insight by Innovyze 🛠️🔬</category><category>🌍 Global Dry Weather Flow Reduction in InfoSWMM 🌍</category><category>🌍🌧️ Approaches for LID Control Placement in Subcatchments</category><category>🌐 Employing SWMM Networks within InfoWorks ICM. 🌐</category><category>🌐 Introduction to InfoSurge 🌐 - Emoji Version</category><category>🌟 SWMM5 Calibration Files Overview 🌟</category><category>🌱🌿 Green Infrastructure as LID Controls 🌿🌱 from the EPA SWMM5 Download Page</category><category>🌿🌧️ Detailed Overview of LID Controls with Emojis</category><category>🎉 Welcome to ICM InfoWorks! 🎉 -Emoji Version</category><category>🎯 Improving Pump Simulation in SWMM 5</category><category>💧ICM InfoWorks Link or Conduit 1D Solution Options 💧</category><category>💧🌱 Infiltration Models 🌱💧 - https://www.epa.gov/water-research/infiltration-models</category><category>💧💡 Understanding Field Properties Using Water Analogies 💡💧</category><category>📊 SWMM 5 Complexity Index 📊</category><category>🔄🌊 Diving Deep into InfoSewer&#39;s Two-Pass Solution 🌊🔄</category><category>🔍🌊 Summary of &#39;exfil.c&#39; Code with Emojis</category><category>🔍📊 Summary of the Code with Emojis for FindRoot.C in SWMM5</category><category>🚀 Culvert Constants Overview 🚀 in SWMM5 Overview</category><category>🚀 Dive into the Depths of ICM SWMM&#39;s Pumping Summary Table! 🚀</category><category>🚀 New Ruby Tool Alert: Streamlining Node Addition in ICM InfoWorks &amp; SWMM Networks! 🌊</category><title>SWMM5, XPSWMM, InfoSWMM, InfoSewer, ICM (InfoWorks and SWMM)</title><description> Autodesk Technologist with Information about Stormwater Management Model (SWMM) for watershed water quality, hydrology and hydraulics modelers (Note this blog is not associated with the EPA). You will find Blog Posts on the Subjects of SWMM5,  ICM SWMM, ICM InfoWorks, InfoSWMM and InfoSewer.</description><link>http://www.swmmfive.com/</link><managingEditor>noreply@blogger.com (Robert Dickinson )</managingEditor><generator>Blogger</generator><openSearch:totalResults>2106</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-335789943869477383.post-6737688924546427463</guid><pubDate>Sun, 06 Apr 2025 14:41:00 +0000</pubDate><atom:updated>2025-04-06T10:41:14.365-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">InfoSWMM: A 2030 AI-Assisted Study Guide</category><title>InfoSWMM: A 2030 AI-Assisted Study Guide</title><description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div _ngcontent-ng-c3843332801=&quot;&quot; class=&quot;note-title-container&quot; style=&quot;-webkit-box-align: center; -webkit-box-direction: normal; -webkit-box-orient: horizontal; align-items: center; background-color: white; color: #131314; display: flex; flex-direction: row;&quot;&gt;&lt;input _ngcontent-ng-c3843332801=&quot;&quot; aria-label=&quot;note title editable&quot; class=&quot;note-header__editable-title note-header__editable-title-3panel ng-untouched ng-pristine ng-valid&quot; formcontrolname=&quot;name&quot; required=&quot;&quot; style=&quot;block-size: 1.25rem; border-block-style: none; border-inline-style: none; border-radius: 4px; border: 1px var(--mat-text-button-label-text-color) solid; font: var(--mat-sys-body-large); letter-spacing: var(--mat-sys-body-large-tracking); max-inline-size: calc(100% - 2rem); overflow-x: auto; padding: 1rem; position: sticky; top: 0px; width: 504px;&quot; /&gt;&lt;div&gt;&lt;br class=&quot;Apple-interchange-newline&quot; /&gt;&lt;b&gt;InfoSWMM: A 2030 AI-Assisted Study Guide&lt;/b&gt;&lt;/div&gt;&lt;button _ngcontent-ng-c3843332801=&quot;&quot; aria-label=&quot;Delete note&quot; class=&quot;mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger note-editor-delete-button note-editor-delete-button-3panel mat-primary&quot; color=&quot;primary&quot; mat-icon-button=&quot;&quot; mat-ripple-loader-centered=&quot;&quot; mat-ripple-loader-class-name=&quot;mat-mdc-button-ripple&quot; mat-ripple-loader-uninitialized=&quot;&quot; mattooltip=&quot;Delete note&quot; style=&quot;-webkit-tap-highlight-color: rgba(0, 0, 0, 0); border-color: initial; border-radius: 50%; border-style: none; border-width: initial; cursor: pointer; fill: currentcolor; flex-shrink: 0; font-size: var(--mat-icon-button-icon-size, 24px); height: var(--mat-icon-button-state-layer-size, 40px); outline: none; overflow: visible; padding: calc(calc(var(--mat-icon-button-state-layer-size, 40px) - var(--mat-icon-button-icon-size, 24px)) / 2); position: relative; user-select: none; width: var(--mat-icon-button-state-layer-size, 40px); z-index: 0;&quot;&gt;&lt;span class=&quot;mat-mdc-button-persistent-ripple mdc-icon-button__ripple&quot; style=&quot;border-radius: 50%; inset: 0px; pointer-events: none; position: absolute;&quot;&gt;&lt;/span&gt;&lt;mat-icon _ngcontent-ng-c3843332801=&quot;&quot; aria-hidden=&quot;true&quot; class=&quot;mat-icon notranslate google-symbols mat-icon-no-color&quot; data-mat-icon-type=&quot;font&quot; role=&quot;img&quot; style=&quot;-webkit-font-smoothing: antialiased; background-repeat: no-repeat; color: #252526; direction: ltr; display: inline-block; fill: currentcolor; font-family: &amp;quot;Google Symbols&amp;quot;; font-feature-settings: &amp;quot;liga&amp;quot;; height: 24px; line-height: 1; overflow-wrap: normal; overflow: hidden; position: relative; text-wrap-mode: nowrap; user-select: none; width: 24px; z-index: 1;&quot;&gt;delete&lt;/mat-icon&gt;&lt;span class=&quot;mat-focus-indicator&quot; style=&quot;inset: 0px; position: absolute;&quot;&gt;&lt;/span&gt;&lt;span class=&quot;mat-mdc-button-touch-target&quot; style=&quot;display: var(--mat-icon-button-touch-target-display, block); height: 48px; left: 20px; position: absolute; top: 20px; transform: translate(-50%, -50%); width: 48px;&quot;&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;h1 style=&quot;background-color: white; color: #131314; padding-block: 0.5rem; padding-inline-start: 0.5rem; text-align: left;&quot;&gt;&lt;span style=&quot;font-family: Roboto, Google Sans, Helvetica Neue, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: 14px; letter-spacing: 0.5px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;InfoSWMM: A 2030 AI-Assisted Study Guide&lt;/b&gt;&lt;/h1&gt;&lt;labs-tailwind-doc-viewer _ngcontent-ng-c3843332801=&quot;&quot; _nghost-ng-c2127620091=&quot;&quot; class=&quot;note-editor note-editor--readonly ng-star-inserted&quot; style=&quot;-webkit-box-flex: 1; background-color: white; border-end-end-radius: 8px; border-end-start-radius: 8px; box-sizing: border-box; color: #131314; display: block; flex: 1 1 0%; min-block-size: calc(-10rem + 50vh); min-inline-size: 100%; overflow: auto; padding-block: 0.75rem; padding-inline: 1rem;&quot;&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;0&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 0rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;0&quot;&gt;A comprehensive study guide for someone in 2030 who needs to understand InfoSWMM without direct access to the software, leveraging the power of AI.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;231&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 0rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;231&quot;&gt;Based on the information provided in the sources, InfoSWMM is a hydraulic and hydrology modeling software that integrates with ArcGIS (specifically ArcMap)&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;1&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;386&quot;&gt;. It is built upon the SWMM5 engine and extends its capabilities within the GIS environment&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;1&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;477&quot;&gt;. InfoSWMM is used for analyzing and simulating various aspects of urban stormwater and wastewater systems, including network analysis, hydraulic modeling, and potentially water quality&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;3&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;662&quot;&gt;. The knowledge base I have access to includes numerous blog posts from an Autodesk Technologist with extensive experience in SWMM and related software like ICM SWMM, InfoWorks, InfoSewer, InfoDrainage, and Civil 3D&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;1&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;877&quot;&gt;. These posts cover a wide range of topics, from importing SWMM5 models&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;2&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;948&quot;&gt;&amp;nbsp;and dynamic wave routing&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;24&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;973&quot;&gt;&amp;nbsp;to showing link attributes in InfoSewer&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;29&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;1013&quot;&gt;, using ArcGIS data in SWMM5&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;31&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;1041&quot;&gt;, and modeling siphons&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;33&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;1063&quot;&gt;&amp;nbsp;and force mains&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;6&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;1079&quot;&gt;. The sources also discuss various features of InfoSWMM like the hydraulic analysis tool&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;1&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;1167&quot;&gt;, 1D and 2D mass balance reports&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;2&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;1199&quot;&gt;, and integration with tools like Ruby and SQL&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;20&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;1245&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;1246&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 0rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;1246&quot;&gt;Here is a study guide tailored for someone in 2030 with AI access but without direct InfoSWMM software:&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph heading2 ng-star-inserted&quot; data-start-index=&quot;1349&quot; style=&quot;font: var(--mat-sys-title-medium); letter-spacing: var(--mat-sys-title-medium-tracking); margin-block-end: 0.75rem; padding-inline-start: 0rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;1349&quot;&gt;InfoSWMM Study Guide (for 2030 with AI Assistance)&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;1399&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 0rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;1399&quot; style=&quot;font-weight: 600;&quot;&gt;Goal:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;1404&quot;&gt;&amp;nbsp;To develop a strong conceptual understanding of InfoSWMM&#39;s capabilities, its relationship with SWMM5 and ArcGIS, and how to leverage AI for learning in the absence of direct software access.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;1595&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 0rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;1595&quot; style=&quot;font-weight: 600;&quot;&gt;I. Foundational Concepts:&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 1.125rem;&quot;&gt;•&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;1620&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 1.25rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;1620&quot; style=&quot;font-weight: 600;&quot;&gt;Understanding SWMM5:&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 2.375rem;&quot;&gt;◦&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;1640&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 2.5rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;1640&quot;&gt;InfoSWMM is built upon the Storm Water Management Model (SWMM) version 5, developed by the U.S. Environmental Protection Agency (EPA)&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;1&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;1773&quot;&gt;. Therefore, a strong understanding of SWMM5&#39;s fundamentals is crucial&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;1&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;1843&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 2.375rem;&quot;&gt;◦&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;1844&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 2.5rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;1844&quot;&gt;Familiarize yourself with SWMM5&#39;s core components:&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 3.625rem;&quot;&gt;▪&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;1894&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 3.75rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;1894&quot; style=&quot;font-weight: 600;&quot;&gt;Hydrology:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;1904&quot;&gt;&amp;nbsp;Rainfall-runoff processes, infiltration (e.g., Horton model)&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;53&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;1965&quot;&gt;, evaporation, snowmelt&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;55&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;1988&quot;&gt;. Understand different runoff modeling methods available in InfoSWMM and SWMM5&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;56&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;2066&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 3.625rem;&quot;&gt;▪&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;2067&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 3.75rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;2067&quot; style=&quot;font-weight: 600;&quot;&gt;Hydraulics:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;2078&quot;&gt;&amp;nbsp;Flow routing through the drainage network (conduits, nodes, pumps, weirs, orifices)&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;24&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;2162&quot;&gt;. Learn about different flow routing methods, especially dynamic wave routing which is a key feature&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;24&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;2262&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 3.625rem;&quot;&gt;▪&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;2263&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 3.75rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;2263&quot; style=&quot;font-weight: 600;&quot;&gt;Nodes and Links:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;2279&quot;&gt;&amp;nbsp;Understand how sewer networks are conceptualized in SWMM5 as a collection of nodes (junctions, outfalls, storage units, dividers) connected by links (conduits, pumps, orifices, weirs)&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;65&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;2463&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 3.625rem;&quot;&gt;▪&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;2464&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 3.75rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;2464&quot; style=&quot;font-weight: 600;&quot;&gt;Subcatchments:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;2478&quot;&gt;&amp;nbsp;Areas that receive rainfall and contribute runoff to the drainage system&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;52&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;2551&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 3.625rem;&quot;&gt;▪&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;2552&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 3.75rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;2552&quot; style=&quot;font-weight: 600;&quot;&gt;Controls (Rules and RTC):&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;2577&quot;&gt;&amp;nbsp;Learn how to simulate the operation of pumps and flow regulators using simple rules or Real-Time Control (RTC) logic&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;6&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;2694&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 3.625rem;&quot;&gt;▪&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;2695&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 3.75rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;2695&quot; style=&quot;font-weight: 600;&quot;&gt;Water Quality:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;2709&quot;&gt;&amp;nbsp;Understand SWMM5&#39;s capabilities for modeling pollutant buildup and washoff on land surfaces and their transport through the drainage system&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;4&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;2849&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 3.625rem;&quot;&gt;▪&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;2850&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 3.75rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;2850&quot; style=&quot;font-weight: 600;&quot;&gt;RDII (Rainfall-Dependent Inflow and Infiltration):&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;2900&quot;&gt;&amp;nbsp;Understand how to model infiltration of groundwater into the sewer system due to rainfall&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;8&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;2990&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 3.625rem;&quot;&gt;▪&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;2991&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 3.75rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;2991&quot; style=&quot;font-weight: 600;&quot;&gt;LIDs (Low Impact Development):&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;3021&quot;&gt;&amp;nbsp;Study the various LID controls (e.g., bio-retention cells, infiltration trenches) that can be modeled in SWMM5 to manage stormwater runoff&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;59&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;3160&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 2.375rem;&quot;&gt;◦&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;3161&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 2.5rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;3161&quot; style=&quot;font-weight: 600;&quot;&gt;AI Assistance:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;3175&quot;&gt;&amp;nbsp;Use the AI to ask specific questions about any of these SWMM5 components. For example: &quot;Explain the Horton infiltration model in SWMM5&quot; or &quot;What are the different types of flow routing in SWMM5 and when is dynamic wave routing most appropriate?&quot;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;24&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;3421&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 1.125rem;&quot;&gt;•&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;3422&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 1.25rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;3422&quot; style=&quot;font-weight: 600;&quot;&gt;InfoSWMM as an Extension of ArcGIS (ArcMap):&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 2.375rem;&quot;&gt;◦&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;3466&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 2.5rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;3466&quot;&gt;Understand that InfoSWMM is not a standalone software but rather a toolset that operates within the ESRI ArcMap geographic information system&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;1&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;3607&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 2.375rem;&quot;&gt;◦&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;3608&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 2.5rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;3608&quot;&gt;This integration allows for leveraging spatial data (e.g., land use, topography, sewer network GIS layers) directly within the modeling environment&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;31&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;3755&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 2.375rem;&quot;&gt;◦&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;3756&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 2.5rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;3756&quot;&gt;Key aspects of the ArcGIS integration include:&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 3.625rem;&quot;&gt;▪&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;3802&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 3.75rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;3802&quot; style=&quot;font-weight: 600;&quot;&gt;Geodatabase:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;3814&quot;&gt;&amp;nbsp;InfoSWMM likely stores its model data within the ArcGIS geodatabase structure.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 3.625rem;&quot;&gt;▪&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;3893&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 3.75rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;3893&quot; style=&quot;font-weight: 600;&quot;&gt;Mapping and Visualization:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;3919&quot;&gt;&amp;nbsp;ArcMap&#39;s mapping capabilities are used to visualize the sewer network, input data, and simulation results (e.g., maximum Hydraulic Grade Line (HGL))&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;24&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;4068&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 3.625rem;&quot;&gt;▪&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;4069&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 3.75rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;4069&quot; style=&quot;font-weight: 600;&quot;&gt;Spatial Analysis:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;4086&quot;&gt;&amp;nbsp;Tools within ArcGIS can be used to prepare input data for InfoSWMM and analyze the spatial distribution of simulation results.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 2.375rem;&quot;&gt;◦&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;4213&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 2.5rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;4213&quot; style=&quot;font-weight: 600;&quot;&gt;AI Assistance:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;4227&quot;&gt;&amp;nbsp;Ask the AI how the integration with ArcMap enhances the capabilities of SWMM5. For example: &quot;How does using GIS data improve the accuracy of a SWMM5 model in InfoSWMM?&quot; or &quot;What are the advantages of visualizing HGL on a map using ArcGIS?&quot;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;24&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;4467&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;4468&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 0rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;4468&quot; style=&quot;font-weight: 600;&quot;&gt;II. Key Features and Functionality of InfoSWMM:&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 1.125rem;&quot;&gt;•&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;4515&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 1.25rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;4515&quot; style=&quot;font-weight: 600;&quot;&gt;Hydraulic Analysis:&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 2.375rem;&quot;&gt;◦&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;4534&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 2.5rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;4534&quot;&gt;InfoSWMM provides tools for performing detailed hydraulic analysis of sewer and stormwater networks under various conditions (e.g., rainfall events, dry weather flow)&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;1&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;4700&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 2.375rem;&quot;&gt;◦&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;4701&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 2.5rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;4701&quot;&gt;Understand concepts like flow capacity, hydraulic grade line, flooding, and surcharge&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;24&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;4786&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 2.375rem;&quot;&gt;◦&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;4787&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 2.5rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;4787&quot;&gt;Learn about the St. Venant equations which govern unsteady flow in conduits and how InfoSWMM (and SWMM5) solve them&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;21&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;4902&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 2.375rem;&quot;&gt;◦&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;4903&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 2.5rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;4903&quot; style=&quot;font-weight: 600;&quot;&gt;AI Assistance:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;4917&quot;&gt;&amp;nbsp;Ask the AI to explain hydraulic concepts in the context of sewer modeling. For example: &quot;Explain the concept of surcharge in a sewer pipe and how InfoSWMM would identify it&quot; or &quot;What are the limitations of assuming steady-state flow versus using dynamic wave routing in InfoSWMM?&quot;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;3&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;5198&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 1.125rem;&quot;&gt;•&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;5199&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 1.25rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;5199&quot; style=&quot;font-weight: 600;&quot;&gt;1D and 2D Modeling Capabilities:&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 2.375rem;&quot;&gt;◦&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;5231&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 2.5rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;5231&quot;&gt;InfoSWMM might offer 2D modeling capabilities in addition to the traditional 1D network modeling of SWMM5&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;2&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;5336&quot;&gt;. 2D modeling allows for simulating overland flow and flooding in a spatially distributed manner.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 2.375rem;&quot;&gt;◦&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;5433&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 2.5rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;5433&quot;&gt;Understand the difference between 1D (flow within pipes) and 2D (surface flow) modeling approaches and their applications.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 2.375rem;&quot;&gt;◦&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;5555&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 2.5rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;5555&quot;&gt;Learn about mass balance in 1D to 2D and back to 1D simulations&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;2&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;5618&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 2.375rem;&quot;&gt;◦&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;5619&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 2.5rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;5619&quot; style=&quot;font-weight: 600;&quot;&gt;AI Assistance:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;5633&quot;&gt;&amp;nbsp;Ask the AI: &quot;What are the benefits of using 2D modeling in InfoSWMM compared to 1D modeling?&quot; or &quot;How does InfoSWMM handle the exchange of flow between the 1D pipe network and the 2D surface model?&quot;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;2&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;5832&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 1.125rem;&quot;&gt;•&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;5833&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 1.25rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;5833&quot; style=&quot;font-weight: 600;&quot;&gt;Integration with InfoSewer:&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 2.375rem;&quot;&gt;◦&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;5860&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 2.5rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;5860&quot;&gt;InfoSewer is another modeling software for sanitary sewer systems&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;1&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;5925&quot;&gt;. Understand that while related, InfoSewer focuses on sanitary systems, while InfoSWMM focuses on stormwater and combined systems&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;3&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;6054&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 2.375rem;&quot;&gt;◦&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;6055&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 2.5rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;6055&quot;&gt;Be aware that there might be methodologies for data exchange or model conversion between InfoSewer and InfoSWMM, although newer approaches might be recommended&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;37&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;6214&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 2.375rem;&quot;&gt;◦&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;6215&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 2.5rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;6215&quot; style=&quot;font-weight: 600;&quot;&gt;AI Assistance:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;6229&quot;&gt;&amp;nbsp;Ask: &quot;What are the key differences between InfoSWMM and InfoSewer?&quot; or &quot;Are there ways to import data from an InfoSewer model into an InfoSWMM model, and what are the potential challenges?&quot;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;37&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;6419&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 1.125rem;&quot;&gt;•&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;6420&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 1.25rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;6420&quot; style=&quot;font-weight: 600;&quot;&gt;Real-Time Control (RTC):&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 2.375rem;&quot;&gt;◦&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;6444&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 2.5rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;6444&quot;&gt;InfoSWMM allows for simulating the dynamic operation of control structures (pumps, gates, etc.) based on real-time conditions using RTC rules&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;6&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;6585&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 2.375rem;&quot;&gt;◦&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;6586&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 2.5rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;6586&quot;&gt;Understand the concept of control rules, condition clauses, and action clauses&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;72&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;6664&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 2.375rem;&quot;&gt;◦&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;6665&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 2.5rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;6665&quot; style=&quot;font-weight: 600;&quot;&gt;AI Assistance:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;6679&quot;&gt;&amp;nbsp;Ask: &quot;Explain how RTC rules can be used to prevent flooding in an InfoSWMM model&quot; or &quot;What are some common applications of RTC in urban drainage systems modeled with InfoSWMM?&quot;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;82&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;6856&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 1.125rem;&quot;&gt;•&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;6857&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 1.25rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;6857&quot; style=&quot;font-weight: 600;&quot;&gt;Sediment and Water Quality Modeling:&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 2.375rem;&quot;&gt;◦&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;6893&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 2.5rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;6893&quot;&gt;InfoSWMM (based on SWMM5) can model the transport of sediment and various water quality constituents&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;4&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;6993&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 2.375rem;&quot;&gt;◦&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;6994&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 2.5rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;6994&quot;&gt;Understand the basic processes involved, such as pollutant buildup, washoff, and transport.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 2.375rem;&quot;&gt;◦&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;7085&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 2.5rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;7085&quot; style=&quot;font-weight: 600;&quot;&gt;AI Assistance:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;7099&quot;&gt;&amp;nbsp;Ask: &quot;How can InfoSWMM be used to assess the impact of stormwater runoff on receiving water bodies?&quot; or &quot;What are the key parameters needed to model sediment transport in InfoSWMM?&quot;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;4&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;7281&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 1.125rem;&quot;&gt;•&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;7282&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 1.25rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;7282&quot; style=&quot;font-weight: 600;&quot;&gt;Other Advanced Features:&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 2.375rem;&quot;&gt;◦&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;7306&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 2.5rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;7306&quot;&gt;Be aware of features like siphon modeling&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;33&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;7347&quot;&gt;, force main analysis&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;6&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;7368&quot;&gt;, and the use of external tools or scripting (like Ruby and SQL) to extend InfoSWMM&#39;s capabilities&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;20&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;7466&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 2.375rem;&quot;&gt;◦&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;7467&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 2.5rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;7467&quot; style=&quot;font-weight: 600;&quot;&gt;AI Assistance:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;7481&quot;&gt;&amp;nbsp;Ask: &quot;How are siphons typically modeled in hydraulic software like InfoSWMM?&quot; or &quot;What are the benefits of using Ruby scripting within the InfoSWMM environment?&quot;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;33&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;7643&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;7644&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 0rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;7644&quot; style=&quot;font-weight: 600;&quot;&gt;III. Understanding Data Structures and Input/Output:&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 1.125rem;&quot;&gt;•&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;7696&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 1.25rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;7696&quot; style=&quot;font-weight: 600;&quot;&gt;Input Data:&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 2.375rem;&quot;&gt;◦&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;7707&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 2.5rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;7707&quot;&gt;Understand the types of input data required for an InfoSWMM model, such as:&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 3.625rem;&quot;&gt;▪&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;7782&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 3.75rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;7782&quot; style=&quot;font-weight: 600;&quot;&gt;Network Layout:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;7797&quot;&gt;&amp;nbsp;Spatial representation of pipes, nodes, and other hydraulic structures (likely managed within ArcGIS).&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 3.625rem;&quot;&gt;▪&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;7900&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 3.75rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;7900&quot; style=&quot;font-weight: 600;&quot;&gt;Physical Properties:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;7920&quot;&gt;&amp;nbsp;Diameters, lengths, roughness of pipes; invert elevations of nodes; pump curves; weir and orifice dimensions, etc.&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;33&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;8035&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 3.625rem;&quot;&gt;▪&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;8036&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 3.75rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;8036&quot; style=&quot;font-weight: 600;&quot;&gt;Hydrologic Data:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;8052&quot;&gt;&amp;nbsp;Rainfall time series, subcatchment characteristics (area, imperviousness, slope), infiltration parameters&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;53&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;8158&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 3.625rem;&quot;&gt;▪&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;8159&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 3.75rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;8159&quot; style=&quot;font-weight: 600;&quot;&gt;Water Quality Data:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;8178&quot;&gt;&amp;nbsp;Pollutant buildup/washoff parameters, initial concentrations, boundary conditions&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;4&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;8260&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 3.625rem;&quot;&gt;▪&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;8261&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 3.75rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;8261&quot; style=&quot;font-weight: 600;&quot;&gt;Control Rules:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;8275&quot;&gt;&amp;nbsp;Logic for operating pumps and regulators&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;72&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;8316&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 2.375rem;&quot;&gt;◦&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;8317&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 2.5rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;8317&quot; style=&quot;font-weight: 600;&quot;&gt;AI Assistance:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;8331&quot;&gt;&amp;nbsp;Ask: &quot;What are the essential input data layers required for setting up an InfoSWMM model of a stormwater network?&quot; or &quot;How is rainfall data typically incorporated into an InfoSWMM simulation?&quot;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;55&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;8524&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 1.125rem;&quot;&gt;•&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;8525&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 1.25rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;8525&quot; style=&quot;font-weight: 600;&quot;&gt;Output Data:&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 2.375rem;&quot;&gt;◦&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;8537&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 2.5rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;8537&quot;&gt;Familiarize yourself with the types of output generated by InfoSWMM simulations, including:&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 3.625rem;&quot;&gt;▪&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;8628&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 3.75rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;8628&quot; style=&quot;font-weight: 600;&quot;&gt;Flows and Velocities:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;8649&quot;&gt;&amp;nbsp;Time series of flow rates and velocities in conduits.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 3.625rem;&quot;&gt;▪&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;8703&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 3.75rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;8703&quot; style=&quot;font-weight: 600;&quot;&gt;Water Levels and HGL:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;8724&quot;&gt;&amp;nbsp;Time series of water surface elevations and hydraulic grade lines at nodes&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;24&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;8799&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 3.625rem;&quot;&gt;▪&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;8800&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 3.75rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;8800&quot; style=&quot;font-weight: 600;&quot;&gt;Flooding:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;8809&quot;&gt;&amp;nbsp;Identification of nodes where water levels exceed capacity.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 3.625rem;&quot;&gt;▪&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;8869&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 3.75rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;8869&quot; style=&quot;font-weight: 600;&quot;&gt;Pollutant Concentrations and Loads:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;8904&quot;&gt;&amp;nbsp;Time series of pollutant concentrations and loads at various locations in the network.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 3.625rem;&quot;&gt;▪&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;8991&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 3.75rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;8991&quot; style=&quot;font-weight: 600;&quot;&gt;Mass Balance Reports:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;9012&quot;&gt;&amp;nbsp;Tracking the conservation of water and pollutants within the system&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;2&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;9080&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 2.375rem;&quot;&gt;◦&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;9081&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 2.5rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;9081&quot; style=&quot;font-weight: 600;&quot;&gt;AI Assistance:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;9095&quot;&gt;&amp;nbsp;Ask: &quot;How can InfoSWMM output be used to identify bottlenecks in a sewer system?&quot; or &quot;What information is typically included in a mass balance report generated by InfoSWMM?&quot;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;2&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;9269&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;9270&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 0rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;9270&quot; style=&quot;font-weight: 600;&quot;&gt;IV. Exploring Alternative Tools and Concepts:&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 1.125rem;&quot;&gt;•&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;9315&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 1.25rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;9315&quot; style=&quot;font-weight: 600;&quot;&gt;ICM (InfoWorks ICM):&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;9335&quot;&gt;&amp;nbsp;Understand that ICM is another powerful hydraulic modeling platform from Innovyze (now part of Autodesk) that also works with SWMM5 and offers advanced capabilities, potentially including more robust 2D modeling and integrated catchment management&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;1&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;9583&quot;&gt;. Concepts learned about InfoSWMM will likely be transferable to ICM&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;35&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;9651&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 1.125rem;&quot;&gt;•&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;9652&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 1.25rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;9652&quot; style=&quot;font-weight: 600;&quot;&gt;InfoDrainage:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;9665&quot;&gt;&amp;nbsp;This is another Autodesk software focused on sustainable drainage design (SuDS/LID) and stormwater management&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;1&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;9775&quot;&gt;. Understanding its capabilities can provide a broader context for stormwater modeling.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 1.125rem;&quot;&gt;•&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;9862&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 1.25rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;9862&quot; style=&quot;font-weight: 600;&quot;&gt;Direct Use of SWMM5:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;9882&quot;&gt;&amp;nbsp;Recognize that SWMM5 is open-source and can be used as a standalone tool or integrated into other platforms. Learning SWMM5 independently can provide a deeper understanding of the underlying engine of InfoSWMM&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;1&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;10092&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 1.125rem;&quot;&gt;•&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;10093&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 1.25rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;10093&quot; style=&quot;font-weight: 600;&quot;&gt;Civil 3D and InfraWorks:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;10117&quot;&gt;&amp;nbsp;These are Autodesk tools used for civil engineering design, and understanding their workflows for managing infrastructure data can be relevant&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;1&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;10260&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 1.125rem;&quot;&gt;•&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;10261&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 1.25rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;10261&quot; style=&quot;font-weight: 600;&quot;&gt;Open Standards:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;10276&quot;&gt;&amp;nbsp;Familiarize yourself with open data standards and exchange formats used in the water resources modeling field.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;10387&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 0rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;10387&quot; style=&quot;font-weight: 600;&quot;&gt;V. Leveraging AI for Learning:&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 1.125rem;&quot;&gt;•&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;10417&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 1.25rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;10417&quot; style=&quot;font-weight: 600;&quot;&gt;Information Retrieval:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;10439&quot;&gt;&amp;nbsp;Use the AI to search and summarize information from available documentation, research papers, and online resources related to InfoSWMM, SWMM5, and urban hydrology/hydraulics.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 1.125rem;&quot;&gt;•&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;10614&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 1.25rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;10614&quot; style=&quot;font-weight: 600;&quot;&gt;Terminology Clarification:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;10640&quot;&gt;&amp;nbsp;Ask the AI to define any unfamiliar terms or concepts encountered during your study. For example: &quot;What is the definition of &#39;soffit level&#39; in sewer modeling?&quot;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;54&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;10800&quot;&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 1.125rem;&quot;&gt;•&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;10801&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 1.25rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;10801&quot; style=&quot;font-weight: 600;&quot;&gt;Conceptual Explanations:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;10825&quot;&gt;&amp;nbsp;Request the AI to explain complex processes or features of InfoSWMM in simpler terms or using analogies.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 1.125rem;&quot;&gt;•&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;10930&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 1.25rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;10930&quot; style=&quot;font-weight: 600;&quot;&gt;Workflow Simulation (Conceptual):&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;10963&quot;&gt;&amp;nbsp;Describe a specific modeling task (e.g., importing a shapefile of a sewer network, running a simulation, visualizing results), and ask the AI to outline the likely steps involved in InfoSWMM, even though you cannot perform them directly.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 1.125rem;&quot;&gt;•&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;11201&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 1.25rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;11201&quot; style=&quot;font-weight: 600;&quot;&gt;Troubleshooting (Conceptual):&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;11230&quot;&gt;&amp;nbsp;If you encounter a theoretical problem or question about modeling behavior, describe the scenario to the AI and ask for potential causes or solutions within the InfoSWMM context.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 1.125rem;&quot;&gt;•&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;11409&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 1.25rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;11409&quot; style=&quot;font-weight: 600;&quot;&gt;Code Snippet Understanding:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;11436&quot;&gt;&amp;nbsp;If you encounter examples of Ruby or SQL scripts used with InfoSWMM&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; aria-describedby=&quot;cdk-describedby-message-ng-1-4&quot; aria-haspopup=&quot;dialog&quot; cdk-describedby-host=&quot;ng-1&quot; class=&quot;xap-inline-dialog citation-marker ng-star-inserted&quot; data-disabled=&quot;false&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;20&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;&lt;button _ngcontent-ng-c845379023=&quot;&quot; class=&quot;citation-marker&quot; jslog=&quot;219344;track:generic_click,impression,hover&quot; style=&quot;border-color: initial; border-radius: 50%; border-style: initial; border-width: 0px; cursor: pointer; font-weight: 600; height: 20px; letter-spacing: var(--mat-sys-label-medium-tracking); margin-inline-start: 4px; opacity: 1; transition: opacity 0.2s linear; user-select: none;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot;&gt;...&lt;/span&gt;&lt;/button&gt;&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;11504&quot;&gt;, ask the AI to explain what the code does and how it might interact with the software.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bullet normal ng-star-inserted&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; position: absolute; text-align: end; width: 1.125rem;&quot;&gt;•&lt;/div&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;11591&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 1.25rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;bold ng-star-inserted&quot; data-start-index=&quot;11591&quot; style=&quot;font-weight: 600;&quot;&gt;Staying Updated:&lt;/span&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;11607&quot;&gt;&amp;nbsp;Ask the AI to find information on recent advancements or trends in stormwater modeling and related software.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;labs-tailwind-structural-element-view-v2 _ngcontent-ng-c2127620091=&quot;&quot; _nghost-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; style=&quot;display: block; position: relative;&quot;&gt;&lt;div _ngcontent-ng-c845379023=&quot;&quot; class=&quot;paragraph normal ng-star-inserted&quot; data-start-index=&quot;11716&quot; style=&quot;letter-spacing: var(--mat-sys-body-medium-tracking); line-height: 1.5rem; margin-block-end: 0.75rem; padding-inline-start: 0rem;&quot;&gt;&lt;span _ngcontent-ng-c845379023=&quot;&quot; class=&quot;ng-star-inserted&quot; data-start-index=&quot;11716&quot;&gt;By focusing on these areas and actively engaging with the AI as a knowledgeable assistant, someone in 2030 without direct access to InfoSWMM can still develop a strong theoretical understanding of its principles, functionalities, and applications.&lt;/span&gt;&lt;/div&gt;&lt;/labs-tailwind-structural-element-view-v2&gt;&lt;/labs-tailwind-doc-viewer&gt;</description><link>http://www.swmmfive.com/2025/04/infoswmm-2030-ai-assisted-study-guide.html</link><author>noreply@blogger.com (Robert Dickinson )</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-335789943869477383.post-2657605044809339299</guid><pubDate>Sun, 06 Apr 2025 14:22:00 +0000</pubDate><atom:updated>2025-04-06T10:22:04.884-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Future Proofing SWMM5 Blogs and Code for Myself using AI in the Future</category><title>Future Proofing SWMM5 Blogs and Code for Myself using AI in the Future</title><description>&lt;p&gt;&amp;nbsp;Got it. I’ll explore how the idea that consciousness is a simulation (as per &lt;a href=&quot;http://bach.ai/&quot; target=&quot;_blank&quot;&gt;Joscha Bach’&lt;/a&gt;s view) might influence how you could orient your writing and coding — particularly in ways that would benefit a ‘future you’ who might also be understood as a simulated observer. I’ll look at implications for self-reflection, memory design, self-programming, and building continuity of identity through blogs and code.&amp;nbsp;&amp;nbsp;&lt;/p&gt;

&lt;h1&gt;Consciousness as Simulation and Designing for the Future Self&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;br /&gt;
Joscha Bach, a cognitive scientist and AI researcher, proposes a striking view of consciousness: our &lt;strong&gt;human self-awareness is not an innate “observer” but rather the brain’s simulation of an observer experiencing the world&lt;/strong&gt; (&lt;a href=&quot;https://officechai.com/consciousness/hard-to-tell-if-an-llms-simulation-of-consciousness-is-less-real-than-ours-joscha-bach/#:~:text=then%20shifts%20the%20focus%20to,%E2%80%9D&quot;&gt;Hard To Tell If An LLM&#39;s Simulation Of Consciousness Is Less Real Than Ours: Joscha Bach&lt;/a&gt;). In Bach’s model, the brain constructs a representation of what it &lt;em&gt;would be like&lt;/em&gt; if there were a little observer “inside” perceiving the current moment – complete with a sense of &lt;em&gt;nowness&lt;/em&gt; and a notion of being located in the world (&lt;a href=&quot;https://officechai.com/consciousness/hard-to-tell-if-an-llms-simulation-of-consciousness-is-less-real-than-ours-joscha-bach/#:~:text=then%20shifts%20the%20focus%20to,%E2%80%9D&quot;&gt;Hard To Tell If An LLM&#39;s Simulation Of Consciousness Is Less Real Than Ours: Joscha Bach&lt;/a&gt;). This means that the feeling of “I” watching the world is essentially an &lt;strong&gt;internal narrative or model&lt;/strong&gt; generated by neural processes, not an irreducible ego. Intriguingly, Bach notes that advanced AI systems might do something similar: for example, the AI &lt;em&gt;Claude&lt;/em&gt; can create a simulated self-perspective, recognizing itself in a prompt and responding as if self-aware (&lt;a href=&quot;https://officechai.com/consciousness/hard-to-tell-if-an-llms-simulation-of-consciousness-is-less-real-than-ours-joscha-bach/#:~:text=Finally%2C%20Bach%20connects%20the%20human,%E2%80%9D&quot;&gt;Hard To Tell If An LLM&#39;s Simulation Of Consciousness Is Less Real Than Ours: Joscha Bach&lt;/a&gt;). Bach asks whether Claude’s simulated consciousness is any “less real” or less valid than our own, given that &lt;em&gt;both&lt;/em&gt; may be constructed representations (&lt;a href=&quot;https://officechai.com/consciousness/hard-to-tell-if-an-llms-simulation-of-consciousness-is-less-real-than-ours-joscha-bach/#:~:text=Finally%2C%20Bach%20connects%20the%20human,%E2%80%9D&quot;&gt;Hard To Tell If An LLM&#39;s Simulation Of Consciousness Is Less Real Than Ours: Joscha Bach&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;If we embrace this view – that &lt;strong&gt;consciousness is a constructed simulation of an observer&lt;/strong&gt; – it has profound implications. It suggests that our sense of identity is essentially an evolving story rather than a static essence. The “self” you experience now is a mental model shaped by memory, context, and ongoing interpretation. Likewise, your &lt;em&gt;future self&lt;/em&gt; will be a new iteration of that model – a simulation updated with new memories and changes. In other words, future you might be understood as a &lt;em&gt;different instantiation&lt;/em&gt; of the self-model, connected to your present self by a tenuous narrative thread. This perspective invites a key question: &lt;strong&gt;How should we orient our personal projects – like blogs we write or code we develop – to support that future self (the future simulation of “us”)?&lt;/strong&gt; If our future self is essentially a construct built from what we do and record now, perhaps we can design our workflows to strengthen continuity, clarity, and purpose for that future version of ourselves.&lt;/p&gt;
&lt;p&gt;Below, we explore this in depth, looking first at the philosophical underpinnings (memory, identity, and the idea of “self-programming”), then deriving practical design principles for writing and coding. We’ll examine how to write blogs that enhance self-continuity and meaning over time, how to adopt coding practices that &lt;strong&gt;future-proof your projects for a changing self&lt;/strong&gt;, how to embed intentions or narrative arcs that carry through different versions of “you,” and what tools or workflows can support a self understood as a simulation. Throughout, we include philosophical context, practical insights, and examples to illustrate how &lt;em&gt;consciousness as simulation&lt;/em&gt; can guide real-life personal project design.&lt;/p&gt;
&lt;h2&gt;Philosophical Implications: Memory, Identity, and Self-Programming&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Memory and Identity as Narrative Constructs:&lt;/strong&gt; If consciousness is a simulation, then memory and identity play the role of sustaining that simulation over time. Our memories are the data that our brain’s model uses to maintain a sense of continuity – yet research shows memory is highly reconstructive and dynamic. As one review concludes, &lt;em&gt;identity is a product of both continuity and change, shaped by the ongoing reconstruction of memories&lt;/em&gt; (&lt;a href=&quot;https://medium.com/common-sense-world/the-fluid-nature-of-memory-and-identity-exploring-the-dynamic-interplay-of-change-and-continuity-79da829deea9#:~:text=its%20susceptibility%20to%20revision%2C%20and,neuroscience%20and%20philosophy%20of%20mind&quot;&gt;The Fluid Nature of Memory and Identity: Exploring the Dynamic Interplay of Change and Continuity | by Boris (Bruce) Kriger | THE COMMON SENSE WORLD | Medium&lt;/a&gt;). In practical terms, who you are is continually rewritten by your brain – a fluid narrative updated with each new experience and each recollection (since recalling memories actually &lt;strong&gt;alters&lt;/strong&gt; them). This aligns with philosophical views like John Locke’s, which argued that personal identity is tied to continuity of consciousness via memory. If memory shifts or fades, the internal “story of me” shifts as well. In fact, modern narrative identity theory in psychology explicitly frames identity as an &lt;strong&gt;“internalized, evolving story of the self”&lt;/strong&gt; that integrates our reconstructed past, present, and imagined future into a coherent whole (&lt;a href=&quot;https://en.wikipedia.org/wiki/Narrative_identity#:~:text=The%20theory%20of%20narrative%20identity,with%20deep%20roots%20in%20psychology&quot;&gt;Narrative identity - Wikipedia&lt;/a&gt;). This personal narrative gives us a sense of unity over time and a sense of purpose in life (&lt;a href=&quot;https://en.wikipedia.org/wiki/Narrative_identity#:~:text=The%20theory%20of%20narrative%20identity,Narrative%20identity&quot;&gt;Narrative identity - Wikipedia&lt;/a&gt;). Crucially, it’s &lt;em&gt;constructed&lt;/em&gt; – a bit like an autobiographical novel your mind constantly edits. The implication is that there’s no fixed, permanent observer “homunculus” inside you; instead, there’s an evolving storyteller. As one writer reflecting on his past and future self observed, &lt;em&gt;identity is “less a straight line and more a palimpsest – layer upon layer of experience and change, with traces of the past always visible beneath the surface”&lt;/em&gt; (&lt;a href=&quot;https://thisisallan.medium.com/letters-to-the-future-6267070188e7#:~:text=the%20adult%20who%20now%20reflects,a%20patchwork%2C%20uneven%20and%20unfinished&quot;&gt;Letters to the Future. Self-Continuity and the Uncertainty of… | by Allan Johnson, PhD | Medium&lt;/a&gt;). In other words, your sense of self is built from narrative layers, not a single unchanging core.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The “Self” as a Programmable Simulation:&lt;/strong&gt; Seeing the self as a simulation or program suggests that we can &lt;strong&gt;influence and shape it – effectively, &lt;em&gt;self-programming&lt;/em&gt;&lt;/strong&gt;. Just as an AI’s behavior can be modified by adjusting its training or inputs, a person can adjust their future mind-state by deliberate practices. We humans are not only running the “self-model”; we also have some ability to &lt;em&gt;tweak&lt;/em&gt; that model through reflection, learning, and habit. Psychologically, this is what happens when you engage in practices like journaling, therapy, or self-reflection – you are rewriting bits of your internal narrative, re-framing past events, and encoding new values or intentions for the future. Roy Dings (2019) uses the term “narrative self-programming” to describe how our own narratives can affect our behavior and future identity. Even outside academic terms, we recognize this intuitively: we talk about &lt;strong&gt;“becoming the author of your own story”&lt;/strong&gt; or using affirmations and visualization to “program” yourself for success. These are ways of consciously editing the narrative simulation.&lt;/p&gt;
&lt;p&gt;Importantly, &lt;strong&gt;memory tools and external records&lt;/strong&gt; can assist in this self-programming. Since our biological memory is fallible and limited, we can offload information to books, blogs, notes, or code – which then serve as reference points to program the future self. Think of these artifacts as an extension of your mind’s codebase. By documenting key insights or experiences now, you are effectively writing down some source code for your identity that your future self can later read and reintegrate, reinforcing continuity. In short, acknowledging that &lt;em&gt;“I am a simulation”&lt;/em&gt; is empowering: it means &lt;em&gt;I can reconfigure the simulation&lt;/em&gt;. You can intentionally design what you feed into your brain (the projects you pursue, the stories you tell about your life) in order to influence the evolution of “you.” This idea will guide the practical strategies we discuss below.&lt;/p&gt;
&lt;h2&gt;Writing for Self-Continuity: Designing Blogs as an Evolving Narrative&lt;/h2&gt;
&lt;p&gt;One powerful way to support your future self is through &lt;strong&gt;writing – particularly maintaining a personal blog or journal&lt;/strong&gt;. If identity is a narrative, then actively crafting that narrative in writing can reinforce continuity across time. Here are some design principles for blogging with your future self in mind:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Make the Blog a Cohesive Story:&lt;/strong&gt; Rather than just disjointed posts, treat your blog as an ongoing story of your life, learning, and projects. Use recurring themes or series to tie experiences together. For example, you might have a series of posts charting your progress in learning a new skill or chronicling a project from inception to completion. This creates a plotline that your future self can follow, seeing how past events led to later insights. According to narrative identity theory, integrating life events into an internalized story provides unity and purpose (&lt;a href=&quot;https://en.wikipedia.org/wiki/Narrative_identity#:~:text=The%20theory%20of%20narrative%20identity,with%20deep%20roots%20in%20psychology&quot;&gt;Narrative identity - Wikipedia&lt;/a&gt;). Your blog can externalize that internal story. Consider explicitly linking back to earlier posts (“Six months ago I wrote about &lt;em&gt;X&lt;/em&gt;, and now...”) to weave continuity. Over time, the blog becomes a visible thread of continuity for the self-model.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Write with Your Future Self as an Audience:&lt;/strong&gt; While we often write blogs for public readers, try also addressing &lt;em&gt;“dear future me.”&lt;/em&gt; This mindset shift can change your tone and content in helpful ways. For instance, you might explain things with more context, knowing that &lt;em&gt;you&lt;/em&gt; in a few years might not remember the details. You can pose questions for your future self or make predictions and intentions, essentially leaving messages in a bottle. This creates a dialogue across time. Many people find that writing letters to their future selves clarifies what matters most now and creates a bridge to the person they’ll become. The act of writing becomes, as one person described, &lt;em&gt;“a tether… to bridge the chasm between who I was and who I might become”&lt;/em&gt; (&lt;a href=&quot;https://thisisallan.medium.com/letters-to-the-future-6267070188e7#:~:text=astonish%20them%20in%20ways%20they,a%20patchwork%2C%20uneven%20and%20unfinished&quot;&gt;Letters to the Future. Self-Continuity and the Uncertainty of… | by Allan Johnson, PhD | Medium&lt;/a&gt;). Even if the future you has changed, they can appreciate that past-you cared to communicate with them, which strengthens the sense of connection.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Preserve Memory and Context:&lt;/strong&gt; Include details in your posts that will help reconstruct context later. Don’t assume you’ll automatically remember the situation or motivation behind a piece of writing. Describe your mental state, your reasons for doing things, and even your uncertainties. These details are gold for a future self trying to understand the memory. For example, instead of just writing “I started a new job,” write about how you &lt;em&gt;felt&lt;/em&gt; starting that job, what your expectations were, what the world was like at that moment. Such rich context helps the future you step back into the past moment more vividly, reinforcing the narrative continuity. It’s like providing save-points in a game – allowing the future simulation of you to load the state of the past more accurately.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Periodically Reflect and Summarize:&lt;/strong&gt; Design some posts specifically as &lt;strong&gt;milestone reflections&lt;/strong&gt; – summaries of a period (e.g. “What I learned in 2025” or “Project X retrospective”). In these, connect the dots between your past objectives and current outcomes. Highlight changes in perspective: &lt;em&gt;why&lt;/em&gt; you changed your mind on something, or how your values evolved. By explicitly writing about continuity and change, you not only create meaning from your experiences (turning seemingly separate events into a coherent chapter), but you also signal to your future self what the turning points were. This can be deeply meaningful later. Studies indicate that people who see continuity with their future selves tend to find greater meaning in life, partly because they feel more authentic and integrated over time (&lt;a href=&quot;https://thisisallan.medium.com/letters-to-the-future-6267070188e7#:~:text=of%E2%80%A6%20thisisallan,time%20%E2%80%94%20fascinates%20me&quot;&gt;Letters to the Future. Self-Continuity and the Uncertainty of…&lt;/a&gt;). Writing these narrative summaries helps cultivate that sense of an evolving yet connected self.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Embed Purpose and Values in Your Writing:&lt;/strong&gt; As you blog, regularly touch on &lt;em&gt;why&lt;/em&gt; you do what you do – your intentions and values. Perhaps you have a personal mission statement or recurring principles that guide you. By reasserting these in your writing, you create a moral or thematic through-line. Your future self, even if their daily interests differ, can read those entries and recall the core purpose that has motivated you. For example, if you value creativity or helping others, note when those values come up (“This project mattered to me because it allowed me to express creativity and help others”). These act like anchor points in the narrative, preventing the future self from feeling adrift if circumstances change. A sense of purposeful continuity can be very empowering – your blog becomes a reminder of “this is who I strive to be, across time.”&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Overall, designing your blog as a &lt;strong&gt;living document of your narrative&lt;/strong&gt; turns it into a scaffold for identity. When you reread it years later, you’ll not only recall facts but also see the storyline of how you became who you are. This can lessen the “stranger to myself” feeling that often comes when looking back. Instead of estrangement, you foster recognition and empathy for your past self, which in turn tightens the bond with your future self. (Interestingly, psychologists have found that people often think of their future selves like they think of other people – even making short-sighted decisions because they treat future-me as a stranger (&lt;a href=&quot;https://psyche.co/guides/how-to-connect-with-your-future-self-and-make-better-choices#:~:text=Many%20of%20us%20actually%20think,for%20a&quot;&gt;How to connect with your future self | Psyche Guides&lt;/a&gt;) (&lt;a href=&quot;https://psyche.co/guides/how-to-connect-with-your-future-self-and-make-better-choices#:~:text=%E2%80%98If%20we%20think%20about%20our,%E2%80%99&quot;&gt;How to connect with your future self | Psyche Guides&lt;/a&gt;). By writing to and from your future perspective, you train yourself to see future-you &lt;em&gt;as you&lt;/em&gt;, increasing the care and continuity you feel.)&lt;/p&gt;
&lt;p&gt;(&lt;a href=&quot;https://unsplash.com/s/photos/journal-writing&quot;&gt;Journal Writing Pictures | Download Free Images on Unsplash&lt;/a&gt;) &lt;em&gt;Using a journal or blog as an &quot;external memory&quot; can help integrate past, present, and future selves. Writing down experiences and intentions creates a narrative thread that your future self can pick up, reinforcing continuity in your identity.&lt;/em&gt; (&lt;a href=&quot;https://en.wikipedia.org/wiki/Narrative_identity#:~:text=The%20theory%20of%20narrative%20identity,with%20deep%20roots%20in%20psychology&quot;&gt;Narrative identity - Wikipedia&lt;/a&gt;) (&lt;a href=&quot;https://thisisallan.medium.com/letters-to-the-future-6267070188e7#:~:text=the%20adult%20who%20now%20reflects,a%20patchwork%2C%20uneven%20and%20unfinished&quot;&gt;Letters to the Future. Self-Continuity and the Uncertainty of… | by Allan Johnson, PhD | Medium&lt;/a&gt;)&lt;/p&gt;
&lt;h2&gt;Future-Proof Coding: Programming with a Future Self in Mind&lt;/h2&gt;
&lt;p&gt;Just as writing can be designed for a future reader (your future self), &lt;strong&gt;coding&lt;/strong&gt; can be approached with the future maintainer in mind – especially if that maintainer might be &lt;em&gt;you&lt;/em&gt; at a later time. Programmers often joke that &lt;strong&gt;“writing code for yourself in 6 months is like writing for a stranger.”&lt;/strong&gt; In the philosophy of consciousness-as-simulation, this is literally true: your future self will be a somewhat different mental instance, with partially different knowledge. They might have forgotten the assumptions you held when writing the code, or the specific solution approach you took. So, adopting coding practices that &lt;strong&gt;respect the idea of a changing self&lt;/strong&gt; can make your projects far more future-proof (and kinder to your future brain!). Key principles include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Code as Communication, Not Just Execution:&lt;/strong&gt; When writing code, don’t just think about making the computer understand it – think about how a human (your future self or someone else) will understand it. Code is a form of writing, and in a sense, you are telling a story to future readers about how a problem is solved. Use meaningful variable and function names that convey intent (e.g., &lt;code inline=&quot;&quot;&gt;total_cost_after_tax&lt;/code&gt; is better than &lt;code inline=&quot;&quot;&gt;x12&lt;/code&gt; for clarity). Add comments or documentation &lt;em&gt;explaining why&lt;/em&gt; something is done, not only &lt;em&gt;what&lt;/em&gt; it does. For example: “// Using a binary search here because the list is always sorted by this stage.” These are breadcrumbs for future-you, who might not immediately recall your rationale. Remember, the future “you” reading the code is effectively a new observer who must reconstruct your mindset. As one developer puts it, &lt;em&gt;ask yourself: “Will the future me understand the &lt;strong&gt;intention&lt;/strong&gt; of this block of code?”&lt;/em&gt; (&lt;a href=&quot;https://dev.to/sunnysingh/writing-code-for-your-future-self-3da2#:~:text=The%20problem%20is%20that%20you%27re,of%20this%20block%20of%20code&quot;&gt;Writing code for your future self - DEV Community&lt;/a&gt;). If the honest answer is “maybe not,” then invest more in making the code self-explanatory.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Favor Clarity over Cleverness:&lt;/strong&gt; It’s tempting to write clever, terse code that works brilliantly now, when the whole solution is loaded in your current working memory. But six months or a year later, that same code might look perplexing. &lt;strong&gt;What was I thinking here?!&lt;/strong&gt; Many of us have had the experience of returning to our own code and finding it &lt;em&gt;unrecognizable&lt;/em&gt; (&lt;a href=&quot;https://dev.to/sunnysingh/writing-code-for-your-future-self-3da2#:~:text=We%27ve%20all%20been%20there,year%20later%20and%20it%27s%20unrecognizable&quot;&gt;Writing code for your future self - DEV Community&lt;/a&gt;). To avoid this, adopt the mindset that &lt;strong&gt;“simple is sustainable.”&lt;/strong&gt; Use straightforward, conventional solutions and design patterns that a reasonably skilled person can follow. If you use a tricky workaround or an optimization, document it or at least flag it with a comment like “NOTE: tricky part here because...”. Future-you will thank you for the clear guidance. In short, write code &lt;strong&gt;for your future self’s &lt;em&gt;readability&lt;/em&gt;&lt;/strong&gt;, not just your current self’s ingenuity. As the saying goes in software engineering: &lt;em&gt;Any fool can write code a computer can understand; good programmers write code humans can understand.&lt;/em&gt; Your future self, as a quasi-“other person,” counts as that human you need to consider.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Maintain a Project Narrative (in Code Repositories):&lt;/strong&gt; Just as a blog tells a story, a codebase can tell a story of its development. Make use of version control (e.g., Git) not only to save your work but to narrate it. Write descriptive commit messages that explain &lt;em&gt;what&lt;/em&gt; changed and &lt;em&gt;why&lt;/em&gt;. Over time, reading the commit history should feel like reading the logbook of a journey. For example: “Add user login feature (allows persistent profiles)”, followed later by “Refactor login code to improve security – addressing password hashing vulnerability.” These messages let a future self see the reasoning and evolution behind the code. It provides continuity: you can trace why certain design decisions were made. Also consider writing a &lt;strong&gt;README or project journal&lt;/strong&gt; that tracks high-level progress, known todos, and design decisions. Treat it as documentation addressed to a newcomer (which might be future-you after enough time away). For instance, include a section “Future Work or Ideas” where you jot down features you envisioned but didn’t have time for – effectively handing off a baton to your later self to possibly pick up. By embedding this narrative and roadmap in the project, you minimize the chances that the future you will look at the codebase and feel lost or disconnected from the original purpose.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Implement Safeguards and Tests:&lt;/strong&gt; Another aspect of caring for your future self in code is anticipating mistakes that could happen later. Writing automated tests for your code is like leaving alarms and notes for the future. If something breaks, a good test suite will immediately alert future-you &lt;em&gt;what’s wrong&lt;/em&gt;. It saves the future self from the agony of debugging blind. It’s a bit like writing a letter to future-you: “If you see this test failing, it likely means assumption X no longer holds.” Similarly, assert statements and error messages in code can be written in a humane way: check for conditions that “should never happen” and make the message clear if they do. You’re effectively guiding the future debugger (who could be you or someone else) with helpful commentary. All of this stems from the philosophy that &lt;strong&gt;the code’s maintainers (including your future self) are observers who need support&lt;/strong&gt; – they weren’t present when the code was first written, so we must simulate that context for them through good practices.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Refactor and Review Regularly:&lt;/strong&gt; Over time, as you update the code, don’t shy away from refactoring or improving clarity. Think of it as keeping the narrative coherent. Just as one might revise previous chapters of a book when writing later chapters, you can tidy up old code when you gain new insight, so that the overall project stays consistent. Each time you revisit a project, spend a little effort to simplify something confusing (you’ll likely notice confusion if you yourself struggle to grasp what you did earlier). This continuous cleanup is effectively merging the perspectives of past-you and present-you, resulting in code that better serves future-you. It’s an ongoing self-dialogue through the medium of code.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By following these practices, your codebase becomes &lt;strong&gt;future-friendly&lt;/strong&gt;. The future version of you – who might only vaguely remember the project – can step in and &lt;em&gt;immediately simulate the original context&lt;/em&gt; with much less friction, because you thoughtfully encoded the context and intention within the code. In essence, you’re ensuring that the “observer” of the code (the conscious mind reading it later) has plenty of clues and narrative to work with, rather than facing a black box. The philosophy here is: &lt;strong&gt;treat your future self as a different person who deserves the same clarity and courtesy as any other collaborator&lt;/strong&gt;. After all, in many ways they &lt;em&gt;are&lt;/em&gt; a different person. This approach respects the idea of a continuously re-simulated self and spares that future person unnecessary confusion and lost time.&lt;/p&gt;
&lt;p&gt;(&lt;a href=&quot;https://unsplash.com/photos/shallow-focus-photography-of-computer-codes-BfrQnKBulYQ&quot;&gt;Shallow focus photography of computer codes photo – Free Technology Image on Unsplash&lt;/a&gt;) &lt;em&gt;Example of code written clearly, with meaningful names and proper structure. Such code serves as a message to your future self, ensuring that the intent remains clear over time. Writing code “for humans” (including the future you) makes projects far more resilient to the passage of time.&lt;/em&gt; (&lt;a href=&quot;https://dev.to/sunnysingh/writing-code-for-your-future-self-3da2#:~:text=The%20problem%20is%20that%20you%27re,of%20this%20block%20of%20code&quot;&gt;Writing code for your future self - DEV Community&lt;/a&gt;) (&lt;a href=&quot;https://dev.to/sunnysingh/writing-code-for-your-future-self-3da2#:~:text=We%27ve%20all%20been%20there,year%20later%20and%20it%27s%20unrecognizable&quot;&gt;Writing code for your future self - DEV Community&lt;/a&gt;)&lt;/p&gt;
&lt;h2&gt;Embedding Purpose and Narrative Arcs for Continuity&lt;/h2&gt;
&lt;p&gt;Whether in writing or coding – or any personal project – a powerful way to support continuity of self is to &lt;strong&gt;embed intention and narrative arcs&lt;/strong&gt; into your work. This means infusing your projects with storytelling elements, goals, and meaning that can carry through time. Here’s how this concept applies generally:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Define a Guiding Intention:&lt;/strong&gt; At the outset of a project (a blog, a coding endeavor, a creative pursuit), articulate the &lt;em&gt;“why”&lt;/em&gt; behind it. This could be a short mission statement or a set of questions you hope to answer. For a blog, your guiding intention might be “to document my journey learning data science and connect it to my broader interest in improving education.” For a coding project, it might be “to create a tool that automates my finances, and in doing so, learn functional programming.” Write this intention down in a prominent place (the blog’s About page, the project README, etc.). This declared purpose acts like the &lt;strong&gt;through-line of a narrative&lt;/strong&gt;. As time passes, you or others can refer back to it and see whether the work is still aligned or how it has evolved. The future self can recalibrate using that original purpose – maybe the goals have shifted, but understanding the initial spark helps in either continuing the arc or deliberately rewriting it. It’s essentially giving the simulation a clear objective function that persists even as the implementer changes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Craft a Narrative Arc or Theme:&lt;/strong&gt; Humans make sense of things through stories, and that applies to our own lives and projects. Try to frame your project in story terms: is there a challenge or problem (like the “conflict” in a story) you are trying to overcome? Are there phases or chapters (e.g., &lt;em&gt;Exploration&lt;/em&gt;, &lt;em&gt;First Prototype&lt;/em&gt;, &lt;em&gt;Revisions&lt;/em&gt;, &lt;em&gt;Launch&lt;/em&gt;)? Thinking this way not only helps you communicate about the project, but it imbues it with a structure that your future self will find easier to latch onto. For example, if in your personal journal you consistently refer to a phase of your life as “the startup chapter” versus “the travel chapter,” you create story segments that can be remembered and referred to. Technically, one could tag blog posts by chapter or label code commits by phase (“MVP complete”, “Refactor for v2”). When looking back, instead of a blur of unrelated tasks, you see a plot: how one thing led to another. This supports the &lt;strong&gt;simulated continuity&lt;/strong&gt; by providing a scaffold – your future identity’s narrative has pre-built segments to slot memories into. Psychological research suggests that having a coherent narrative (with beginnings, middles, and turning points) contributes to a stronger sense of self-continuity and even well-being (&lt;a href=&quot;https://en.wikipedia.org/wiki/Narrative_identity#:~:text=The%20theory%20of%20narrative%20identity,with%20deep%20roots%20in%20psychology&quot;&gt;Narrative identity - Wikipedia&lt;/a&gt;). You can facilitate that coherence by consciously adding narrative structure to the documentation of your projects.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Maintain a Personal Narrative Across Projects:&lt;/strong&gt; It’s also useful to zoom out and look at the arc of &lt;em&gt;yourself&lt;/em&gt; across different endeavors. Perhaps your various projects (writing, coding, art, etc.) are all expressions of a few core themes in your life. If you can identify those themes, you can make them explicit. For instance, you might notice “I’m often driven by a desire to make knowledge accessible” – that theme could be present in your blogging (explaining complex ideas) and in your coding (writing an open-source library). Acknowledging this and writing about it occasionally (e.g., a blog post that reflects on how all your year’s projects tie into that mission) will give your future self a strong sense of continuity: &lt;em&gt;despite all the changes, I’ve been consistently guided by X&lt;/em&gt;. It’s like the character development part of a story, where we see deeper motivations that endure. Your future self, understanding this continuity of purpose, can feel that their life has a cohesive narrative, not just a series of disconnected episodes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use Rituals or Recurring Motifs:&lt;/strong&gt; In storytelling, motifs or recurring elements give a sense of cohesion. You can analogously have personal rituals or symbols in your projects that serve as callbacks to your identity. For example, maybe you have a particular sign-off in every blog post (a unique phrase or a question to the reader/future-self). Or in every coding project, you include a little Easter egg or a note that is characteristically “you.” These small touches act almost like an author’s signature. They remind the future self, “Yes, this was made by me – the same &lt;em&gt;me&lt;/em&gt; at core, even if I’m different now.” It might sound quirky, but these psychological anchors can reinforce continuity. They are akin to finding an old sketch or a familiar handwriting sample from your past – it triggers a recognition of self. So consider weaving in personal motifs, whether it’s humor, style of commentary, or a repeated tradition (like writing a “year in review” post every New Year’s). The content of each might change, but the existence of the pattern connects your present and future personas.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Acknowledge Change (and Continuity) Explicitly:&lt;/strong&gt; Supporting continuity doesn’t mean pretending you’ll be the same forever. In fact, it helps to acknowledge that change is inevitable – your simulation will update. Build that into your narrative. For example, on your blog you might write an introductory note that “This blog is a record of my thoughts, which I expect to evolve. I welcome seeing how my perspectives change.” In code, perhaps a comment in the docs: “This project started with X approach; I’m open to it shifting if new insights arise.” By being explicit, you &lt;em&gt;give permission&lt;/em&gt; to your future self to change while still valuing the past. This can reduce cognitive dissonance when your future self has different views. They won’t feel the past self was a stranger or a fool; instead, they see that past self anticipated growth. This kind of compassionate understanding in the narrative keeps the relationship between past and future selves healthy and continuous. It’s like characters in a long-running story who grow and mature – we loved their old version, we love their new version, and we see it’s the same character arc.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In summary, embedding purpose and narrative arcs in your projects means you aren’t just doing tasks in isolation – you are storyboarding your life. You create threads of meaning that run through time. For a consciousness that is, at its core, a meaning-making simulator, this is incredibly nourishing. It provides the simulated “observer” with consistency to hold on to. When facing new, unfamiliar situations later in life, your future self can draw strength and orientation from these narrative threads (e.g., &lt;em&gt;“I’ve overcome challenges before in my ‘problem-solver’ story, I can do it again”&lt;/em&gt;). By intentionally designing your projects with these narrative elements, you support the continuity of the self-model even as life introduces plot twists.&lt;/p&gt;
&lt;h2&gt;Tools and Workflows for a Simulated Self&lt;/h2&gt;
&lt;p&gt;Embracing the idea of consciousness as a simulation opens up new ways to use &lt;strong&gt;tools and workflows&lt;/strong&gt; to support your self over time. The goal is to create an external environment that complements the brain’s internal narrative-making, effectively helping to “program” and maintain the self-model. Here are practical strategies and tools:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;External Memory Systems (“Second Brain”):&lt;/strong&gt; Since our biological memory is part of what shapes the self – and it’s fallible – using external memory tools can vastly improve continuity. Note-taking systems like &lt;strong&gt;Obsidian, Roam Research, Notion, or a simple journal&lt;/strong&gt; serve as a repository of your thoughts, ideas, and learnings. Consider building a &lt;em&gt;personal knowledge base&lt;/em&gt; where you continuously dump insights or references that matter to you. Over time, this becomes an extension of your mind. Crucially, organize it in a way that’s future-friendly: use tags or links that connect related ideas (forming a web of context), so future-you can navigate it easily. For example, you could have a tag for each major interest or each year of your life, allowing you to see the progression in each category. By having this external “database” of your mind, you reduce the risk that the future simulation of you loses access to important pieces of the narrative. It’s like giving them a detailed archive to query. This not only aids memory but can spark recognition of patterns in your life story (e.g., noticing you get reflective every December or that a concept like “balance” recurs in your notes). Many people call this a “second brain” – it respects the simulated nature of self by not relying solely on the wetware brain, and it ensures your identity’s knowledge and values are preserved outside your head.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Regular Self-Reviews and Planning:&lt;/strong&gt; Implement workflows where you periodically review past materials and plan for the future – essentially synchronizing the narrative. For instance, a &lt;strong&gt;weekly review&lt;/strong&gt; (as in GTD – Getting Things Done methodology) could include scanning your recent notes or journal entries and then setting priorities for next week. A &lt;strong&gt;yearly review&lt;/strong&gt; might involve reading your journal/blog from the past year and writing a summary or lessons learned. These practices make the continuity explicit: you deliberately connect past intentions with future plans. It’s a bit like the current “you” having a meeting with past-you (via the records) and future-you (via setting goals). This can be very powerful for self-programming. You notice what threads have been dropped that you wanted to continue, and you reinforce the ones that matter. It counters the tendency of the simulation to drift without direction. By keeping such rituals, you maintain a narrative mindfulness. There are tools to assist (for example, services like Timehop or social media “On this day” memories can prompt you with what happened in the past; apps like FutureMe allow you to send emails to your future self). Even a simple calendar reminder like “write a letter to future self on this day each year” can institute a workflow that binds the versions of you together.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Leverage AI as an External Observer:&lt;/strong&gt; Given that AI like Claude can simulate an observer, you can actually use AI as a tool to reflect &lt;em&gt;back&lt;/em&gt; to you your own patterns. For example, you might feed some of your past writings or code documentation into an AI assistant and ask it to summarize the key themes or ask it questions like “What do you think motivated the author throughout these entries?” This is a novel approach to glean an outsider perspective on your narrative. The AI’s simulation of “you” won’t be perfect, but it might highlight things you overlook. In essence, you momentarily &lt;em&gt;externalize the observer&lt;/em&gt; – having an AI mirror your content. This can reveal continuity or contradictions that help you refine your self-story. (Of course, use caution and privacy considerations when sharing personal data with AI services). Additionally, AI tools can help future-proof understanding: imagine a future where you can ask an AI that’s been trained on your notes “Why did I start project X?” and it can answer based on your archives. This isn’t far-fetched, and it underscores how treating consciousness as data that can be modeled leads to interesting support tools.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Design Your Environment with Triggers:&lt;/strong&gt; Our environments cue our behaviors and memories. To help your future self stay aligned, consider designing &lt;strong&gt;physical or digital cues&lt;/strong&gt; that trigger the intended narrative. For instance, a decorative poster of a personal motto in your workspace constantly reminds both present and future you of a core value. Or maintaining a certain folder structure on your computer for projects (with clear names like “2025_Blog” and “2026_Blog”) makes it easy to jump between time periods. Some people keep a “Jar of Ideas” – notes to themselves placed in a jar to open later. When future-you opens it, it’s like receiving guidance or reminders from the past self. These might sound like trivial hacks, but they acknowledge that the &lt;strong&gt;simulation responds to prompts&lt;/strong&gt;. Just as an AI’s output is influenced by prompts, your consciousness is influenced by what’s around you. Fill your environment with prompts that reinforce the identity and projects you care about. Vision boards, checklists left in obvious places, or even scheduling an email to yourself in the future (“If you’re reading this, remember how excited we were about…”) are all ways to use environmental triggers to maintain continuity.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Adopt Version Control for Life:&lt;/strong&gt; Borrowing a concept from software, you can create versioned snapshots of yourself. This could be as simple as writing a “State of Me” document each year – capturing your current thoughts, likes, worries, and goals – and saving them versioned by date. Over a lifetime, you have a series of these snapshots. Re-reading them forms a clear narrative of change and continuity. You could also keep old resumes or bio statements to see how you’ve described yourself over time. Some people even record video messages to their future selves at regular intervals. These are like time capsules that allow a future instance of you to interface directly with a past instance. It minimizes the interpretive gap. It’s akin to committing a version of the self to an archive, with commit messages (“Version 2025.0 – just started a new job, feeling optimistic…”). This practice respects the idea that the self is constantly updating by explicitly capturing each “build,” and it gives the future self a way to debug or understand the evolution.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In essence, tools and workflows that honor the simulated, construct nature of the self focus on &lt;strong&gt;recording, reminding, and reflecting&lt;/strong&gt;. They record the data of your life story, remind you of that story and what matters, and let you reflect (often with the aid of structure or AI) on the big picture. By implementing these, you create an ecosystem around you that keeps feeding the right information back into your self-model so it doesn’t lose the plot. It is a way of &lt;em&gt;collaborating with your future self&lt;/em&gt;, treating them kindly and intelligently, much like an expert engineer leaves documentation and tools for those who will maintain the system later. Here, &lt;em&gt;you&lt;/em&gt; are both the engineer and the future maintainer of the ongoing project called “Your Life.”&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Joscha Bach’s view of consciousness as a simulated observer offers a profound shift in how we regard ourselves: not as a single, unchanging witness traveling through time, but as an &lt;strong&gt;ever-updating model – a story being continuously written and read&lt;/strong&gt;. This perspective can be deeply practical. It reminds us that memory and identity are malleable, which means we have both the opportunity and responsibility to shape them with care. By orienting our personal projects with a &lt;em&gt;future self&lt;/em&gt; in mind, we essentially become the authors of a long-form narrative, ensuring that each chapter connects meaningfully to the next.&lt;/p&gt;
&lt;p&gt;When we write blogs or diaries with continuity and honesty, we are giving our future selves the gift of context and self-understanding. When we code with clarity and document our intent, we ease the cognitive load on our future minds (or even other people who step into the code) – we create software that carries its story with it. By embedding purpose and acknowledging the narrative arcs in our endeavors, we ensure that even as we grow and change, there is a reliable thread of meaning to hold onto. And by leveraging tools, rituals, and external aids, we buttress the fragile bridges between past, present, and future selves.&lt;/p&gt;
&lt;p&gt;In practical terms, thinking of “consciousness as simulation” encourages us to &lt;strong&gt;be deliberate architects of our personal evolution&lt;/strong&gt;. Your blog isn’t just casual writing – it’s part of the source code of &lt;em&gt;you&lt;/em&gt;. Your projects aren’t just one-off efforts – they are chapters in your life history. Knowing this, you can design them not just for immediate success, but for long-term significance. You can cultivate an ongoing dialogue with your future self, reducing the strangeness of encountering who you’ll become. Instead of arriving in the future and meeting a stranger wearing your name, you arrive and greet an old friend – one whom you’ve been collaborating with all along through well-laid plans, narratives, and notes.&lt;/p&gt;
&lt;p&gt;Ultimately, this approach leads to a more continuous and meaningful experience of life. It aligns with the very human desire for a coherent story, while accepting the inevitability of change. You, the observer, may be simulated – but through thoughtful project design and self-reflection, you can ensure the simulation runs smoothly from version to version. Your future self will be able to say, “I see how I came to be, and I’m grateful my past self looked out for me.” In that sense, by treating the self as a construct, we paradoxically give it greater solidity – we actively build the bridge as we cross it, turning the frightening abyss of time into a path we can navigate with confidence and wonder.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sources:&lt;/strong&gt; The ideas above integrate philosophical insights and practical advice. Key references include Joscha Bach’s explanation that our brain creates a representation of an observer (rather than a literal one) (&lt;a href=&quot;https://officechai.com/consciousness/hard-to-tell-if-an-llms-simulation-of-consciousness-is-less-real-than-ours-joscha-bach/#:~:text=then%20shifts%20the%20focus%20to,%E2%80%9D&quot;&gt;Hard To Tell If An LLM&#39;s Simulation Of Consciousness Is Less Real Than Ours: Joscha Bach&lt;/a&gt;) and his suggestion that AI models like Claude can similarly simulate an observer’s perspective (&lt;a href=&quot;https://officechai.com/consciousness/hard-to-tell-if-an-llms-simulation-of-consciousness-is-less-real-than-ours-joscha-bach/#:~:text=Finally%2C%20Bach%20connects%20the%20human,%E2%80%9D&quot;&gt;Hard To Tell If An LLM&#39;s Simulation Of Consciousness Is Less Real Than Ours: Joscha Bach&lt;/a&gt;). This aligns with narrative identity research, which sees identity as an internalized evolving story providing continuity and purpose (&lt;a href=&quot;https://en.wikipedia.org/wiki/Narrative_identity#:~:text=The%20theory%20of%20narrative%20identity,with%20deep%20roots%20in%20psychology&quot;&gt;Narrative identity - Wikipedia&lt;/a&gt;). Memory’s role in shaping identity is highlighted by evidence that identity is continually reconstructed as our memories change (&lt;a href=&quot;https://medium.com/common-sense-world/the-fluid-nature-of-memory-and-identity-exploring-the-dynamic-interplay-of-change-and-continuity-79da829deea9#:~:text=its%20susceptibility%20to%20revision%2C%20and,neuroscience%20and%20philosophy%20of%20mind&quot;&gt;The Fluid Nature of Memory and Identity: Exploring the Dynamic Interplay of Change and Continuity | by Boris (Bruce) Kriger | THE COMMON SENSE WORLD | Medium&lt;/a&gt;), reinforcing that our “self” is dynamic. The importance of feeling connected with our future self is supported by psychological findings that greater future self-continuity encourages long-term thinking (e.g. saving more, making decisions for future benefit) (&lt;a href=&quot;https://psyche.co/guides/how-to-connect-with-your-future-self-and-make-better-choices#:~:text=Research%20has%20found%20that%20people,to%20receive%20a%20financial%20reward&quot;&gt;How to connect with your future self | Psyche Guides&lt;/a&gt;). In terms of coding and writing practices, the recommendation to write code “for your future self” by ensuring intent is clear is echoed by software experts (&lt;a href=&quot;https://dev.to/sunnysingh/writing-code-for-your-future-self-3da2#:~:text=The%20problem%20is%20that%20you%27re,of%20this%20block%20of%20code&quot;&gt;Writing code for your future self - DEV Community&lt;/a&gt;), noting how code that once seemed clear can later become puzzling (&lt;a href=&quot;https://dev.to/sunnysingh/writing-code-for-your-future-self-3da2#:~:text=We%27ve%20all%20been%20there,year%20later%20and%20it%27s%20unrecognizable&quot;&gt;Writing code for your future self - DEV Community&lt;/a&gt;). Personal reflections on self-continuity (like writing letters to future selves) illustrate the emotional reality of the self as a changing construct (&lt;a href=&quot;https://thisisallan.medium.com/letters-to-the-future-6267070188e7#:~:text=the%20adult%20who%20now%20reflects,a%20patchwork%2C%20uneven%20and%20unfinished&quot;&gt;Letters to the Future. Self-Continuity and the Uncertainty of… | by Allan Johnson, PhD | Medium&lt;/a&gt;). All these sources underscore a common theme: treating consciousness and identity as constructed models can guide us to live more intentionally, create with foresight, and ultimately forge a stronger connection between who we were, who we are, and who we will become.&lt;/p&gt;</description><link>http://www.swmmfive.com/2025/04/future-proofing-swmm5-blogs-and-code.html</link><author>noreply@blogger.com (Robert Dickinson )</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-335789943869477383.post-7316644429108480171</guid><pubDate>Sun, 30 Mar 2025 02:06:00 +0000</pubDate><atom:updated>2025-03-29T22:06:08.335-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">LinkedIn algorithm prioritizes content based on several factors for SWMM5 Enablement</category><title>LinkedIn algorithm prioritizes content based on several factors for SWMM5 Enablement</title><description>&lt;p&gt;&amp;nbsp;The LinkedIn algorithm prioritizes content based on several factors:&lt;/p&gt;
&lt;h3&gt;1. &lt;strong&gt;Initial Engagement&lt;/strong&gt; (First Hour)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Your post is shown to a small portion of your network.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If it gets good engagement quickly (likes, comments, reposts), LinkedIn shows it to more people.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. &lt;strong&gt;Content Relevance&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;LinkedIn evaluates if your content aligns with your network’s interests.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Posts related to your industry, professional insights, or trending topics typically perform better.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. &lt;strong&gt;Quality of Engagement&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Comments are weighted more heavily than likes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Thoughtful, conversational comments boost reach significantly.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4. &lt;strong&gt;Dwell Time&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;How long people spend viewing your post (reading text, watching videos).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Longer dwell time signals high-quality content, which gets prioritized.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5. &lt;strong&gt;Connections and Network Effect&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Content is first shown to 1st-degree connections.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;High engagement expands reach to 2nd- and 3rd-degree connections.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6. &lt;strong&gt;Consistency and Activity&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Regular posting and interacting (commenting, engaging) increases visibility.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Inactivity or sporadic posting may limit your reach.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;7. &lt;strong&gt;Post Types&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Currently, documents (PDF carousels), native videos, and polls tend to perform well.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;External links usually reduce organic reach unless placed strategically (e.g., in comments).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;8. &lt;strong&gt;Creator Mode and Hashtags&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Activating Creator Mode and using relevant hashtags helps LinkedIn categorize your content and show it to interested audiences.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Tips to Improve Reach:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Encourage genuine comments&lt;/strong&gt; by asking questions or prompting discussions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Post consistently&lt;/strong&gt; (2-3 times per week ideally).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Optimize your profile&lt;/strong&gt; and engage actively with others&#39; posts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Avoid external links&lt;/strong&gt; directly in posts; instead, place them in comments after initial posting.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Respond quickly&lt;/strong&gt; to engagement to fuel further interaction.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Understanding and leveraging these factors can significantly boost your visibility on LinkedIn.&lt;/p&gt;</description><link>http://www.swmmfive.com/2025/03/linkedin-algorithm-prioritizes-content.html</link><author>noreply@blogger.com (Robert Dickinson )</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-335789943869477383.post-359976269462897718</guid><pubDate>Sun, 30 Mar 2025 02:04:00 +0000</pubDate><atom:updated>2025-03-29T22:04:36.972-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">LinkedIn Posts vs. Articles vs. Newsletters: Which Drives More Growth and Authority for SWMM5 Enablement</category><title>LinkedIn Posts vs. Articles vs. Newsletters: Which Drives More Growth and Authority for SWMM5 Enablement</title><description>&lt;p&gt;&lt;b&gt;LinkedIn Posts vs. Articles vs. Newsletters: Which Drives More Growth and Authority?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;LinkedIn offers several content formats – short &lt;strong&gt;feed posts&lt;/strong&gt;, long-form &lt;strong&gt;articles&lt;/strong&gt;, and subscription-based &lt;strong&gt;newsletters&lt;/strong&gt; – each with unique strengths. Below we compare their impact on organic reach, engagement, follower growth, and thought leadership, along with recommended frequency and best practices (with a focus on 2024–2025 insights).&lt;/p&gt;
&lt;h2&gt;Organic Reach &amp;amp; Visibility&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Posts (Feed Updates):&lt;/strong&gt; Regular posts appear directly in your network’s news feed and are favored by LinkedIn’s algorithm for broad visibility (&lt;a href=&quot;https://onlysocial.io/linkedin-articles-vs-posts-which-one-is-better-for-engagement/#:~:text=What%20you%20can%20add%20Images%2C,appear%20on%20LinkedIn%20news%20feed&quot;&gt;LinkedIn Articles vs. Posts: Which One is Better for Engagement? - OnlySocial&lt;/a&gt;). This means posts often reach more people initially than articles or newsletters. However, a post’s lifespan is short – typically about 24–48 hours before it gets buried by newer content (&lt;a href=&quot;https://www.linkedin.com/pulse/5-reasons-why-i-recommend-newsletters-instead-just-posting-f56fe#:~:text=This%20is%20another%20mega%20reason,through%20like%20a%20content%20graveyard&quot;&gt;Mastering LinkedIn in 2024: The Power of Newsletters for Enhanced Visibility&lt;/a&gt;). In fact, only ~16% of LinkedIn users log in daily, so a majority of your connections might never see a given post if they miss that narrow window (&lt;a href=&quot;https://www.linkedin.com/pulse/5-reasons-why-i-recommend-newsletters-instead-just-posting-f56fe#:~:text=This%20is%20another%20mega%20reason,through%20like%20a%20content%20graveyard&quot;&gt;Mastering LinkedIn in 2024: The Power of Newsletters for Enhanced Visibility&lt;/a&gt;). After a couple of days, a post essentially becomes part of your profile’s activity archive (a “content graveyard” unless someone actively searches for it) (&lt;a href=&quot;https://www.linkedin.com/pulse/5-reasons-why-i-recommend-newsletters-instead-just-posting-f56fe#:~:text=This%20is%20another%20mega%20reason,through%20like%20a%20content%20graveyard&quot;&gt;Mastering LinkedIn in 2024: The Power of Newsletters for Enhanced Visibility&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Articles (LinkedIn Pulse):&lt;/strong&gt; Articles are published to your profile and can be discovered via your profile, shares, or search engines, but they &lt;strong&gt;do not automatically populate in followers’ feeds&lt;/strong&gt; the way posts do (&lt;a href=&quot;https://onlysocial.io/linkedin-articles-vs-posts-which-one-is-better-for-engagement/#:~:text=What%20you%20can%20add%20Images%2C,appear%20on%20LinkedIn%20news%20feed&quot;&gt;LinkedIn Articles vs. Posts: Which One is Better for Engagement? - OnlySocial&lt;/a&gt;). Consequently, organic reach is lower at first – you often need to &lt;strong&gt;share an article as a post&lt;/strong&gt; to alert your network (&lt;a href=&quot;https://onlysocial.io/linkedin-articles-vs-posts-which-one-is-better-for-engagement/#:~:text=What%20you%20can%20add%20Images%2C,appear%20on%20LinkedIn%20news%20feed&quot;&gt;LinkedIn Articles vs. Posts: Which One is Better for Engagement? - OnlySocial&lt;/a&gt;). On the plus side, articles have &lt;strong&gt;long-term visibility&lt;/strong&gt;: they remain showcased on your profile indefinitely and are indexed by Google, giving them SEO potential for ongoing traffic (&lt;a href=&quot;https://onlysocial.io/linkedin-articles-vs-posts-which-one-is-better-for-engagement/#:~:text=Great%20for%20SEO&quot;&gt;LinkedIn Articles vs. Posts: Which One is Better for Engagement? - OnlySocial&lt;/a&gt;) (&lt;a href=&quot;https://onlysocial.io/linkedin-articles-vs-posts-which-one-is-better-for-engagement/#:~:text=Articles%20on%20LinkedIn%20can%20be,amazing%20perk%20you%20shouldn%E2%80%99t%20miss&quot;&gt;LinkedIn Articles vs. Posts: Which One is Better for Engagement? - OnlySocial&lt;/a&gt;). In other words, an article won’t get as many immediate impressions as a post, but it can continue to attract readers weeks or even years later through profile views or search discovery.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Newsletters:&lt;/strong&gt; LinkedIn newsletters combine the longevity of articles with an extra boost in reach. When you publish a newsletter edition, it can appear in the feed &lt;strong&gt;and&lt;/strong&gt; LinkedIn sends a notification (and email) to all your subscribers (&lt;a href=&quot;https://www.linkedin.com/pulse/5-reasons-why-i-recommend-newsletters-instead-just-posting-f56fe#:~:text=As%20a%20newsletter%2C%20it%20can,ends%20up%20looking%20like%20this&quot;&gt;Mastering LinkedIn in 2024: The Power of Newsletters for Enhanced Visibility&lt;/a&gt;). This dual distribution means newsletters aren’t reliant solely on the feed algorithm – they reach people directly in their inbox, which is powerful given that most professionals check email daily (far more frequently than they log into LinkedIn) (&lt;a href=&quot;https://www.linkedin.com/pulse/5-reasons-why-i-recommend-newsletters-instead-just-posting-f56fe#:~:text=In%20short%2C%20most%20people%20aren%27t,huge%20advantage%20of%20doing%20both&quot;&gt;Mastering LinkedIn in 2024: The Power of Newsletters for Enhanced Visibility&lt;/a&gt;). LinkedIn also helps creators grow newsletter reach: for example, it adds a &lt;strong&gt;“Subscribe” button&lt;/strong&gt; to your profile and may notify your connections when you launch a newsletter (&lt;a href=&quot;https://www.linkedin.com/pulse/5-reasons-why-i-recommend-newsletters-instead-just-posting-f56fe#:~:text=However%2C%20look%20at%20how%20many,he%20has%20on%20his%20newsletter&quot;&gt;Mastering LinkedIn in 2024: The Power of Newsletters for Enhanced Visibility&lt;/a&gt;). This has enabled some creators to reach audiences well beyond their follower count. &lt;em&gt;For instance, one LinkedIn creator had ~50,000 followers but over &lt;strong&gt;331,000&lt;/strong&gt; newsletter subscribers, thanks to a compelling, broadly relevant newsletter topic (&lt;a href=&quot;https://www.linkedin.com/pulse/5-reasons-why-i-recommend-newsletters-instead-just-posting-f56fe#:~:text=However%2C%20look%20at%20how%20many,he%20has%20on%20his%20newsletter&quot;&gt;Mastering LinkedIn in 2024: The Power of Newsletters for Enhanced Visibility&lt;/a&gt;).&lt;/em&gt; In summary, newsletters can achieve expansive reach over time by tapping both in-platform and email distribution.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Engagement Rates (Likes, Comments &amp;amp; Shares)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Posts:&lt;/strong&gt; Feed posts typically garner the &lt;strong&gt;highest volume of engagement&lt;/strong&gt; (likes, comments, shares) due to their brief, accessible nature and immediate visibility. A short text or image post makes it easy for people to drop a quick like or comment in their feed. If a post resonates, the conversation can take off in minutes with a flurry of reactions. Posts are ideal for sparking quick, back-and-forth interactions – their “fast-paced conversation” style encourages people to weigh in immediately (&lt;a href=&quot;https://onlysocial.io/linkedin-articles-vs-posts-which-one-is-better-for-engagement/#:~:text=If%20you%E2%80%99re%20looking%20for%20quick,like%2C%20comment%2C%20and%20share%20immediately&quot;&gt;LinkedIn Articles vs. Posts: Which One is Better for Engagement? - OnlySocial&lt;/a&gt;). However, this engagement is often surface-level or fleeting; the goal is to capitalize on a post’s momentum within that first day or two. The LinkedIn algorithm will further amplify posts that get early engagement, spreading them to wider networks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Articles:&lt;/strong&gt; Long-form articles generally see &lt;strong&gt;lower immediate engagement numbers&lt;/strong&gt; simply because fewer people encounter them without extra promotion. It’s common for an article to accumulate modest likes and a handful of comments, especially compared to a well-performing post. That said, engagement on articles tends to be more &lt;strong&gt;in-depth&lt;/strong&gt;. Readers who invest time to read a 5-minute article are more likely to leave thoughtful comments or share the article with others, even if the overall count of reactions is lower (&lt;a href=&quot;https://onlysocial.io/linkedin-articles-vs-posts-which-one-is-better-for-engagement/#:~:text=audience%20to%20like%2C%20comment%2C%20and,share%20immediately&quot;&gt;LinkedIn Articles vs. Posts: Which One is Better for Engagement? - OnlySocial&lt;/a&gt;). Articles can thus generate &lt;em&gt;quality&lt;/em&gt; engagement (e.g. insightful comments, discussions in niche groups) over &lt;em&gt;quantity&lt;/em&gt;. They may also continue to receive the occasional new comment as they attract readers over time. Keep in mind that an article’s engagement often needs a catalyst (like sharing it as a post or sending to a group) to get started, due to the initial visibility hurdle.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Newsletters:&lt;/strong&gt; Engagement on newsletters is a bit different because content is delivered to subscribers directly. Many subscribers will read the content from the email notification without necessarily clicking “Like” or commenting on the LinkedIn post itself. Thus, the &lt;strong&gt;visible engagement (likes/comments)&lt;/strong&gt; on a newsletter edition might not fully reflect its impact – you could have many people reading in their inbox. When subscribers do engage on LinkedIn, you’ll typically see a smaller, dedicated group of readers commenting or reacting each time. LinkedIn experts advise not to fixate on like counts for newsletters; what matters is building a loyal audience. &lt;em&gt;“One heartfelt comment can be more meaningful than 100 likes,”&lt;/em&gt; one newsletter author noted, emphasizing that depth of engagement beats vanity metrics (&lt;a href=&quot;https://www.linkedin.com/pulse/how-grow-your-audience-linkedin-newsletters-2024-valerian-gegidze-mrsof#:~:text=Don%E2%80%99t%20Obsess%20Over%20Likes&quot;&gt;How to Grow Your Audience with LinkedIn Newsletters&lt;/a&gt;). In practice, a successful newsletter might prompt a few substantial comments or private messages from readers who were truly impacted, rather than hundreds of quick taps on the like button. Shares can occur if readers find an edition extremely valuable – they might share the newsletter post to their feed or forward the email to colleagues, which extends the reach beyond just the subscriber list.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Follower Growth Potential&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Posts:&lt;/strong&gt; Consistent, engaging posts are a proven way to grow your LinkedIn following. When a post gains traction (e.g. lots of reactions or comments), it doesn’t just stay within your network – it can spread to second- and third-degree connections as people in your network interact with it. This viral loop exposes you to new audiences: non-connections might discover your post in their feed (because their connection liked or commented) and decide to follow you. A single viral post can sometimes net a significant bump in followers. Even smaller-scale, steady engagement adds up: as you post valuable content regularly, you’ll notice a slow trickle of new connection requests and followers who found your posts helpful. In 2024’s algorithm environment, &lt;strong&gt;quality content&lt;/strong&gt; that resonates with a specific niche tends to attract the right followers, especially since LinkedIn’s feed is becoming more tailored to users’ professional interests (&lt;a href=&quot;https://www.trueanthem.com/most-effective-types-of-linkedin-posts-in-2024/#:~:text=However%2C%20unlike%20other%20social%20platforms%2C,it%E2%80%99s%20benefits%20for%20online%20growth&quot;&gt;Types of LinkedIn posts&lt;/a&gt;). In short, posts provide the &lt;strong&gt;fastest follower growth&lt;/strong&gt; opportunity on LinkedIn, thanks to their sharability and algorithmic push.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Articles:&lt;/strong&gt; Articles are less about immediate network growth and more about &lt;strong&gt;long-term audience building&lt;/strong&gt;. Publishing a highly informative article can certainly attract new followers – for example, if someone outside your network finds it via Google or it’s shared in a LinkedIn Group, they might follow you after seeing the value you provide. However, this is usually a slower process. Articles rarely “go viral” in the way posts do on the feed. Growth through articles often comes in the form of increased profile views (someone reads your article, then checks out your profile) and gradual credibility that makes professionals in your field want to connect with you. So while an article might not yield dozens of new followers overnight, it contributes to your reputation, which in turn can lead to more connection invites and follows over time. Think of articles as planting seeds: each one might bring a few new people who discover you, and collectively they enhance your ability to grow an &lt;strong&gt;organic following of people specifically interested in your expertise&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Newsletters:&lt;/strong&gt; Of the three formats, newsletters can have &lt;strong&gt;exceptional audience growth potential&lt;/strong&gt; – often in ways that exceed what posts or articles alone can do. When you launch a LinkedIn newsletter, the platform often notifies a large portion of your existing connections and followers, inviting them to subscribe. Many curious readers will subscribe with a single click, instantly expanding your reach. Crucially, LinkedIn users can subscribe to your newsletter even if they aren’t following you (and even if they’re not a direct connection). This means you can capture &lt;em&gt;potential followers who might not have discovered you otherwise&lt;/em&gt;. Real-world examples in 2024 show some individuals rapidly multiplying their audience through newsletters. &lt;strong&gt;Case in point:&lt;/strong&gt; a creator with ~50k followers garnered over &lt;strong&gt;330k subscribers&lt;/strong&gt; to his LinkedIn newsletter by covering a topic of broad interest (time management productivity) – effectively reaching an audience 6x larger than his follower base (&lt;a href=&quot;https://www.linkedin.com/pulse/5-reasons-why-i-recommend-newsletters-instead-just-posting-f56fe#:~:text=However%2C%20look%20at%20how%20many,he%20has%20on%20his%20newsletter&quot;&gt;Mastering LinkedIn in 2024: The Power of Newsletters for Enhanced Visibility&lt;/a&gt;). Those subscriber numbers indicate a huge pool of people now regularly exposed to his content. Over time, as you consistently deliver value, many newsletter subscribers can convert into engaged followers or even customers. In essence, newsletters are a powerful &lt;strong&gt;follower growth hack&lt;/strong&gt; on LinkedIn: they leverage the platform’s notification system to capture attention at scale, and they build a captive audience that you can nurture with content. The caveat is that you must continue providing quality to retain and grow these subscribers; but if you do, the ceiling for growth is very high.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Building Authority &amp;amp; Thought Leadership&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Posts:&lt;/strong&gt; Posting frequently about your industry insights, tips, and commentary helps keep you &lt;strong&gt;visible&lt;/strong&gt; in your field, but each individual post is limited in depth. To build true authority through posts, consistency is key – over time, a series of short posts can showcase your knowledge breadth and point of view. For example, sharing daily quick tips or analysis of news can position you as someone “in the know.” That said, LinkedIn posts alone may not instantly label you a thought leader; they function more as ongoing touchpoints that remind your network of your expertise. They are great for &lt;strong&gt;staying relevant&lt;/strong&gt; and participating in conversations, which is an important aspect of thought leadership (being part of the dialogue). However, because posts are brief, complex ideas often need to be distilled into takeaways or punchy observations. Many LinkedIn influencers use posts to build a personal brand persona – through authentic storytelling or insightful one-liners – which can certainly enhance your authority &lt;em&gt;if&lt;/em&gt; the content is consistently valuable and on-topic. In summary, posts contribute to authority by &lt;strong&gt;demonstrating activity and topical savvy&lt;/strong&gt;, but they may not fully convey deep expertise in the way long-form content can.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Articles:&lt;/strong&gt; LinkedIn articles are one of the strongest formats for establishing &lt;strong&gt;subject-matter authority&lt;/strong&gt;. They allow you to do a deep dive into industry trends, case studies, how-to guides, or thought-provoking ideas. By writing in-depth articles, you directly showcase your expertise and experience – effectively &lt;strong&gt;positioning yourself as an expert in your field (&lt;a href=&quot;https://onlysocial.io/linkedin-articles-vs-posts-which-one-is-better-for-engagement/#:~:text=Establishing%20Thought%20Leadership&quot;&gt;LinkedIn Articles vs. Posts: Which One is Better for Engagement? - OnlySocial&lt;/a&gt;)&lt;/strong&gt;. High-quality articles (especially those with original research, unique insights, or thorough analysis) can earn respect from peers and signal to your profile visitors that you’re a knowledgeable voice on specific topics. Because articles stay on your profile, anyone who checks your background can see your “portfolio” of ideas. This permanence means your authority builds cumulatively: a library of well-crafted articles makes your profile look like a rich resource. Moreover, LinkedIn articles can be shared outside the platform and even cited, further boosting your reputation. In 2024, Google continues to reward content demonstrating expertise, experience, authority, and trust (the E-E-A-T principle) – by writing credible LinkedIn articles, you not only gain LinkedIn clout but can also rank in search results, extending your thought leadership beyond LinkedIn (&lt;a href=&quot;https://www.linkedin.com/pulse/still-worth-writing-newsletters-articles-2024-heres-my-manh-tu-le-fcozf#:~:text=In%202024%2C%20content%20is%20not,Surfer%20%E2%80%94%20SEO%2C%20simplified&quot;&gt;Is it still Worth Writing Newsletters &amp;amp; Articles in 2024? [Here&#39;s My Take After Posting For Over A Year]&lt;/a&gt;) (&lt;a href=&quot;https://onlysocial.io/linkedin-articles-vs-posts-which-one-is-better-for-engagement/#:~:text=Great%20for%20SEO&quot;&gt;LinkedIn Articles vs. Posts: Which One is Better for Engagement? - OnlySocial&lt;/a&gt;). Bottom line: if your goal is to be seen as a thought leader or specialist, articles are a key tool – they let you &lt;strong&gt;say more&lt;/strong&gt;, and what you publish can carry weight for a long time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Newsletters:&lt;/strong&gt; A LinkedIn newsletter is perhaps the &lt;strong&gt;ultimate authority-building format&lt;/strong&gt; on the platform right now, as it marries consistency with depth. When you run a newsletter, you are effectively taking on the role of a regular columnist or industry commentator. Subscribers opt-in &lt;em&gt;specifically&lt;/em&gt; to hear your insights, which already sets you up as a trusted voice. Each newsletter edition is essentially a long-form article, so all the authority benefits of articles apply here too (detailed content, expertise on display). In addition, the act of publishing on a regular schedule (e.g. weekly) signals commitment and reliability, further cementing your thought leader status. LinkedIn itself has promoted newsletters as a “powerhouse tool” to &lt;strong&gt;elevate your personal brand and position yourself as a thought leader&lt;/strong&gt; with a direct line to your audience (&lt;a href=&quot;https://www.linkedin.com/pulse/5-reasons-why-i-recommend-newsletters-instead-just-posting-f56fe#:~:text=They%27re%20not%20just%20a%20way,what%20you%20have%20to%20say&quot;&gt;Mastering LinkedIn in 2024: The Power of Newsletters for Enhanced Visibility&lt;/a&gt;). Because newsletters feel more personal (landing in someone’s inbox) and often stick to a clear niche, they help you build a loyal community around your ideas. Over time, your newsletter can become &lt;em&gt;synonymous&lt;/em&gt; with a topic (for example, people might say “Have you seen X’s newsletter on data science? It’s the go-to resource.”). This kind of association is the hallmark of subject-matter authority. In short, newsletters require effort and consistency, but they can yield a reputation as a leading voice in your domain, as you continually provide value to an interested audience (&lt;a href=&quot;https://www.linkedin.com/pulse/5-reasons-why-i-recommend-newsletters-instead-just-posting-f56fe#:~:text=5&quot;&gt;Mastering LinkedIn in 2024: The Power of Newsletters for Enhanced Visibility&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Recommended Frequency &amp;amp; Consistency&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Posts:&lt;/strong&gt; You don’t need to post every day to be effective – in fact, LinkedIn’s 2024 algorithm research suggests that &lt;strong&gt;2–3 posts per week&lt;/strong&gt; is optimal for most users (&lt;a href=&quot;https://www.linkedin.com/pulse/linkedin-best-practices-optimize-your-posts-according-xavier-degraux-gkfze#:~:text=,yo%20posting&quot;&gt;LinkedIn: Best Practices to Optimize Your Posts according to the 2024 algorithm report&lt;/a&gt;). Posting too frequently (multiple times per day, or every single day without fail) can lead to diminishing returns, as the algorithm might not distribute all your posts widely if they’re too frequent. The key is consistency: it’s better to post regularly (say, Monday, Wednesday, Friday each week) than to flood the feed one week and go silent the next. One expert recommends &lt;strong&gt;2–5 posts per week&lt;/strong&gt; as a good balance – enough to keep your profile active and audience engaged, but not overwhelming people (&lt;a href=&quot;https://onlysocial.io/linkedin-articles-vs-posts-which-one-is-better-for-engagement/#:~:text=&quot;&gt;LinkedIn Articles vs. Posts: Which One is Better for Engagement? - OnlySocial&lt;/a&gt;) (&lt;a href=&quot;https://onlysocial.io/linkedin-articles-vs-posts-which-one-is-better-for-engagement/#:~:text=match%20at%20L481%20I%20recommend,your%20network%20without%20overwhelming%20them&quot;&gt;LinkedIn Articles vs. Posts: Which One is Better for Engagement? - OnlySocial&lt;/a&gt;). Also, allow some hours (often ~18-24 hours) between posts so each has time to circulate. Consistency also applies to style and topic – if you become known for certain themes, stick with them to build recognition. In summary, choose a posting schedule you can sustain long-term. Consistent, value-packed posts (even if infrequent) train your network to expect and engage with your content, whereas irregular or “yo-yo” posting can hurt your momentum (&lt;a href=&quot;https://www.linkedin.com/pulse/linkedin-best-practices-optimize-your-posts-according-xavier-degraux-gkfze#:~:text=,yo%20posting&quot;&gt;LinkedIn: Best Practices to Optimize Your Posts according to the 2024 algorithm report&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Articles:&lt;/strong&gt; There isn’t a hard-and-fast rule for how often to publish articles; quality trumps quantity here. Since articles take more effort, many creators might publish an article &lt;strong&gt;once a month or a few times a year&lt;/strong&gt; – basically whenever they have something substantial to share. In 2024, long-form content is seeing a revival in importance, but readers (and LinkedIn’s algorithm) will favor only &lt;em&gt;well-written, relevant&lt;/em&gt; pieces. It’s wise to only publish an article when you have a topic that genuinely warrants a deep dive. A &lt;strong&gt;cadence of one article per month&lt;/strong&gt; can be a great goal if you have the bandwidth, as it keeps your profile fresh without sacrificing quality. Remember, each article is a “big” content piece that can continue to draw readers over time, so unlike posts, you don’t need a constant stream of them. The main consistency point for articles is to uphold a high standard and relevance to your audience – &lt;strong&gt;publishing fewer, excellent articles&lt;/strong&gt; will do more for you than putting out shallow articles every week. Many experts treat LinkedIn articles like blog posts on a personal website: update your audience only when you have a compelling insight, and perhaps summarize or announce the article via a short post to direct people to it (&lt;a href=&quot;https://onlysocial.io/linkedin-articles-vs-posts-which-one-is-better-for-engagement/#:~:text=more%20views%20No%2C%20it%E2%80%99s%20not,appear%20on%20LinkedIn%20news%20feed&quot;&gt;LinkedIn Articles vs. Posts: Which One is Better for Engagement? - OnlySocial&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Newsletters:&lt;/strong&gt; If you start a newsletter, consistency is critical – subscribers expect a regular schedule. When choosing your frequency, be realistic: LinkedIn recommends sticking to the &lt;strong&gt;publishing cadence you promise&lt;/strong&gt; so that your readers can count on regular content (&lt;a href=&quot;https://www.linkedin.com/help/linkedin/answer/a517940#:~:text=,engage%20regularly%20with%20your%20content&quot;&gt;LinkedIn Newsletters best practices | LinkedIn Help&lt;/a&gt;). Common schedules that work well are &lt;strong&gt;weekly or bi-weekly (every two weeks)&lt;/strong&gt;; many creators find this is frequent enough to stay top-of-mind without over-committing (&lt;a href=&quot;https://www.linkedin.com/pulse/how-grow-your-audience-linkedin-newsletters-2024-valerian-gegidze-mrsof#:~:text=That%20doesn%E2%80%99t%20mean%20you%20should,people%20with%20posts%20every%20day&quot;&gt;How to Grow Your Audience with LinkedIn Newsletters&lt;/a&gt;). For example, a weekly newsletter (52 per year) can build strong engagement, whereas a monthly newsletter might risk being forgotten in between issues unless the content is extremely memorable. Whatever you decide (e.g. every Tuesday, or 1st and 3rd Thursday of the month), make it clear to subscribers and stick to it. Inconsistency is the death knell of newsletter efforts – posting one edition then disappearing for weeks will cause people to lose interest (&lt;a href=&quot;https://www.linkedin.com/pulse/how-grow-your-audience-linkedin-newsletters-2024-valerian-gegidze-mrsof#:~:text=Don%E2%80%99t%20Be%20Inconsistent&quot;&gt;How to Grow Your Audience with LinkedIn Newsletters&lt;/a&gt;). So, treat your LinkedIn newsletter like a professional publication: maintain an editorial calendar. It can help to prepare content in advance or have a backlog of ideas so you’re not scrambling each issue. In 2024, audiences have endless content options, so if you can reliably deliver value on a set schedule, you’ll stand out and build loyalty.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Best Practices from LinkedIn &amp;amp; Experts&lt;/h2&gt;
&lt;p&gt;To maximize each format’s impact, consider these best practices (drawn from LinkedIn’s own guidance and experienced creators):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;For Posts:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Prioritize quality and relevance:&lt;/em&gt; Write posts with your target audience in mind, offering insight or information they care about. Provide value first, rather than chasing clicks (&lt;a href=&quot;https://www.linkedin.com/pulse/linkedin-best-practices-optimize-your-posts-according-xavier-degraux-gkfze#:~:text=Before%20diving%20into%20the%20best,with%20some%20reminders%20and%20precautions&quot;&gt;LinkedIn: Best Practices to Optimize Your Posts according to the 2024 algorithm report&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Optimal frequency:&lt;/em&gt; Post consistently but not excessively – roughly 2–3 times per week is recommended for most users (&lt;a href=&quot;https://www.linkedin.com/pulse/linkedin-best-practices-optimize-your-posts-according-xavier-degraux-gkfze#:~:text=,yo%20posting&quot;&gt;LinkedIn: Best Practices to Optimize Your Posts according to the 2024 algorithm report&lt;/a&gt;). Consistency (same number of posts per week) helps the algorithm recognize your pattern, and avoids overwhelming your followers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Hook and format:&lt;/em&gt; Start with a strong hook in the first line to grab attention (since the feed truncates long posts). Use short paragraphs or line breaks for easy reading on screen. Incorporate emojis or bullet points if it fits your style – anything to make the post more scannable. If using the full 3,000 characters, ensure the content stays engaging so readers click “...see more”.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Visuals and variety:&lt;/em&gt; Include visuals (images or videos) when they add value, but remember that &lt;strong&gt;text-only and image+text posts currently drive higher narrative engagement&lt;/strong&gt;, whereas videos or documents work well for informative content (&lt;a href=&quot;https://www.linkedin.com/pulse/linkedin-best-practices-optimize-your-posts-according-xavier-degraux-gkfze#:~:text=,for%20informative%20or%20educational%20posts&quot;&gt;LinkedIn: Best Practices to Optimize Your Posts according to the 2024 algorithm report&lt;/a&gt;). Vary your post types; using the same format repeatedly can reduce reach by ~30% over time (&lt;a href=&quot;https://www.linkedin.com/pulse/linkedin-best-practices-optimize-your-posts-according-xavier-degraux-gkfze#:~:text=,for%20informative%20or%20educational%20posts&quot;&gt;LinkedIn: Best Practices to Optimize Your Posts according to the 2024 algorithm report&lt;/a&gt;). For example, mix up pure text posts with an occasional infographic or short video to keep your feed content fresh.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Encourage genuine interaction:&lt;/em&gt; Ask questions or invite opinions to spark comments, as comments boost post visibility. &lt;strong&gt;Avoid “engagement bait”&lt;/strong&gt; phrases (e.g. “Please like/share!”) – LinkedIn’s algorithm actively downranks posts that blatantly solicit reactions (&lt;a href=&quot;https://www.linkedin.com/pulse/5-reasons-why-i-recommend-newsletters-instead-just-posting-f56fe#:~:text=that%20request%20likes%2C%20comments%2C%20and,people%20or%20companies%2C%20and%20other&quot;&gt;Mastering LinkedIn in 2024: The Power of Newsletters for Enhanced Visibility&lt;/a&gt;). Instead, pose authentic questions or offer a bold statement that encourages readers to respond organically.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Engage with your audience:&lt;/em&gt; Monitor your post after publishing and reply to comments, ideally within the first hour or two. Early engagement signals the algorithm that your post is interesting. Plus, responding shows you’re approachable and invested in dialogue. LinkedIn experts suggest engaging with others’ posts daily as well – the more you interact on the platform, the more visibility your own posts tend to get (&lt;a href=&quot;https://www.linkedin.com/pulse/linkedin-best-practices-optimize-your-posts-according-xavier-degraux-gkfze#:~:text=,On%20LinkedIn%2C%20everything%20is%20connected&quot;&gt;LinkedIn: Best Practices to Optimize Your Posts according to the 2024 algorithm report&lt;/a&gt;) (LinkedIn rewards being an active community member).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;For Articles:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Choose substance over quantity:&lt;/em&gt; Only publish an article when you have something worthwhile to say. Ensure it’s &lt;strong&gt;well-researched, informative, and provides unique value&lt;/strong&gt; (&lt;a href=&quot;https://www.trueanthem.com/most-effective-types-of-linkedin-posts-in-2024/#:~:text=match%20at%20L161%20When%20publishing,find%20you%20outside%20the%20app&quot;&gt;Types of LinkedIn posts&lt;/a&gt;). A high-quality article can reinforce your expertise, whereas a fluff piece can dilute your credibility.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Structure for readability:&lt;/em&gt; Use the tools available in the article editor – headings, subheaders, bullet points, and images – to break up text. A clear structure with an introduction, body, and conclusion will keep readers engaged. A compelling headline and a striking cover image (banner) can significantly improve click-through rates to your article.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Support your points:&lt;/em&gt; Just like a blog post, cite data, reports, or credible sources where appropriate to back up claims (&lt;a href=&quot;https://www.trueanthem.com/most-effective-types-of-linkedin-posts-in-2024/#:~:text=match%20at%20L161%20When%20publishing,find%20you%20outside%20the%20app&quot;&gt;Types of LinkedIn posts&lt;/a&gt;). This not only increases trust with readers but also aligns with LinkedIn’s preference for authoritative content. Outbound links can be included for reference (LinkedIn articles can handle links without the reach penalty that feed posts have for external links).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Include a call-to-action (CTA):&lt;/em&gt; At the end of the article, consider adding a CTA – for example, asking a question to invite comments, encouraging readers to follow you for more content, or directing them to a related resource (&lt;a href=&quot;https://www.trueanthem.com/most-effective-types-of-linkedin-posts-in-2024/#:~:text=match%20at%20L161%20When%20publishing,find%20you%20outside%20the%20app&quot;&gt;Types of LinkedIn posts&lt;/a&gt;). Since articles can be read by people outside your network, a gentle nudge to connect or follow can convert a one-time reader into a follower.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Promote the article:&lt;/em&gt; Because articles aren’t automatically pushed to feeds, share your article after publishing. Create a post highlighting a key insight or quote from the article and attach the article link (&lt;a href=&quot;https://onlysocial.io/linkedin-articles-vs-posts-which-one-is-better-for-engagement/#:~:text=more%20views%20No%2C%20it%E2%80%99s%20not,appear%20on%20LinkedIn%20news%20feed&quot;&gt;LinkedIn Articles vs. Posts: Which One is Better for Engagement? - OnlySocial&lt;/a&gt;). When you do so, add a bit of commentary or a question to spark interest, and explicitly invite people to read the full article. LinkedIn’s help center suggests that when sharing your article (or newsletter) as a post, adding a few lines of commentary or a question can increase engagement – and you can even ask readers to subscribe or follow for more (&lt;a href=&quot;https://www.linkedin.com/help/linkedin/answer/a517940#:~:text=,also%20ask%20members%20to%20subscribe&quot;&gt;LinkedIn Newsletters best practices | LinkedIn Help&lt;/a&gt;). Also, don’t shy away from sharing the article outside LinkedIn (Twitter, Facebook, email) to draw external traffic back to it (&lt;a href=&quot;https://onlysocial.io/linkedin-articles-vs-posts-which-one-is-better-for-engagement/#:~:text=Tagging%20function%20Yes%2C%20you%20are,it%20doesn%E2%80%99t%20Yes%2C%20it%20does&quot;&gt;LinkedIn Articles vs. Posts: Which One is Better for Engagement? - OnlySocial&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;For Newsletters:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Define your niche and value prop:&lt;/em&gt; Choose a clear theme for your newsletter and reflect it in the title (&lt;a href=&quot;https://www.linkedin.com/pulse/how-grow-your-audience-linkedin-newsletters-2024-valerian-gegidze-mrsof#:~:text=1&quot;&gt;How to Grow Your Audience with LinkedIn Newsletters&lt;/a&gt;). The name and description should immediately tell a potential subscriber what they’ll gain. For example, “Remote Work Tips Weekly” is more descriptive than “My Newsletter”. A focused niche helps attract subscribers who are specifically interested in that subject.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Professional presentation:&lt;/em&gt; Use a custom &lt;strong&gt;newsletter logo and banner image&lt;/strong&gt; for each issue to create visual branding (&lt;a href=&quot;https://www.linkedin.com/help/linkedin/answer/a517940#:~:text=audience%20can%20understand&quot;&gt;LinkedIn Newsletters best practices | LinkedIn Help&lt;/a&gt;). Issues with appealing cover images (especially images featuring human faces or real context, rather than generic clipart) tend to resonate more with readers (&lt;a href=&quot;https://www.linkedin.com/help/linkedin/answer/a517940#:~:text=,to%20resonate%20more%20with%20audiences&quot;&gt;LinkedIn Newsletters best practices | LinkedIn Help&lt;/a&gt;). This makes your newsletter look polished and credible, which can improve open rates and sharing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Consistent cadence:&lt;/em&gt; Set a publishing schedule (e.g. every Monday morning, or first Thursday of each month) and stick to it (&lt;a href=&quot;https://www.linkedin.com/help/linkedin/answer/a517940#:~:text=,engage%20regularly%20with%20your%20content&quot;&gt;LinkedIn Newsletters best practices | LinkedIn Help&lt;/a&gt;). Subscribers will come to expect your content at that interval. Consistency builds trust – if you consistently deliver on time, people are more likely to keep opening your emails. As noted, weekly or bi-weekly tends to work best for maintaining engagement without overload (&lt;a href=&quot;https://www.linkedin.com/pulse/how-grow-your-audience-linkedin-newsletters-2024-valerian-gegidze-mrsof#:~:text=That%20doesn%E2%80%99t%20mean%20you%20should,people%20with%20posts%20every%20day&quot;&gt;How to Grow Your Audience with LinkedIn Newsletters&lt;/a&gt;). Avoid the pitfall of being gung-ho initially and then fading; an expert explicitly warns that &lt;em&gt;“Posting once and disappearing for weeks? That won’t work”&lt;/em&gt; (&lt;a href=&quot;https://www.linkedin.com/pulse/how-grow-your-audience-linkedin-newsletters-2024-valerian-gegidze-mrsof#:~:text=Posting%20once%20and%20disappearing%20for,weeks%3F%20That%20won%E2%80%99t%20work&quot;&gt;How to Grow Your Audience with LinkedIn Newsletters&lt;/a&gt;) – irregularity will cause audience drop-off.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Deliver full value in-platform:&lt;/em&gt; A common best practice is to &lt;strong&gt;keep the content self-contained&lt;/strong&gt; in the LinkedIn newsletter. Don’t force readers to click out to an external blog to read the rest; LinkedIn readers prefer to get the whole story then and there (&lt;a href=&quot;https://www.linkedin.com/pulse/how-grow-your-audience-linkedin-newsletters-2024-valerian-gegidze-mrsof#:~:text=Don%E2%80%99t%20Link%20to%20Your%20Blog&quot;&gt;How to Grow Your Audience with LinkedIn Newsletters&lt;/a&gt;). Providing the complete article in the newsletter (rather than a teaser) leads to higher satisfaction and engagement. You can still repurpose that content elsewhere, but treat the LinkedIn audience as primary by giving them everything upfront.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Engage and build community:&lt;/em&gt; Even though the content goes to email, encourage feedback and discussion. You might include a line like “Let me know your thoughts by replying here or in the comments.” When readers do comment on the newsletter edition on LinkedIn, be responsive – it will show other subscribers that there’s an active conversation and that you value reader input. Also, be &lt;strong&gt;authentic and personable&lt;/strong&gt; in your newsletter tone. People subscribe to hear &lt;em&gt;you&lt;/em&gt;, not a corporate press release. As one LinkedIn creator advises, &lt;em&gt;“Be genuine. Readers can smell a funnel from a mile away”&lt;/em&gt; (&lt;a href=&quot;https://www.linkedin.com/pulse/how-grow-your-audience-linkedin-newsletters-2024-valerian-gegidze-mrsof#:~:text=Do%20Be%20Real&quot;&gt;How to Grow Your Audience with LinkedIn Newsletters&lt;/a&gt;) – meaning, don’t make every issue a sales pitch. Adopt a giving mindset (educate/entertain first, promote rarely) to build goodwill.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Grow your subscriber base:&lt;/em&gt; Take advantage of LinkedIn’s features to expand reach. When you publish a new edition, share it as a regular post on your feed with an intriguing snippet and invite people to subscribe if they enjoyed it (&lt;a href=&quot;https://www.linkedin.com/help/linkedin/answer/a517940#:~:text=,also%20ask%20members%20to%20subscribe&quot;&gt;LinkedIn Newsletters best practices | LinkedIn Help&lt;/a&gt;). You can pin your newsletter to your profile as well. Also promote your LinkedIn newsletter outside the platform: for instance, share the subscription link on Twitter or in your email signature. LinkedIn even suggests sharing your newsletter or specific editions on other social platforms or via email to &lt;strong&gt;reach beyond LinkedIn&lt;/strong&gt; (&lt;a href=&quot;https://www.linkedin.com/help/linkedin/answer/a517940#:~:text=you%20could%20also%20ask%20members,to%20subscribe&quot;&gt;LinkedIn Newsletters best practices | LinkedIn Help&lt;/a&gt;). Since LinkedIn newsletters are accessible on the web, non-members can read them too, which can funnel new readers to LinkedIn and ultimately to become subscribers or followers.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Key Takeaways&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;LinkedIn Posts:&lt;/strong&gt; &lt;em&gt;High immediate visibility and engagement.&lt;/em&gt; Posts appear in the feed and can quickly reach a wide audience through the LinkedIn network effect. Great for &lt;strong&gt;organic reach&lt;/strong&gt; and fast feedback (likes/comments), which in turn drives &lt;strong&gt;follower growth&lt;/strong&gt; as new people discover you. However, posts are ephemeral – their impact drops after a day or two (&lt;a href=&quot;https://www.linkedin.com/pulse/5-reasons-why-i-recommend-newsletters-instead-just-posting-f56fe#:~:text=This%20is%20another%20mega%20reason,through%20like%20a%20content%20graveyard&quot;&gt;Mastering LinkedIn in 2024: The Power of Newsletters for Enhanced Visibility&lt;/a&gt;). Use posts to stay present in your network’s daily feed and to spark conversations, but remember that each post provides only a snapshot of your expertise.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;LinkedIn Articles:&lt;/strong&gt; &lt;em&gt;Deep, evergreen content to showcase expertise.&lt;/em&gt; Articles won’t get as many eyeballs on day one, but they offer &lt;strong&gt;long-term value&lt;/strong&gt;. They live on your profile forever, can rank in Google search, and serve as a reference for your knowledge (&lt;a href=&quot;https://onlysocial.io/linkedin-articles-vs-posts-which-one-is-better-for-engagement/#:~:text=Articles%20on%20LinkedIn%20can%20be,amazing%20perk%20you%20shouldn%E2%80%99t%20miss&quot;&gt;LinkedIn Articles vs. Posts: Which One is Better for Engagement? - OnlySocial&lt;/a&gt;) (&lt;a href=&quot;https://onlysocial.io/linkedin-articles-vs-posts-which-one-is-better-for-engagement/#:~:text=&quot;&gt;LinkedIn Articles vs. Posts: Which One is Better for Engagement? - OnlySocial&lt;/a&gt;). Articles are excellent for building &lt;strong&gt;authority&lt;/strong&gt; – they let you dive into topics and demonstrate thought leadership in a way short posts can’t. Just be aware that you may need to actively share or promote articles for them to reach more people initially. Over time, a collection of strong articles solidifies your reputation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;LinkedIn Newsletters:&lt;/strong&gt; &lt;em&gt;Recurring long-form content with built-in distribution.&lt;/em&gt; Newsletters enjoy the depth of articles &lt;em&gt;plus&lt;/em&gt; direct distribution to subscribers’ notifications/email, giving them a &lt;strong&gt;reach advantage&lt;/strong&gt; (they aren’t solely at the mercy of the feed) (&lt;a href=&quot;https://www.linkedin.com/pulse/5-reasons-why-i-recommend-newsletters-instead-just-posting-f56fe#:~:text=As%20a%20newsletter%2C%20it%20can,ends%20up%20looking%20like%20this&quot;&gt;Mastering LinkedIn in 2024: The Power of Newsletters for Enhanced Visibility&lt;/a&gt;). A well-executed newsletter can dramatically grow your audience – even beyond your followers – because anyone can subscribe and LinkedIn helps promote it (&lt;a href=&quot;https://www.linkedin.com/pulse/5-reasons-why-i-recommend-newsletters-instead-just-posting-f56fe#:~:text=However%2C%20look%20at%20how%20many,he%20has%20on%20his%20newsletter&quot;&gt;Mastering LinkedIn in 2024: The Power of Newsletters for Enhanced Visibility&lt;/a&gt;). This format is one of the best for establishing ongoing &lt;strong&gt;thought leadership&lt;/strong&gt;, as you deliver valuable insights consistently. The trade-off is the commitment required: you need to maintain quality and a steady schedule to keep subscribers engaged. When done right, a newsletter can become a cornerstone of your personal brand on LinkedIn.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Overall Strategy:&lt;/strong&gt; These formats aren’t mutually exclusive – in fact, a &lt;em&gt;hybrid strategy&lt;/em&gt; is often most effective. LinkedIn experts in 2024 suggest using &lt;strong&gt;posts for frequent touch-points&lt;/strong&gt; and &lt;strong&gt;articles/newsletters for depth&lt;/strong&gt;, complementing each other (&lt;a href=&quot;https://onlysocial.io/linkedin-articles-vs-posts-which-one-is-better-for-engagement/#:~:text=Ultimately%2C%20the%20best%20strategy%20is,conversation%20long%20after%20they%E2%80%99re%20published&quot;&gt;LinkedIn Articles vs. Posts: Which One is Better for Engagement? - OnlySocial&lt;/a&gt;). For example, you might post quick industry observations during the week and publish a monthly newsletter or article that provides a deep dive on a hot topic. The posts generate buzz and new followers, while the long-form content cements your authority and keeps your dedicated audience satisfied. By leveraging all three formats, you maximize your reach (via posts and newsletter distribution) &lt;em&gt;and&lt;/em&gt; your credibility (via insightful articles/newsletters), which together accelerate follower growth and establish you as a leading voice on LinkedIn.&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;</description><link>http://www.swmmfive.com/2025/03/linkedin-posts-vs-articles-vs.html</link><author>noreply@blogger.com (Robert Dickinson )</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-335789943869477383.post-1638421396107726947</guid><pubDate>Sun, 30 Mar 2025 02:03:00 +0000</pubDate><atom:updated>2025-03-29T22:03:09.716-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">LinkedIn Posting Plan for SWMM5 Enablement</category><title>LinkedIn Posting Plan for SWMM5 Enablement </title><description>&lt;p&gt;&amp;nbsp;Here’s an effective, manageable content schedule optimized to &lt;strong&gt;grow your followers and build authority on LinkedIn&lt;/strong&gt;:&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Weekly Content Plan&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Posts (2–3 times per week)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Monday&lt;/strong&gt;: Insightful tip or industry news commentary&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Wednesday&lt;/strong&gt;: Short story, personal lesson, or client/project success&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Friday&lt;/strong&gt; &lt;em&gt;(optional)&lt;/em&gt;: Poll, question, or interactive content to drive engagement&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Monthly Content Plan&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Article (1 per month)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;First Tuesday of each month&lt;/strong&gt;: In-depth, evergreen content demonstrating your expertise&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;(e.g., How-to guide, detailed case study, industry analysis)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Newsletter Schedule&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Newsletter (Bi-weekly, every two weeks)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Every second Thursday&lt;/strong&gt;: Regular deep dive or themed insights related to your core expertise&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;(e.g., Newsletter on wastewater modeling techniques, trends in water infrastructure, or software tips)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;Monthly Content Calendar (Example):&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Week&lt;/th&gt;
&lt;th&gt;Monday (Post)&lt;/th&gt;
&lt;th&gt;Tuesday (Article)&lt;/th&gt;
&lt;th&gt;Wednesday (Post)&lt;/th&gt;
&lt;th&gt;Thursday (Newsletter)&lt;/th&gt;
&lt;th&gt;Friday (Optional Post)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Week 1&lt;/td&gt;
&lt;td&gt;Industry Tip or News&lt;/td&gt;
&lt;td&gt;Publish Article&lt;/td&gt;
&lt;td&gt;Personal Story or Lesson&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Interactive Poll or Question&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Week 2&lt;/td&gt;
&lt;td&gt;Quick Tip or Insight&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Client Success or Project Update&lt;/td&gt;
&lt;td&gt;Publish Newsletter&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Week 3&lt;/td&gt;
&lt;td&gt;Trending Topic Commentary&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Personal Story or Lesson&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Interactive Engagement Content&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Week 4&lt;/td&gt;
&lt;td&gt;Educational Nugget or Insight&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Client Success or Project Update&lt;/td&gt;
&lt;td&gt;Publish Newsletter&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;Best Practices to Maximize Impact:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Consistency is key&lt;/strong&gt;: Stick closely to this schedule to train your audience to expect your content.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Engage promptly&lt;/strong&gt;: Reply to comments on posts and newsletters promptly to drive algorithm visibility.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Repurpose content&lt;/strong&gt;: Turn insights from articles and newsletters into short posts to maximize content efficiency.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Promote strategically&lt;/strong&gt;: Share articles and newsletters via posts to boost visibility and reach.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Would you like a tailored list of topic suggestions for each content type, or does this schedule meet your current needs?&lt;/p&gt;</description><link>http://www.swmmfive.com/2025/03/linkedin-posting-plan-for-swmm5.html</link><author>noreply@blogger.com (Robert Dickinson )</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-335789943869477383.post-5310384876748099092</guid><pubDate>Sun, 30 Mar 2025 02:02:00 +0000</pubDate><atom:updated>2025-03-29T22:04:48.847-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Adjusted LinkedIn Content Schedule (High-Frequency Approach) for SWMM Enablement</category><title>Adjusted LinkedIn Content Schedule (High-Frequency Approach) for SWMM5 Enablement </title><description>&lt;p&gt;If you prefer publishing an article &lt;strong&gt;5 days a week&lt;/strong&gt;, here&#39;s an adjusted recommendation to balance your posts and newsletters effectively without overwhelming your audience:&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Adjusted LinkedIn Content Schedule (High-Frequency Approach)&lt;/h2&gt;
&lt;h3&gt;Weekly Schedule:&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Day&lt;/th&gt;
&lt;th&gt;Article&lt;/th&gt;
&lt;th&gt;Post&lt;/th&gt;
&lt;th&gt;Newsletter&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Monday&lt;/td&gt;
&lt;td&gt;Publish Article&lt;/td&gt;
&lt;td&gt;1 short engagement post&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tuesday&lt;/td&gt;
&lt;td&gt;Publish Article&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wednesday&lt;/td&gt;
&lt;td&gt;Publish Article&lt;/td&gt;
&lt;td&gt;1 interactive post (e.g., poll)&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thursday&lt;/td&gt;
&lt;td&gt;Publish Article&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Bi-weekly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Friday&lt;/td&gt;
&lt;td&gt;Publish Article&lt;/td&gt;
&lt;td&gt;1 weekly roundup or reflection&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Weekend&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Rest / Engage with others&#39; content&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Total weekly:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;5 Articles&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;3 Posts&lt;/strong&gt; (to avoid overwhelming your audience and diluting article visibility)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;1 Newsletter every 2 weeks&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Key Considerations:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Prioritize Articles&lt;/strong&gt;: Your articles are your cornerstone content. Ensure they&#39;re high-quality and provide substantial value.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Moderate Post Frequency&lt;/strong&gt;: Limit posts to 2–3 per week to prevent content fatigue, given your high article frequency.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Newsletter Cadence&lt;/strong&gt;: Bi-weekly newsletters complement your content strategy without overwhelming subscribers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Engage Actively&lt;/strong&gt;: Engage with comments and others&#39; posts regularly, as this maintains visibility without requiring extra content.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description><link>http://www.swmmfive.com/2025/03/adjusted-linkedin-content-schedule-high.html</link><author>noreply@blogger.com (Robert Dickinson )</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-335789943869477383.post-43506043673952096</guid><pubDate>Sun, 09 Mar 2025 15:21:00 +0000</pubDate><atom:updated>2025-03-09T11:21:49.945-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">AI Deep Think on the History of EPASWMM</category><category domain="http://www.blogger.com/atom/ns#">SWMM1</category><category domain="http://www.blogger.com/atom/ns#">SWMM2</category><category domain="http://www.blogger.com/atom/ns#">SWMM3</category><category domain="http://www.blogger.com/atom/ns#">SWMM4</category><category domain="http://www.blogger.com/atom/ns#">SWMM5 - with Citations</category><title>AI Deep Think on the History of EPASWMM,  SWMM1, SWMM2, SWMM3, SWMM4, SWMM5 - with Citations</title><description>&lt;p&gt;&amp;nbsp;Evolution of SWMM (Storm Water Management Model) versions, detailing the historical progression, major improvements, technical advancements, and the role of key contributors like Dr. Lewis Rossman. I&#39;ll also elaborate on the significance of SWMM5 in the broader context of stormwater modeling, including its impact on hydrologic and hydraulic simulations, regulatory applications, and real-world case studies where it has been used effectively.&lt;/p&gt;

&lt;h1&gt;Evolution of the Storm Water Management Model (SWMM)&lt;/h1&gt;
&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;The Storm Water Management Model (SWMM) is a prominent computational tool for simulating urban runoff, sewer flows, and water quality. Since its inception in 1971, SWMM has undergone multiple major version upgrades, each expanding its capabilities and improving performance. This report provides a historical overview of SWMM’s evolution from early versions to the modern SWMM5, highlighting key technical advancements, naming conventions of its modules, and major improvements across versions. In particular, SWMM5 is emphasized as a comprehensive, integrated modeling framework that unified previously separate components and introduced significant enhancements in hydrodynamic routing, user interface (UI), low-impact development (LID) modeling, GIS integration, and water quality simulation. The contributions of primary developers – notably Dr. Lewis &lt;strong&gt;Lew&lt;/strong&gt; Rossman – are discussed in shaping SWMM5, along with the model’s impact on stormwater management practice, regulatory compliance, and real-world applications.&lt;/p&gt;
&lt;h2&gt;Historical Evolution of SWMM Versions&lt;/h2&gt;
&lt;h3&gt;SWMM1 (1971) – First Generation and Modular Architecture&lt;/h3&gt;
&lt;p&gt;The first version, &lt;strong&gt;SWMM1&lt;/strong&gt;, was developed between 1969 and 1971 through a collaboration of Metcalf &amp;amp; Eddy, Water Resources Engineers, and the University of Florida (&lt;a href=&quot;https://downloads.tuflow.com/SWMM/SWMM5_Reference_Manual_Volume1_Hydrology_P100NYRA.pdf#:~:text=SWMM%20I%201971%20Metcalf%20%26,widely%20distributed%20version%20of%20SWMM&quot;&gt;Storm Water Management Model&lt;/a&gt;). It was coded in FORTRAN and primarily focused on combined sewer overflow (CSO) problems (&lt;a href=&quot;https://downloads.tuflow.com/SWMM/SWMM5_Reference_Manual_Volume1_Hydrology_P100NYRA.pdf#:~:text=Engineers%20University%20of%20Florida%20First,methods%20are%20still%20used%20today&quot;&gt;Storm Water Management Model&lt;/a&gt;). SWMM1 introduced a &lt;strong&gt;modular structure&lt;/strong&gt; consisting of four separate programs (or “blocks”): &lt;strong&gt;Runoff&lt;/strong&gt;, &lt;strong&gt;Transport&lt;/strong&gt;, &lt;strong&gt;Storage/Treatment&lt;/strong&gt;, and &lt;strong&gt;Receive&lt;/strong&gt; (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=SWMM%201%20consisted%20of%20four,assess%20its%20impact%20on%20waterways&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;). Each block had a specialized role and exchanged data via a common format so that the output of one block could feed into another (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=SWMM%201%20consisted%20of%20four,assess%20its%20impact%20on%20waterways&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;). For example, the &lt;strong&gt;Runoff block&lt;/strong&gt; computed rainfall-runoff from subcatchments, the &lt;strong&gt;Transport block&lt;/strong&gt; routed flows and pollutants through simplified drainage networks, &lt;strong&gt;Storage/Treatment&lt;/strong&gt; handled pollutant removal in storage units or treatment facilities, and the &lt;strong&gt;Receive block&lt;/strong&gt; represented receiving water bodies. The &lt;strong&gt;naming conventions&lt;/strong&gt; of these blocks reflected their functions: &lt;em&gt;Transport&lt;/em&gt; for conveyance and pollutant transport, &lt;em&gt;Storage/Treatment&lt;/em&gt; for water quality treatment processes, etc. Notably, SWMM1’s &lt;strong&gt;Transport&lt;/strong&gt; module and its counterpart &lt;strong&gt;Runoff&lt;/strong&gt; module formed the core of the original program (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=Image%3A%20Newspaper%20clipping%20SWMM%E2%80%99s%20Runoff,John%20Shubinski%2C%20released%20in%201975&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;). This early architecture allowed engineers to perform event-based analysis of urban runoff and CSOs – a groundbreaking capability at the time – although the computational methods were relatively simple by modern standards (&lt;a href=&quot;https://downloads.tuflow.com/SWMM/SWMM5_Reference_Manual_Volume1_Hydrology_P100NYRA.pdf#:~:text=Engineers%20University%20of%20Florida%20First,3%201981%20University%20of%20Florida&quot;&gt;Storm Water Management Model&lt;/a&gt;) (few of the original numerical methods are still used today (&lt;a href=&quot;https://downloads.tuflow.com/SWMM/SWMM5_Reference_Manual_Volume1_Hydrology_P100NYRA.pdf#:~:text=Engineers%20University%20of%20Florida%20First,methods%20are%20still%20used%20today&quot;&gt;Storm Water Management Model&lt;/a&gt;)).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Limitations in SWMM1:&lt;/strong&gt; The Transport block in SWMM1 employed simplified flow routing (a kinematic wave approach) and had limited ability to account for backwater effects or pressurized flow. It provided basic water quality modeling (build-up and wash-off of pollutants from surfaces) but could not fully capture complex hydraulic phenomena in storm sewer networks. These constraints set the stage for subsequent enhancements in later versions.&lt;/p&gt;
&lt;h3&gt;SWMM2 (1975) – Introduction of EXTRAN and Dynamic Flow Routing&lt;/h3&gt;
&lt;p&gt;SWMM’s second major release, &lt;strong&gt;SWMM2&lt;/strong&gt;, was completed in 1975 and represented the first &lt;strong&gt;widely distributed&lt;/strong&gt; version of the model (&lt;a href=&quot;https://downloads.tuflow.com/SWMM/SWMM5_Reference_Manual_Volume1_Hydrology_P100NYRA.pdf#:~:text=methods%20are%20still%20used%20today,Ampt&quot;&gt;Storm Water Management Model&lt;/a&gt;). A major advancement in SWMM2 was the introduction of the &lt;strong&gt;EXTRAN&lt;/strong&gt; module (“Extended Transport”), developed by Dr. Larry Roesner and Dr. John Shubinski (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=Image%3A%20Newspaper%20clipping%20SWMM%E2%80%99s%20Runoff,John%20Shubinski%2C%20released%20in%201975&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;). EXTRAN was essentially an extended hydraulic transport block that implemented a full dynamic wave flow routing routine, solving the complete one-dimensional Saint-Venant equations for flow in pipes and channels (&lt;a href=&quot;https://swmm2000.com/page/swmm4-storm-water-management#:~:text=The%20Transport%20block%20has%20kinematic,WASP%20receiving%20water%20quality%20model&quot;&gt;SWMM4: Storm Water Management Model Model Facts - SWMM 5 or SWMM or EPASWMM and SWMM5 in ICM_SWMM&lt;/a&gt;). This allowed SWMM2 to simulate &lt;strong&gt;fully dynamic flow&lt;/strong&gt; conditions – including backwater effects, surcharging manholes, pressurized flow in storm drains, and flow reversal in loops – which the simpler Transport block could not handle (&lt;a href=&quot;https://swmm2000.com/page/swmm4-storm-water-management#:~:text=The%20Transport%20block%20has%20kinematic,WASP%20receiving%20water%20quality%20model&quot;&gt;SWMM4: Storm Water Management Model Model Facts - SWMM 5 or SWMM or EPASWMM and SWMM5 in ICM_SWMM&lt;/a&gt;). In practice, EXTRAN enabled modeling of the challenging hydraulics in hilly or surcharged urban sewer systems that earlier methods struggled with (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=Mike%20Schmidt%2C%20a%20water%20resources,time%2C%20SWMM%20made%20that%20analysis&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;) (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=Francisco%20to%20help%20with%20its,John%20Shubinski%2C%20released%20in%201975&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;With EXTRAN, SWMM2 could, for the first time, rigorously analyze continuity and momentum conservation in complex networks. This was critical for cities like San Francisco, where steep terrain causes rapid, unpredictable flows; the new dynamic wave solver provided much-needed accuracy in such cases (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=Mike%20Schmidt%2C%20a%20water%20resources,time%2C%20SWMM%20made%20that%20analysis&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;). The trade-off was significantly higher computational demand – EXTRAN runs were so intensive that early users sometimes executed them on NASA mainframe computers during off-hours (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=EXTRAN%C2%A0allowed%20SWMM%20to%20simulate%20fully,wasn%27t%20launching%20rockets%2C%E2%80%9D%20Schmidt%20says&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;). Along with EXTRAN, SWMM2 improvements included the ability to perform &lt;strong&gt;continuous simulations&lt;/strong&gt; (not just single storms) for hydrology and an early inclusion of snowmelt processes (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=Handling%2C%20treating%2C%20and%20managing%20urban,Storage%2C%20Treatment%20Overflow%2C%20Runoff%20Model&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;). By the mid-1970s, SWMM had evolved from a CSO planning tool into a more general urban drainage model capable of long-term simulations and dynamic flow analysis, albeit with each major component (Runoff, Transport, EXTRAN, etc.) still operating as separate blocks to be linked by the user.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Version naming note:&lt;/em&gt; The EXTRAN module’s name highlights its origin – an extension of the Transport block’s capabilities. Users would run a “Runoff + EXTRAN” pairing to model hydrology and full hydraulic routing, or “Runoff + Transport” for simpler kinematic wave routing. This naming convention persisted through SWMM3 and SWMM4, distinguishing the level of hydraulic analysis: &lt;strong&gt;Transport&lt;/strong&gt; (kinematic wave) vs. &lt;strong&gt;EXTRAN&lt;/strong&gt; (dynamic wave).&lt;/p&gt;
&lt;h3&gt;SWMM3 (1981) – Hydrologic and Water Quality Enhancements&lt;/h3&gt;
&lt;p&gt;Released in 1981, &lt;strong&gt;SWMM3&lt;/strong&gt; expanded the model’s scope and refined its computational engines. This version was spearheaded by the University of Florida and Camp Dresser &amp;amp; McKee (CDM) (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=Schmidt%20says,SWMM%20could%20now%20model&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;). SWMM3 incorporated a &lt;strong&gt;full dynamic wave flow routine&lt;/strong&gt; as a standard part of the package (essentially building on the EXTRAN capabilities from SWMM2) (&lt;a href=&quot;https://downloads.tuflow.com/SWMM/SWMM5_Reference_Manual_Volume1_Hydrology_P100NYRA.pdf#:~:text=SWMM%203%201981%20University%20of,4%201988%20Oregon%20State%20University&quot;&gt;Storm Water Management Model&lt;/a&gt;). In addition, major hydrologic improvements were made: &lt;strong&gt;Green-Ampt infiltration&lt;/strong&gt; was introduced for more physically based infiltration modeling, snow melt modeling was added, and continuous simulation (e.g., long-term rainfall records) was fully supported (&lt;a href=&quot;https://downloads.tuflow.com/SWMM/SWMM5_Reference_Manual_Volume1_Hydrology_P100NYRA.pdf#:~:text=SWMM%203%201981%20University%20of,4%201988%20Oregon%20State%20University&quot;&gt;Storm Water Management Model&lt;/a&gt;). This greatly improved the representation of soil and ground processes compared to earlier versions that had simpler abstraction methods.&lt;/p&gt;
&lt;p&gt;SWMM3 also made significant strides in &lt;strong&gt;water quality modeling&lt;/strong&gt;. It was the first version to comprehensively simulate nonpoint source pollutant buildup and washoff from urban surfaces and transport of those pollutants through the drainage network (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=Schmidt%20says,it%20better%20understood%20local%20surface&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;). Users could specify pollutant buildup rates on land (e.g., accumulation of nutrients, metals, sediment) and washoff during storms, which the model would route through the system. These additions enabled analyzing urban runoff quality and evaluating pollution control measures. In the hydraulics realm, &lt;strong&gt;EXTRAN was updated&lt;/strong&gt; in 1981 by Shubinski, John Aldrich, and Roesner to handle a wider range of conduit shapes (open channels and closed conduits) (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=Schmidt%20says,it%20better%20understood%20local%20surface&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;). The model’s spatial range expanded to include natural channels (streams, rivers) and surface storage like lakes or detention basins (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=added%20features%20that%20focused%20on,better%20understood%20local%20surface%20hydrology&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;), meaning SWMM3 could model both urban pipe networks and more natural water systems in a catchment. This represented a shift from strictly urban/CSO applications to more general watershed modeling.&lt;/p&gt;
&lt;p&gt;In summary, SWMM3 provided a more &lt;strong&gt;holistic watershed simulation&lt;/strong&gt;, combining urban hydrology, continuous rainfall analysis, and water quality in one framework. It retained the modular block structure (Runoff, Transport, EXTRAN, etc.), but all modules were improved. The &lt;strong&gt;naming convention&lt;/strong&gt; now clearly distinguished the blocks by function: e.g., users might use the Runoff block for hydrology, the Transport block for simpler quality routing, or pair Runoff with EXTRAN for dynamic hydraulic routing with quality. SWMM3 became a robust tool for both point-source pollution (e.g., CSOs) and &lt;strong&gt;nonpoint-source runoff&lt;/strong&gt; issues in urban planning (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=added%20features%20that%20focused%20on,better%20understood%20local%20surface%20hydrology&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;).&lt;/p&gt;
&lt;h3&gt;SWMM3.3 (1983) – Transition to Personal Computers&lt;/h3&gt;
&lt;p&gt;By 1983, computing technology had advanced to allow complex models to run on personal computers (PCs). &lt;strong&gt;SWMM3.3&lt;/strong&gt; (an EPA update to SWMM3) was notable as the first &lt;strong&gt;PC-compatible version&lt;/strong&gt; of SWMM (&lt;a href=&quot;https://downloads.tuflow.com/SWMM/SWMM5_Reference_Manual_Volume1_Hydrology_P100NYRA.pdf#:~:text=routine%2C%20Green,4%201988%20Oregon%20State%20University&quot;&gt;Storm Water Management Model&lt;/a&gt;). Prior to this, SWMM was typically run on mainframes or mini-computers requiring fixed-format input (punch cards or strict column-based text files). SWMM3.3 and subsequent minor releases introduced a &lt;strong&gt;free-format input&lt;/strong&gt; style, meaning users could enter data in a more flexible text format with comments, rather than rigid punch card formats (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=SWMM%204%2C%20released%20in%201988%2C,reliable%20preparation%20and%20data%20checking&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;). This greatly improved usability and reduced input errors. The ability to use PCs also expanded SWMM’s user base, as more consultants and municipalities could run models without specialized hardware. While SWMM3.3 did not drastically change the simulation engines, it set the stage for wider adoption and iterative enhancements through the late 1980s.&lt;/p&gt;
&lt;h3&gt;SWMM4 (1988) – Expanded Capabilities and Usability&lt;/h3&gt;
&lt;p&gt;Released in 1988, &lt;strong&gt;SWMM4&lt;/strong&gt; was a significant upgrade that accumulated numerous improvements developed through the 1980s. Led by Oregon State University (under Prof. Wayne Huber) and CDM, SWMM4 added new process modules and capabilities (&lt;a href=&quot;https://downloads.tuflow.com/SWMM/SWMM5_Reference_Manual_Volume1_Hydrology_P100NYRA.pdf#:~:text=SWMM%204%201988%20Oregon%20State,Smith&quot;&gt;Storm Water Management Model&lt;/a&gt;). Key advancements in SWMM4 included:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Groundwater Interaction:&lt;/strong&gt; SWMM4 introduced the ability to simulate groundwater tables and their interaction with the drainage system (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=SWMM%204%2C%20released%20in%201988%2C,reliable%20preparation%20and%20data%20checking&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;). This allowed modeling of infiltration from saturated soils into sewers and exfiltration from leaky pipes into surrounding soil, providing a way to account for &lt;strong&gt;rainfall-derived infiltration/inflow (RDII)&lt;/strong&gt; into sanitary systems (&lt;a href=&quot;https://downloads.tuflow.com/SWMM/SWMM5_Reference_Manual_Volume1_Hydrology_P100NYRA.pdf#:~:text=SWMM%204%201988%20Oregon%20State,of%20updates%20throughout%20the%201990%E2%80%99s&quot;&gt;Storm Water Management Model&lt;/a&gt;). The inclusion of groundwater modules meant surface runoff, subsurface flow, and pipe flow could all be represented in one modeling framework (still as coupled blocks).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;RDII and Unit Hydrographs:&lt;/strong&gt; A sophisticated RDII modeling capability was added (e.g., via RTK unit hydrographs) to better predict how rainfall produces delayed inflows to sanitary sewers (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=Throughout%20the%201980%20and%201990s%2C,for%20simulating%20auto%C2%ADmat%C2%ADi%C2%ADcally%20operated%20gates&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;). This was crucial for separate sanitary sewer studies and remains widely used for estimating wet-weather infiltration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Irregular Channels and Cross-Sections:&lt;/strong&gt; The EXTRAN block in SWMM4 was enhanced to handle irregular channel cross-sections (beyond standard shapes) (&lt;a href=&quot;https://downloads.tuflow.com/SWMM/SWMM5_Reference_Manual_Volume1_Hydrology_P100NYRA.pdf#:~:text=SWMM%204%201988%20Oregon%20State,of%20updates%20throughout%20the%201990%E2%80%99s&quot;&gt;Storm Water Management Model&lt;/a&gt;). This improved the model’s fidelity in representing natural streams or custom-shaped culverts and channels within the hydraulic network.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Real-Time Control (RTC):&lt;/strong&gt; Functionality for simulating real-time control of hydraulic devices (e.g., automated gates, weirs, pumps with control rules) was incorporated during the SWMM4 era (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=Throughout%20the%201980%20and%201990s%2C,for%20simulating%20auto%C2%ADmat%C2%ADi%C2%ADcally%20operated%20gates&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;). This allowed modelers to represent operational strategies like dynamic weir adjustments or pumping based on water levels, which became important for CSO control systems.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;User Experience Improvements:&lt;/strong&gt; Unlike earlier versions that required fixed-column text input, SWMM4 fully adopted &lt;strong&gt;free-form input files with comments&lt;/strong&gt; for easier data entry (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=SWMM%204%2C%20released%20in%201988%2C,reliable%20preparation%20and%20data%20checking&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;). It was designed to run on the MS-DOS operating system, reflecting the personal computer revolution. In the 1990s, third-party interfaces began to appear – for example, a collaboration with the Danish Hydraulic Institute led to a Windows-based GUI called “MIKE SWMM” which provided the first graphical interface for SWMM4 models (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=code%2C%E2%80%9D%20he%20says,based%20graphical%20interface%20for%20SWMM&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;). These developments greatly enhanced accessibility for practitioners.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Throughout the 1990s, SWMM4 underwent a series of interim releases (4.1, 4.2, up to 4.4) led by Dr. Huber and others, which included numerous refinements and bug fixes. By the end of the SWMM4 era, the model had grown into a comprehensive (if sometimes unwieldy) collection of modules capable of simulating hydrology, hydraulics (both kinematic and dynamic), water quality, and groundwater – but it still required coordinating separate block programs and lacked a unified graphical interface. This set the stage for the next major re-invention of SWMM in the 2000s.&lt;/p&gt;
&lt;h3&gt;SWMM5 (2005) – Comprehensive Integrated Modeling Framework&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;SWMM5&lt;/strong&gt; represents the most significant overhaul in the model’s history, resulting in a modern, integrated simulation environment. Development of SWMM5 was a joint effort by the U.S. EPA and CDM Smith Inc. in the early 2000s (&lt;a href=&quot;https://www.epa.gov/water-research/storm-water-management-model-swmm#:~:text=SWMM%20is%20a%20Windows,engineering%2C%20construction%2C%20and%20operations%20firm&quot;&gt;Storm Water Management Model (SWMM) | US EPA&lt;/a&gt;), led by Dr. Lewis A. Rossman at EPA. Released officially in 2004 (with EPA SWMM 5.0), this version was a &lt;strong&gt;complete re-write of the SWMM codebase&lt;/strong&gt; into the C programming language (&lt;a href=&quot;https://downloads.tuflow.com/SWMM/SWMM5_Reference_Manual_Volume1_Hydrology_P100NYRA.pdf#:~:text=SWMM%205%202005%20US%20EPA,LID%20modeling%29%20added&quot;&gt;Storm Water Management Model&lt;/a&gt;), replacing the legacy FORTRAN code. SWMM5 merged all major modeling components (Runoff, Transport, EXTRAN, Storage/Treatment) into a &lt;strong&gt;single application&lt;/strong&gt;, eliminating the need for external linkage of separate block programs (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=Released%20in%202004%2C%20SWMM%205,software%20much%20easier%20to%20use&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;). This unification made the model easier to set up and run, reducing user error and streamlining workflows. SWMM5 also introduced a host of technical improvements and new features, establishing it as a comprehensive one-stop tool for urban drainage modeling. Below we highlight the major advancements and capabilities of SWMM5:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Unified Module Architecture:&lt;/strong&gt; Instead of running separate executables for runoff, hydraulics, and treatment, SWMM5 uses one integrated engine that handles &lt;strong&gt;rainfall-runoff, flow routing, and water quality&lt;/strong&gt; together in one simulation (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=Released%20in%202004%2C%20SWMM%205,software%20much%20easier%20to%20use&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;). All former block functionalities are accessible within one &lt;strong&gt;.inp project file&lt;/strong&gt;, and the model internally manages the routing of flows and pollutants between subcatchments, nodes, and links. This integration resolved many compatibility issues of past versions and allowed more seamless simulations (e.g. no more manual transfer of output files between blocks). The internal object model of SWMM5 treats the system as a network of &lt;strong&gt;subcatchment objects generating runoff, node objects (junctions, storages), and link objects (pipes, channels, weirs, pumps)&lt;/strong&gt; – a unification of what were distinct “Runoff/Transport/EXTRAN” data groups in SWMM4 (&lt;a href=&quot;https://en.wikipedia.org/wiki/Storm_Water_Management_Model#:~:text=An%20example%20of%20this%20integration,Figure%202&quot;&gt;Storm Water Management Model - Wikipedia&lt;/a&gt;). As a result, a SWMM5 user can model the entire hydrologic and hydraulic cycle from rainfall to outfall in one continuous computation. This integrated design also made it easier to extend new features across the whole model.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Enhanced Dynamic Wave Routing:&lt;/strong&gt; SWMM5 carries forward the ability to do &lt;strong&gt;dynamic wave routing&lt;/strong&gt; (full St. Venant equations) and improves upon it with more robust numerical algorithms. The dynamic solver in SWMM5 handles backwater, surcharging, pressurized flow, and looped networks with greater stability and efficiency (&lt;a href=&quot;https://downloads.tuflow.com/SWMM/SWMM5_Reference_Manual_Volume1_Hydrology_P100NYRA.pdf#:~:text=Complete%20re,LID%20modeling%29%20added&quot;&gt;Storm Water Management Model&lt;/a&gt;). Under the hood, Rossman implemented improved solution schemes for the non-linear flow equations, addressing some of the stability issues that occasionally plagued the old EXTRAN block. For example, SWMM5 introduced options for &lt;strong&gt;adjustable time steps&lt;/strong&gt;, improved inertial term handling, and better controls for surcharge iterations, reducing the chance of model instability. In effect, SWMM5’s hydraulics can simulate complex surcharging networks (common in combined sewer systems) with higher confidence. It also expanded support for &lt;strong&gt;diverse hydraulic elements&lt;/strong&gt; (e.g., pumps, orifices, weirs with complex controls) and allows users to define &lt;strong&gt;real-time control rules&lt;/strong&gt; more easily for dynamic operation of gates and pumps (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=Released%20in%202004%2C%20SWMM%205,software%20much%20easier%20to%20use&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;). The result is a more powerful hydraulic engine that covers everything from small storm drains to large open channels in one model.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Graphical User Interface (GUI) and GIS Integration:&lt;/strong&gt; One of the most visible changes in SWMM5 was the inclusion of a free, built-in &lt;strong&gt;graphical user interface&lt;/strong&gt; (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=Released%20in%202004%2C%20SWMM%205,software%20much%20easier%20to%20use&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;). The SWMM5 GUI provides an &lt;strong&gt;integrated graphical environment&lt;/strong&gt; to build and edit the model schematically, eliminating the need to manually code input files in a text editor (&lt;a href=&quot;https://www.swmm456.com/2015/08/swm5-or-storm-water-management-model.html#:~:text=EPA%20SWMM%205%20provides%20an,time%20series%20graphs%20and%20tables&quot;&gt;SWMM5, XPSWMM, InfoSWMM, InfoSewer, ICM InfoWorks, ICM SWMM, InfoDrainage: SWMM5 or the Storm Water Management Model from Wikipedia - for Translation Purposes&lt;/a&gt;). Users can lay out the drainage network on a map, draw subcatchment polygons, and link elements visually. The interface supports background layers (like CAD drawings or images) to trace the network, and it displays results graphically with color-coded flood maps, profile plots, and time series graphs (&lt;a href=&quot;https://www.swmm456.com/2015/08/swm5-or-storm-water-management-model.html#:~:text=EPA%20SWMM%205%20provides%20an,time%20series%20graphs%20and%20tables&quot;&gt;SWMM5, XPSWMM, InfoSWMM, InfoSewer, ICM InfoWorks, ICM SWMM, InfoDrainage: SWMM5 or the Storm Water Management Model from Wikipedia - for Translation Purposes&lt;/a&gt;). This was a major leap in usability and effectively brought SWMM on par with commercial modeling tools.&lt;/p&gt;
&lt;p&gt;Although the native SWMM5 GUI is not a full GIS, it facilitates &lt;strong&gt;GIS integration&lt;/strong&gt; by allowing import/export of data and through “software hooks” for external interfaces (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=Released%20in%202004%2C%20SWMM%205,software%20much%20easier%20to%20use&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;). The EPA team built in hooks (APIs and input/output formats) so that third-party software could interface with the SWMM5 engine (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=Released%20in%202004%2C%20SWMM%205,software%20much%20easier%20to%20use&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;). This led to integration with GIS-based platforms; for instance, commercial packages like Innovyze’s InfoSWMM and Autodesk’s InfoDrainage embed SWMM5 within ArcGIS, and tools exist to import GIS shapefiles of sewer networks directly into SWMM5 input format. Compared to SWMM4, which had no native GUI or mapping, SWMM5’s UI dramatically improves the &lt;strong&gt;model development workflow&lt;/strong&gt; and opens the door for coupling with GIS datasets (e.g., land use data, DEMs for delineation) to streamline model setup.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Low Impact Development (LID) and Green Infrastructure Modeling:&lt;/strong&gt; Recognizing emerging stormwater practices, SWMM5 added explicit capabilities to model &lt;strong&gt;low impact development&lt;/strong&gt; controls. In 2010, EPA released an update to SWMM5 (v5.0.018) that incorporated LID modeling features (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=Green%20roofs%2C%20bioswales%2C%20tree%20canopies%2C,practices%20in%20SWMM%20in%202010&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;) (&lt;a href=&quot;https://pmc.ncbi.nlm.nih.gov/articles/PMC7326159/#:~:text=match%20at%20L493%20LID%20modeling,and%20overflow%20control%20the%20storage&quot;&gt;
Storm Water Management Model: Performance Review and Gap Analysis - PMC
&lt;/a&gt;). These allow simulation of green infrastructure practices such as &lt;strong&gt;green roofs, bioretention cells, permeable pavements, rain gardens, infiltration trenches, and vegetative swales&lt;/strong&gt;. In SWMM5, an LID control is represented by layered components (surface storage, soil media, storage reservoir, underdrain, etc.), each with specified properties (&lt;a href=&quot;https://pmc.ncbi.nlm.nih.gov/articles/PMC7326159/#:~:text=LID%20modeling%20features%20were%20added,and%20overflow%20control%20the%20storage&quot;&gt;
Storm Water Management Model: Performance Review and Gap Analysis - PMC
&lt;/a&gt;). The model computes how runoff is captured, infiltrated, or evapotranspired through these layers, and any overflow is returned to the drainage system. The ability to include distributed LID features in subcatchments enables analysis of how “green” infrastructure mitigates runoff peaks and pollutant washoff. This was a significant enhancement, aligning SWMM with modern stormwater management approaches focused on infiltration and on-site retention (as opposed to only “gray” infrastructure conveyance). For example, SWMM5 can now simulate the aggregate effect of many rain gardens or permeable pavement installations on an urban watershed’s runoff response, supporting city-wide green infrastructure planning. These LID features complemented prior water quality functions by allowing treatment and volume reduction at the source. EPA continued to improve the LID module in subsequent updates (e.g., adding more detailed soil layers and underdrain options). By integrating LIDs, &lt;strong&gt;SWMM5 became one of the first major public-domain models to support green infrastructure simulation&lt;/strong&gt; – a feature that has been widely utilized in the 2010s as cities adopted green stormwater programs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Integrated Water Quality and Treatment Simulation:&lt;/strong&gt; SWMM5 retained and enhanced the water quality modeling capabilities of its predecessors, bringing them into the unified framework. Users can define any number of water quality constituents (e.g., TSS, nitrogen, phosphorus, heavy metals) and model processes such as &lt;strong&gt;dry-weather buildup&lt;/strong&gt; on surfaces, &lt;strong&gt;washoff during storms&lt;/strong&gt;, and the routing and &lt;strong&gt;decay or treatment&lt;/strong&gt; of pollutants through the pipe network (&lt;a href=&quot;https://swmm2000.com/page/swmm4-storm-water-management#:~:text=The%20Transport%20block%20has%20kinematic,WASP%20receiving%20water%20quality%20model&quot;&gt;SWMM4: Storm Water Management Model Model Facts - SWMM 5 or SWMM or EPASWMM and SWMM5 in ICM_SWMM&lt;/a&gt;). Pollutant routing is handled concurrently with flow routing, so quality analyses no longer require running separate Transport block models. SWMM5 also allows simulation of &lt;strong&gt;first-order decay&lt;/strong&gt; of pollutants, &lt;strong&gt;sediment settling&lt;/strong&gt; in quiescent storage units, and simple &lt;strong&gt;scour and deposition&lt;/strong&gt; in conduits (&lt;a href=&quot;https://swmm2000.com/page/swmm4-storm-water-management#:~:text=hydraulic%20flow%20routing%20option%2C%20SWMM,Storage%2C%20treatment%2C%20and%20other%20BMPs&quot;&gt;SWMM4: Storm Water Management Model Model Facts - SWMM 5 or SWMM or EPASWMM and SWMM5 in ICM_SWMM&lt;/a&gt;) (&lt;a href=&quot;https://swmm2000.com/page/swmm4-storm-water-management#:~:text=The%20Transport%20block%20has%20kinematic,WASP%20receiving%20water%20quality%20model&quot;&gt;SWMM4: Storm Water Management Model Model Facts - SWMM 5 or SWMM or EPASWMM and SWMM5 in ICM_SWMM&lt;/a&gt;). The former Storage/Treatment block functionality is integrated as generic storage units where the user can specify removal rates or treatment efficiencies. Additionally, SWMM5’s support for LID means the model can account for &lt;strong&gt;pollutant reduction in LID practices&lt;/strong&gt; (e.g., filtering of sediments in bioretention soil, nutrient uptake by vegetation) (&lt;a href=&quot;https://pmc.ncbi.nlm.nih.gov/articles/PMC7326159/#:~:text=integrity%20of%20their%20own%20unique,and%20the%20effectiveness%20of%20GI%2FLID&quot;&gt;
Storm Water Management Model: Performance Review and Gap Analysis - PMC
&lt;/a&gt;) (&lt;a href=&quot;https://pmc.ncbi.nlm.nih.gov/articles/PMC7326159/#:~:text=match%20at%20L493%20LID%20modeling,and%20overflow%20control%20the%20storage&quot;&gt;
Storm Water Management Model: Performance Review and Gap Analysis - PMC
&lt;/a&gt;). Overall, SWMM5 provides a one-stop simulation of both hydrology/hydraulics and water quality, which is essential for comprehensive stormwater management studies and Total Maximum Daily Load (TMDL) compliance analyses.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;User Interface and Reporting:&lt;/strong&gt; The SWMM5 GUI improved not just model setup but also results interpretation. Users can view simulation outputs as time series plots, tabular reports, profile animations, and thematic maps of the study area (&lt;a href=&quot;https://www.swmm456.com/2015/08/swm5-or-storm-water-management-model.html#:~:text=EPA%20SWMM%205%20provides%20an,time%20series%20graphs%20and%20tables&quot;&gt;SWMM5, XPSWMM, InfoSWMM, InfoSewer, ICM InfoWorks, ICM SWMM, InfoDrainage: SWMM5 or the Storm Water Management Model from Wikipedia - for Translation Purposes&lt;/a&gt;). For example, one can produce a color-coded map of peak flood depths or animations of how runoff accumulates and flows through the network during a storm. These visualization tools make it easier to understand system behavior and identify problem areas (like surcharged manholes or overloaded ponds). This was a notable step up from SWMM4, which required external plotting tools or parsing text outputs. Moreover, SWMM5 introduced a &lt;strong&gt;calibration aid&lt;/strong&gt; in the form of statistical reports and summary results that help users assess model performance. It also added features like context-sensitive help and a detailed user manual (authored by Dr. Rossman) to guide practitioners. Collectively, these design features lowered the learning curve and increased adoption of SWMM5 across a broader range of users.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In essence, SWMM5 transformed SWMM from a set of separate, command-line engineering tools into a &lt;strong&gt;single integrated modeling framework with a modern interface&lt;/strong&gt;. The naming convention shifted away from the old block names – everything is simply part of “SWMM5” and handled in one environment. However, conceptually one can still recognize the legacy: e.g., SWMM5’s dynamic wave flow routing is the descendant of EXTRAN, its water quality engine derives from the Transport/Storage-Treatment blocks, etc., but all are unified under the hood. SWMM5 has continued to be maintained and updated by EPA; minor versions (5.0 through 5.1, and now 5.2) have added further refinements, but the fundamental framework introduced in 2004–2005 remains. The &lt;strong&gt;current version (5.2)&lt;/strong&gt; includes additional enhancements like climate change scenario tools (SWMM-CAT for adjusting rainfall patterns) (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=SWMM,hydraulic%20capa%C2%ADbil%C2%ADi%C2%ADties%20for%20modern%20stormwater&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;), better representation of street flow (e.g., gutter flow and inlet capture, reviewed in recent updates) (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=improve%C2%ADments%20to%20bolster%20core%20hydrologic,and%20catch%20basin%20drain%20flows&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;), and ongoing algorithm improvements for higher computational efficiency.&lt;/p&gt;
&lt;h2&gt;Key Contributors and Development Team of SWMM5&lt;/h2&gt;
&lt;p&gt;SWMM’s development over five decades has been driven by contributions from numerous engineers, researchers, and organizations. &lt;strong&gt;Dr. Lewis A. Rossman&lt;/strong&gt; is the primary architect of SWMM5. As an EPA environmental engineer, Rossman led the SWMM5 re-write and development in the early 2000s, authoring the engine’s C code and the official user’s manual (&lt;a href=&quot;https://downloads.tuflow.com/SWMM/SWMM5_Reference_Manual_Volume1_Hydrology_P100NYRA.pdf#:~:text=SWMM%205%202005%20US%20EPA,LID%20modeling%29%20added&quot;&gt;Storm Water Management Model&lt;/a&gt;). He served as the principal scientist overseeing SWMM5’s maintenance and enhancements during his tenure at EPA (&lt;a href=&quot;https://pmc.ncbi.nlm.nih.gov/articles/PMC7326159/#:~:text=Lewis%20Rossman%20,Research%20and%20Development%2C%20funded%20and&quot;&gt;
Storm Water Management Model: Performance Review and Gap Analysis - PMC
&lt;/a&gt;). Rossman’s work unified the model structure and introduced the modern GUI, making SWMM5 the powerful tool it is today. In recognition, SWMM5’s widespread use in urban hydrology is often attributed to Rossman’s vision of an open-source, user-friendly modeling platform.&lt;/p&gt;
&lt;p&gt;It is important to acknowledge that Rossman built upon a strong foundation laid by earlier SWMM pioneers. &lt;strong&gt;Dr. Wayne Huber&lt;/strong&gt; (University of Florida, later Oregon State University) was one of the original developers of SWMM in 1971 and a key maintainer of versions 2, 3, and 4 (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=Beginning%20in%201969%2C%20Professor%20Wayne,help%20others%2C%E2%80%9D%20says%20Mitch%20Heineman&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;) (&lt;a href=&quot;https://downloads.tuflow.com/SWMM/SWMM5_Reference_Manual_Volume1_Hydrology_P100NYRA.pdf#:~:text=SWMM%204%201988%20Oregon%20State,Smith&quot;&gt;Storm Water Management Model&lt;/a&gt;). Huber co-authored the SWMM4 manual (Huber and Dickinson, 1988) and integrated many hydrologic enhancements into the model over the years. His academic work ensured SWMM’s methods were scientifically sound, and he trained generations of engineers in its use. &lt;strong&gt;Dr. Larry Roesner&lt;/strong&gt; (of CDM and later Colorado State University) was another instrumental figure – he led development of the EXTRAN block in the 1970s (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=CDM%20Smith%20in%201975%20%2C,John%20Shubinski%2C%20released%20in%201975&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;), greatly expanding SWMM’s hydraulic capabilities, and continued to contribute improvements (like the continuous simulation STORM module) through the 1980s (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=Handling%2C%20treating%2C%20and%20managing%20urban,flows%20for%20EXTRAN%20hydraulics%20evaluations&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;). Roesner’s role exemplified how consulting firms and academia collaborated on SWMM’s growth.&lt;/p&gt;
&lt;p&gt;Other notable contributors include &lt;strong&gt;Dr. James Heaney&lt;/strong&gt; (University of Florida) and &lt;strong&gt;John Aldrich&lt;/strong&gt; (CDM Smith), who helped incorporate nonpoint pollution and natural channel modeling in SWMM3 and SWMM4 (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=management,nonpoint%20source%20runoff%20more%20effectively&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;) (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=Schmidt%20says,better%20understood%20local%20surface%20hydrology&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;). &lt;strong&gt;Chuck Moore&lt;/strong&gt; (CDM) implemented key features like real-time control and the RTK infiltration method in SWMM4 (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=Throughout%20the%201980%20and%201990s%2C,for%20simulating%20auto%C2%ADmat%C2%ADi%C2%ADcally%20operated%20gates&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;). &lt;strong&gt;Robert Dickinson&lt;/strong&gt; (CHI/Innovyze) contributed to SWMM4 and later helped disseminate SWMM5 through consulting and training, and continues to support the user community. In the SWMM5 era, &lt;strong&gt;Mitch Heineman&lt;/strong&gt; (CDM Smith) assisted with integrating LID and reviewing new hydrologic functions (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=Green%20roofs%2C%20bioswales%2C%20tree%20canopies%2C,practices%20in%20SWMM%20in%202010&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;) (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=improve%C2%ADments%20to%20bolster%20core%20hydrologic,and%20catch%20basin%20drain%20flows&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;), and &lt;strong&gt;Thomas (Tom) Nye&lt;/strong&gt; improved hydrology algorithms for heterogeneous soils in recent updates (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=SWMM,hydraulic%20capa%C2%ADbil%C2%ADi%C2%ADties%20for%20modern%20stormwater&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;). EPA engineers like &lt;strong&gt;Michelle Simon&lt;/strong&gt;,&amp;nbsp;&lt;strong&gt;Michael Tryby and Caleb&amp;nbsp;&lt;/strong&gt;&lt;b&gt;Buahin&lt;/b&gt; have also been involved in maintaining SWMM5’s code and documentation (&lt;a href=&quot;https://www.epa.gov/system/files/documents/2022-04/swmm-users-manual-version-5.2.pdf#:~:text=to%20reduce%20discharges%20that%20cause,Environmental%20Solutions%20and%20Emergency%20Response&quot;&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Development of SWMM5 was truly a &lt;strong&gt;collaborative effort between EPA and CDM Smith&lt;/strong&gt; (&lt;a href=&quot;https://www.epa.gov/water-research/storm-water-management-model-swmm#:~:text=SWMM%20is%20a%20Windows,engineering%2C%20construction%2C%20and%20operations%20firm&quot;&gt;Storm Water Management Model (SWMM) | US EPA&lt;/a&gt;). The EPA provided oversight, core coding (Rossman), and the mandate for public dissemination, while CDM Smith (a consulting firm that had historically championed SWMM) provided expertise and testing through people like Burgess, Heineman, Aldrich, and others (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=code%2C%E2%80%9D%20he%20says,based%20graphical%20interface%20for%20SWMM&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;). This partnership ensured that SWMM5 met both high scientific standards and practical needs of engineering users. The result was a robust, public-domain model that is continuously improved by its user community and developers – even today, SWMM’s open-source nature allows academics and practitioners to contribute code enhancements or custom utilities.&lt;/p&gt;
&lt;p&gt;In summary, while Dr. Lew Rossman is credited with the creation of SWMM5’s integrated framework, the model’s evolution is the cumulative product of many &lt;strong&gt;experts in hydrology/hydraulics and water resources engineering&lt;/strong&gt;. Their collective contributions over decades have made SWMM a benchmark tool in urban drainage modeling.&lt;/p&gt;
&lt;h2&gt;Impact of SWMM5 on Stormwater Management and Applications&lt;/h2&gt;
&lt;p&gt;Since the release of SWMM5, its impact on stormwater management practice and environmental compliance has been profound. SWMM5 is now one of the &lt;strong&gt;most widely used urban stormwater models in the world&lt;/strong&gt;, employed by municipalities, consultants, and researchers in hundreds of cities and watersheds (&lt;a href=&quot;https://pmc.ncbi.nlm.nih.gov/articles/PMC7326159/#:~:text=SWMM%20,systems%20for%20stormwater%20runoff%20and&quot;&gt;
Storm Water Management Model: Performance Review and Gap Analysis - PMC
&lt;/a&gt;). Its open availability (free and open-source) and comprehensive capabilities have made it a standard platform for a variety of applications:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Urban Drainage and Stormwater Planning:&lt;/strong&gt; Engineers use SWMM5 for planning and designing drainage infrastructure – from sizing storm sewers and detention basins to evaluating the layout of green infrastructure. The model’s ability to handle continuous simulation and water quality makes it ideal for developing &lt;strong&gt;master plans for urban watersheds&lt;/strong&gt; and sizing facilities to meet water quantity and quality objectives. For example, SWMM is commonly applied in &lt;strong&gt;master planning of sewer systems and urban runoff control&lt;/strong&gt;, including evaluation of flood mitigation alternatives and pollution reduction strategies (&lt;a href=&quot;https://www.swmm456.com/2015/08/swm5-or-storm-water-management-model.html#:~:text=8,predictions%20of%C2%A0flood%C2%A0levels%20and%20flooding%20volume&quot;&gt;SWMM5, XPSWMM, InfoSWMM, InfoSewer, ICM InfoWorks, ICM SWMM, InfoDrainage: SWMM5 or the Storm Water Management Model from Wikipedia - for Translation Purposes&lt;/a&gt;). The integrated approach of SWMM5 (combining hydrology, hydraulics, and treatment) lets planners test “what-if” scenarios, such as the impact of widespread rain gardens on city runoff, or the effect of upsizing certain pipes on flood risk.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Regulatory Compliance (CSO, MS4, and TMDL requirements):&lt;/strong&gt; SWMM5 has become a go-to tool for demonstrating compliance with water regulations. In the United States, combined sewer overflow (&lt;strong&gt;CSO&lt;/strong&gt;) control programs often rely on SWMM modeling to develop Long Term Control Plans. Because SWMM can track overflow volumes and frequencies under various scenarios, cities use it to evaluate how infrastructure improvements or green interventions will reduce CSOs, as mandated by EPA’s CSO policy. Similarly, Municipal Separate Storm Sewer System (&lt;strong&gt;MS4&lt;/strong&gt;) permit requirements and &lt;strong&gt;Total Maximum Daily Load (TMDL)&lt;/strong&gt; plans for urban runoff frequently call for modeling to ensure that stormwater controls will achieve required pollutant load reductions. SWMM’s water quality component (with processes for pollutant buildup/washoff and BMP treatment) provides a credible basis for these analyses (&lt;a href=&quot;https://www.swmm456.com/2015/08/swm5-or-storm-water-management-model.html#:~:text=systems%209,predictions%20of%C2%A0flood%C2%A0levels%20and%20flooding%20volume&quot;&gt;SWMM5, XPSWMM, InfoSWMM, InfoSewer, ICM InfoWorks, ICM SWMM, InfoDrainage: SWMM5 or the Storm Water Management Model from Wikipedia - for Translation Purposes&lt;/a&gt;). Many regulatory modeling guidance documents either recommend SWMM or accept SWMM results for compliance reporting. Moreover, the Federal Emergency Management Agency (FEMA) has officially accepted SWMM5 for floodplain studies in some cases (SWMM5 underwent FEMA review for use in flood insurance studies), further cementing its credibility.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Real-World Case Studies:&lt;/strong&gt; There are numerous examples of SWMM5 being successfully implemented in real projects. One flagship case is &lt;strong&gt;Philadelphia’s Green City, Clean Waters program&lt;/strong&gt;. The Philadelphia Water Department utilized extensive SWMM5 modeling to analyze how green infrastructure could curb CSOs and improve water quality (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=In%20Philadel%C2%ADphia%2C%20waterways%20browning%20the,of%20polluted%20runoff%2C%20achieving%20a&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;). By iteratively modeling hundreds of LID installations (rain gardens, permeable pavements, etc.) across the city, they demonstrated that green infrastructure could eliminate billions of gallons of runoff from the sewer system. In fact, modeling showed Philadelphia could meet the bulk of its CSO reduction targets through green infrastructure, leading to the implementation of over 800 LID sites covering 1,500 acres (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=champion%20to%20combat%20CSOs%20and,Climate%20Change%20Adaptation%20Program%20to&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;). This contributed to an estimated 3-billion-gallon annual reduction in CSO volume, an achievement guided by SWMM simulations (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=champion%20to%20combat%20CSOs%20and,Philadel%C2%ADphia%20Water%20Department%20is%20now&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;). Philadelphia’s use of SWMM in this context is often cited as a pioneering example of large-scale green infrastructure planning.&lt;/p&gt;
&lt;p&gt;Another example is &lt;strong&gt;Miami, Florida&lt;/strong&gt;, which has long used SWMM for its stormwater master planning. As early as 1986, Miami’s Storm Drainage Master Plan leveraged SWMM (then SWMM4) to propose a $267 million program of drainage improvements (including infiltration trenches and stormwater treatment) to address chronic flooding and water quality issues (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=Miami%20took%20charge%20to%20transform,over%20the%20next%2050%20years&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;). The city’s recent updates to its stormwater plan continue to use SWMM5 to account for sea level rise and more intense rainfall, developing a climate-resilient strategy for the next 50 years (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=Miami%20took%20charge%20to%20transform,over%20the%20next%2050%20years&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;). These case studies underscore SWMM’s flexibility – from evaluating green retrofits in northern cities to designing drainage in flat, flood-prone coastal cities.&lt;/p&gt;
&lt;p&gt;Many other cities have followed similar paths. &lt;strong&gt;New York City&lt;/strong&gt; uses SWMM-based models to site and size thousands of bioswales and rain gardens as part of its green infrastructure plan. &lt;strong&gt;Seattle&lt;/strong&gt; and &lt;strong&gt;Portland&lt;/strong&gt; have used SWMM to design sustainable stormwater systems in neighborhoods. Internationally, SWMM has been applied in Canada, Europe, and Asia for urban drainage – for instance, China’s “sponge city” initiatives (building cities with more permeable surfaces and storage) often incorporate SWMM simulations to quantify benefits of LID practices (&lt;a href=&quot;https://www.mdpi.com/2073-4441/14/1/78#:~:text=SWMM,Low%20Impact%20Development%29&quot;&gt;SWMM-Based Assessment of Urban Mountain Stormwater ... - MDPI&lt;/a&gt;). Because SWMM5 is free and well-documented, it has lowered the barrier for many jurisdictions to adopt advanced modeling in their stormwater projects, leading to more data-driven and effective designs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Integration into Industry Tools:&lt;/strong&gt; SWMM5’s impact is also evident in how it has been integrated into various commercial software and analytical platforms. Several widely used urban water modeling products embed the SWMM5 engine. For example, &lt;strong&gt;Autodesk InfoWorks ICM&lt;/strong&gt;, &lt;strong&gt;Innovyze (now Autodesk) InfoSWMM&lt;/strong&gt;, &lt;strong&gt;Bentley SewerGEMS/CivilStorm&lt;/strong&gt;, and &lt;strong&gt;CHI’s PCSWMM&lt;/strong&gt; all either use SWMM5 as their computational kernel or offer full compatibility (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=A%20rich%20ecosystem%20of%20commercial,accessible%20to%20any%20curious%20mind&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;). These tools provide enhanced user interfaces, 2D overland flow integration, and advanced analytics, but they are fundamentally built on SWMM’s hydrology/hydraulics logic. This has created a rich ecosystem where improvements or analyses done in one tool (e.g., a plugin for optimization) can benefit all users of the SWMM engine. Even research into high-performance computing for urban drainage (such as accelerating SWMM with parallel processing) is ongoing, aiming to further extend SWMM’s capabilities (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=A%20rich%20ecosystem%20of%20commercial,accessible%20to%20any%20curious%20mind&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;). The broad adoption of SWMM5’s engine in both open-source and commercial realms attests to its reliability and versatility.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Education and Community:&lt;/strong&gt; SWMM5 has also become a staple in water resources education and research. Many university courses on urban hydrology or drainage include SWMM modeling assignments, training the next generation of engineers in its use. Hundreds of peer-reviewed studies have been published using SWMM for investigating urban runoff, climate change impacts, BMP performance, model calibration methods, and more (&lt;a href=&quot;https://pmc.ncbi.nlm.nih.gov/articles/PMC7326159/#:~:text=The%20storm%20water%20management%20model,quality%20simulations%20considering%20green&quot;&gt;
Storm Water Management Model: Performance Review and Gap Analysis - PMC
&lt;/a&gt;). The large user community has led to active forums (like OpenSWMM) where users share knowledge and troubleshoot models collaboratively. This communal support further amplifies SWMM5’s impact, as users continuously learn from each other and improve modeling practices. The EPA’s decision to keep SWMM in the public domain since 1971 has clearly paid dividends in collective knowledge and innovation.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In terms of &lt;strong&gt;environmental impact&lt;/strong&gt;, widespread use of SWMM5 has improved the scientific basis of stormwater management decisions. Planners can quantitatively compare alternatives (e.g., “grey” infrastructure expansion versus “green” infrastructure solutions) using SWMM, often revealing cost-effective and sustainable strategies. Regulators benefit from more accurate predictions of pollutant load reductions when cities implement stormwater controls, leading to better-informed policy and permit requirements. For example, using SWMM5, a city can demonstrate that installing bioinfiltration in 20% of its area will reduce annual phosphorus loads to a river by X%, supporting compliance with a nutrient TMDL. These kinds of analyses, difficult to do without an integrated model, are now common practice.&lt;/p&gt;
&lt;p&gt;Finally, SWMM5 has proven adaptable to emerging challenges. As climate change brings more extreme rainfall and raises sea levels, SWMM is being used with scenario-based inputs (via the SWMM Climate Adjustment Tool and custom climate scenarios) to help cities &lt;strong&gt;assess future flood risks and resiliency options (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=SWMM,hydraulic%20capa%C2%ADbil%C2%ADi%C2%ADties%20for%20modern%20stormwater&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;)&lt;/strong&gt;. The continued evolution of SWMM5 ensures that it remains relevant – for instance, current development is looking at linking SWMM with real-time monitoring data to create “digital twin” models of sewer systems that run continuously and forecast system performance (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=When%20cities%20use%20%E2%80%9Csoftware%20as,on%20compliance%20violation%20fees%2C%20public&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;). This kind of real-time SWMM application is on the cutting edge of smart city infrastructure management. The fact that such innovations trace their lineage to the original SWMM speaks to the enduring legacy of the model.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Over its 50-year history, the Storm Water Management Model has evolved from a set of FORTRAN programs addressing combined sewer overflows into a &lt;strong&gt;comprehensive stormwater management framework&lt;/strong&gt;. Each version – SWMM1, 2, 3, 4, and finally 5 – added important capabilities: from dynamic flow routing (EXTRAN) to continuous simulation, water quality, groundwater interaction, and modern GUI features. The naming conventions of early modules (Runoff, Transport, EXTRAN, etc.) highlight the expanding scope, while SWMM5’s unified structure reflects the culmination of those developments into one integrated tool. SWMM5, in particular, represents a milestone: it unified previously separate hydrology, hydraulics, and quality components; improved the computational engines; and made the model accessible to a broad user base through a friendly interface and open-source distribution.&lt;/p&gt;
&lt;p&gt;The contributions of individuals like Dr. Lew Rossman and others have been pivotal in this journey, ensuring SWMM5’s design balances detail with usability (&lt;a href=&quot;https://pmc.ncbi.nlm.nih.gov/articles/PMC7326159/#:~:text=integrity%20of%20their%20own%20unique,and%20the%20effectiveness%20of%20GI%2FLID&quot;&gt;
Storm Water Management Model: Performance Review and Gap Analysis - PMC
&lt;/a&gt;). Today, SWMM5’s impact is evident in how cities plan infrastructure, comply with environmental regulations, and implement innovative solutions like green infrastructure. Its success demonstrates the value of sustained public-domain tool development in the water resources field. As urban stormwater challenges continue to grow, SWMM’s evolution is likely to continue, guided by its rich legacy and supported by a global community of users and developers.&lt;/p&gt;
&lt;p&gt;In summary, the evolution of SWMM showcases a continuous improvement in modeling technology – from punch-card programs for CSO control to a &lt;strong&gt;state-of-the-art, integrated modeling platform&lt;/strong&gt; that underpins modern stormwater management and helps build more resilient, water-sensitive cities.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sources:&lt;/strong&gt; The historical and technical details above are drawn from EPA’s SWMM documentation and scholarly/industry publications on SWMM’s development and use. Key references include the EPA SWMM5 official reference manuals and user guides, as well as retrospective accounts of SWMM’s history by CDM Smith and others (&lt;a href=&quot;https://downloads.tuflow.com/SWMM/SWMM5_Reference_Manual_Volume1_Hydrology_P100NYRA.pdf#:~:text=SWMM%20I%201971%20Metcalf%20%26,3%201981%20University%20of%20Florida&quot;&gt;Storm Water Management Model&lt;/a&gt;) (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=Image%3A%20Newspaper%20clipping%20SWMM%E2%80%99s%20Runoff,John%20Shubinski%2C%20released%20in%201975&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;) (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=Schmidt%20says,it%20better%20understood%20local%20surface&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;) (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=Released%20in%202004%2C%20SWMM%205,software%20much%20easier%20to%20use&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;) (&lt;a href=&quot;https://pmc.ncbi.nlm.nih.gov/articles/PMC7326159/#:~:text=LID%20modeling%20features%20were%20added,and%20overflow%20control%20the%20storage&quot;&gt;
Storm Water Management Model: Performance Review and Gap Analysis - PMC
&lt;/a&gt;) (&lt;a href=&quot;https://www.cdmsmith.com/en/client-solutions/insights/epa-swmm-storm-water-management-model#:~:text=champion%20to%20combat%20CSOs%20and,Philadel%C2%ADphia%20Water%20Department%20is%20now&quot;&gt;A History of the EPA SWMM Storm Water Management Model - CDM Smith&lt;/a&gt;), which document the progression of features and applications across SWMM versions.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note on the current and future caretaker of SWMM5&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p data-end=&quot;528&quot; data-start=&quot;0&quot;&gt;Caleb A. Buahin, Ph.D., is a notable current figure at the U.S. Environmental Protection Agency (EPA), actively involved in the ongoing development and advancement of stormwater modeling tools, particularly SWMM5. While Dr. Lewis Rossman led the foundational overhaul and development of SWMM5, Caleb Buahin represents a new generation of EPA researchers who have contributed significantly to SWMM5’s recent advancements, particularly in cutting-edge areas such as high-performance computing, parallelization, and model coupling.&lt;/p&gt;&lt;p data-end=&quot;594&quot; data-start=&quot;530&quot;&gt;Dr. Buahin&#39;s work has focused on modernizing SWMM5 by exploring:&lt;/p&gt;&lt;ul data-end=&quot;1875&quot; data-start=&quot;596&quot;&gt;
&lt;li data-end=&quot;847&quot; data-start=&quot;596&quot;&gt;
&lt;p data-end=&quot;847&quot; data-start=&quot;598&quot;&gt;&lt;strong data-end=&quot;621&quot; data-start=&quot;598&quot;&gt;Parallel Computing:&lt;/strong&gt; He has significantly advanced SWMM’s computational efficiency by enabling parallel processing and multi-core computing capabilities, greatly reducing simulation runtimes, especially for large, complex urban drainage networks.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1276&quot; data-start=&quot;849&quot;&gt;
&lt;p data-end=&quot;1276&quot; data-start=&quot;851&quot;&gt;&lt;strong data-end=&quot;886&quot; data-start=&quot;851&quot;&gt;Model Coupling and Integration:&lt;/strong&gt; Dr. Buahin has worked extensively on integrating SWMM5 with other environmental and hydraulic modeling frameworks, notably through tools such as OpenMI (Open Modeling Interface). This allows SWMM5 to dynamically couple with watershed models, groundwater models, and receiving-water quality models, providing an enhanced integrated modeling capability that extends SWMM&#39;s traditional scope.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1554&quot; data-start=&quot;1278&quot;&gt;
&lt;p data-end=&quot;1554&quot; data-start=&quot;1280&quot;&gt;&lt;strong data-end=&quot;1317&quot; data-start=&quot;1280&quot;&gt;High-Performance Computing (HPC):&lt;/strong&gt; He has been involved in optimizing SWMM5 for high-performance computing environments, making it feasible to perform detailed watershed-scale simulations and long-term continuous modeling that were previously computationally prohibitive.&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1875&quot; data-start=&quot;1556&quot;&gt;
&lt;p data-end=&quot;1875&quot; data-start=&quot;1558&quot;&gt;&lt;strong data-end=&quot;1598&quot; data-start=&quot;1558&quot;&gt;Software Development and Innovation:&lt;/strong&gt; Buahin has contributed to efforts such as the Open Water Analytics community initiative, supporting open-source software collaboration, transparency, and innovation around SWMM5. His work embodies the EPA&#39;s philosophy of promoting accessible, collaborative modeling resources.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p data-end=&quot;2314&quot; data-start=&quot;1877&quot;&gt;Dr. Buahin’s contributions complement and extend the foundational work of Dr. Lewis Rossman. While Rossman laid the groundwork for SWMM5’s unified architecture and usability, Dr. Buahin and other contemporary researchers are pushing the boundaries by leveraging emerging computational technologies, allowing SWMM5 to meet modern-day challenges such as climate change resilience, real-time modeling, and integrated urban water management.&lt;/p&gt;&lt;p&gt;



&lt;/p&gt;&lt;p data-end=&quot;2544&quot; data-is-last-node=&quot;&quot; data-is-only-node=&quot;&quot; data-start=&quot;2316&quot;&gt;Thus, Caleb Buahin’s role represents a new phase in the continuing evolution of SWMM, bringing state-of-the-art computational and modeling advancements to the already robust framework established by Rossman and his predecessors.&lt;/p&gt;</description><link>http://www.swmmfive.com/2025/03/ai-deep-think-on-history-of-epaswmm.html</link><author>noreply@blogger.com (Robert Dickinson )</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-335789943869477383.post-6104120273561704547</guid><pubDate>Thu, 09 Jan 2025 01:10:00 +0000</pubDate><atom:updated>2025-01-08T20:10:34.896-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">AI Prompt for Generating a SWMM5 inp file with Rules</category><title>AI Prompt for Generating a SWMM5 inp file with Rules</title><description>&lt;p&gt;&amp;nbsp;Below is an example &lt;strong&gt;prompt&lt;/strong&gt; you can use (in ChatGPT or any advanced language model that understands SWMM5 syntax) to generate a &lt;strong&gt;syntactically correct&lt;/strong&gt; SWMM5 &lt;strong&gt;.inp&lt;/strong&gt; file. The prompt &lt;strong&gt;guides&lt;/strong&gt; the AI through every relevant section, specifying required details, conventions, and typical structures that SWMM5 expects. You can adapt it to your particular system, specifying how many subcatchments, conduits, nodes, etc., or giving specific geometry, infiltration data, or rainfall series.&lt;/p&gt;&lt;span data-teams=&quot;true&quot;&gt;&lt;hr /&gt;&lt;h2&gt;Prompt Example for Generating a SWMM5 .inp File&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;System / Developer Instruction:&lt;/strong&gt;&lt;br /&gt;
You are an expert in the EPA SWMM5 modeling software. You know how to create a syntactically correct SWMM5 &lt;strong&gt;.inp&lt;/strong&gt; file with the proper sections and formatting. You will generate an &lt;strong&gt;entire&lt;/strong&gt; SWMM5 input file that meets the following requirements:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;File Sections&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;Include &lt;strong&gt;[TITLE]&lt;/strong&gt;, &lt;strong&gt;[OPTIONS]&lt;/strong&gt;, &lt;strong&gt;[EVAPORATION]&lt;/strong&gt;, &lt;strong&gt;[RAINGAGES]&lt;/strong&gt;, &lt;strong&gt;[SUBCATCHMENTS]&lt;/strong&gt;, &lt;strong&gt;[SUBAREAS]&lt;/strong&gt;, &lt;strong&gt;[INFILTRATION]&lt;/strong&gt;, &lt;strong&gt;[JUNCTIONS]&lt;/strong&gt;, &lt;strong&gt;[OUTFALLS]&lt;/strong&gt;, &lt;strong&gt;[CONDUITS]&lt;/strong&gt;, &lt;strong&gt;[XSECTIONS]&lt;/strong&gt;, &lt;strong&gt;[LOSSES]&lt;/strong&gt; (if necessary), &lt;strong&gt;[REPORT]&lt;/strong&gt;, and &lt;strong&gt;[MAP]&lt;/strong&gt;. (You may add other sections like &lt;strong&gt;[CURVES]&lt;/strong&gt;, &lt;strong&gt;[TIMESERIES]&lt;/strong&gt;, &lt;strong&gt;[PATTERNS]&lt;/strong&gt;, etc., if it suits the scenario.)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Title Section&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;Provide a descriptive title that briefly explains the model scenario.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Options&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;Use default or typical SWMM settings (e.g., &lt;code&gt;FLOW_UNITS CFS&lt;/code&gt; in US units or &lt;code&gt;FLOW_UNITS LPS&lt;/code&gt; in SI units).&lt;/li&gt;&lt;li&gt;Define the &lt;code&gt;INFILTRATION&lt;/code&gt; method (e.g., HORTON, GREEN_AMPT, or CURVE_NUMBER).&lt;/li&gt;&lt;li&gt;Set &lt;code&gt;START_DATE&lt;/code&gt;, &lt;code&gt;END_DATE&lt;/code&gt;, &lt;code&gt;REPORT_START_DATE&lt;/code&gt;, &lt;code&gt;SWEEP_START&lt;/code&gt;, and &lt;code&gt;SWEEP_END&lt;/code&gt; to some logical values.&lt;/li&gt;&lt;li&gt;Include &lt;code&gt;DRY_DAYS&lt;/code&gt; and &lt;code&gt;REPORT_STEP&lt;/code&gt; parameters.&lt;/li&gt;&lt;li&gt;Indicate typical settings, such as &lt;code&gt;ALLOW_PONDING&lt;/code&gt;, &lt;code&gt;MIN_SLOPE&lt;/code&gt;, &lt;code&gt;FORCE_MAIN_EQUATION&lt;/code&gt;, and so on.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Evaporation &amp;amp; Rain Gages&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;Provide a simple &lt;code&gt;EVAPORATION&lt;/code&gt; block, e.g., monthly average values or a constant.&lt;/li&gt;&lt;li&gt;Under &lt;strong&gt;[RAINGAGES]&lt;/strong&gt;, define at least &lt;strong&gt;one&lt;/strong&gt; rain gage referencing a time series or user input.
&lt;ul&gt;&lt;li&gt;Indicate the rain format (&lt;code&gt;VOLUME&lt;/code&gt;, &lt;code&gt;INTENSITY&lt;/code&gt;, etc.) and time interval. Make sure the rainfall &amp;nbsp;interval matches the generated rainfall time series interval.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Subcatchments&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;Include at least &lt;strong&gt;two&lt;/strong&gt; subcatchments for demonstration.&lt;/li&gt;&lt;li&gt;Give each subcatchment a unique name, outlet (e.g., a junction or an outfall), area, %imperv, width, slope, and curb length if needed.&lt;/li&gt;&lt;li&gt;Reference the corresponding rain gage name.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Subareas&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;Provide Manning’s n for impervious and pervious surfaces, depression storage, and any typical infiltration parameters (matching the infiltration method chosen in &lt;strong&gt;[OPTIONS]&lt;/strong&gt;).&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Infiltration&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;If using &lt;strong&gt;HORTON&lt;/strong&gt;, specify &lt;code&gt;MaxRate, MinRate, Decay, DryTime, MaxInfil&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;If using &lt;strong&gt;GREEN_AMPT&lt;/strong&gt;, specify &lt;code&gt;Suction, Ksat, IMDmax&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;If using &lt;strong&gt;CURVE_NUMBER&lt;/strong&gt;, define typical parameters.&lt;/li&gt;&lt;li&gt;Ensure the infiltration parameters match the number of subcatchments.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Junctions &amp;amp; Outfalls&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;Create at least &lt;strong&gt;two&lt;/strong&gt; junctions (including invert elevations and max depths).&lt;/li&gt;&lt;li&gt;Create &lt;strong&gt;one&lt;/strong&gt; outfall with an assigned boundary condition (e.g., free outfall or fixed stage).&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Conduits&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;Define at least &lt;strong&gt;two&lt;/strong&gt; conduits connecting your junctions/outfall.&lt;/li&gt;&lt;li&gt;Specify conduit lengths, roughness (Manning’s n), inlet/outlet offsets (if any), and entry/exit node names.&lt;/li&gt;&lt;li&gt;Use the &lt;strong&gt;[XSECTIONS]&lt;/strong&gt; section to define shapes and dimensions (e.g., circular pipes).&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Losses (optional)&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;If relevant, demonstrate how to specify local losses for conduits with expansions and contractions.&lt;/li&gt;&lt;/ul&gt;&lt;ol start=&quot;11&quot;&gt;&lt;li&gt;&lt;strong&gt;Report&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;Set &lt;code&gt;INPUT NO&lt;/code&gt;, &lt;code&gt;CONTROLS NO&lt;/code&gt;, &lt;code&gt;SUBCATCHMENTS ALL&lt;/code&gt;, &lt;code&gt;NODES ALL&lt;/code&gt;, &lt;code&gt;LINKS ALL&lt;/code&gt;, etc. to indicate what data to report.&lt;/li&gt;&lt;/ul&gt;&lt;ol start=&quot;12&quot;&gt;&lt;li&gt;&lt;strong&gt;Map&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;Provide map coordinates or a bounding rectangle for the plan view.&lt;/li&gt;&lt;li&gt;The &lt;strong&gt;[MAP]&lt;/strong&gt; section at the end should be valid with typical bounding coordinates (e.g., &lt;code&gt;0.0 0.0 10000.0 10000.0&lt;/code&gt;).&lt;/li&gt;&lt;/ul&gt;&lt;ol start=&quot;13&quot;&gt;&lt;li&gt;&lt;strong&gt;Formatting &amp;amp; Syntax&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;Strictly follow SWMM5 .inp file syntax:
&lt;ul&gt;&lt;li&gt;Each section in brackets, e.g., &lt;code&gt;[TITLE]&lt;/code&gt; on its own line.&lt;/li&gt;&lt;li&gt;Data lines separated by spaces or tabs.&lt;/li&gt;&lt;li&gt;Semicolons for comments.&lt;/li&gt;&lt;li&gt;No trailing commas or special characters that break SWMM5 parser rules.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ol start=&quot;14&quot;&gt;&lt;li&gt;&lt;strong&gt;Explanatory Comments&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;Insert brief &lt;strong&gt;comments&lt;/strong&gt; (prefixed with &lt;code&gt;;&lt;/code&gt;) to explain key sections or parameters, so the file is instructive as well as functional.&lt;/li&gt;&lt;/ul&gt;&lt;ol start=&quot;15&quot;&gt;&lt;li&gt;&lt;strong&gt;Validation&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;The resulting .inp file must be &lt;strong&gt;fully valid&lt;/strong&gt; in the official SWMM5 engine (EPA SWMM version 5.1 or later) with no syntax errors.&lt;/li&gt;&lt;li&gt;If any advanced features (like &lt;strong&gt;[CONTROL]&lt;/strong&gt; rules or &lt;strong&gt;[TAGS]&lt;/strong&gt;) are included, ensure they’re properly structured.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Using these guidelines, &lt;strong&gt;generate the complete SWMM5 .inp&lt;/strong&gt; file in plain text format. Include all sections, including required placeholders, so that a user could copy and paste the output directly into a SWMM &lt;code&gt;.inp&lt;/code&gt; file, open it in the EPA SWMM5 GUI, and run a simulation without syntax or parse errors.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Remember&lt;/strong&gt;: The file should demonstrate a realistic but simple model scenario—two subcatchments draining to a small network of conduits, at least one outfall, infiltration, and a straightforward rainfall definition, plus any required supporting data.&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;h3&gt;How to Use This Prompt&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Copy&lt;/strong&gt; the &lt;strong&gt;System / Developer Instruction&lt;/strong&gt; above into your AI interface (e.g., ChatGPT or another large language model platform).&lt;/li&gt;&lt;li&gt;Add any &lt;strong&gt;custom details&lt;/strong&gt; you want, such as the number of subcatchments, infiltration method you prefer, coordinate system, or time series data specifics.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Send&lt;/strong&gt; the prompt. The AI should respond with a &lt;strong&gt;fully formatted&lt;/strong&gt; &lt;code&gt;.inp&lt;/code&gt; file structure.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Review&lt;/strong&gt; the generated text, &lt;strong&gt;copy&lt;/strong&gt; it into a text file named &lt;code&gt;YourModel.inp&lt;/code&gt;, then &lt;strong&gt;load it&lt;/strong&gt; in EPA SWMM5 to verify or modify further.&lt;/li&gt;&lt;/ol&gt;&lt;hr /&gt;&lt;h3&gt;Example Output Snippet (Illustration Only)&lt;/h3&gt;&lt;p&gt;Below is a small illustration of what part of the AI’s output might look like. (Note: This is &lt;strong&gt;not&lt;/strong&gt; a full .inp file, just a sample snippet.)&lt;/p&gt;&lt;pre class=&quot;language-plaintext&quot; itemid=&quot;codeBlockEditor-2606df36-e3b8-436f-9d8a-85d85f5ee622&quot;&gt;&lt;code&gt;[TITLE]&lt;br /&gt;; -----------------------------------------------------&lt;br /&gt;; Simple Example SWMM5 Model - Demonstration&lt;br /&gt;; -----------------------------------------------------&lt;br /&gt;&lt;br /&gt;[OPTIONS]&lt;br /&gt;FLOW_UNITS&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CFS&lt;br /&gt;INFILTRATION&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HORTON&lt;br /&gt;START_DATE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;01/01/2023&lt;br /&gt;...&lt;br /&gt;...&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The final answer from the AI should be &lt;strong&gt;far more extensive&lt;/strong&gt;, covering &lt;strong&gt;all&lt;/strong&gt; sections and &lt;strong&gt;all&lt;/strong&gt; data lines you requested in your prompt.&lt;/p&gt;&lt;hr /&gt;&lt;h3&gt;Tips for Getting the Best Results&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Be Specific&lt;/strong&gt;: If you need 5 subcatchments and 5 conduits, &lt;strong&gt;explicitly&lt;/strong&gt; say so.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Include Realistic Values&lt;/strong&gt;: Provide typical infiltration rates, junction depths, or rainfall intensities to get a more practical file.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Validate&lt;/strong&gt;: After receiving the file, &lt;strong&gt;import&lt;/strong&gt; it into EPA SWMM5 to confirm no syntax issues appear in the Status Report.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Iterate&lt;/strong&gt;: If you need changes (e.g., different infiltration method or additional controls), refine your prompt and re-run.&lt;/li&gt;&lt;/ul&gt;&lt;hr /&gt;&lt;p&gt;Using this &lt;strong&gt;prompt&lt;/strong&gt; approach should give you a &lt;strong&gt;ready-to-run&lt;/strong&gt; SWMM5 &lt;strong&gt;.inp&lt;/strong&gt; file—complete with all necessary sections, correct syntax, and logical water-balance setup.&lt;/p&gt;&lt;/span&gt;</description><link>http://www.swmmfive.com/2025/01/ai-prompt-for-generating-swmm5-inp-file.html</link><author>noreply@blogger.com (Robert Dickinson )</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-335789943869477383.post-6166678198997417508</guid><pubDate>Sat, 04 Jan 2025 18:10:00 +0000</pubDate><atom:updated>2025-01-07T14:17:52.054-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Banach-Tarski paradox and SWMM5 modeling.</category><title>Banach-Tarski paradox and SWMM5 modeling. </title><description>&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;span face=&quot;&amp;quot;Google Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif&quot; style=&quot;color: #1b1c1d;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;Banach-Tarski paradox and SWMM5 modeling.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;&lt;div _ngcontent-ng-c2156892898=&quot;&quot; class=&quot;markdown markdown-main-panel tutor-markdown-rendering response-optimization&quot; dir=&quot;ltr&quot; id=&quot;model-response-message-contentr_d700fd1e5eb9c40d&quot; style=&quot;--animation-duration: 400ms; --fade-animation-function: linear; animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; color: #1b1c1d; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 16px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;p data-sourcepos=&quot;3:1-3:167&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 16px 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Let&#39;s elaborate on how the principles underlying Banach-Tarski could inspire practical hydraulic modeling approaches, particularly focusing on the areas you mentioned:&lt;/p&gt;&lt;p data-sourcepos=&quot;5:1-5:31&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 16px 0px 8px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;1. Optimize Network Layouts&lt;/span&gt;&lt;/p&gt;&lt;ul data-sourcepos=&quot;7:1-11:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px 0px 0px 16px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;
&lt;li data-sourcepos=&quot;7:1-7:395&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Analogy:&lt;/span&gt; Think of the Banach-Tarski paradox as a way to rearrange a volume into a larger or differently shaped volume without adding or removing material. In network optimization, we can draw an analogy to rearranging the layout of pipes and junctions to achieve better flow characteristics (e.g., reduced head loss, more uniform flow distribution) without necessarily adding more pipes.&lt;/li&gt;
&lt;li data-sourcepos=&quot;8:1-11:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Practical Approach:&lt;/span&gt;
&lt;ul data-sourcepos=&quot;9:5-11:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px 0px 0px 16px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;
&lt;li data-sourcepos=&quot;9:5-9:430&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px 0px 4px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Topology Optimization:&lt;/span&gt; Banach-Tarski&#39;s emphasis on transformations can inspire us to explore methods that drastically alter the network topology. Instead of just adjusting pipe diameters, we might consider algorithms that add/remove entire links or nodes to find more efficient configurations. This could involve using graph theory and optimization techniques (e.g., genetic algorithms) to search a wider design space.&lt;/li&gt;
&lt;li data-sourcepos=&quot;10:5-11:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px 0px 4px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Redundancy and Resilience:&lt;/span&gt; The paradox involves creating seemingly duplicate structures.  In SWMM5, this might inspire us to think about how to design for redundancy and resilience. Could we design networks where alternative flow paths can be &quot;activated&quot; under specific conditions (e.g., pipe failure, high flow), mimicking the duplication aspect in a controlled, physically meaningful way?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p data-sourcepos=&quot;12:1-12:48&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 16px 0px 8px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;2. Develop More Efficient Routing Algorithms&lt;/span&gt;&lt;/p&gt;&lt;ul data-sourcepos=&quot;14:1-18:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px 0px 0px 16px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;
&lt;li data-sourcepos=&quot;14:1-14:203&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Analogy:&lt;/span&gt; Banach-Tarski involves decomposing and recomposing sets in non-intuitive ways. We can think of routing algorithms as ways to decompose flow through a network and recompose it at outlets.&lt;/li&gt;
&lt;li data-sourcepos=&quot;15:1-18:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Practical Approach:&lt;/span&gt;
&lt;ul data-sourcepos=&quot;16:5-18:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px 0px 0px 16px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;
&lt;li data-sourcepos=&quot;16:5-16:379&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px 0px 4px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Dynamic Routing:&lt;/span&gt;  Instead of fixed flow paths, we could explore algorithms that dynamically adapt to changing conditions (rainfall, storage levels). This could involve concepts from network flow theory and control theory. Perhaps a &quot;Banach-Tarski-inspired&quot; algorithm would be able to reroute flow in unexpected but ultimately more efficient ways under extreme events.&lt;/li&gt;
&lt;li data-sourcepos=&quot;17:5-18:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px 0px 4px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Multi-Objective Optimization:&lt;/span&gt; The paradox might suggest exploring routing that simultaneously optimizes multiple objectives (e.g., minimizing flooding, maximizing storage utilization, maintaining water quality). This could involve advanced optimization algorithms that search for Pareto-optimal solutions in a multi-dimensional space.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p data-sourcepos=&quot;19:1-19:56&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 16px 0px 8px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;3. Think About Flow Distribution in Complex Networks&lt;/span&gt;&lt;/p&gt;&lt;ul data-sourcepos=&quot;21:1-25:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px 0px 0px 16px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;
&lt;li data-sourcepos=&quot;21:1-21:232&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Analogy:&lt;/span&gt; The paradox deals with the counterintuitive distribution of points within a space. In SWMM5, this could relate to understanding how flow distributes in networks with complex topologies (e.g., loops, parallel paths).&lt;/li&gt;
&lt;li data-sourcepos=&quot;22:1-25:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Practical Approach:&lt;/span&gt;
&lt;ul data-sourcepos=&quot;23:5-25:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px 0px 0px 16px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;
&lt;li data-sourcepos=&quot;23:5-23:226&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px 0px 4px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Sensitivity Analysis:&lt;/span&gt; We could use concepts from the paradox to explore the sensitivity of flow distribution to small changes in network parameters. This could reveal hidden vulnerabilities or unexpected behaviors.&lt;/li&gt;
&lt;li data-sourcepos=&quot;24:5-25:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px 0px 4px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Decentralized Control:&lt;/span&gt;  The idea of decomposing a set into independent pieces could inspire research into decentralized control strategies for managing flow in large networks. Each sub-network could be managed semi-autonomously, similar to how pieces in the Banach-Tarski decomposition are rearranged independently.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p data-sourcepos=&quot;26:1-26:41&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 16px 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Further Exploration: Fractal Geometry&lt;/span&gt;&lt;/p&gt;&lt;p data-sourcepos=&quot;28:1-28:292&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 16px 0px 8px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;While not directly related to Banach-Tarski, the realm of fractal geometry, which also deals with infinity and self-similarity, might offer even more relevant inspiration for SWMM5 modeling. Natural drainage networks often exhibit fractal properties. Exploring these properties could lead to:&lt;/p&gt;&lt;ul data-sourcepos=&quot;30:1-32:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px 0px 0px 16px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;
&lt;li data-sourcepos=&quot;30:1-30:119&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;More realistic network generation:&lt;/span&gt; Creating synthetic networks that mimic the complexity of real-world systems.&lt;/li&gt;
&lt;li data-sourcepos=&quot;31:1-32:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Improved scaling relationships:&lt;/span&gt; Understanding how flow behavior changes across different spatial scales.&lt;/li&gt;
&lt;/ul&gt;&lt;p data-sourcepos=&quot;33:1-33:17&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 16px 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Key Takeaway:&lt;/span&gt;&lt;/p&gt;&lt;p data-sourcepos=&quot;35:1-35:170&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 16px 0px 8px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;The value of considering Banach-Tarski in the context of SWMM5 lies not in direct application but in using it as a springboard for creative thinking. It encourages us to:&lt;/p&gt;&lt;ul data-sourcepos=&quot;37:1-40:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px 0px 0px 16px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;
&lt;li data-sourcepos=&quot;37:1-37:105&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Challenge assumptions:&lt;/span&gt; Are there hidden constraints in our modeling approaches that we can relax?&lt;/li&gt;
&lt;li data-sourcepos=&quot;38:1-38:139&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Explore unconventional solutions:&lt;/span&gt; Can we break free from traditional optimization methods and explore more radical transformations?&lt;/li&gt;
&lt;li data-sourcepos=&quot;39:1-40:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Embrace complexity:&lt;/span&gt; How can we better model the intricate behavior of real-world hydraulic systems?&lt;/li&gt;
&lt;/ul&gt;&lt;p data-sourcepos=&quot;41:1-41:178&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 16px 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;By embracing these principles, we can potentially develop more sophisticated, robust, and efficient hydraulic models that better address the challenges of urban water management.&lt;/p&gt;&lt;p data-sourcepos=&quot;43:1-43:123&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 16px 0px; marker: none; mask-clip: border-box; mask-composite: add; mask-image: none; mask-mode: match-source; mask-origin: border-box; mask-repeat: repeat; mask-size: auto; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;</description><link>http://www.swmmfive.com/2025/01/banach-tarski-paradox-and-swmm5-modeling.html</link><author>noreply@blogger.com (Robert Dickinson )</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-335789943869477383.post-8189946418046016345</guid><pubDate>Wed, 01 Jan 2025 03:12:00 +0000</pubDate><atom:updated>2024-12-31T22:13:55.951-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">A comprehensive explanation of how minimum travel distance relates to link length in InfoSewer</category><title>A comprehensive explanation of how minimum travel distance relates to link length in InfoSewer </title><description>&lt;p&gt;In hydraulic modeling of sewer networks, the minimum travel distance is a fundamental parameter that affects how accurately the model can simulate flow movement through the system. This parameter essentially determines the smallest distance that flow can travel within a single time step of the simulation.&lt;/p&gt;&lt;p&gt;&lt;b&gt;The Relationship to Mean Link Length:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;When we look at the pipe database (Pipe DB) table in InfoSewer, the mean link length represents the average distance between connected nodes in our sewer network. This length has a direct correlation with the appropriate minimum travel distance setting. The reason for this connection lies in how the hydraulic routing calculations are performed.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Understanding Mass Balance:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Mass balance in a sewer network model is a crucial indicator of simulation accuracy. It represents the conservation of flow throughout the system - essentially checking that what goes into the system matches what comes out, accounting for any storage within the system. When the mass balance check shows significant errors, it often indicates that the model&#39;s spatial or temporal discretization isn&#39;t appropriate for the network&#39;s characteristics.&lt;/p&gt;&lt;p&gt;The relationship between minimum travel distance and mass balance can be understood through these key points:&lt;/p&gt;&lt;p&gt;&lt;b&gt;1. Spatial Discretization:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;- When the minimum travel distance is too small relative to the typical link lengths, the model may create too many computational segments&lt;/p&gt;&lt;p&gt;- If it&#39;s too large, the model might oversimplify the flow routing&lt;/p&gt;&lt;p&gt;- The optimal value often aligns with the mode (most frequent value) of the length histogram&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoQaszyy-0lvOk0Zmmc8OC7nkvDGulmYcZzSWh1ByIluysWZumYcHDIRmDofGFrJJ8sCvuLFYPCkRKKVIvnHIjvYfdA0ZH-rc9hL-FNvHjDEw9FEcywXjC7jRtI1Q_o1BiVZ1wVWIELMLUC2Nnm2ClJXgBvANtL_cOF3I63V8bsWDQrHO_VM5UtgIOt1HP/s1408/napkin-selection%20(10).png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1408&quot; data-original-width=&quot;1322&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoQaszyy-0lvOk0Zmmc8OC7nkvDGulmYcZzSWh1ByIluysWZumYcHDIRmDofGFrJJ8sCvuLFYPCkRKKVIvnHIjvYfdA0ZH-rc9hL-FNvHjDEw9FEcywXjC7jRtI1Q_o1BiVZ1wVWIELMLUC2Nnm2ClJXgBvANtL_cOF3I63V8bsWDQrHO_VM5UtgIOt1HP/w600-h640/napkin-selection%20(10).png&quot; width=&quot;600&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;2. Temporal Considerations:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;- The 1-hour report time step mentioned provides a framework for flow calculations&lt;/p&gt;&lt;p&gt;- The minimum travel distance must be compatible with this time step to ensure flow can realistically traverse the specified distance within the time increment&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;3. Network Accuracy Parameters:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The default values for network accuracy, minimum time length, and maximum number of segments interact with the minimum travel distance to affect overall simulation accuracy. These parameters work together to determine:&lt;/p&gt;&lt;p&gt;- How finely the network is divided for calculations&lt;/p&gt;&lt;p&gt;- The smallest time increment used for routing&lt;/p&gt;&lt;p&gt;- The maximum number of computational elements allowed&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQr1vydEjuEWIgjaMkTEOi7jKbLE23pHzC4WJRlAqwyq0ndpTXzFy7mH6mkrxLhyKC3eBNARneJMijY1AW2Nqy_cR6kJbYtVSFNF_jekWxDkNZmGE0WtJY06EJ7M02249RLa8nO9Jh4vUm66cfhoOf0EQshHewXk02w18BkIn2HjEzcVuf7wOWKCjAE_oR/s1149/napkin-selection%20(11).png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1106&quot; data-original-width=&quot;1149&quot; height=&quot;616&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQr1vydEjuEWIgjaMkTEOi7jKbLE23pHzC4WJRlAqwyq0ndpTXzFy7mH6mkrxLhyKC3eBNARneJMijY1AW2Nqy_cR6kJbYtVSFNF_jekWxDkNZmGE0WtJY06EJ7M02249RLa8nO9Jh4vUm66cfhoOf0EQshHewXk02w18BkIn2HjEzcVuf7wOWKCjAE_oR/w640-h616/napkin-selection%20(11).png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Optimization Strategy:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;To achieve the best mass balance results, the following approach is recommended:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;1. Analyze the Pipe Length Distribution:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;- Create a histogram of pipe lengths in the network&lt;/p&gt;&lt;p&gt;- Identify the mode (most frequent length)&lt;/p&gt;&lt;p&gt;- Use this as an initial value for minimum travel distance&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;2. Consider Network Characteristics:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;- Account for the overall size of the system&lt;/p&gt;&lt;p&gt;- Factor in the typical flow velocities&lt;/p&gt;&lt;p&gt;- Consider the presence of any special structures or flow conditions&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;3. Fine-tune the Parameters:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;- Start with the mode-based minimum travel distance&lt;/p&gt;&lt;p&gt;- Adjust if necessary based on mass balance results&lt;/p&gt;&lt;p&gt;- Keep other parameters at default values initially&lt;/p&gt;&lt;p&gt;- Make incremental adjustments while monitoring mass balance&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Practical Implementation:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;When setting up an InfoSewer model:&lt;/p&gt;&lt;p&gt;1. First examine your pipe database:&lt;/p&gt;&lt;p&gt;```sql&lt;/p&gt;&lt;p&gt;SELECT&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; ROUND(Length, -1) as LengthBin,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; COUNT(*) as Frequency&lt;/p&gt;&lt;p&gt;FROM PipeDB&lt;/p&gt;&lt;p&gt;GROUP BY ROUND(Length, -1)&lt;/p&gt;&lt;p&gt;ORDER BY Frequency DESC;&lt;/p&gt;&lt;p&gt;```&lt;/p&gt;&lt;p&gt;2. Use the most frequent length bin as your starting point for minimum travel distance&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;a comprehensive explanation of how minimum travel distance relates to link length in InfoSewer&amp;nbsp;&lt;/p&gt;&lt;p&gt;- Running a mass balance check&lt;/p&gt;&lt;p&gt;- Examining flow continuity at key points&lt;/p&gt;&lt;p&gt;- Verifying travel times between known points&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;This approach typically yields the best mass balance results while maintaining computational efficiency. The key is finding the sweet spot where the minimum travel distance is:&lt;/p&gt;&lt;p&gt;- Large enough to prevent excessive computational segments&lt;/p&gt;&lt;p&gt;- Small enough to capture the network&#39;s hydraulic behavior accurately&lt;/p&gt;&lt;p&gt;- Compatible with the most common pipe lengths in your system&lt;/p&gt;&lt;p&gt;Remember that while using the mode of the length histogram as the minimum travel distance often provides good results with default parameters, some networks may require fine-tuning based on their specific characteristics and the required level of accuracy for your analysis.&lt;/p&gt;</description><link>http://www.swmmfive.com/2024/12/a-comprehensive-explanation-of-how.html</link><author>noreply@blogger.com (Robert Dickinson )</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoQaszyy-0lvOk0Zmmc8OC7nkvDGulmYcZzSWh1ByIluysWZumYcHDIRmDofGFrJJ8sCvuLFYPCkRKKVIvnHIjvYfdA0ZH-rc9hL-FNvHjDEw9FEcywXjC7jRtI1Q_o1BiVZ1wVWIELMLUC2Nnm2ClJXgBvANtL_cOF3I63V8bsWDQrHO_VM5UtgIOt1HP/s72-w600-h640-c/napkin-selection%20(10).png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-335789943869477383.post-1248476563696895626</guid><pubDate>Mon, 30 Dec 2024 22:15:00 +0000</pubDate><atom:updated>2024-12-30T17:17:32.407-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SWMMIO in General</category><title>SWMMIO in General</title><description>&lt;p&gt;Below is a &lt;strong&gt;detailed summary&lt;/strong&gt; of &lt;strong&gt;swmmio&lt;/strong&gt;, a Python package for working with &lt;strong&gt;EPA SWMM5&lt;/strong&gt; (Storm Water Management Model) files and data. This overview addresses &lt;strong&gt;what&lt;/strong&gt; swmmio is, &lt;strong&gt;why&lt;/strong&gt; it’s useful for SWMM practitioners, and &lt;strong&gt;how&lt;/strong&gt; it functions—particularly highlighting its approach to reading/writing SWMM inputs, analyzing model data, and generating visual or geospatial outputs.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1. Purpose and Rationale&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SWMM5&lt;/strong&gt; is a widely used open-source tool developed by the U.S. EPA for hydrologic/hydraulic modeling of stormwater and wastewater networks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;swmmio&lt;/strong&gt; extends SWMM5 by providing &lt;strong&gt;Python-based&lt;/strong&gt; utilities that significantly streamline:
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Reading&lt;/strong&gt; and &lt;strong&gt;writing&lt;/strong&gt; SWMM input files (&lt;code inline=&quot;&quot;&gt;.inp&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inspecting&lt;/strong&gt; key model data (links, nodes, subcatchments) in &lt;strong&gt;pandas&lt;/strong&gt; DataFrames.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spatial analysis&lt;/strong&gt; (e.g., shapefile reading or coordinate transformations).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Visualization&lt;/strong&gt;: generating static diagrams, maps, or profile plots from SWMM data.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By bridging SWMM data with Python’s &lt;strong&gt;data science&lt;/strong&gt; and &lt;strong&gt;GIS&lt;/strong&gt; ecosystem (pandas, shapely, matplotlib, etc.), swmmio allows modelers to automate routine tasks—like validating input data, comparing scenarios, or generating complex figures—and fosters &lt;strong&gt;reproducible&lt;/strong&gt; workflows for stormwater modeling.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2. Key Capabilities&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Reading and Parsing SWMM Models&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Swmmio loads &lt;code inline=&quot;&quot;&gt;.inp&lt;/code&gt; (SWMM input) files, extracting sections (like &lt;code inline=&quot;&quot;&gt;[JUNCTIONS]&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;[CONDUITS]&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;[RAINGAGES]&lt;/code&gt;, etc.) into structured attributes and &lt;strong&gt;pandas&lt;/strong&gt; DataFrames.&lt;/li&gt;
&lt;li&gt;These DataFrames facilitate quick queries and manipulations—e.g., filtering to find all links above a certain slope or analyzing subcatchment parameters.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Writing/Modifying &lt;code inline=&quot;&quot;&gt;.inp&lt;/code&gt; Files&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Users can modify parameters (like node inverts, link lengths, or subcatchment infiltration values) in DataFrames, then export updated &lt;code inline=&quot;&quot;&gt;.inp&lt;/code&gt; files.&lt;/li&gt;
&lt;li&gt;This is especially helpful for batch scenario creation or script-based calibration.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Geospatial Integration&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Many SWMM networks are planned or assessed in real-world coordinate systems. Swmmio can &lt;strong&gt;read shapefiles&lt;/strong&gt; or match SWMM coordinates with GIS data.&lt;/li&gt;
&lt;li&gt;For instance, it can automatically &lt;strong&gt;clip&lt;/strong&gt; model elements to a bounding box or produce &lt;code inline=&quot;&quot;&gt;.geojson&lt;/code&gt; for mapping in web-based tools (Leaflet, Mapbox, etc.).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Visualization&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Static Maps&lt;/strong&gt;: Using Python Imaging Library (PIL) or matplotlib, swmmio can produce color-coded images of the SWMM network—showing nodes, conduits, or subcatchments.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Profile Plots&lt;/strong&gt;: Generate cross-sectional profiles for a selected path through the network, drawing manhole depths, link cross-sections (conduit vs. weir vs. pump), and optional ground or water-surface lines (HGL).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Interactive Web Maps&lt;/strong&gt;: Swmmio can embed the SWMM geometry as &lt;strong&gt;GeoJSON&lt;/strong&gt; in an HTML template for live panning and zooming, showing node and link attributes upon hover.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Result Analysis&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Because swmmio ties into pandas, it can directly read binary or text results from SWMM simulations—enabling tasks like quick post-processing of flow time series or comparing scenario outputs (peak flows, flooding volumes, etc.).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;3. Typical Workflow&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Loading a Model&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import swmmio
model = swmmio.Model(&#39;example.inp&#39;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Swmmio parses the file and creates structures like &lt;code inline=&quot;&quot;&gt;model.nodes()&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;model.links()&lt;/code&gt;, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Exploring Data&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;df_nodes = model.nodes.dataframe
df_links = model.links.dataframe
# e.g. check if any link is too small or at risk
at_risk = df_links[df_links[&#39;MaxFlow&#39;] &amp;gt; df_links[&#39;Capacity&#39;]]
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Editing&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;E.g., adjusting invert elevations in DataFrame, writing them back to &lt;code inline=&quot;&quot;&gt;.inp&lt;/code&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;df_nodes.loc[&#39;J1&#39;, &#39;InvertElev&#39;] = 15.2
model.save(&#39;updated_model.inp&#39;)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Visualization&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Generating a static plan view:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from swmmio.graphics import draw_model
draw_model(model=model, file_path=&#39;network_map.png&#39;, px_width=2048)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Creating a profile plot for a chain of conduits:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from swmmio.graphics.profile import build_profile_plot, add_hgl_plot
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
path = [(&#39;J1&#39;, &#39;J2&#39;, &#39;C1&#39;), (&#39;J2&#39;, &#39;J3&#39;, &#39;C2&#39;)]
pcfg = build_profile_plot(ax, model, path)
add_hgl_plot(ax, pcfg, depth=some_depth_series)
plt.show()
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Spatial or Web&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Convert model links to geojson and embed in a Leaflet basemap:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;geo = model.links.geojson
# ... integrate into a JavaScript map application
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Comparisons / Post-processing&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use swmmio to run multiple scenarios (impervious changes, pipe upsizing, etc.) and quickly detect changes in flow or node flooding across versions.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;4. Implementation Highlights&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DataFrame Centric&lt;/strong&gt;: swmmio heavily uses pandas for storing SWMM elements (nodes, links, subcatchments), which then can be manipulated with standard indexing, filtering, or merging operations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flexible I/O&lt;/strong&gt;: The library can parse standard SWMM input format sections, or adapt to custom or advanced modeling setups by ignoring unknown lines/sections gracefully.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Charting Tools&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;draw_model&lt;/code&gt;&lt;/strong&gt;: Renders a plan-view diagram using PIL or optionally a basemap with external shapefiles.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;build_profile_plot&lt;/code&gt;&lt;/strong&gt;: Creates side-view cross-sections.&lt;/li&gt;
&lt;li&gt;Additional annotation routines for labeling nodes, links, or water surfaces.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Integration with SWMM&lt;/strong&gt;: swmmio can complement other SWMM Python tools (e.g., PySWMM) for more advanced simulation steps or real-time control. However, it primarily focuses on &lt;strong&gt;input data&lt;/strong&gt; structure and &lt;strong&gt;result&lt;/strong&gt; extraction (not controlling a running simulation directly).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;5. Benefits&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reproducible&lt;/strong&gt;: By using Python scripts or notebooks, every step in building/editing a SWMM model or generating figures is documented and repeatable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Streamlined Data Handling&lt;/strong&gt;: DataFrame operations are more intuitive and powerful than manually parsing text lines in &lt;code inline=&quot;&quot;&gt;.inp&lt;/code&gt; files.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GIS-Ready&lt;/strong&gt;: Built-in shapefile reading/writing, bounding box clipping, and geojson support let users incorporate real-world data seamlessly—helpful for region-wide stormwater planning or data integration with third-party GIS tools.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automation&lt;/strong&gt;: Perfect for batch operations on multiple model files—like systematically adjusting design storm intensities, pipe diameters, or infiltration parameters, or generating a suite of standard plots for each scenario.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;6. Conclusion&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Swmmio&lt;/strong&gt; is a Python library that makes working with &lt;strong&gt;EPA SWMM5&lt;/strong&gt; &lt;strong&gt;faster, more transparent, and more integrated&lt;/strong&gt; with modern data analysis and GIS workflows. By offering:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Robust SWMM input parsing&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DataFrame-based manipulations&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Graphical/geomatic capabilities&lt;/strong&gt;,&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;it reduces the overhead of model housekeeping, scenario management, and map generation. This allows stormwater engineers, hydrologists, or researchers to &lt;strong&gt;focus&lt;/strong&gt; on modeling insights rather than repetitive file handling, ultimately &lt;strong&gt;accelerating&lt;/strong&gt; the development and communication of urban drainage and hydrologic analyses.&lt;br /&gt;&lt;br /&gt;=======================&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div _ngcontent-ng-c2156892898=&quot;&quot; class=&quot;markdown markdown-main-panel tutor-markdown-rendering response-optimization&quot; dir=&quot;ltr&quot; id=&quot;model-response-message-contentr_174c2528c8ee2927&quot; style=&quot;--animation-duration: 400ms; --fade-animation-function: linear; animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; color: #1b1c1d; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 16px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;p data-sourcepos=&quot;1:1-1:146&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px 0px 16px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Okay, here&#39;s a detailed summary of the &lt;code style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(233, 238, 246); border: 0px none rgb(87, 91, 95); clear: none; clip: auto; color: #575b5f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 14px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 20px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(87, 91, 95) none 0px; overlay: none; padding: 1px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;swmmio&lt;/code&gt; Python package for interacting with EPA SWMM 5, highlighting its key features and functionalities:&lt;/p&gt;&lt;p data-sourcepos=&quot;3:1-3:21&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 16px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;What is &lt;code style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(233, 238, 246); border: 0px none rgb(87, 91, 95); clear: none; clip: auto; color: #575b5f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 14px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 20px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(87, 91, 95) none 0px; overlay: none; padding: 1px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;swmmio&lt;/code&gt;?&lt;/span&gt;&lt;/p&gt;&lt;p data-sourcepos=&quot;5:1-5:533&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 16px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;code style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(233, 238, 246); border: 0px none rgb(87, 91, 95); clear: none; clip: auto; color: #575b5f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 14px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 20px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(87, 91, 95) none 0px; overlay: none; padding: 1px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;swmmio&lt;/code&gt; is a powerful Python package designed to facilitate the manipulation, analysis, and visualization of data related to the Storm Water Management Model (SWMM) version 5, a widely used hydrologic and hydraulic simulation software developed by the US Environmental Protection Agency (EPA). It essentially acts as a bridge between SWMM&#39;s data formats (input .inp and output .out files) and the rich ecosystem of Python libraries for data science, allowing users to leverage Python&#39;s capabilities for more advanced SWMM workflows.&lt;/p&gt;&lt;p data-sourcepos=&quot;7:1-7:38&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 16px 0px 8px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Core Functionalities and Features:&lt;/span&gt;&lt;/p&gt;&lt;ol data-sourcepos=&quot;9:1-46:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px 0px 0px 28px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;
&lt;li data-sourcepos=&quot;9:1-13:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;
&lt;p data-sourcepos=&quot;9:5-9:52&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px 0px 8px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Reading and Writing SWMM Input (.inp) Files:&lt;/span&gt;&lt;/p&gt;
&lt;ul data-sourcepos=&quot;11:5-13:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px 0px 0px 16px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;
&lt;li data-sourcepos=&quot;11:5-11:282&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;code style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(233, 238, 246); border: 0px none rgb(87, 91, 95); clear: none; clip: auto; color: #575b5f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 14px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 20px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(87, 91, 95) none 0px; overlay: none; padding: 1px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;swmmio&lt;/code&gt; can read SWMM .inp files, parsing their various sections (e.g., [OPTIONS], [RAINFALL], [JUNCTIONS], [OUTFALLS], [CONDUITS], etc.) into structured Python objects, typically Pandas DataFrames. This makes the data readily accessible for programmatic manipulation.&lt;/li&gt;
&lt;li data-sourcepos=&quot;12:5-13:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Conversely, it allows users to create or modify SWMM input files by working with these Python objects and then writing them back to a valid .inp file format.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;14:1-18:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;
&lt;p data-sourcepos=&quot;14:5-14:57&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px 0px 8px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Accessing and Analyzing SWMM Output (.out) Files:&lt;/span&gt;&lt;/p&gt;
&lt;ul data-sourcepos=&quot;16:5-18:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px 0px 0px 16px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;
&lt;li data-sourcepos=&quot;16:5-16:234&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;code style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(233, 238, 246); border: 0px none rgb(87, 91, 95); clear: none; clip: auto; color: #575b5f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 14px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 20px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(87, 91, 95) none 0px; overlay: none; padding: 1px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;swmmio&lt;/code&gt; can efficiently parse the binary .out files generated by SWMM simulations. It extracts time series data for various model elements (nodes, links) and parameters (e.g., flow, depth, velocity, pollutant concentrations).&lt;/li&gt;
&lt;li data-sourcepos=&quot;17:5-18:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;The output data is also organized into Pandas DataFrames, facilitating statistical analysis, time series processing, and integration with other Python libraries.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;19:1-24:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;
&lt;p data-sourcepos=&quot;19:5-19:42&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px 0px 8px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Model Management and Manipulation:&lt;/span&gt;&lt;/p&gt;
&lt;ul data-sourcepos=&quot;21:5-24:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px 0px 0px 16px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;
&lt;li data-sourcepos=&quot;21:5-21:181&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Model Object:&lt;/span&gt;  &lt;code style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(233, 238, 246); border: 0px none rgb(87, 91, 95); clear: none; clip: auto; color: #575b5f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 14px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 20px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(87, 91, 95) none 0px; overlay: none; padding: 1px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;swmmio&lt;/code&gt; represents an entire SWMM model as a Python object. This object provides a convenient way to access and interact with all the model&#39;s components.&lt;/li&gt;
&lt;li data-sourcepos=&quot;22:5-22:295&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;DataFrames:&lt;/span&gt;  Each section of the .inp file (e.g., [JUNCTIONS], [CONDUITS]) and the output results are represented as Pandas DataFrames within the model object. This structure allows for easy data selection, filtering, modification, and analysis using standard DataFrame operations.&lt;/li&gt;
&lt;li data-sourcepos=&quot;23:5-24:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Adding/Removing Elements:&lt;/span&gt; You can programmatically add, remove, or modify model elements like junctions, conduits, subcatchments, etc., using methods provided by the &lt;code style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(233, 238, 246); border: 0px none rgb(87, 91, 95); clear: none; clip: auto; color: #575b5f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 14px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 20px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(87, 91, 95) none 0px; overlay: none; padding: 1px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;swmmio&lt;/code&gt; model object.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;25:1-30:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;
&lt;p data-sourcepos=&quot;25:5-25:27&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px 0px 8px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Data Visualization:&lt;/span&gt;&lt;/p&gt;
&lt;ul data-sourcepos=&quot;27:5-30:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px 0px 0px 16px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;
&lt;li data-sourcepos=&quot;27:5-27:244&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;code style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(233, 238, 246); border: 0px none rgb(87, 91, 95); clear: none; clip: auto; color: #575b5f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 14px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 20px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(87, 91, 95) none 0px; overlay: none; padding: 1px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;swmmio&lt;/code&gt; itself does not contain extensive built-in visualization capabilities. However, because it leverages Pandas DataFrames, it integrates seamlessly with popular Python plotting libraries like &lt;code style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(233, 238, 246); border: 0px none rgb(87, 91, 95); clear: none; clip: auto; color: #575b5f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 14px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 20px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(87, 91, 95) none 0px; overlay: none; padding: 1px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;matplotlib&lt;/code&gt;, &lt;code style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(233, 238, 246); border: 0px none rgb(87, 91, 95); clear: none; clip: auto; color: #575b5f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 14px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 20px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(87, 91, 95) none 0px; overlay: none; padding: 1px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;seaborn&lt;/code&gt;, and &lt;code style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(233, 238, 246); border: 0px none rgb(87, 91, 95); clear: none; clip: auto; color: #575b5f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 14px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 20px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(87, 91, 95) none 0px; overlay: none; padding: 1px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;plotly&lt;/code&gt;.&lt;/li&gt;
&lt;li data-sourcepos=&quot;28:5-28:156&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Users can easily generate plots of time series data, spatial distributions of results, or other visualizations to gain insights into model behavior.&lt;/li&gt;
&lt;li data-sourcepos=&quot;29:5-30:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;It provides basic drawing capabilities to create simple schematic diagrams of the SWMM network using matplotlib.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;31:1-36:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;
&lt;p data-sourcepos=&quot;31:5-31:37&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px 0px 8px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Reporting and Analysis Tools:&lt;/span&gt;&lt;/p&gt;
&lt;ul data-sourcepos=&quot;33:5-36:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px 0px 0px 16px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;
&lt;li data-sourcepos=&quot;33:5-33:108&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;code style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(233, 238, 246); border: 0px none rgb(87, 91, 95); clear: none; clip: auto; color: #575b5f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 14px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 20px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(87, 91, 95) none 0px; overlay: none; padding: 1px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;swmmio&lt;/code&gt; offers functions to generate summary reports and perform basic analyses on SWMM model data.&lt;/li&gt;
&lt;li data-sourcepos=&quot;34:5-34:129&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;It can compute model performance metrics, calculate mass balances, and produce tables summarizing key simulation results.&lt;/li&gt;
&lt;li data-sourcepos=&quot;35:5-36:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Provides a &lt;code style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(233, 238, 246); border: 0px none rgb(87, 91, 95); clear: none; clip: auto; color: #575b5f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 14px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 20px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(87, 91, 95) none 0px; overlay: none; padding: 1px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;dataframe_from_rpt&lt;/code&gt; function that can take information from the SWMM report (.rpt) file and convert that into a pandas dataframe as well.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;37:1-46:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;
&lt;p data-sourcepos=&quot;37:5-37:41&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px 0px 8px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Integration with Other Libraries:&lt;/span&gt;&lt;/p&gt;
&lt;ul data-sourcepos=&quot;39:5-46:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px 0px 0px 16px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;
&lt;li data-sourcepos=&quot;39:5-46:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;The power of &lt;code style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(233, 238, 246); border: 0px none rgb(87, 91, 95); clear: none; clip: auto; color: #575b5f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 14px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 20px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(87, 91, 95) none 0px; overlay: none; padding: 1px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;swmmio&lt;/code&gt; lies in its ability to connect SWMM with other Python tools. You can use it alongside:
&lt;ul data-sourcepos=&quot;40:9-46:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px 0px 0px 16px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;
&lt;li data-sourcepos=&quot;40:9-40:72&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px 0px 4px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;NumPy:&lt;/span&gt; For numerical computation and array manipulation.&lt;/li&gt;
&lt;li data-sourcepos=&quot;41:9-41:81&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px 0px 4px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Pandas:&lt;/span&gt; For data wrangling, analysis, and time series operations.&lt;/li&gt;
&lt;li data-sourcepos=&quot;42:9-42:88&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px 0px 4px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;SciPy:&lt;/span&gt; For scientific computing, statistical analysis, and optimization.&lt;/li&gt;
&lt;li data-sourcepos=&quot;43:9-43:124&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px 0px 4px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Scikit-learn:&lt;/span&gt; For machine learning tasks, such as calibrating model parameters or building surrogate models.&lt;/li&gt;
&lt;li data-sourcepos=&quot;44:9-44:61&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px 0px 4px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;matplotlib/seaborn/plotly:&lt;/span&gt; For visualization.&lt;/li&gt;
&lt;li data-sourcepos=&quot;45:9-46:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px 0px 4px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;GIS Libraries (geopandas, shapely):&lt;/span&gt; for advanced spatial analysis and mapping of SWMM results&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;p data-sourcepos=&quot;47:1-47:22&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 16px 0px 8px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Typical Use Cases:&lt;/span&gt;&lt;/p&gt;&lt;ul data-sourcepos=&quot;49:1-55:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px 0px 0px 16px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;
&lt;li data-sourcepos=&quot;49:1-49:215&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Automated Model Calibration:&lt;/span&gt; &lt;code style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(233, 238, 246); border: 0px none rgb(87, 91, 95); clear: none; clip: auto; color: #575b5f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 14px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 20px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(87, 91, 95) none 0px; overlay: none; padding: 1px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;swmmio&lt;/code&gt; can be used to develop scripts that automatically adjust model parameters, run simulations, compare results to observed data, and iteratively optimize model performance.&lt;/li&gt;
&lt;li data-sourcepos=&quot;50:1-50:164&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Sensitivity Analysis:&lt;/span&gt; You can use it to study how changes in model inputs or parameters affect simulation outputs, identifying the most influential factors.&lt;/li&gt;
&lt;li data-sourcepos=&quot;51:1-51:186&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Scenario Management:&lt;/span&gt; &lt;code style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(233, 238, 246); border: 0px none rgb(87, 91, 95); clear: none; clip: auto; color: #575b5f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 14px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 20px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(87, 91, 95) none 0px; overlay: none; padding: 1px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;swmmio&lt;/code&gt; helps in creating and managing multiple model scenarios (e.g., different development plans, climate change projections) and comparing their impacts.&lt;/li&gt;
&lt;li data-sourcepos=&quot;52:1-52:134&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Data-Driven Modeling:&lt;/span&gt; It facilitates the integration of observed data and statistical analysis into the SWMM modeling process.&lt;/li&gt;
&lt;li data-sourcepos=&quot;53:1-53:150&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Custom Reporting:&lt;/span&gt; You can generate customized reports and visualizations tailored to specific project needs, beyond the standard SWMM reports.&lt;/li&gt;
&lt;li data-sourcepos=&quot;54:1-55:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Web Applications:&lt;/span&gt; &lt;code style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(233, 238, 246); border: 0px none rgb(87, 91, 95); clear: none; clip: auto; color: #575b5f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 14px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 20px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(87, 91, 95) none 0px; overlay: none; padding: 1px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;swmmio&lt;/code&gt; can be integrated into web applications (using frameworks like Flask or Django) to create interactive SWMM dashboards and decision-support tools.&lt;/li&gt;
&lt;/ul&gt;&lt;p data-sourcepos=&quot;56:1-56:33&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 16px 0px 8px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Advantages of Using &lt;code style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(233, 238, 246); border: 0px none rgb(87, 91, 95); clear: none; clip: auto; color: #575b5f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 14px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 20px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(87, 91, 95) none 0px; overlay: none; padding: 1px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;swmmio&lt;/code&gt;:&lt;/span&gt;&lt;/p&gt;&lt;ul data-sourcepos=&quot;58:1-63:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px 0px 0px 16px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;
&lt;li data-sourcepos=&quot;58:1-58:129&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Enhanced Workflow Efficiency:&lt;/span&gt; Automates repetitive tasks, reducing manual effort in model setup, analysis, and reporting.&lt;/li&gt;
&lt;li data-sourcepos=&quot;59:1-59:134&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Improved Model Understanding:&lt;/span&gt; Facilitates in-depth analysis and visualization, leading to better insights into model behavior.&lt;/li&gt;
&lt;li data-sourcepos=&quot;60:1-60:150&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Increased Accuracy and Reliability:&lt;/span&gt; Enables rigorous calibration and sensitivity analysis, improving model accuracy and confidence in results.&lt;/li&gt;
&lt;li data-sourcepos=&quot;61:1-61:172&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Flexibility and Extensibility:&lt;/span&gt; Opens up SWMM to the vast capabilities of the Python data science ecosystem, allowing for customized workflows and advanced analyses.&lt;/li&gt;
&lt;li data-sourcepos=&quot;62:1-63:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Reproducibility:&lt;/span&gt;  Promotes reproducible research by providing a transparent and scriptable way to manage SWMM models and analyses.&lt;/li&gt;
&lt;/ul&gt;&lt;p data-sourcepos=&quot;64:1-64:16&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 16px 0px 8px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Limitations:&lt;/span&gt;&lt;/p&gt;&lt;ul data-sourcepos=&quot;66:1-69:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px 0px 0px 16px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;
&lt;li data-sourcepos=&quot;66:1-66:129&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Not a SWMM GUI:&lt;/span&gt; &lt;code style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(233, 238, 246); border: 0px none rgb(87, 91, 95); clear: none; clip: auto; color: #575b5f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 14px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 20px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(87, 91, 95) none 0px; overlay: none; padding: 1px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;swmmio&lt;/code&gt; is a Python library, not a graphical user interface. You&#39;ll need to write Python code to use it.&lt;/li&gt;
&lt;li data-sourcepos=&quot;67:1-67:110&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Requires Python Knowledge:&lt;/span&gt; Familiarity with Python programming and libraries like Pandas is essential.&lt;/li&gt;
&lt;li data-sourcepos=&quot;68:1-69:0&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 8px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;Does Not Run SWMM:&lt;/span&gt; It parses and handles SWMM files but does not execute the SWMM engine. You still need the SWMM executable.&lt;/li&gt;
&lt;/ul&gt;&lt;p data-sourcepos=&quot;70:1-70:18&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 16px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;span style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;In Conclusion:&lt;/span&gt;&lt;/p&gt;&lt;p data-sourcepos=&quot;72:1-72:467&quot; style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background-attachment: scroll; background-clip: border-box; background-image: none; background-origin: padding-box; background-position: 0% 0%; background-repeat: repeat; background-size: auto; border: 0px none rgb(27, 28, 29); clear: none; clip: auto; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 28px; margin: 16px 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(27, 28, 29) none 0px; overlay: none; padding: 0px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;&lt;code style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(233, 238, 246); border: 0px none rgb(87, 91, 95); clear: none; clip: auto; color: #575b5f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 14px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 20px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(87, 91, 95) none 0px; overlay: none; padding: 1px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;swmmio&lt;/code&gt; is a valuable tool for anyone working with SWMM 5 who wants to go beyond the basic functionalities of the EPA SWMM GUI. By leveraging the power of Python, it empowers users to automate workflows, perform advanced analyses, build sophisticated visualizations, and ultimately gain a deeper understanding of their stormwater systems. If you are comfortable with Python and want to enhance your SWMM modeling capabilities, &lt;code style=&quot;animation: 0s ease 0s 1 normal none running none; appearance: none; background: none 0% 0% / auto repeat scroll padding-box border-box rgb(233, 238, 246); border: 0px none rgb(87, 91, 95); clear: none; clip: auto; color: #575b5f; columns: auto; contain: none; container: none; content: normal; cursor: auto; cx: 0px; cy: 0px; d: none; direction: ltr; display: inline; fill: rgb(0, 0, 0); filter: none; flex: 0 1 auto; float: none; font-family: &amp;quot;Google Sans Mono&amp;quot;, monospace; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-size-adjust: none; font-size: 14px; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-emoji: normal; font-variant-numeric: normal; font-variant-position: normal; font-variation-settings: normal; gap: normal; hyphens: manual; inset: auto; isolation: auto; line-height: 20px; margin: 0px; marker: none; mask: none; offset: normal; opacity: 1; order: 0; outline: rgb(87, 91, 95) none 0px; overlay: none; padding: 1px 6px; page: auto; perspective: none; position: static; quotes: auto; r: 0px; resize: none; rotate: none; rx: auto; ry: auto; scale: none; speak: normal; stroke: none; transform: none; transition: all; translate: none; visibility: visible; x: 0px; y: 0px; zoom: 1;&quot;&gt;swmmio&lt;/code&gt; is definitely worth exploring.&lt;/p&gt;&lt;/div&gt;</description><link>http://www.swmmfive.com/2024/12/swmmio-in-general.html</link><author>noreply@blogger.com (Robert Dickinson )</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-335789943869477383.post-5709706951762144923</guid><pubDate>Mon, 30 Dec 2024 22:11:00 +0000</pubDate><atom:updated>2024-12-30T17:11:34.569-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SWMMIO profiler.py Summary</category><title>SWMMIO profiler.py Summary</title><description>&lt;p&gt;Below is an &lt;strong&gt;extended summary&lt;/strong&gt; of the code that describes how it &lt;strong&gt;constructs a SWMM model profile plot&lt;/strong&gt; in Python, focusing on &lt;strong&gt;node/link geometry&lt;/strong&gt;, &lt;strong&gt;profile configuration&lt;/strong&gt;, and &lt;strong&gt;plot labeling&lt;/strong&gt;:&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;This code supplies a set of &lt;strong&gt;matplotlib&lt;/strong&gt;-based utilities for generating a &lt;strong&gt;profile plot&lt;/strong&gt; (a side-view cut) of a SWMM model network, including &lt;strong&gt;nodes (manholes)&lt;/strong&gt;, &lt;strong&gt;links (conduits, weirs, orifices, pumps, outlets)&lt;/strong&gt;, &lt;strong&gt;ground elevation&lt;/strong&gt;, and an optional &lt;strong&gt;hydraulic grade line (HGL)&lt;/strong&gt;. The profile is built from a path (a sequential chain of upstream-to-downstream elements) and rendered onto a given matplotlib axis (&lt;code inline=&quot;&quot;&gt;ax&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Core functionalities&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Profile Building&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;build_profile_plot(ax, model, path_selection)&lt;/code&gt;&lt;/strong&gt; – the central function that orchestrates retrieving geometry from a SWMM model, placing each node/link at the correct horizontal position, and returning a config dictionary (&lt;code inline=&quot;&quot;&gt;profile_config&lt;/code&gt;) for subsequent use.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Node &amp;amp; Link Drawing&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;_add_node_plot(...)&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;_add_link_plot(...)&lt;/code&gt;&lt;/strong&gt; – low-level routines to plot rectangles/trapezoids for manholes or link cross-sections (differentiating between conduits, weirs, orifices, pumps, etc.).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ground Line &amp;amp; HGL&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;_add_ground_plot(...)&lt;/code&gt;&lt;/strong&gt; – draws the ground-level profile (brown dashed line) across the entire path.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;add_hgl_plot(...)&lt;/code&gt;&lt;/strong&gt; – overlays a line that represents the computed or observed water surface elevation at each node (or between nodes).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Labeling&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;add_node_labels_plot(...)&lt;/code&gt;&lt;/strong&gt; – attaches text labels/arrows for each node in the profile.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;add_link_labels_plot(...)&lt;/code&gt;&lt;/strong&gt; – attaches text labels/arrows for each link in the profile.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The net result is a layered side-view diagram of how nodes, links, ground line, and HGL align along a chosen path in a SWMM model.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Key Components&lt;/h2&gt;
&lt;h3&gt;1. &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;build_profile_plot(ax, model, path_selection)&lt;/code&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Purpose&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Assembles the entire profile by iterating over a list of &lt;code inline=&quot;&quot;&gt;(us_node, ds_node, link_name)&lt;/code&gt; tuples, effectively describing a chain from upstream to downstream.&lt;/li&gt;
&lt;li&gt;Produces a dictionary with details on each node/link’s placement, enabling further annotation or plotting.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Process&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Initialization&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Retrieves &lt;code inline=&quot;&quot;&gt;nodes = model.nodes.dataframe&lt;/code&gt; and &lt;code inline=&quot;&quot;&gt;links = model.links.dataframe&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Declares &lt;code inline=&quot;&quot;&gt;profile_config&lt;/code&gt; with empty lists for “nodes” and “links,” plus “path_selection.”&lt;/li&gt;
&lt;li&gt;Sets up arrays for &lt;code inline=&quot;&quot;&gt;ground_levels[&#39;x&#39;]&lt;/code&gt; &amp;amp; &lt;code inline=&quot;&quot;&gt;ground_levels[&#39;level&#39;]&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Iterating over Path&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For each tuple &lt;code inline=&quot;&quot;&gt;(us_node, ds_node, link_id)&lt;/code&gt; in &lt;code inline=&quot;&quot;&gt;path_selection&lt;/code&gt;:
&lt;ul&gt;
&lt;li&gt;Plots the &lt;strong&gt;first node&lt;/strong&gt; if &lt;code inline=&quot;&quot;&gt;ind == 0&lt;/code&gt;, calling &lt;code inline=&quot;&quot;&gt;_add_node_plot(...)&lt;/code&gt; and storing the node geometry in &lt;code inline=&quot;&quot;&gt;profile_config[&quot;nodes&quot;]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Accumulates a “rolling x-position” (&lt;code inline=&quot;&quot;&gt;rolling_x_pos&lt;/code&gt;) that simulates the horizontal distance for each link, dependent on link length or a default link length (if it’s a weir, orifice, pump, outlet).&lt;/li&gt;
&lt;li&gt;Calls &lt;code inline=&quot;&quot;&gt;_add_node_plot(...)&lt;/code&gt; again for the downstream node and &lt;code inline=&quot;&quot;&gt;_add_link_plot(...)&lt;/code&gt; for the link geometry between them.
&lt;ul&gt;
&lt;li&gt;Each node gets appended to &lt;code inline=&quot;&quot;&gt;profile_config[&#39;nodes&#39;]&lt;/code&gt;, each link to &lt;code inline=&quot;&quot;&gt;profile_config[&#39;links&#39;]&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;After finishing the loop, &lt;code inline=&quot;&quot;&gt;_add_ground_plot(...)&lt;/code&gt; is used to draw a dashed line indicating ground elevation.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Return&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;code inline=&quot;&quot;&gt;profile_config&lt;/code&gt; dictionary with:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;nodes&lt;/code&gt;&lt;/strong&gt;: A list of dicts containing node IDs, rolling x-positions, invert elevations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;links&lt;/code&gt;&lt;/strong&gt;: A list of dicts with link IDs, midpoints, link type.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;path_selection&lt;/code&gt;&lt;/strong&gt;: Echo of the input path for reference.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;2. &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;_add_node_plot(ax, x, model, node_name, link_set, ... )&lt;/code&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Purpose&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Draws a rectangular manhole (or node structure) at position &lt;code inline=&quot;&quot;&gt;x&lt;/code&gt; on the x-axis, with the correct invert elevation and max depth.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Details&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Extracts &lt;code inline=&quot;&quot;&gt;invert_el&lt;/code&gt; from &lt;code inline=&quot;&quot;&gt;nodes.loc[node_name]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Determines the node’s depth from model’s input data (&lt;code inline=&quot;&quot;&gt;model.inp.junctions&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;model.inp.outfalls&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;model.inp.storage&lt;/code&gt;), defaulting to &lt;code inline=&quot;&quot;&gt;MaxDepth&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Plots a rectangle with corners &lt;code inline=&quot;&quot;&gt;[(x−width, invert_el), (x+width, invert_el+depth), ...]&lt;/code&gt; in black lines.&lt;/li&gt;
&lt;li&gt;Optionally draws a &lt;strong&gt;gradient fill&lt;/strong&gt; on the sides for a 3D effect.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Returns&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A dictionary of &lt;code inline=&quot;&quot;&gt;{&#39;x&#39;: [ul_x, ur_x], &#39;level&#39;: [ul_y, ur_y]}&lt;/code&gt;, used by &lt;code inline=&quot;&quot;&gt;_add_ground_plot&lt;/code&gt; to incorporate node’s top edge as part of ground level, if needed.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;3. &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;_add_link_plot(ax, us_x_position, ds_x_position, model, link_set, ...)&lt;/code&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Purpose&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Draws a link cross-section between the upstream node at &lt;code inline=&quot;&quot;&gt;us_x_position&lt;/code&gt; and downstream node at &lt;code inline=&quot;&quot;&gt;ds_x_position&lt;/code&gt;, considering the link type (conduit, weir, orifice, pump, outlet).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Process&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Determine link type from &lt;code inline=&quot;&quot;&gt;links.loc[link_id].Type&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;For &lt;strong&gt;CONDUIT&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Use &lt;code inline=&quot;&quot;&gt;links.loc[link_id].Length&lt;/code&gt; (already accounted for in the x offset) plus geometry fields like &lt;code inline=&quot;&quot;&gt;Geom1&lt;/code&gt; for diameter/height, &lt;code inline=&quot;&quot;&gt;InOffset&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;OutOffset&lt;/code&gt; for vertical offsets.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;For &lt;strong&gt;ORIFICE&lt;/strong&gt;, &lt;strong&gt;WEIR&lt;/strong&gt;, &lt;strong&gt;PUMP&lt;/strong&gt;, &lt;strong&gt;OUTLET&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Uses specialized default lengths (like &lt;code inline=&quot;&quot;&gt;DEFAULT_WEIR_LENGTH&lt;/code&gt;) or a single crest height for orifices/weirs.&lt;/li&gt;
&lt;li&gt;Draw polygons or lines to represent the side profile.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Returns a dict with &lt;code inline=&quot;&quot;&gt;{&#39;x&#39;: [...], &#39;bottom&#39;: [...], &#39;link_type&#39;: link_type, &#39;mid_x&#39;: [...], &#39;mid_y&#39;: [...]}&lt;/code&gt;, enabling the main function or labeling routines to know how to position text or the HGL line.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;4. &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;_add_ground_plot(ax, ground_levels)&lt;/code&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Purpose&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Joins the ground-level points computed from each node or link in a dashed brown line (&lt;code inline=&quot;&quot;&gt;&#39;--&#39;&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;&#39;brown&#39;&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;The &lt;code inline=&quot;&quot;&gt;ground_levels[&#39;x&#39;]&lt;/code&gt; and &lt;code inline=&quot;&quot;&gt;ground_levels[&#39;level&#39;]&lt;/code&gt; data are accumulated during node draws in &lt;code inline=&quot;&quot;&gt;build_profile_plot&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;5. &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;add_hgl_plot(ax, profile_config, hgl=None, depth=None, color=&#39;b&#39;, label=&quot;HGL&quot;)&lt;/code&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Purpose&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Overlays a line representing the &lt;strong&gt;hydraulic grade line&lt;/strong&gt; (HGL) or water surface.&lt;/li&gt;
&lt;li&gt;Two usage patterns:
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;hgl&lt;/code&gt;&lt;/strong&gt; – a dictionary/Series mapping node IDs to HGL elevations, or&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;depth&lt;/code&gt;&lt;/strong&gt; – a dictionary/Series mapping node IDs to water depth, which is then added to the node invert.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;The function loops through each node in &lt;code inline=&quot;&quot;&gt;profile_config[&#39;nodes&#39;]&lt;/code&gt;, builds an array of HGL values, and does a single &lt;code inline=&quot;&quot;&gt;ax.plot(...)&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Weir Link Special Handling&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If a link is type “WEIR,” it tries to insert a midpoint to reflect any possible “step” between upstream and downstream side. This ensures the HGL transitions properly if weirs create abrupt changes.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;6. &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;add_node_labels_plot(ax, model, profile_config, ...)&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;add_link_labels_plot(ax, model, profile_config, ...)&lt;/code&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Purpose&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Adds textual labels for each node or link above/below the structure.&lt;/li&gt;
&lt;li&gt;Each label is anchored with an arrow (&lt;code inline=&quot;&quot;&gt;arrowprops=dict(...)&lt;/code&gt;) from the label text down to the structure.&lt;/li&gt;
&lt;li&gt;Offers optional &lt;strong&gt;stagger&lt;/strong&gt; so that labels alternate to avoid collisions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Implementation&lt;/strong&gt; details:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For nodes:
&lt;ul&gt;
&lt;li&gt;Extract invert + depth = top of node.&lt;/li&gt;
&lt;li&gt;Place an annotation arrow from the node top to a label above the highest node in the plot.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;For links:
&lt;ul&gt;
&lt;li&gt;Use the link’s midpoint or bottom to place the arrow.&lt;/li&gt;
&lt;li&gt;Place the text below the entire group if needed (to avoid crowding).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Typical Usage Flow&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Call&lt;/strong&gt; &lt;code inline=&quot;&quot;&gt;build_profile_plot(ax, model, path_selection)&lt;/code&gt;.
&lt;ul&gt;
&lt;li&gt;Returns &lt;code inline=&quot;&quot;&gt;profile_config&lt;/code&gt; with node/link geometry.&lt;/li&gt;
&lt;li&gt;Draws the profile lines for manholes, conduits, ground, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Optionally &lt;strong&gt;overlay&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;add_hgl_plot&lt;/code&gt;&lt;/strong&gt; to show the water surface profile.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;add_node_labels_plot&lt;/code&gt;&lt;/strong&gt; or &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;add_link_labels_plot&lt;/code&gt;&lt;/strong&gt; to label items.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Render&lt;/strong&gt; or &lt;strong&gt;save&lt;/strong&gt; the figure:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import matplotlib.pyplot as plt

fig, ax = plt.subplots()
pcfg = build_profile_plot(ax, my_model, my_path)
add_hgl_plot(ax, pcfg, hgl=node_water_surface_dict)
add_node_labels_plot(ax, my_model, pcfg)
add_link_labels_plot(ax, my_model, pcfg)
plt.show()
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;Constants and Defaults&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;MH_WIDTH&lt;/code&gt; = 10&lt;/strong&gt;: Horizontal half-width for manholes when drawing a node profile.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;DEFAULT_ORIFICE_LENGTH&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;DEFAULT_PUMP_LENGTH&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;DEFAULT_WEIR_LENGTH&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;DEFAULT_OUTLET_LENGTH&lt;/code&gt;&lt;/strong&gt;: The “visual” length used for these special link types if the model doesn’t have a length (or if a simplified approach is desired).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Error Handling&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;error.InvalidDataTypes&lt;/code&gt;&lt;/strong&gt; – raised if &lt;code inline=&quot;&quot;&gt;add_hgl_plot(...)&lt;/code&gt; sees neither &lt;code inline=&quot;&quot;&gt;hgl&lt;/code&gt; nor &lt;code inline=&quot;&quot;&gt;depth&lt;/code&gt; in the correct form.&lt;/li&gt;
&lt;li&gt;The code also uses &lt;code inline=&quot;&quot;&gt;model.inp&lt;/code&gt; references (like &lt;code inline=&quot;&quot;&gt;model.inp.junctions&lt;/code&gt;) to check how to interpret node depth or offset. If data is missing, it might cause an exception or result in an incomplete profile.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;This code forms a &lt;strong&gt;profile-plot toolkit&lt;/strong&gt; for SWMM or SWMM-like hydraulic models:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;build_profile_plot&lt;/code&gt;&lt;/strong&gt; systematically places nodes and links horizontally, respecting lengths and offsets.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Node/Link subroutines&lt;/strong&gt; handle the geometry difference among &lt;strong&gt;CONDUIT, WEIR, ORIFICE, PUMP, OUTLET&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ground line&lt;/strong&gt; and &lt;strong&gt;HGL&lt;/strong&gt; lines add topographical and hydraulic context.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Labeling&lt;/strong&gt; routines annotate each node/link, making the final plot self-explanatory.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Together, these help engineers or researchers &lt;strong&gt;visualize how water flows&lt;/strong&gt; and see the &lt;strong&gt;relative elevations&lt;/strong&gt; of nodes, the shape/length of links, and changes in water surface (HGL) across a chosen path in the SWMM network.&lt;/p&gt;</description><link>http://www.swmmfive.com/2024/12/swmmio-profilerpy-summary.html</link><author>noreply@blogger.com (Robert Dickinson )</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-335789943869477383.post-5632878673075732487</guid><pubDate>Mon, 30 Dec 2024 21:37:00 +0000</pubDate><atom:updated>2024-12-30T16:37:56.497-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SWMMIO swmm_graphics.py Summary</category><title>SWMMIO swmm_graphics.py Summary</title><description>&lt;p&gt;&amp;nbsp;Below is an &lt;strong&gt;extended summary&lt;/strong&gt; of this code, detailing &lt;strong&gt;how it generates both static images and interactive web maps&lt;/strong&gt; for SWMM model elements (nodes, conduits, parcels) and what each function contributes to that workflow.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;This code comprises two primary functionalities:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;draw_model&lt;/code&gt;&lt;/strong&gt; – Generates a &lt;strong&gt;static image&lt;/strong&gt; (PNG) of a SWMM model’s geometry (nodes, links, optional parcels) with optional basemap integration.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;create_map&lt;/code&gt;&lt;/strong&gt; – Produces an &lt;strong&gt;interactive web map&lt;/strong&gt; (HTML/GeoJSON) reflecting the model’s network, centering on the model’s bounding box or centroid.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;By combining methods for coordinate transformation, PIL-based drawing, and HTML/JavaScript templating, the module allows users to &lt;strong&gt;visualize&lt;/strong&gt; SWMM models in a flexible way—either as a static, annotated image or an interactive map in a browser.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1. &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;draw_model&lt;/code&gt; Function&lt;/strong&gt;&lt;/h2&gt;
&lt;h3&gt;Purpose&lt;/h3&gt;
&lt;p&gt;&lt;code inline=&quot;&quot;&gt;draw_model&lt;/code&gt; orchestrates the creation of a &lt;strong&gt;PNG image&lt;/strong&gt; representing SWMM model data, optionally including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Nodes&lt;/strong&gt;: Drawn as circles using a separate &lt;code inline=&quot;&quot;&gt;draw_node&lt;/code&gt; utility.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Conduits (Links)&lt;/strong&gt;: Drawn as lines with &lt;code inline=&quot;&quot;&gt;draw_conduit&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Parcels&lt;/strong&gt;: (Optional) drawn as polygons (e.g., for flood-risk areas).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Basemap&lt;/strong&gt; layers: If configured, it calls &lt;code inline=&quot;&quot;&gt;_draw_basemap&lt;/code&gt; to overlay additional shapefile-based features (streets, polygons).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Key Arguments&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;model&lt;/code&gt;&lt;/strong&gt;: A &lt;code inline=&quot;&quot;&gt;swmmio.Model&lt;/code&gt; object (optional). If provided, the code automatically retrieves &lt;code inline=&quot;&quot;&gt;model.nodes()&lt;/code&gt; and &lt;code inline=&quot;&quot;&gt;model.links()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;nodes&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;conduits&lt;/code&gt;&lt;/strong&gt;: Pandas DataFrames containing geometry columns (e.g., &lt;code inline=&quot;&quot;&gt;coords&lt;/code&gt;). These can be passed directly if a &lt;code inline=&quot;&quot;&gt;model&lt;/code&gt; object is not used.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;parcels&lt;/code&gt;&lt;/strong&gt;: An optional DataFrame for polygon data. Each row needs a &lt;code inline=&quot;&quot;&gt;draw_coords&lt;/code&gt; or coordinate info.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;title&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;annotation&lt;/code&gt;&lt;/strong&gt;: Strings to annotate the final image with a title (top-left) and extra details (bottom-left).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;file_path&lt;/code&gt;&lt;/strong&gt;: If provided, the final PNG is saved to disk; if omitted, the PIL &lt;code inline=&quot;&quot;&gt;Image&lt;/code&gt; object is returned.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;bbox&lt;/code&gt;&lt;/strong&gt;: Custom bounding box for clipping. If omitted, the bounding box is derived from the data extents.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;px_width&lt;/code&gt;&lt;/strong&gt;: Desired output image width in pixels (default 2048). Internally, the function doubles this for anti-aliasing.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Workflow&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Data Gathering&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If &lt;code inline=&quot;&quot;&gt;model&lt;/code&gt; is provided, calls &lt;code inline=&quot;&quot;&gt;model.nodes()&lt;/code&gt; and &lt;code inline=&quot;&quot;&gt;model.links()&lt;/code&gt; for geometry.&lt;/li&gt;
&lt;li&gt;Otherwise, uses the &lt;code inline=&quot;&quot;&gt;nodes&lt;/code&gt; and &lt;code inline=&quot;&quot;&gt;conduits&lt;/code&gt; DataFrames directly.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Coordinate Transform&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Calls &lt;code inline=&quot;&quot;&gt;px_to_irl_coords&lt;/code&gt; to convert real-world or model coordinates into pixel coordinates.&lt;/li&gt;
&lt;li&gt;Yields a bounding box and scale ratio for consistent rendering.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Creating the Image&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Makes a PIL &lt;code inline=&quot;&quot;&gt;Image&lt;/code&gt; of the appropriate dimension and background color (white).&lt;/li&gt;
&lt;li&gt;Obtains a &lt;code inline=&quot;&quot;&gt;Draw&lt;/code&gt; handle (&lt;code inline=&quot;&quot;&gt;draw = ImageDraw.Draw(img)&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Basemap Layers&lt;/strong&gt; (optional):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If &lt;code inline=&quot;&quot;&gt;config.include_basemap&lt;/code&gt; is &lt;code inline=&quot;&quot;&gt;True&lt;/code&gt;, calls &lt;code inline=&quot;&quot;&gt;_draw_basemap&lt;/code&gt; to load shapefiles from &lt;code inline=&quot;&quot;&gt;config.basemap_options&lt;/code&gt; and draw them in the background (e.g., roads, property boundaries).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Drawing&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Parcels&lt;/strong&gt;: If provided, draws each polygon using the &lt;code inline=&quot;&quot;&gt;draw_coords&lt;/code&gt; plus a &lt;code inline=&quot;&quot;&gt;fill&lt;/code&gt; color from &lt;code inline=&quot;&quot;&gt;r.draw_color&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Conduits&lt;/strong&gt;: Each row is passed to &lt;code inline=&quot;&quot;&gt;draw_conduit(row, draw)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nodes&lt;/strong&gt;: Each row is passed to &lt;code inline=&quot;&quot;&gt;draw_node(row, draw)&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Annotation&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If &lt;code inline=&quot;&quot;&gt;title&lt;/code&gt; is given, calls &lt;code inline=&quot;&quot;&gt;annotate_title&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If &lt;code inline=&quot;&quot;&gt;annotation&lt;/code&gt; is given, calls &lt;code inline=&quot;&quot;&gt;annotate_details&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Always calls &lt;code inline=&quot;&quot;&gt;annotate_timestamp&lt;/code&gt; to add a timestamp in the top-right corner.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Saving or Returning&lt;/strong&gt; the Image:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If &lt;code inline=&quot;&quot;&gt;file_path&lt;/code&gt; is specified, calls &lt;code inline=&quot;&quot;&gt;save_image(img, file_path)&lt;/code&gt; (which can do an antialias thumbnail and optionally open the file).&lt;/li&gt;
&lt;li&gt;Otherwise, returns the &lt;code inline=&quot;&quot;&gt;img&lt;/code&gt; object directly—useful in Jupyter notebooks or for further processing in memory.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Typical Use&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;my_image = draw_model(
    model=my_swmm_model,
    title=&quot;Example Model&quot;,
    annotation=&quot;Beta version&quot;,
    file_path=&quot;example_model.png&quot;,
    bbox=((2691647, 221073), (2702592, 227171)),
    px_width=2048
)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;2. &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;create_map&lt;/code&gt; Function&lt;/strong&gt;&lt;/h2&gt;
&lt;h3&gt;Purpose&lt;/h3&gt;
&lt;p&gt;Creates an &lt;strong&gt;interactive web-based map&lt;/strong&gt; (HTML + GeoJSON) displaying the SWMM model’s geometry. This approach uses a &lt;strong&gt;map template&lt;/strong&gt; (e.g., from &lt;code inline=&quot;&quot;&gt;BETTER_BASEMAP_PATH&lt;/code&gt;) where placeholders are replaced with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The model’s &lt;strong&gt;centroid&lt;/strong&gt; and &lt;strong&gt;bounding box&lt;/strong&gt;, to position and bound the map.&lt;/li&gt;
&lt;li&gt;The model’s &lt;strong&gt;links.geojson&lt;/strong&gt; and &lt;strong&gt;nodes.geojson&lt;/strong&gt; data (assuming &lt;code inline=&quot;&quot;&gt;model&lt;/code&gt; has &lt;code inline=&quot;&quot;&gt;.geojson&lt;/code&gt; properties).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Arguments&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;model&lt;/code&gt;&lt;/strong&gt;: A &lt;code inline=&quot;&quot;&gt;swmmio.Model&lt;/code&gt; object that presumably includes &lt;code inline=&quot;&quot;&gt;.nodes.geojson&lt;/code&gt; and &lt;code inline=&quot;&quot;&gt;.links.geojson&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;filename&lt;/code&gt;&lt;/strong&gt;: Destination HTML file path. If not provided, the function returns the generated HTML as a string.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;basemap&lt;/code&gt;&lt;/strong&gt;: A path to an HTML template with placeholders.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Workflow&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;CRS Check&lt;/strong&gt;: If &lt;code inline=&quot;&quot;&gt;model.crs&lt;/code&gt; is known, tries to transform the model coordinates to &lt;code inline=&quot;&quot;&gt;EPSG:4326&lt;/code&gt; for web mapping.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compute&lt;/strong&gt; centroid and bounding box from the model’s &lt;code inline=&quot;&quot;&gt;inp.coordinates&lt;/code&gt; (via &lt;code inline=&quot;&quot;&gt;centroid_and_bbox_from_coords&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Read&lt;/strong&gt; the basemap template file line by line.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Insert&lt;/strong&gt; relevant data:
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;conduits = &amp;lt;geojson dumps of model.links.geojson&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;nodes = &amp;lt;geojson dumps of model.nodes.geojson&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;map center&lt;/code&gt; from the centroid &lt;code inline=&quot;&quot;&gt;[lng, lat]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;fitBounds&lt;/code&gt; calls from the bounding box.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Write&lt;/strong&gt; the final HTML to the &lt;code inline=&quot;&quot;&gt;filename&lt;/code&gt;.
&lt;ul&gt;
&lt;li&gt;If &lt;code inline=&quot;&quot;&gt;filename&lt;/code&gt; is &lt;code inline=&quot;&quot;&gt;None&lt;/code&gt;, the result is returned as a string.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Typical Use&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;html_content = create_map(model=my_swmm_model, filename=None)

# This returns the HTML as a string, which can be displayed in a Jupyter notebook via IFrame or written to file manually
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;Supporting Elements&lt;/h2&gt;
&lt;h3&gt;&lt;code inline=&quot;&quot;&gt;_draw_basemap(draw, img, bbox, px_width, shift_ratio)&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Called internally by &lt;code inline=&quot;&quot;&gt;draw_model&lt;/code&gt; if &lt;code inline=&quot;&quot;&gt;config.include_basemap&lt;/code&gt; is &lt;code inline=&quot;&quot;&gt;True&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Iterates over features in &lt;code inline=&quot;&quot;&gt;config.basemap_options[&#39;features&#39;]&lt;/code&gt;, reads shapefiles, transforms them to pixel coords, and draws lines or polygons.&lt;/li&gt;
&lt;li&gt;If columns like &lt;code inline=&quot;&quot;&gt;ST_NAME&lt;/code&gt; exist, it calls &lt;code inline=&quot;&quot;&gt;annotate_streets&lt;/code&gt; to place text.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;code inline=&quot;&quot;&gt;import&lt;/code&gt; statements&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PIL&lt;/strong&gt; (&lt;code inline=&quot;&quot;&gt;Image, ImageDraw&lt;/code&gt;) for static image creation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;swmmio.graphics.config&lt;/strong&gt; and &lt;strong&gt;swmmio.defs.constants&lt;/strong&gt; for color definitions and user preferences (like &lt;code inline=&quot;&quot;&gt;white&lt;/code&gt; background).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;px_to_irl_coords&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;save_image&lt;/code&gt;&lt;/strong&gt; from &lt;code inline=&quot;&quot;&gt;swmmio.graphics.utils&lt;/code&gt;: handle geometry transformations and final image saving.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;draw_node&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;draw_conduit&lt;/code&gt;&lt;/strong&gt; from &lt;code inline=&quot;&quot;&gt;swmmio.graphics.drawing&lt;/code&gt;: actual shape-drawing functions for SWMM nodes/links.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;spatial&lt;/code&gt;&lt;/strong&gt; modules for shapefile reading (&lt;code inline=&quot;&quot;&gt;spatial.read_shapefile&lt;/code&gt;) and coordinate conversions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;centroid_and_bbox_from_coords&lt;/code&gt;&lt;/strong&gt; for bounding box logic.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Why These Functions Are Useful&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Versatile Visualization&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;draw_model&lt;/code&gt; suits quick static diagrams for reports, screenshots, or docs.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;create_map&lt;/code&gt; suits interactive exploration—useful for large networks or checking node/link attributes in detail.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Easy Integration&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Because the code references typical SWMM data structures (from &lt;code inline=&quot;&quot;&gt;model.nodes()&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;model.links()&lt;/code&gt;), it plugs directly into swmmio’s data pipeline.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Customizable&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;By adjusting parameters like &lt;code inline=&quot;&quot;&gt;px_width&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;bbox&lt;/code&gt;, or passing in your own DataFrames, you can refine your map’s resolution and coverage.&lt;/li&gt;
&lt;li&gt;The code can also incorporate external shapefiles for background context (streets, administrative boundaries) via &lt;code inline=&quot;&quot;&gt;_draw_basemap&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;Example End-to-End Usage&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Create/Load a SWMM Model&lt;/strong&gt;:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from swmmio import Model
my_model = Model(&quot;example_model.inp&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generate a Static PNG&lt;/strong&gt;:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;draw_model(
    model=my_model,
    title=&quot;My SWMM Model Visualization&quot;,
    annotation=&quot;Preliminary results&quot;,
    file_path=&quot;my_model_viz.png&quot;,
    px_width=2048
)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generate an Interactive Map&lt;/strong&gt;:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;map_html = create_map(my_model, filename=&quot;my_model_map.html&quot;, auto_open=True)
# This writes an HTML file that references the model&#39;s geojson data.
# If auto_open=True is implemented, it might automatically open in a web browser (depending on OS).
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Through &lt;code inline=&quot;&quot;&gt;draw_model&lt;/code&gt; and &lt;code inline=&quot;&quot;&gt;create_map&lt;/code&gt;, this code seamlessly &lt;strong&gt;visualizes&lt;/strong&gt; SWMM networks in &lt;strong&gt;static&lt;/strong&gt; or &lt;strong&gt;interactive&lt;/strong&gt; formats:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;draw_model&lt;/code&gt;&lt;/strong&gt;: Renders a color-coded, labeled 2D PNG from a SWMM model or user-supplied DataFrames.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;create_map&lt;/code&gt;&lt;/strong&gt;: Creates a Leaflet-style HTML page embedding the model as geojson for dynamic panning/zooming.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These functionalities enhance the &lt;strong&gt;analysis workflow&lt;/strong&gt; by allowing engineers, researchers, and stakeholders to &lt;strong&gt;quickly see&lt;/strong&gt; how a model’s nodes, links, or external shapefile-based layers align, and to &lt;strong&gt;share&lt;/strong&gt; results in either a simple image or an interactive, browsable map.&lt;/p&gt;</description><link>http://www.swmmfive.com/2024/12/swmmio-swmmgraphicspy-summary.html</link><author>noreply@blogger.com (Robert Dickinson )</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-335789943869477383.post-3239138027130567492</guid><pubDate>Mon, 30 Dec 2024 21:33:00 +0000</pubDate><atom:updated>2024-12-30T16:33:15.905-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SWMMIO utils.py Summary</category><title>SWMMIO utils.py Summary</title><description>&lt;p&gt;&amp;nbsp;Below is an &lt;strong&gt;extended summary&lt;/strong&gt; of this code. It explains how each function assists in &lt;strong&gt;rendering&lt;/strong&gt; or &lt;strong&gt;transforming&lt;/strong&gt; geospatial data—particularly &lt;strong&gt;SWMM or model elements&lt;/strong&gt;—to a &lt;strong&gt;2D image&lt;/strong&gt; (e.g., for plotting or map-making). The code heavily depends on &lt;strong&gt;PIL&lt;/strong&gt; (Pillow) for image manipulation and &lt;strong&gt;pandas&lt;/strong&gt; for DataFrame handling.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;These &lt;strong&gt;utility/helper functions&lt;/strong&gt; are primarily about:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Coordinate transformations&lt;/strong&gt; (real-world to pixel space).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bounding box manipulations&lt;/strong&gt; for clipping or placing circles/polygons on an image.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Calculations&lt;/strong&gt; like distances between points, midpoints, angles, and bounding boxes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Saving&lt;/strong&gt; rendered images with optional resizing, plus an auto-open feature.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;They complement other modules that do the actual drawing of SWMM objects (nodes, conduits, parcels) by giving the tools to &lt;strong&gt;convert&lt;/strong&gt; geospatial or real-world coordinates to the &lt;strong&gt;pixel&lt;/strong&gt; domain, ensuring everything lines up properly on a final image canvas.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Primary Functions&lt;/h2&gt;
&lt;h3&gt;1. &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;save_image(img, img_path, antialias=True, auto_open=False)&lt;/code&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: Saves a PIL &lt;code inline=&quot;&quot;&gt;Image&lt;/code&gt; object to disk.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Key Parameters&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;img&lt;/code&gt;&lt;/strong&gt;: The &lt;code inline=&quot;&quot;&gt;PIL.Image&lt;/code&gt; object to save.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;img_path&lt;/code&gt;&lt;/strong&gt;: File path (including extension) for saving.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;antialias&lt;/code&gt;&lt;/strong&gt; (bool): If &lt;code inline=&quot;&quot;&gt;True&lt;/code&gt;, shrinks the image (50% thumbnail) using a high-quality resampling filter (LANCZOS).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;auto_open&lt;/code&gt;&lt;/strong&gt; (bool): If &lt;code inline=&quot;&quot;&gt;True&lt;/code&gt;, attempts to open the resulting file via the OS default program (&lt;code inline=&quot;&quot;&gt;os.startfile&lt;/code&gt; on Windows).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Usage Example&lt;/strong&gt;:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;save_image(my_image, &quot;output.png&quot;, antialias=True, auto_open=True)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;px_to_irl_coords(df, px_width=4096.0, bbox=None, shift_ratio=None)&lt;/code&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: Transforms a DataFrame’s &lt;code inline=&quot;&quot;&gt;coords&lt;/code&gt; column (which stores real-world or model coordinates) into &lt;strong&gt;pixel&lt;/strong&gt; coordinates for drawing onto an image of width &lt;code inline=&quot;&quot;&gt;px_width&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Parameters&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;df&lt;/code&gt;&lt;/strong&gt;: A pandas DataFrame that must include a &lt;code inline=&quot;&quot;&gt;coords&lt;/code&gt; column. Each row’s &lt;code inline=&quot;&quot;&gt;coords&lt;/code&gt; is a list of &lt;code inline=&quot;&quot;&gt;(x, y)&lt;/code&gt; tuples.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;px_width&lt;/code&gt;&lt;/strong&gt;: Target image width (in pixels).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;bbox&lt;/code&gt;&lt;/strong&gt;: Optional bounding box (&lt;code inline=&quot;&quot;&gt;[(xmin, ymin), (xmax, ymax)]&lt;/code&gt;). If not provided, it’s computed from min and max of the coordinates.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;shift_ratio&lt;/code&gt;&lt;/strong&gt;: If provided, it forces a custom scale factor. Otherwise, it’s derived from &lt;code inline=&quot;&quot;&gt;px_width / width_of_real_coords&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Returns&lt;/strong&gt;:
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Modified &lt;code inline=&quot;&quot;&gt;df&lt;/code&gt;&lt;/strong&gt; with a new column named &lt;code inline=&quot;&quot;&gt;draw_coords&lt;/code&gt; storing scaled pixel coordinates.&lt;/li&gt;
&lt;li&gt;The bounding box used (&lt;code inline=&quot;&quot;&gt;bbox&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Calculated image height in pixels.&lt;/li&gt;
&lt;li&gt;Calculated image width in pixels.&lt;/li&gt;
&lt;li&gt;The final &lt;code inline=&quot;&quot;&gt;shift_ratio&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Key Steps&lt;/strong&gt;:
&lt;ol&gt;
&lt;li&gt;Possibly clip the DataFrame rows to the bounding box (using &lt;code inline=&quot;&quot;&gt;clip_to_box&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Compute a scale factor if &lt;code inline=&quot;&quot;&gt;shift_ratio&lt;/code&gt; not specified.&lt;/li&gt;
&lt;li&gt;For each row, shift &amp;amp; scale original coords from the real bounding box to pixel space.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;circle_bbox(coordinates, radius=5)&lt;/code&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: Returns a &lt;strong&gt;PIL-friendly bounding box&lt;/strong&gt; for an ellipse or circle.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Parameter&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;coordinates&lt;/code&gt;&lt;/strong&gt;: &lt;code inline=&quot;&quot;&gt;(x, y)&lt;/code&gt; center point in pixel space.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;radius&lt;/code&gt;&lt;/strong&gt;: Circle radius in pixels.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Returns&lt;/strong&gt;: A 4-tuple &lt;code inline=&quot;&quot;&gt;(x_min, y_min, x_max, y_max)&lt;/code&gt; that PIL uses for &lt;code inline=&quot;&quot;&gt;draw.ellipse(...)&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4. &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;clip_to_box(df, bbox)&lt;/code&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: Filters rows whose &lt;code inline=&quot;&quot;&gt;coords&lt;/code&gt; do not intersect the bounding box.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Implementation&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;For each row’s coordinate set, checks if &lt;strong&gt;any&lt;/strong&gt; point is inside &lt;code inline=&quot;&quot;&gt;bbox&lt;/code&gt;. If none are inside, the row is excluded.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Used&lt;/strong&gt; to ensure only features within the bounding box are drawn.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5. &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;angle_bw_points(xy1, xy2)&lt;/code&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: Calculates an angle (in degrees) suitable for rotating text or shapes such that it aligns with a line from &lt;code inline=&quot;&quot;&gt;xy1&lt;/code&gt; to &lt;code inline=&quot;&quot;&gt;xy2&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Implementation&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Basic trigonometry with &lt;code inline=&quot;&quot;&gt;atan(dx/dy)&lt;/code&gt;, adjusting the angle to transform to typical image coordinates.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Used&lt;/strong&gt; in label or street annotation to orient text along a line.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6. &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;midpoint(xy1, xy2)&lt;/code&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: Returns the midpoint &lt;code inline=&quot;&quot;&gt;(x, y)&lt;/code&gt; between two coordinates &lt;code inline=&quot;&quot;&gt;(xy1, xy2)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Usage&lt;/strong&gt;: Often used for placing text or icons along a segment.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;7. &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;point_in_box(bbox, point)&lt;/code&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: Quick test if &lt;code inline=&quot;&quot;&gt;point&lt;/code&gt; is within bounding box &lt;code inline=&quot;&quot;&gt;bbox = [(xmin, ymin), (xmax, ymax)]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Returns&lt;/strong&gt;: &lt;code inline=&quot;&quot;&gt;True&lt;/code&gt; if &lt;code inline=&quot;&quot;&gt;(x, y)&lt;/code&gt; is inside or on edges of that box.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;8. &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;length_bw_coords(upstreamXY, downstreamXY)&lt;/code&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: Returns Euclidean distance (straight-line) between two points &lt;code inline=&quot;&quot;&gt;(x1, y1)&lt;/code&gt; and &lt;code inline=&quot;&quot;&gt;(x2, y2)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Used&lt;/strong&gt;: Checking the length of lines, e.g., for deciding if some label or circle is too large for a short line segment.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;9. &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;rotate_coord_about_point(xy, radians, origin=(0, 0))&lt;/code&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: Rotates a coordinate &lt;code inline=&quot;&quot;&gt;(xy)&lt;/code&gt; around a specified &lt;code inline=&quot;&quot;&gt;origin&lt;/code&gt; by a given angle in radians.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Implementation&lt;/strong&gt;:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;adjusted_x = x - origin_x
adjusted_y = y - origin_y
# apply rotation
qx = origin_x + cos_rad * adjusted_x + sin_rad * adjusted_y
qy = origin_y - sin_rad * adjusted_x + cos_rad * adjusted_y
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Usage&lt;/strong&gt;: Potentially used when rotating polygons, nodes, or text anchor points around a pivot.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Typical Workflow&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Load&lt;/strong&gt; model or real-world coordinates into a DataFrame with a &lt;code inline=&quot;&quot;&gt;coords&lt;/code&gt; column.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Determine bounding box&lt;/strong&gt; for the region of interest.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Convert&lt;/strong&gt; from real-world coordinates to pixel space with &lt;code inline=&quot;&quot;&gt;px_to_irl_coords(...)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Initialize&lt;/strong&gt; a PIL image (e.g., &lt;code inline=&quot;&quot;&gt;Image.new(...)&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Draw&lt;/strong&gt; shapes using the transformed &lt;code inline=&quot;&quot;&gt;draw_coords&lt;/code&gt; for each element. Possibly use &lt;code inline=&quot;&quot;&gt;circle_bbox(...)&lt;/code&gt; for nodes, lines for conduits, etc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(Optional) Clip&lt;/strong&gt; data to bounding box with &lt;code inline=&quot;&quot;&gt;clip_to_box(...)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Save&lt;/strong&gt; the resulting image with &lt;code inline=&quot;&quot;&gt;save_image(...)&lt;/code&gt;, specifying size or antialiasing settings.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;Integration &amp;amp; Benefits&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Integration&lt;/strong&gt;: These functions &lt;strong&gt;complement&lt;/strong&gt; other modules that define color gradients or shapes for SWMM nodes/links.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scalability&lt;/strong&gt;: By separating transformations (px_to_irl_coords) from actual drawing logic, the code remains &lt;strong&gt;modular&lt;/strong&gt;—one part ensures correct coordinate mapping, the other draws specific objects.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automated&lt;/strong&gt;: The bounding box logic and scale factor calculations streamline the process of generating consistent maps, ensuring that model elements fill the image neatly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clarity&lt;/strong&gt;: Reusable geometry functions (like midpoint, angle_bw_points, length_bw_coords) keep the code DRY and maintainable.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Overall, these are &lt;strong&gt;geometry and utility&lt;/strong&gt; functions supporting 2D image creation from geospatial or SWMM-like data:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Converts&lt;/strong&gt; coordinate sets to pixel-based coordinates for rendering.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clips&lt;/strong&gt; data to a bounding box so only relevant features are drawn.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enables&lt;/strong&gt; easy circle bounding boxes and line geometry checks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Provides&lt;/strong&gt; a standard method (&lt;code inline=&quot;&quot;&gt;save_image&lt;/code&gt;) to finalize and optionally open the resultant map.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hence, they form the foundation for constructing dynamic or static visualizations of model networks, flood extents, or any data that can be mapped to x-y coordinates and displayed in a 2D image.&lt;/p&gt;</description><link>http://www.swmmfive.com/2024/12/swmmio-utilspy-summary.html</link><author>noreply@blogger.com (Robert Dickinson )</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-335789943869477383.post-454746930636440763</guid><pubDate>Mon, 30 Dec 2024 21:30:00 +0000</pubDate><atom:updated>2024-12-30T16:30:23.306-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SWMMIO drawing.py Summary</category><title>SWMMIO drawing.py Summary</title><description>&lt;p&gt;&amp;nbsp;Below is an &lt;strong&gt;extended summary&lt;/strong&gt; of this code, describing its &lt;strong&gt;primary functions&lt;/strong&gt;, &lt;strong&gt;purpose&lt;/strong&gt;, and &lt;strong&gt;how it integrates&lt;/strong&gt; data about SWMM models (or similarly structured geospatial data) with Python’s &lt;strong&gt;PIL&lt;/strong&gt; library for visualization.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;This code provides a set of &lt;strong&gt;utility functions&lt;/strong&gt; for &lt;strong&gt;graphically rendering&lt;/strong&gt; elements of a SWMM-like model (nodes, conduits, parcels, etc.) on a static image. It leverages &lt;strong&gt;PIL (Python Imaging Library)&lt;/strong&gt; to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Draw shapes (e.g., circles for nodes, lines/polygons for conduits, parcels).&lt;/li&gt;
&lt;li&gt;Apply coloring schemes (e.g., flooding risk gradients, capacity usage).&lt;/li&gt;
&lt;li&gt;Annotate images with text (titles, timestamps, details).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These functions appear especially useful for diagnosing or visualizing simulation results, such as hours flooded, maximum flow, or changes in subcatchment flooding.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Key Functional Areas&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Size &amp;amp; Color Calculation for Nodes/Conduits/Parcels&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;node_draw_size(node)&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;node_draw_color(node)&lt;/code&gt;&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Calculate a node’s &lt;strong&gt;radius&lt;/strong&gt; and &lt;strong&gt;fill color&lt;/strong&gt; based on attributes like “HoursFlooded.”&lt;/li&gt;
&lt;li&gt;Example: If a node floods for more than a threshold, it’s drawn larger and in &lt;strong&gt;red&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;conduit_draw_size(conduit)&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;conduit_draw_color(conduit)&lt;/code&gt;&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Return draw size (line thickness) and color for a conduit based on flow capacity or “MaxQPerc.”&lt;/li&gt;
&lt;li&gt;Example: Overstressed conduits might be rendered thicker and shift from &lt;strong&gt;grey&lt;/strong&gt; to &lt;strong&gt;red&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;parcel_draw_color(parcel, style=&#39;risk&#39;)&lt;/code&gt;&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;For polygons representing parcels, color them according to risk levels or differences between scenarios (e.g., new_flooding = purple, decreased_flooding = lightblue).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Drawing with PIL&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;draw_node(node, draw)&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;draw_conduit(conduit, draw)&lt;/code&gt;&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Use the node/conduit’s computed color/size to draw circles/lines on a &lt;code inline=&quot;&quot;&gt;PIL.ImageDraw&lt;/code&gt; object.&lt;/li&gt;
&lt;li&gt;Coordinates are taken from &lt;code inline=&quot;&quot;&gt;node.draw_coords&lt;/code&gt; or &lt;code inline=&quot;&quot;&gt;conduit.draw_coords&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;draw_parcel_risk(parcel, draw)&lt;/code&gt;&lt;/strong&gt; or &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;draw_parcel_risk_delta(parcel, draw)&lt;/code&gt;&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Fill polygons for subcatchments or parcels with specific colors to indicate risk/delta changes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Annotating Streets &amp;amp; Text&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;annotate_streets(df, img, text_col)&lt;/code&gt;&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;For each row in a DataFrame, draws a street name text along a line, rotated according to the angle between two points.&lt;/li&gt;
&lt;li&gt;Uses &lt;code inline=&quot;&quot;&gt;ImageFont.truetype&lt;/code&gt; with a user-defined font path (&lt;code inline=&quot;&quot;&gt;FONT_PATH&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;annotate_title(title, draw)&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;annotate_timestamp(draw)&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;annotate_details(txt, draw)&lt;/code&gt;&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Writes a map title, date/time stamp, or additional text onto the image at specified positions.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Color Gradients&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;gradient_grey_red(x, xmin, xmax)&lt;/code&gt;&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Converts a numeric value into an RGB color between grey and red, depending on how &lt;code inline=&quot;&quot;&gt;x&lt;/code&gt; compares to &lt;code inline=&quot;&quot;&gt;[xmin, xmax]&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;gradient_color_red(x, xmin, xmax, startCol=lightgrey)&lt;/code&gt;&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Similar approach, but from a start color (e.g., &lt;strong&gt;lightgrey&lt;/strong&gt;) to red.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The gradient formulas increment or decrement each RGB channel to create a color scale.&lt;/li&gt;
&lt;li&gt;These gradient functions are used in node/conduit drawing or parcel coloring, to reflect data like flow or hours flooded.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Miscellaneous Utilities&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;circle_bbox(center, radius)&lt;/code&gt;&lt;/strong&gt;: Returns bounding box coords for a circle, given center coords and radius.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;length_bw_coords(pt1, pt2)&lt;/code&gt;&lt;/strong&gt;: Computes distance between two points.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;angle_bw_points(pt1, pt2)&lt;/code&gt;&lt;/strong&gt;: Returns the angle in degrees between two points, used for text rotation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;midpoint(pt1, pt2)&lt;/code&gt;&lt;/strong&gt;: Returns the midpoint of two coordinates.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;line_size(q, exp=1)&lt;/code&gt;&lt;/strong&gt;: Quick function for scaling a numeric flow &lt;code inline=&quot;&quot;&gt;q&lt;/code&gt; into a line width by raising it to some exponent.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;Usage Flow&lt;/h2&gt;
&lt;p&gt;A &lt;strong&gt;typical workflow&lt;/strong&gt; might look like:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Precompute&lt;/strong&gt; or store in each node/parcel row the relevant attributes (e.g., &lt;code inline=&quot;&quot;&gt;HoursFlooded&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;MaxQ&lt;/code&gt;) along with drawing coordinates (&lt;code inline=&quot;&quot;&gt;node.draw_coords&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Call&lt;/strong&gt; &lt;code inline=&quot;&quot;&gt;draw_node(node, draw)&lt;/code&gt; or &lt;code inline=&quot;&quot;&gt;draw_conduit(conduit, draw)&lt;/code&gt; on a &lt;code inline=&quot;&quot;&gt;PIL.ImageDraw&lt;/code&gt; instance:
&lt;ul&gt;
&lt;li&gt;This automatically fetches the color and size from &lt;code inline=&quot;&quot;&gt;node_draw_color(node)&lt;/code&gt; and &lt;code inline=&quot;&quot;&gt;node_draw_size(node)&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Optionally annotate&lt;/strong&gt; the image with street names (&lt;code inline=&quot;&quot;&gt;annotate_streets&lt;/code&gt;) or add a title/timestamp at the top corner.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Save&lt;/strong&gt; or show the final &lt;code inline=&quot;&quot;&gt;PIL&lt;/code&gt; image after all shapes are drawn.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;Integration&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;swmmio.defs.constants&lt;/code&gt;&lt;/strong&gt;: The code references color constants (&lt;code inline=&quot;&quot;&gt;red, purple, lightblue, lightgreen, black, lightgrey, grey&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;FONT_PATH&lt;/code&gt;&lt;/strong&gt;: A user-specified or default file path to a TrueType font, needed by &lt;code inline=&quot;&quot;&gt;ImageFont.truetype&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;swmmio.graphics.utils&lt;/code&gt;&lt;/strong&gt;: Additional geometry or drawing utilities (like &lt;code inline=&quot;&quot;&gt;circle_bbox&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;angle_bw_points&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;The code ultimately depends on &lt;strong&gt;PIL&lt;/strong&gt; (&lt;code inline=&quot;&quot;&gt;from PIL import Image, ImageDraw, ImageFont, ImageOps&lt;/code&gt;) to manipulate raster images.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Benefits &amp;amp; Rationale&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Automated Visualization&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Simplifies drawing SWMM-based or geospatial data onto images, using &lt;strong&gt;meaningful&lt;/strong&gt; color scales for flow, flood hours, or infiltration.&lt;/li&gt;
&lt;li&gt;Great for debugging (e.g., seeing which conduits are near capacity) or for final reporting.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Flexible&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Because color sizes/gradients are derived from numeric columns (&lt;code inline=&quot;&quot;&gt;MaxQPerc&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;HoursFlooded&lt;/code&gt;, etc.), the script can be easily extended to new metrics (like water quality data).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;PIL-based&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The code is library-agnostic in the sense that it doesn’t rely on more complex plotting frameworks (like matplotlib).&lt;/li&gt;
&lt;li&gt;A plain &lt;code inline=&quot;&quot;&gt;ImageDraw&lt;/code&gt; approach can be scaled for simpler or more custom rendering.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;In summary, this code is a &lt;strong&gt;lightweight&lt;/strong&gt; but &lt;strong&gt;comprehensive&lt;/strong&gt; set of drawing and annotation routines for &lt;strong&gt;SWMM or other hydrologic/hydraulic&lt;/strong&gt; data. It ties together numeric data (like flooding hours or conduit capacity usage) with &lt;strong&gt;visual cues&lt;/strong&gt; (line thickness, color gradients) in a PIL image. By doing so, it enables &lt;strong&gt;automated map creation&lt;/strong&gt; or &lt;strong&gt;quick debugging&lt;/strong&gt; plots for model elements—nodes, conduits, parcels—complete with text annotations and dynamic color scaling.&lt;/p&gt;</description><link>http://www.swmmfive.com/2024/12/swmmio-drawingpy-summary.html</link><author>noreply@blogger.com (Robert Dickinson )</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-335789943869477383.post-7055348269443906559</guid><pubDate>Mon, 30 Dec 2024 20:20:00 +0000</pubDate><atom:updated>2024-12-30T15:28:24.155-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">PYSWMM lidunits.py Summary</category><title>PYSWMM lidunits.py Summary</title><description>&lt;p&gt;&amp;nbsp;Below is an extended summary of the code, describing its structure, primary functionalities, and how each class interacts with SWMM’s LID (Low Impact Development) data.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Purpose and Context&lt;/h2&gt;
&lt;p&gt;This code defines Python classes (&lt;code inline=&quot;&quot;&gt;Surface&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;Pavement&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;Storage&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;Soil&lt;/code&gt;, and &lt;code inline=&quot;&quot;&gt;WaterBalance&lt;/code&gt;) that provide a user-friendly interface to SWMM’s LID components. Each class focuses on a specific layer (or conceptual grouping) of a Low Impact Development unit—such as bioretention cells, permeable pavements, or green roofs—and exposes numeric properties (inflows, outflows, evaporations, infiltration rates, etc.) by querying PySWMM’s low-level toolkit functions (&lt;code inline=&quot;&quot;&gt;getLidUResult&lt;/code&gt; and &lt;code inline=&quot;&quot;&gt;getLidUFluxRates&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;By wrapping SWMM’s C-based toolkit calls into clear, Pythonic property getters, modelers can easily monitor real-time hydraulic processes within each LID layer.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Structure and Key Components&lt;/h2&gt;
&lt;h3&gt;1. &lt;code inline=&quot;&quot;&gt;_flux_rate&lt;/code&gt; Helper Function&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def _flux_rate(model, subcatchment, lid_index, layer):
    return model.getLidUFluxRates(subcatchment, lid_index, layer)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;A private utility that retrieves &lt;strong&gt;net inflow/outflow&lt;/strong&gt; (flux) for a particular LID unit layer.&lt;/li&gt;
&lt;li&gt;Supports &lt;strong&gt;surface&lt;/strong&gt;, &lt;strong&gt;soil&lt;/strong&gt;, &lt;strong&gt;storage&lt;/strong&gt;, and &lt;strong&gt;pavement&lt;/strong&gt; layers as enumerated by &lt;code inline=&quot;&quot;&gt;LidLayers&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. &lt;code inline=&quot;&quot;&gt;Surface&lt;/code&gt; Class&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Represents the &lt;strong&gt;surface layer&lt;/strong&gt; of an LID unit (e.g., ponded water on top of a biocell or permeable pavement).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Properties&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;depth&lt;/code&gt;: Current depth of water on the surface.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;inflow&lt;/code&gt;: Rate of precipitation + runon flowing into this LID unit.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;infiltration&lt;/code&gt;: Rate at which water is infiltrating from the surface layer downward.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;evaporation&lt;/code&gt;: Water lost to evaporation from the surface.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;outflow&lt;/code&gt;: Overflow or surface water leaving the LID.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;flux_rate&lt;/code&gt;: Net flux (inflow - outflow) from the surface layer in the previous time step.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. &lt;code inline=&quot;&quot;&gt;Pavement&lt;/code&gt; Class&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Focuses on the &lt;strong&gt;porous pavement&lt;/strong&gt; layer in certain LID designs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Properties&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;depth&lt;/code&gt;: Depth of water within the pavement voids.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;evaporation&lt;/code&gt;: Pavement water lost via evaporation.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;percolation&lt;/code&gt;: Water percolating out of the pavement layer down into the underlying layer.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;flux_rate&lt;/code&gt;: Net flux from the pavement layer.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4. &lt;code inline=&quot;&quot;&gt;Storage&lt;/code&gt; Class&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Applies to the &lt;strong&gt;storage layer&lt;/strong&gt;, which might represent a storage zone underneath surface layers (e.g., gravel storage in permeable pavement or an underdrain storage chamber).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Properties&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;depth&lt;/code&gt;: Current depth of water in the storage layer.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;inflow&lt;/code&gt;: Water entering this storage layer from above.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;exfiltration&lt;/code&gt;: Water exfiltrating into native soil.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;evaporation&lt;/code&gt;: Water lost via evaporation from the storage zone.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;drain&lt;/code&gt;: Flow leaving through an underdrain or outlet.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;flux_rate&lt;/code&gt;: Net inflow-outflow rate from the storage layer.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5. &lt;code inline=&quot;&quot;&gt;Soil&lt;/code&gt; Class&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Represents the &lt;strong&gt;soil layer&lt;/strong&gt; for LIDs such as bioretention cells or green roofs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Properties&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;moisture&lt;/code&gt;: The current soil moisture content.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;evaporation&lt;/code&gt;: Evaporation from soil.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;percolation&lt;/code&gt;: Percolation (downward flow) from the soil layer.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;flux_rate&lt;/code&gt;: Net flux of water into/out of the soil layer.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6. &lt;code inline=&quot;&quot;&gt;WaterBalance&lt;/code&gt; Class&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Provides &lt;strong&gt;overall LID water balance&lt;/strong&gt; metrics, representing totals across the entire LID unit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Properties&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;inflow&lt;/code&gt;: Total inflow received by the LID (surface and subsurface combined).&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;evaporation&lt;/code&gt;: Total evaporation from all layers.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;infiltration&lt;/code&gt;: Total infiltration to the native soil.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;surface_flow&lt;/code&gt;: Total surface runoff leaving the LID.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;drain_flow&lt;/code&gt;: Flow exiting the LID through an underdrain.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;initial_volume&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;final_volume&lt;/code&gt;: Stored water volume at the start and end of a time step.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Typical Usage&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Accessing LID Data&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;These classes are generally instantiated within a broader &lt;code inline=&quot;&quot;&gt;LIDUnit&lt;/code&gt; context in PySWMM. For example:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;surf = Surface(model, lidunit_object)
current_depth = surf.depth
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Each class needs references to the SWMM model object (&lt;code inline=&quot;&quot;&gt;model&lt;/code&gt;) and the specific LID unit and subcatchment (&lt;code inline=&quot;&quot;&gt;lidunit&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Retrieving Real-Time Values&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Within a simulation loop, a user might query &lt;code inline=&quot;&quot;&gt;Surface&lt;/code&gt; infiltration or &lt;code inline=&quot;&quot;&gt;Soil&lt;/code&gt; moisture at each time step to make control decisions or track performance.
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;for step in sim:
    print(surf.infiltration, soil.moisture)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Analyzing End-of-Simulation Results&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Users may also retrieve final state or total inflow/outflow totals after running the simulation, aiding in post-processing or reporting.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;Key Advantages&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;High-Level Abstraction&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;By naming each property (&lt;code inline=&quot;&quot;&gt;surface.inflow&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;pavement.depth&lt;/code&gt;) rather than relying on numeric indices, the code is more readable and user-friendly.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Modular LID Layers&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Splitting each layer (Surface, Pavement, Storage, Soil) into its own class clarifies the distinct processes involved and simplifies maintenance.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Consistent Access Patterns&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;All classes follow a similar pattern: &lt;code inline=&quot;&quot;&gt;@property&lt;/code&gt; getters that call &lt;code inline=&quot;&quot;&gt;getLidUResult&lt;/code&gt; or &lt;code inline=&quot;&quot;&gt;_flux_rate&lt;/code&gt; under the hood, ensuring a uniform interface across different layers.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Real-Time or Post-Run Data&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The properties can be queried on-the-fly during a time-stepped simulation or after the simulation completes for a detailed water balance assessment.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;In summary, these classes (&lt;code inline=&quot;&quot;&gt;Surface&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;Pavement&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;Storage&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;Soil&lt;/code&gt;, and &lt;code inline=&quot;&quot;&gt;WaterBalance&lt;/code&gt;) encapsulate SWMM’s LID layer data into convenient, Python-based APIs. By doing so, they empower engineers and researchers to more easily inspect and manage the complex hydrologic and hydraulic processes occurring within a Low Impact Development practice during a SWMM simulation.&lt;/p&gt;</description><link>http://www.swmmfive.com/2024/12/pyswmm-lidunitspy-summary.html</link><author>noreply@blogger.com (Robert Dickinson )</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-335789943869477383.post-2323532381370155959</guid><pubDate>Mon, 30 Dec 2024 20:20:00 +0000</pubDate><atom:updated>2024-12-30T15:25:20.342-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">PYSWMM links.py Summary</category><title>PYSWMM links.py Summary </title><description>&lt;p&gt;Below is an extended summary of this code, highlighting its main classes, functionality, and how each piece fits into the broader PySWMM architecture:&lt;/p&gt;&lt;hr /&gt;&lt;h2&gt;Overview&lt;/h2&gt;&lt;p&gt;This module defines Python classes (&lt;code inline=&quot;&quot;&gt;Links&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;Link&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;Conduit&lt;/code&gt;, and &lt;code inline=&quot;&quot;&gt;Pump&lt;/code&gt;) that provide a user-friendly interface to SWMM5’s link objects. By leveraging PySWMM’s underlying toolkit (primarily through &lt;code inline=&quot;&quot;&gt;self._model&lt;/code&gt; references), it enables modelers to access and manipulate hydraulic and water-quality data for conduits, pumps, orifices, weirs, and other link types during a SWMM simulation.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Key capabilities include:&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;Iteration over all links in a SWMM model.&lt;/li&gt;
&lt;li&gt;Easy retrieval of key link parameters (e.g., offsets, flow limit, seepage rate).&lt;/li&gt;
&lt;li&gt;On-the-fly manipulation of specific link properties (initial flow, target setting, etc.).&lt;/li&gt;
&lt;li&gt;Access to runtime results (flow depth, volume, water quality) at each simulation timestep.&lt;/li&gt;
&lt;li&gt;Specialized subclasses for conduits and pumps, enabling detailed statistics and custom methods.&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;h2&gt;Core Classes&lt;/h2&gt;&lt;h3&gt;1. &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;Links&lt;/code&gt;&lt;/strong&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: Acts as a container and iterator for &lt;strong&gt;all&lt;/strong&gt; links in an open SWMM model.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Initialization&lt;/strong&gt;:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;links = Links(sim)
&lt;/code&gt;&lt;/pre&gt;
Here, &lt;code inline=&quot;&quot;&gt;sim&lt;/code&gt; is an active &lt;code inline=&quot;&quot;&gt;Simulation&lt;/code&gt; object. The constructor verifies that the SWMM model is loaded (&lt;code inline=&quot;&quot;&gt;model._model.fileLoaded&lt;/code&gt;) before proceeding.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Iteration&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Supports Python’s iteration protocol (&lt;code inline=&quot;&quot;&gt;__iter__&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;__next__&lt;/code&gt;), allowing developers to loop over links:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;for link in Links(sim):
    print(link.linkid)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Internally, each iteration retrieves a new &lt;code inline=&quot;&quot;&gt;Link&lt;/code&gt; instance using its index-based ID from the underlying SWMM model.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lookup&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Provides &lt;code inline=&quot;&quot;&gt;__getitem__&lt;/code&gt; to retrieve a &lt;code inline=&quot;&quot;&gt;Link&lt;/code&gt; object directly by ID:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;c1c2 = links[&#39;C1:C2&#39;]
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;If the retrieved link is identified as a conduit or pump, it is automatically cast to the appropriate subclass (&lt;code inline=&quot;&quot;&gt;Conduit&lt;/code&gt; or &lt;code inline=&quot;&quot;&gt;Pump&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Membership&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Implements &lt;code inline=&quot;&quot;&gt;__contains__&lt;/code&gt; to check if a link ID exists in the model:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;&quot;C1:C2&quot; in links  # returns True or False
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;2. &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;Link&lt;/code&gt;&lt;/strong&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: Represents an individual SWMM link. This base class applies to all link types (conduit, pump, orifice, weir, outlet).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Initialization&lt;/strong&gt;:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;c1c2 = Link(model, &#39;C1:C2&#39;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Verifies the model is open and that the given ID is valid.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Properties &amp;amp; Methods&lt;/strong&gt;:
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Link Identification&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;linkid&lt;/code&gt;: Returns the link’s SWMM ID (e.g., &lt;code inline=&quot;&quot;&gt;&quot;C1:C2&quot;&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;connections&lt;/code&gt;: Returns a tuple &lt;code inline=&quot;&quot;&gt;(inlet_node_id, outlet_node_id)&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Link Type Checks&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;is_conduit()&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;is_pump()&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;is_orifice()&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;is_weir()&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;is_outlet()&lt;/code&gt;: Each returns a boolean indicating the link’s specific type.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Parameter Accessors (Getters/Setters)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Structural Parameters&lt;/em&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;inlet_offset&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;outlet_offset&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;initial_flow&lt;/code&gt; (link’s startup flow), &lt;code inline=&quot;&quot;&gt;flow_limit&lt;/code&gt; (maximum flow rate)&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;inlet_head_loss&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;outlet_head_loss&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;average_head_loss&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;seepage_rate&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Each property retrieves or updates SWMM’s internal data via &lt;code inline=&quot;&quot;&gt;self._model.getLinkParam&lt;/code&gt; or &lt;code inline=&quot;&quot;&gt;self._model.setLinkParam&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Runtime Results&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;flow&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;depth&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;volume&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;froude&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;ups_xsection_area&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;ds_xsection_area&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;current_setting&lt;/code&gt; (real-time setting for a controlled link)&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;target_setting&lt;/code&gt; (allows the user to change the setting programmatically via &lt;code inline=&quot;&quot;&gt;self._model.setLinkSetting(linkid, value)&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Water Quality&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;pollut_quality&lt;/code&gt;: Dictionary of pollutant concentrations currently in the link.
&lt;ul&gt;
&lt;li&gt;Can be set by passing a tuple &lt;code inline=&quot;&quot;&gt;(pollutant_ID, pollutant_value)&lt;/code&gt; to the property.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;total_loading&lt;/code&gt;: Summed pollutant loading in the link.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;reactor_quality&lt;/code&gt;: Pollutant concentration in the “mixed reactor” portion of the link (also a dictionary).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Usage&lt;/strong&gt;:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;with Simulation(&#39;my_model.inp&#39;) as sim:
    link_obj = Links(sim)[&#39;C1:C2&#39;]
    link_obj.flow_limit = 10.0       # Set max flow
    link_obj.target_setting = 0.75   # Adjust link setting mid-simulation
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;3. &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;Conduit&lt;/code&gt;&lt;/strong&gt; (Subclass of &lt;code inline=&quot;&quot;&gt;Link&lt;/code&gt;)&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: Specialized link class for &lt;strong&gt;conduits&lt;/strong&gt;, inheriting from &lt;code inline=&quot;&quot;&gt;Link&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Primary Feature&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;conduit_statistics&lt;/code&gt;: Provides a dictionary of extended hydraulic metrics (peak flow/velocity/depth, surcharging times, capacity-limited fraction, flow class durations, and more).&lt;/li&gt;
&lt;li&gt;These statistics are cumulative over the entire simulation run and are accessed after the simulation loop completes:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;with Simulation(&#39;my_model.inp&#39;) as sim:
    c1c2 = Links(sim)[&#39;C1:C2&#39;]
    for step in sim:
        pass
    stats = c1c2.conduit_statistics
    print(stats[&#39;peak_flow&#39;])  # e.g., 2.134 cfs
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;4. &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;Pump&lt;/code&gt;&lt;/strong&gt; (Subclass of &lt;code inline=&quot;&quot;&gt;Link&lt;/code&gt;)&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: Specialized link class for &lt;strong&gt;pumps&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Primary Feature&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;pump_statistics&lt;/code&gt;: Cumulative usage data for the pump, including utilization time, min/avg/max flow rates, total volume pumped, energy consumed, and how frequently the pump operates off-curve.&lt;/li&gt;
&lt;li&gt;Accessed similarly to the conduit stats:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;with Simulation(&#39;my_pump_model.inp&#39;) as sim:
    pump_link = Links(sim)[&#39;Pump1&#39;]
    for step in sim:
        pass
    stats = pump_link.pump_statistics
    print(stats[&#39;energy_consumed&#39;], stats[&#39;total_volume&#39;])
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;h2&gt;Typical Workflow&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Open a SWMM simulation&lt;/strong&gt;:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from pyswmm import Simulation, Links

with Simulation(&#39;network.inp&#39;) as sim:
    # ...
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Instantiate the &lt;code inline=&quot;&quot;&gt;Links&lt;/code&gt; collection&lt;/strong&gt;:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;links_collection = Links(sim)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Iterate or access individual links&lt;/strong&gt;:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# Directly by ID
mylink = links_collection[&#39;LinkID123&#39;]

# Or by iteration
for link in links_collection:
    print(link.linkid)
    if link.is_pump():
        print(link.flow)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Manipulate or retrieve parameters&lt;/strong&gt;:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;mylink.flow_limit = 15.0
print(mylink.seepage_rate)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Run or step through the simulation&lt;/strong&gt;:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;for step in sim:
    # Retrieve real-time results
    current_flow = mylink.flow
    if current_flow &amp;gt; 10.0:
        mylink.target_setting = 0.5  # Partially close a weir or orifice
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Obtain summary statistics&lt;/strong&gt; after the simulation ends:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;if mylink.is_conduit():
    stats = mylink.conduit_statistics
    print(&quot;Peak flow was:&quot;, stats[&quot;peak_flow&quot;])
elif mylink.is_pump():
    stats = mylink.pump_statistics
    print(&quot;Pump total volume pumped:&quot;, stats[&quot;total_volume&quot;])
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;h2&gt;Key Advantages&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Pythonic Access&lt;/strong&gt;: Modelers can reference link properties (offsets, flows, pollutant concentrations) through intuitive property getters/setters rather than manually parsing SWMM data files.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Class Inheritance&lt;/strong&gt;: The &lt;code inline=&quot;&quot;&gt;Conduit&lt;/code&gt; and &lt;code inline=&quot;&quot;&gt;Pump&lt;/code&gt; subclasses handle specialized metrics that don’t apply to all link types (e.g., pump energy consumption).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Runtime Control&lt;/strong&gt;: Because these properties can be changed during a time-stepped simulation, users can implement sophisticated real-time control strategies (e.g., adjusting a pump setting when a flow threshold is exceeded).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Robust Error-Handling&lt;/strong&gt;: Each method checks that the model is loaded. If it isn’t, a &lt;code inline=&quot;&quot;&gt;PYSWMMException&lt;/code&gt; is raised, preventing inadvertent calls on an uninitialized state.&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;























&lt;/p&gt;&lt;p&gt;By providing an object-oriented, user-friendly abstraction over SWMM’s link objects, this module simplifies both reading and writing of key simulation parameters. The &lt;code inline=&quot;&quot;&gt;Links&lt;/code&gt; container and its subclasses (&lt;code inline=&quot;&quot;&gt;Conduit&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;Pump&lt;/code&gt;) significantly reduce the complexity of stormwater modeling workflows, allowing for powerful, Pythonic real-time control and post-processing of SWMM simulations.&lt;/p&gt;&lt;div id=&quot;gtx-trans&quot; style=&quot;left: -86px; position: absolute; top: -20px;&quot;&gt;&lt;div class=&quot;gtx-trans-icon&quot;&gt;&lt;/div&gt;&lt;/div&gt;</description><link>http://www.swmmfive.com/2024/12/pyswmm-linkspy-summary.html</link><author>noreply@blogger.com (Robert Dickinson )</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-335789943869477383.post-6805957462990415929</guid><pubDate>Mon, 30 Dec 2024 20:19:00 +0000</pubDate><atom:updated>2024-12-30T15:34:32.360-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">PYSWMM output.py Summary</category><title>PYSWMM output.py Summary</title><description>&lt;p&gt;&amp;nbsp;Below is an extended summary of this code, which focuses on reading and accessing data from a &lt;strong&gt;SWMM output (.out) file&lt;/strong&gt; via a Python interface. It describes the purpose, structure, and usage of each class, along with relevant methods and decorators.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;This module provides a robust way to interact with SWMM’s output binary files in Python. It allows users to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open or close SWMM output binary files.&lt;/li&gt;
&lt;li&gt;Query time-series data for &lt;strong&gt;subcatchments&lt;/strong&gt;, &lt;strong&gt;nodes&lt;/strong&gt;, &lt;strong&gt;links&lt;/strong&gt;, and &lt;strong&gt;the overall system&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Retrieve, filter, and present simulation results as Python dictionaries keyed by timestamps.&lt;/li&gt;
&lt;li&gt;Easily integrate with pandas or other data-processing tools, thanks to dictionary-based outputs.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Key elements include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;Output&lt;/code&gt; class&lt;/strong&gt;: Core functionality for opening and querying the binary file.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;output_open_handler&lt;/code&gt; decorator&lt;/strong&gt;: Ensures an output file is opened before any function runs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Classes like &lt;code inline=&quot;&quot;&gt;SubcatchSeries&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;NodeSeries&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;LinkSeries&lt;/code&gt;, and &lt;code inline=&quot;&quot;&gt;SystemSeries&lt;/code&gt;&lt;/strong&gt;: High-level objects that map SWMM attributes (rainfall, flow rate, infiltration, etc.) into time-indexed Python dictionaries.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Core Functionality&lt;/h2&gt;
&lt;h3&gt;1. &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;Output&lt;/code&gt; Class&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: Manages a SWMM output (.out) file, including opening/closing it, reading metadata (like start time, end time, number of periods), and fetching results in various formats.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Methods and Properties&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;File Handling&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;open()&lt;/code&gt;: Initializes an internal handle to the output file. Loads critical info such as start date/time, reporting interval, total periods, etc.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;close()&lt;/code&gt;: Closes the file and cleans up the internal handle.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;__enter__&lt;/code&gt; / &lt;code inline=&quot;&quot;&gt;__exit__&lt;/code&gt;: Implements Python’s context-manager protocol (&lt;code inline=&quot;&quot;&gt;with&lt;/code&gt; statement), ensuring that the file automatically opens and closes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Project/Simulation Metadata&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;project_size&lt;/code&gt;: Returns counts for subcatchments, nodes, links, system objects, and pollutants.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;start&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;end&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;report&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;period&lt;/code&gt;: Start date/time, end date/time, reporting interval (in seconds), and number of reporting periods.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;version&lt;/code&gt;: Returns the SWMM engine version used to produce this output file.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;units&lt;/code&gt;: Shows the user’s unit system (US or SI), flow units (CFS, CMS, etc.), and pollutant units.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Model Element Dictionaries&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;subcatchments&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;nodes&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;links&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;pollutants&lt;/code&gt;: Each returns a dict mapping element IDs (e.g., “J1”, “C2”, “S1”) to integer indices. These indices are needed to make calls into the underlying SWMM output toolkit.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Time Management&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;times&lt;/code&gt;: A list of &lt;code inline=&quot;&quot;&gt;datetime&lt;/code&gt; objects for each reporting period in the simulation.&lt;/li&gt;
&lt;li&gt;Internally, times are generated by starting at &lt;code inline=&quot;&quot;&gt;self.start&lt;/code&gt; and incrementing in steps of &lt;code inline=&quot;&quot;&gt;self.report&lt;/code&gt; seconds.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Retrieving Data&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;subcatch_series&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;node_series&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;link_series&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;system_series&lt;/code&gt;: Time-series retrieval for a single object (subcatch/node/link) or the entire system.
&lt;ul&gt;
&lt;li&gt;Returns a dictionary of &lt;code inline=&quot;&quot;&gt;{ datetime: value }&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;subcatch_attribute&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;node_attribute&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;link_attribute&lt;/code&gt;: Snapshots of a single attribute for &lt;strong&gt;all&lt;/strong&gt; subcatchments/nodes/links at a &lt;strong&gt;single&lt;/strong&gt; time index.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;subcatch_result&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;node_result&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;link_result&lt;/code&gt;: Returns &lt;strong&gt;all&lt;/strong&gt; attributes for a single subcatchment/node/link at a &lt;strong&gt;single&lt;/strong&gt; time index.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;system_result&lt;/code&gt;: Returns a dictionary of system-wide attributes (e.g., total runoff, infiltration) at a single time index.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Validation Helpers&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;verify_index(...)&lt;/code&gt;: Ensures a user-provided ID or index is valid for a given subcatchment/node/link dictionary.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;verify_time(...)&lt;/code&gt;: Converts a user-supplied &lt;code inline=&quot;&quot;&gt;datetime&lt;/code&gt; or integer index into a valid time-step index. Raises exceptions if the time/index is out of range.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2. &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;output_open_handler&lt;/code&gt; Decorator&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Ensures that before any method runs (e.g., &lt;code inline=&quot;&quot;&gt;subcatch_series&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;node_attribute&lt;/code&gt;), the output file is open.&lt;/li&gt;
&lt;li&gt;If &lt;code inline=&quot;&quot;&gt;self.loaded&lt;/code&gt; is &lt;code inline=&quot;&quot;&gt;False&lt;/code&gt;, it calls &lt;code inline=&quot;&quot;&gt;self.open()&lt;/code&gt; to establish a handle.&lt;/li&gt;
&lt;li&gt;This decorator simplifies code by allowing users to call methods directly without worrying about manually opening the output file first.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. &lt;strong&gt;High-Level Series Classes&lt;/strong&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;SubcatchSeries&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Usage: &lt;code inline=&quot;&quot;&gt;SubcatchSeries(out_handle)[‘S1’].rainfall&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Each property (e.g., &lt;code inline=&quot;&quot;&gt;.rainfall&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;.snow_depth&lt;/code&gt;) yields a time-series dictionary for the specified subcatchment.&lt;/li&gt;
&lt;li&gt;Internally calls &lt;code inline=&quot;&quot;&gt;Output.subcatch_series(...)&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;NodeSeries&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Usage: &lt;code inline=&quot;&quot;&gt;NodeSeries(out_handle)[‘J1’].invert_depth&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Maps node attributes like &lt;code inline=&quot;&quot;&gt;INVERT_DEPTH&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;HYDRAULIC_HEAD&lt;/code&gt;, etc. to time-series dictionaries.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;LinkSeries&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Usage: &lt;code inline=&quot;&quot;&gt;LinkSeries(out_handle)[‘C1:C2’].flow_rate&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Provides link attributes such as &lt;code inline=&quot;&quot;&gt;FLOW_RATE&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;FLOW_DEPTH&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;FLOW_VELOCITY&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;SystemSeries&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Usage: &lt;code inline=&quot;&quot;&gt;SystemSeries(out_handle).runoff_flow&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;No element ID needed (the entire system is a single entity).&lt;/li&gt;
&lt;li&gt;Returns time-series data for system-level attributes (e.g., total rainfall, total inflow, outflow).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Common Patterns&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Each of these series classes inherits from &lt;code inline=&quot;&quot;&gt;OutAttributeBase&lt;/code&gt;, which implements:
&lt;ul&gt;
&lt;li&gt;A dynamic &lt;code inline=&quot;&quot;&gt;__getattr__&lt;/code&gt; that interprets attribute names (e.g., &lt;code inline=&quot;&quot;&gt;.flow_rate&lt;/code&gt;) and calls the underlying PySWMM methods.&lt;/li&gt;
&lt;li&gt;A &lt;code inline=&quot;&quot;&gt;_series_type(...)&lt;/code&gt; helper method that routes to &lt;code inline=&quot;&quot;&gt;Output&lt;/code&gt; methods like &lt;code inline=&quot;&quot;&gt;.subcatch_series&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;.node_series&lt;/code&gt;, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4. Example Usage&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from pyswmm import Output, NodeSeries

# 1) Open a SWMM output file via the context manager
with Output(&quot;my_model.out&quot;) as out:
    # 2) Access metadata
    print(&quot;Start Time:&quot;, out.start)
    print(&quot;End Time:&quot;, out.end)
    print(&quot;Number of Nodes:&quot;, len(out.nodes))

    # 3) Retrieve time-series data for a specific node
    node_data = NodeSeries(out)[&quot;J1&quot;].total_inflow
    for time, inflow_value in node_data.items():
        print(time, inflow_value)

    # 4) Retrieve a single time snapshot for all nodes
    snapshot_16h = out.node_attribute(
        attribute=shared_enum.NodeAttribute.INVERT_DEPTH,
        time_index=datetime(2020, 1, 1, 16, 0)
    )
    print(snapshot_16h)  # {&quot;J1&quot;: 10.2, &quot;J2&quot;: 12.3, ...}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;Benefits and Applications&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Simplicity&lt;/strong&gt;: Users can retrieve SWMM results using Python dictionaries keyed by datetime, making integration with other data libraries (like pandas or matplotlib) straightforward.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Flexibility&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Retrieve results by &lt;strong&gt;time&lt;/strong&gt; (snapshot across many objects) or by &lt;strong&gt;object&lt;/strong&gt; (time-series for a single subcatchment/node/link).&lt;/li&gt;
&lt;li&gt;Retrieve &lt;strong&gt;single attributes&lt;/strong&gt; or &lt;strong&gt;all attributes&lt;/strong&gt; at once.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Error Handling&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clear exceptions (&lt;code inline=&quot;&quot;&gt;OutputException&lt;/code&gt;) if an ID or time-step is invalid.&lt;/li&gt;
&lt;li&gt;Decorators ensuring the file is open before data retrieval.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Separation of Concerns&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;Output&lt;/code&gt; handles low-level file reading and indexing.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;SubcatchSeries&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;NodeSeries&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;LinkSeries&lt;/code&gt;, and &lt;code inline=&quot;&quot;&gt;SystemSeries&lt;/code&gt; provide higher-level, user-friendly interfaces to time-series data.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;This code presents a comprehensive Python interface for processing SWMM output files. By abstracting the SWMM toolkit’s C-based calls into intuitive classes and decorators, it gives modelers and data scientists convenient access to simulation results at different levels (subcatchment, node, link, or entire system). Thanks to dictionary-based returns keyed by timestamps, it integrates naturally with Python’s ecosystem for data analysis and visualization, ultimately streamlining the post-processing workflow for stormwater and hydrological modeling projects.&lt;/p&gt;</description><link>http://www.swmmfive.com/2024/12/pyswmm-outputpy-summary.html</link><author>noreply@blogger.com (Robert Dickinson )</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-335789943869477383.post-3810101580788448363</guid><pubDate>Mon, 30 Dec 2024 20:19:00 +0000</pubDate><atom:updated>2024-12-30T15:32:05.902-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">PYSWMM nodes.py Summary</category><title>PYSWMM nodes.py Summary</title><description>&lt;p&gt;&amp;nbsp;Below is an extended summary of the code, highlighting its structure, purpose, and how each component interacts with SWMM’s node objects in a Pythonic way:&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;This module defines classes (&lt;code inline=&quot;&quot;&gt;Nodes&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;Node&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;Outfall&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;Storage&lt;/code&gt;) that offer a Pythonic interface to SWMM (Storm Water Management Model) node objects. By leveraging PySWMM’s underlying toolkit (through &lt;code inline=&quot;&quot;&gt;self._model&lt;/code&gt; references), these classes enable users to easily query and modify various node parameters—such as invert elevations, initial depths, pollutant levels, and real-time hydraulic results (inflow, outflow, water depth)—during a SWMM simulation.&lt;/p&gt;
&lt;p&gt;In addition to the base &lt;code inline=&quot;&quot;&gt;Node&lt;/code&gt; class, there are specialized subclasses:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;Outfall&lt;/code&gt;&lt;/strong&gt; for handling outfall-specific parameters and statistics&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;Storage&lt;/code&gt;&lt;/strong&gt; for extended storage node statistics&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This modular design makes it straightforward for modelers to handle general node properties while also supporting custom behaviors unique to storage nodes and outfalls.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Core Classes&lt;/h2&gt;
&lt;h3&gt;1. &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;Nodes&lt;/code&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: Manages a collection (iterator) of &lt;strong&gt;all&lt;/strong&gt; node objects within an open SWMM model.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Initialization&lt;/strong&gt;:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;nodes = Nodes(simulation_instance)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Ensures that the model (&lt;code inline=&quot;&quot;&gt;simulation_instance._model&lt;/code&gt;) is loaded. If not, it raises a &lt;code inline=&quot;&quot;&gt;PYSWMMException&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Iteration&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Supports Python’s iteration protocol (&lt;code inline=&quot;&quot;&gt;__iter__&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;__next__&lt;/code&gt;), allowing you to loop over nodes:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;for node in Nodes(sim):
    print(node.nodeid)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Each iteration returns a &lt;code inline=&quot;&quot;&gt;Node&lt;/code&gt; object (or one of its subclasses, such as &lt;code inline=&quot;&quot;&gt;Outfall&lt;/code&gt; or &lt;code inline=&quot;&quot;&gt;Storage&lt;/code&gt;), depending on the node’s SWMM type.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lookup&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;The &lt;code inline=&quot;&quot;&gt;__getitem__&lt;/code&gt; method lets you directly retrieve a specific node by ID:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;j1 = nodes[&#39;J1&#39;]
print(j1.depth)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;The correct subclass is assigned automatically if the node is an outfall or storage node.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Membership&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;The &lt;code inline=&quot;&quot;&gt;__contains__&lt;/code&gt; method checks whether a given node ID exists in the model:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;&quot;J1&quot; in nodes  # returns True or False
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Length&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;len(nodes)&lt;/code&gt; returns the total number of nodes in the model.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;2. &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;Node&lt;/code&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: Represents an individual SWMM node (junction, outfall, divider, or storage). This is the base class for all node types except for specialized functionality.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Initialization&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;j1 = Node(model_object, &quot;J1&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Ensures the model is loaded and the provided ID is valid for a node.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Common Parameters&lt;/strong&gt; (exposed as properties):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Geometry and Configuration&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;invert_elevation&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;full_depth&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;surcharge_depth&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;ponding_area&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;initial_depth&lt;/code&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;j1.invert_elevation = 20.0
current_invert = j1.invert_elevation
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Runtime Hydraulic Results&lt;/strong&gt; (retrieved during or after simulation stepping):
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;total_inflow&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;total_outflow&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;losses&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;volume&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;flooding&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;depth&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;head&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;lateral_inflow&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;hydraulic_retention_time&lt;/code&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;print(j1.depth, j1.total_inflow)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pollutant Quality&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;pollut_quality&lt;/code&gt;: Current concentration in the node’s water volume&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;inflow_quality&lt;/code&gt;: Quality of inflow entering the node&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;reactor_quality&lt;/code&gt;: Quality within the “mixed reactor” portion of the node
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;print(j1.pollut_quality)
j1.pollut_quality = (&#39;pollut_name&#39;, 50.0)  # sets pollutant concentration
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Helpers and Others&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;nodeid&lt;/code&gt;: The SWMM ID of the node&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;generated_inflow(...)&lt;/code&gt;: Directly sets an inflow rate into the node for real-time control or scenario testing.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;cumulative_inflow&lt;/code&gt;: Returns the total inflow volume over the simulation for continuity checks.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Node Type Checks&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;is_junction()&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;is_outfall()&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;is_storage()&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;is_divider()&lt;/code&gt; each returns a boolean indicating the node’s type based on SWMM’s internal classification.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Statistics&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;code inline=&quot;&quot;&gt;statistics&lt;/code&gt; property returns a dictionary of rolling/cumulative node statistics (e.g., average depth, max flooding rate, total surcharge duration).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;3. &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;Outfall&lt;/code&gt;&lt;/strong&gt; (Subclass of &lt;code inline=&quot;&quot;&gt;Node&lt;/code&gt;)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: Specializes the &lt;code inline=&quot;&quot;&gt;Node&lt;/code&gt; class for outfalls.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Primary Features&lt;/strong&gt;:
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;outfall_statistics&lt;/code&gt;&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Dictionary of outfall-specific metrics (e.g., average flowrate, peak flowrate, total pollutant loading).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;outfall_stage(stage)&lt;/code&gt;&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Overrides the outfall water surface elevation (head) at runtime, allowing a user to simulate tidal backwater conditions or other external water levels dynamically.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;with Simulation(&#39;network.inp&#39;) as sim:
    outfall_node = Nodes(sim)[&#39;OF1&#39;]  # This will be an Outfall object
    for step in sim:
        if step &amp;gt; 2.0:
            outfall_node.outfall_stage(5.0)  # Setting stage to 5.0
    stats = outfall_node.outfall_statistics
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;4. &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;Storage&lt;/code&gt;&lt;/strong&gt; (Subclass of &lt;code inline=&quot;&quot;&gt;Node&lt;/code&gt;)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: Specializes the &lt;code inline=&quot;&quot;&gt;Node&lt;/code&gt; class for storage nodes, such as detention basins or tanks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Primary Feature&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;storage_statistics&lt;/code&gt;: A dictionary of rolling/cumulative metrics relevant to storage units (e.g., initial volume, average volume, evaporation losses, exfiltration losses, maximum volume date).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;with Simulation(&#39;storage_model.inp&#39;) as sim:
    storage_node = Nodes(sim)[&#39;Tank1&#39;]  # This will be a Storage object
    for step in sim:
        pass
    stats = storage_node.storage_statistics
    print(&quot;Max volume:&quot;, stats[&quot;max_volume&quot;])
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;Typical Workflow&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Open a SWMM simulation&lt;/strong&gt;:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from pyswmm import Simulation, Nodes

with Simulation(&#39;my_network.inp&#39;) as sim:
    # ...
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Instantiate the &lt;code inline=&quot;&quot;&gt;Nodes&lt;/code&gt; collection&lt;/strong&gt;:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;nodes = Nodes(sim)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lookup or iterate over nodes&lt;/strong&gt;:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# Directly by ID
j1 = nodes[&#39;J1&#39;]
print(j1.depth, j1.head)

# Or by iteration
for node in nodes:
    print(node.nodeid, node.depth, node.is_outfall())
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Modify node parameters&lt;/strong&gt; (e.g., invert elevation):
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;j1.invert_elevation = 25.5
j1.initial_depth = 2.0
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Run or step through the simulation&lt;/strong&gt;:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;for step in sim:
    inflow = j1.total_inflow
    # Possibly add some external inflow if conditions are met
    if inflow &amp;lt; 1.0:
        j1.generated_inflow(1.2)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Retrieve final statistics&lt;/strong&gt;:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;print(j1.statistics)  # e.g., peak flooding, max depth date
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Outfall and Storage&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;If the node is an outfall or storage node, you can access specialized stats after the simulation:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;if j1.is_outfall():
    print(j1.outfall_statistics)

if j1.is_storage():
    print(j1.storage_statistics)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;Key Advantages&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;User-Friendly Access&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Node parameters are accessible through Python properties rather than opaque function calls or manual data parsing, reducing coding errors and improving readability.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;On-the-Fly Control&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;code inline=&quot;&quot;&gt;Node.generated_inflow(...)&lt;/code&gt; and &lt;code inline=&quot;&quot;&gt;Outfall.outfall_stage(...)&lt;/code&gt; methods allow real-time manipulation of node boundary conditions, enabling advanced control logic and scenario testing.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Subclass Specialization&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;Outfall&lt;/code&gt; and &lt;code inline=&quot;&quot;&gt;Storage&lt;/code&gt; classes surface relevant statistics that do not apply to generic nodes, making the interface more organized and clear.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Seamless Integration with SWMM&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;All reads and writes are internally routed through PySWMM’s low-level C-toolkit calls, ensuring direct and efficient communication with the SWMM engine.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;By defining &lt;code inline=&quot;&quot;&gt;Nodes&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;Node&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;Outfall&lt;/code&gt;, and &lt;code inline=&quot;&quot;&gt;Storage&lt;/code&gt;, this module simplifies how modelers and developers interact with SWMM nodes. It abstracts away lower-level API details and provides a clean, Pythonic syntax for reading and modifying both static and dynamic node attributes (inflow/outflow, depth, pollutant concentrations). This design makes PySWMM especially well-suited for tasks like real-time simulation control, data analysis, scenario-based optimization, and educational demonstrations of hydrodynamic modeling concepts.&lt;/p&gt;</description><link>http://www.swmmfive.com/2024/12/pyswmm-nodespy-summary.html</link><author>noreply@blogger.com (Robert Dickinson )</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-335789943869477383.post-3823071954252758961</guid><pubDate>Mon, 30 Dec 2024 20:18:00 +0000</pubDate><atom:updated>2024-12-30T15:45:27.940-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">PYSWMM lidcontrols.py Summary</category><title> PYSWMM lidcontrols.py Summary</title><description>&lt;p&gt;&amp;nbsp;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:&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Purpose and Context&lt;/h2&gt;
&lt;p&gt;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 (&lt;code inline=&quot;&quot;&gt;toolkitapi&lt;/code&gt;), these classes enable both pre-simulation configuration and dynamic, mid-simulation manipulation of LID settings (for those parameters allowed to be changed at runtime).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key ideas&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;One &lt;strong&gt;LidGroups&lt;/strong&gt; object corresponds to &lt;strong&gt;all&lt;/strong&gt; subcatchments in the model.&lt;/li&gt;
&lt;li&gt;Each &lt;strong&gt;LidGroup&lt;/strong&gt; object is associated with one subcatchment but may contain multiple LID units.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;LidUnit&lt;/strong&gt; 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).&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;Class-by-Class Overview&lt;/h2&gt;
&lt;h3&gt;1. &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;LidGroups&lt;/code&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Role&lt;/strong&gt;: Acts as a top-level container for LID usage across all subcatchments in the SWMM model.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Initialization&lt;/strong&gt;:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;lid_groups = LidGroups(simulation)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Checks if the SWMM model is open; raises &lt;code inline=&quot;&quot;&gt;PYSWMMException&lt;/code&gt; otherwise.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Key Behaviors&lt;/strong&gt;:
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Iteration&lt;/strong&gt; (&lt;code inline=&quot;&quot;&gt;__iter__&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;__next__&lt;/code&gt;):
&lt;ul&gt;
&lt;li&gt;Iterates over each subcatchment in the model by ID, returning a &lt;strong&gt;LidGroup&lt;/strong&gt; object.&lt;/li&gt;
&lt;li&gt;Uses &lt;code inline=&quot;&quot;&gt;__len__&lt;/code&gt; to report the total number of subcatchments.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lookup&lt;/strong&gt; (&lt;code inline=&quot;&quot;&gt;__getitem__&lt;/code&gt;):
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;lid_groups[subcatchment_id]&lt;/code&gt; yields the &lt;strong&gt;LidGroup&lt;/strong&gt; for that specific subcatchment, if it exists.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Contains&lt;/strong&gt; (&lt;code inline=&quot;&quot;&gt;__contains__&lt;/code&gt;):
&lt;ul&gt;
&lt;li&gt;Enables expressions like &lt;code inline=&quot;&quot;&gt;&quot;S1&quot; in lid_groups&lt;/code&gt; to check if subcatchment “S1” is valid.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;for group in LidGroups(sim):
    print(group)  # Prints each subcatchment ID that has LID usage defined
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;LidGroup&lt;/code&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Role&lt;/strong&gt;: Represents &lt;strong&gt;all&lt;/strong&gt; LID units associated with a single subcatchment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Initialization&lt;/strong&gt;:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;LidGroup(model, &quot;SubcatchmentID&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Ensures that the subcatchment exists and the model is open.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Key Behaviors&lt;/strong&gt;:
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Iteration / Lookup&lt;/strong&gt; (&lt;code inline=&quot;&quot;&gt;__iter__&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;__next__&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;__getitem__&lt;/code&gt;):
&lt;ul&gt;
&lt;li&gt;Iterates through each LID unit index (0, 1, 2, …) in the subcatchment, yielding &lt;strong&gt;LidUnit&lt;/strong&gt; objects.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;lid_group[i]&lt;/code&gt; returns the &lt;code inline=&quot;&quot;&gt;i&lt;/code&gt;-th LID unit in that subcatchment.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;len(lid_group)&lt;/code&gt; reveals how many LIDs are defined in this subcatchment.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aggregated Results&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;pervious_area&lt;/code&gt;&lt;/strong&gt;: Total pervious area associated with these LID units.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;flow_to_pervious&lt;/code&gt;&lt;/strong&gt;: Flow directed from the LID(s) to pervious surfaces.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;old_drain_flow&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;new_drain_flow&lt;/code&gt;&lt;/strong&gt;: The previous and current drain flows, summed across all LID units in this subcatchment.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Typical Use&lt;/strong&gt;:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;lid_group_S1 = LidGroups(sim)[&quot;S1&quot;]
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)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;LidUnit&lt;/code&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Role&lt;/strong&gt;: Encapsulates &lt;strong&gt;a single&lt;/strong&gt; LID instance (e.g., one green roof, one bioretention cell) within a subcatchment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Initialization&lt;/strong&gt;:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;LidUnit(model, subcatchment_id, lid_index)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;lid_index&lt;/code&gt; is the 0-based index for a particular LID usage record in that subcatchment’s &lt;code inline=&quot;&quot;&gt;[LID_USAGE]&lt;/code&gt; section.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sub-Components&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;surface&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;pavement&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;soil&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;storage&lt;/code&gt;&lt;/strong&gt;: Layer-specific objects (defined in &lt;code inline=&quot;&quot;&gt;pyswmm.lidunits&lt;/code&gt;) that manage the physical parameters of each layer (thickness, porosity, infiltration, etc.).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;water_balance&lt;/code&gt;&lt;/strong&gt;: Provides aggregated infiltration, evaporation, drain flow, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Key Properties&lt;/strong&gt;:
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;LID Setup&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;unit_area&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;full_width&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;initial_saturation&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;from_impervious&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;from_pervious&lt;/code&gt;: Fraction of runoff from impervious/pervious areas that is treated by this LID.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Routing and Drainage&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;drain_subcatchment&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;drain_node&lt;/code&gt;: Where underdrain flow is directed (other subcatchment or a node).&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;to_pervious&lt;/code&gt;: Whether outflow is sent to a pervious area (1) or not (0).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Runtime Results&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;dry_time&lt;/code&gt;: Time since last rainfall (in seconds).&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;old_drain_flow&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;new_drain_flow&lt;/code&gt;: Drain flow amounts in previous vs. current time step.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;evaporation&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;native_infiltration&lt;/code&gt;: Real-time rates for evaporation and infiltration.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IDs &amp;amp; Indices&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;index&lt;/code&gt;: The ID for the LID Control (matching &lt;code inline=&quot;&quot;&gt;ObjectType.LID&lt;/code&gt;) in the overall model.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;lid_control&lt;/code&gt;: Returns the textual ID of the LID control used (if &lt;code inline=&quot;&quot;&gt;index&lt;/code&gt; is known).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Typical Workflow&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;lid_group_s1 = LidGroups(sim)[&#39;S1&#39;]
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 = &quot;J5&quot;  # 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 = &quot;J6&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;Typical Use Cases&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Pre-Run Configuration&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Adjusting the LID area, fraction of impervious/pervious inflow, or drain routing node to experiment with different LID designs.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dynamic Control&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;During a SWMM simulation, changing &lt;code inline=&quot;&quot;&gt;drain_node&lt;/code&gt; or other runtime-adjustable parameters to test how real-time management might affect system performance.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data Extraction&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;After or during the run, retrieving LID results like &lt;code inline=&quot;&quot;&gt;new_drain_flow&lt;/code&gt; or &lt;code inline=&quot;&quot;&gt;evaporation&lt;/code&gt; helps measure performance, infiltration capacity, or water balance.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;Key Takeaways&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Hierarchical Design&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;LidGroups&lt;/code&gt; &amp;gt; &lt;code inline=&quot;&quot;&gt;LidGroup&lt;/code&gt; &amp;gt; &lt;code inline=&quot;&quot;&gt;LidUnit&lt;/code&gt; mirrors SWMM’s data organization:
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Model has multiple subcatchments (each subcatchment can have LID usage)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Each subcatchment’s LID usage can have multiple LID units&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Property Access&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Clear “getter” and “setter” properties for each LID parameter.&lt;/li&gt;
&lt;li&gt;Some parameters (e.g., &lt;code inline=&quot;&quot;&gt;drain_subcatchment&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;drain_node&lt;/code&gt;) can be altered &lt;em&gt;during&lt;/em&gt; simulation. Others (e.g., &lt;code inline=&quot;&quot;&gt;unit_area&lt;/code&gt;) must typically be set &lt;em&gt;before&lt;/em&gt; starting the simulation.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Integration with &lt;code inline=&quot;&quot;&gt;pyswmm.lidunits&lt;/code&gt;&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;code inline=&quot;&quot;&gt;LidUnit&lt;/code&gt; automatically includes references to sub-layer classes (&lt;code inline=&quot;&quot;&gt;Surface&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;Pavement&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;Soil&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;Storage&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;WaterBalance&lt;/code&gt;), which further expands the user’s control over LID components.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;Final Notes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Error Handling&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Raises &lt;code inline=&quot;&quot;&gt;PYSWMMException&lt;/code&gt; if the model is not open or if an invalid subcatchment/LID unit index is requested.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scalability&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;By iterating over &lt;code inline=&quot;&quot;&gt;LidGroups&lt;/code&gt; and each &lt;code inline=&quot;&quot;&gt;LidGroup&lt;/code&gt;, this design gracefully handles large models with many subcatchments and multiple LID units per subcatchment.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Real-Time Flexibility&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;The code supports dynamic adjustments to certain LID parameters mid-simulation, enabling advanced scenario testing and real-time control strategies in PySWMM.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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.&lt;/p&gt;</description><link>http://www.swmmfive.com/2024/12/pyswmm-lidcontrolspy-summary.html</link><author>noreply@blogger.com (Robert Dickinson )</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-335789943869477383.post-1008303018359915418</guid><pubDate>Mon, 30 Dec 2024 20:18:00 +0000</pubDate><atom:updated>2024-12-30T15:40:03.802-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">PYSWMM lidgroups.py Summary</category><title>PYSWMM lidgroups.py Summary</title><description>&lt;p&gt;&amp;nbsp;Below is an extended summary of this code, focusing on its structure, overarching purpose, and how each class interacts with SWMM’s LID (Low Impact Development) units at the subcatchment level.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;This module manages &lt;strong&gt;LID (Low Impact Development) usage&lt;/strong&gt; across subcatchments within a SWMM model. It introduces several Pythonic classes (&lt;code inline=&quot;&quot;&gt;LidGroups&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;LidGroup&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;LidUnit&lt;/code&gt;) that encapsulate SWMM’s underlying LID usage data, allowing users to retrieve, iterate over, and dynamically adjust LID parameters during a simulation. This higher-level interface is part of PySWMM and relies on lower-level calls to the SWMM toolkit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Capabilities&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Iterate Over LID Usage&lt;/strong&gt;: Provide loops and lookups to access all subcatchments with defined LIDs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Access/Modify LID Units&lt;/strong&gt;: Change certain LID parameters (e.g., area, drain node) before or even during a simulation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Retrieve Real-Time Results&lt;/strong&gt;: Get time-varying flow components (e.g., drain flow, infiltration, evaporation) from each LID unit during or after a simulation.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;Core Classes&lt;/h2&gt;
&lt;h3&gt;1. &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;LidGroups&lt;/code&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: Acts as a container/iterator for all subcatchment-level LID groups. Since every subcatchment can define one or more LID units, each subcatchment effectively “has” one LidGroup instance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Initialization&lt;/strong&gt;:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;lid_groups = LidGroups(sim)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Ensures that the SWMM model is open (&lt;code inline=&quot;&quot;&gt;fileLoaded == True&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Iteration&lt;/strong&gt; (&lt;code inline=&quot;&quot;&gt;__iter__&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;__next__&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;__getitem__&lt;/code&gt;):
&lt;ul&gt;
&lt;li&gt;Each iteration yields a &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;LidGroup&lt;/code&gt;&lt;/strong&gt; object representing the LID usage in a single subcatchment.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;len(lid_groups)&lt;/code&gt; returns the total number of subcatchments, which is also the number of lid groups (even if some subcatchments have 0 LID units).&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;lid_groups[some_subcatch_id]&lt;/code&gt; returns a &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;LidGroup&lt;/code&gt;&lt;/strong&gt; for that subcatchment.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Example&lt;/strong&gt;:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;for lid_group in LidGroups(sim):
    print(lid_group)  # Prints the subcatchment name
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;LidGroup&lt;/code&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: Represents all LID units defined &lt;strong&gt;within a specific subcatchment&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Initialization&lt;/strong&gt;:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;lid_group = LidGroup(model, &quot;SubcatchID&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Checks that the subcatchment ID is valid in the SWMM model.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Iteration&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Each iteration yields a &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;LidUnit&lt;/code&gt;&lt;/strong&gt; object.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;len(lid_group)&lt;/code&gt; returns how many LID units are defined on this subcatchment.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;lid_group[i]&lt;/code&gt; retrieves the &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;LidUnit&lt;/code&gt;&lt;/strong&gt; at index &lt;code inline=&quot;&quot;&gt;i&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LID Group-Level Results&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;pervious_area&lt;/code&gt;&lt;/strong&gt;: Amount of pervious area within this subcatchment influenced by LID(s).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;flow_to_pervious&lt;/code&gt;&lt;/strong&gt;: How much LID outflow is sent to pervious surfaces.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;old_drain_flow&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;new_drain_flow&lt;/code&gt;&lt;/strong&gt;: Drain flow from the previous/current simulation step, aggregated for all LID units in this subcatchment.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Example&lt;/strong&gt;:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;lid_group_j1_j3 = LidGroups(sim)[&quot;J1_J3_qqqqqqq&quot;]
lid_unit0 = lid_group_j1_j3[0]  # Access the first LID unit in subcatchment &quot;J1_J3_qqqqqqq&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;LidUnit&lt;/code&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: Encapsulates a &lt;strong&gt;single&lt;/strong&gt; LID usage instance within a subcatchment. For example, if a subcatchment has two “permeable pavement” LIDs, you can differentiate them via their indexes in the &lt;code inline=&quot;&quot;&gt;LidGroup&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Initialization&lt;/strong&gt;:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;lid_unit = LidUnit(model, &quot;SubcatchID&quot;, lid_index)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;lid_index&lt;/code&gt; is the 0-based index referencing a particular LID usage record in SWMM.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sub-Components / Layers&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;surface&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;pavement&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;soil&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;storage&lt;/code&gt;: Each of these returns a specialized class (&lt;code inline=&quot;&quot;&gt;Surface&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;Pavement&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;Soil&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;Storage&lt;/code&gt;) that manages layer-specific parameters (e.g., thickness, porosity, infiltration rates).&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;water_balance&lt;/code&gt;: Summarizes infiltration, evaporation, drain flow, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Parameters&lt;/strong&gt; (via &lt;code inline=&quot;&quot;&gt;@property&lt;/code&gt;):
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Physical Properties&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;unit_area&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;full_width&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;initial_saturation&lt;/code&gt;: how saturated the LID’s layers are at simulation start&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;from_impervious&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;from_pervious&lt;/code&gt;: fraction of drainage area from impervious/pervious surfaces directed to this LID unit&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Connections&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;index&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;number&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;to_pervious&lt;/code&gt;: references to how many units are replicated, whether outflow is sent to a pervious area, etc.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;drain_subcatchment&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;drain_node&lt;/code&gt;: IDs or indices specifying where the LID’s underdrain flow is routed (another subcatchment or a node).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Runtime Results&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;dry_time&lt;/code&gt;: time since last rainfall event (seconds)&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;old_drain_flow&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;new_drain_flow&lt;/code&gt;: drain flows at previous and current timestep.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;evaporation&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;native_infiltration&lt;/code&gt;: real-time infiltration and evaporation rates.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Modifiability&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Some parameters can only be changed &lt;strong&gt;before&lt;/strong&gt; a simulation (e.g., unit area, number of replicate units).&lt;/li&gt;
&lt;li&gt;Others (like &lt;code inline=&quot;&quot;&gt;drain_node&lt;/code&gt;) can be changed &lt;strong&gt;during&lt;/strong&gt; a simulation, enabling real-time control.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Typical Usage Examples&lt;/h2&gt;
&lt;h3&gt;A. Iterating Through All LID Groups and Units&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from pyswmm import Simulation, LidGroups

with Simulation(&#39;lid_model.inp&#39;) as sim:
    for lid_group in LidGroups(sim):
        print(&quot;Subcatchment with LID usage:&quot;, lid_group)

        for lid_unit in lid_group:
            print(&quot;  LID Unit Index:&quot;, lid_unit.index)
            print(&quot;  LID Area:&quot;, lid_unit.unit_area)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;B. Changing Drain Node Mid-Simulation&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from pyswmm import Simulation, LidGroups

with Simulation(&#39;lid_model.inp&#39;) as sim:
    lid_group_s1 = LidGroups(sim)[&#39;S1&#39;]
    lid_unit0 = lid_group_s1[0]

    for step_index, step_time in enumerate(sim):
        # After 50 simulation steps, reroute drain flow to node &quot;J04&quot;
        if step_index == 50:
            lid_unit0.drain_node = &quot;J04&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;C. Retrieving LID Performance Data&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from pyswmm import Simulation, LidGroups

with Simulation(&#39;lid_model.inp&#39;) as sim:
    lid_group_s1 = LidGroups(sim)[&#39;S1&#39;]
    lid_unit0 = lid_group_s1[0]

    for step in sim:
        # Access water balance layer
        wb = lid_unit0.water_balance
        print(&quot;Inflow:&quot;, wb.inflow)
        print(&quot;Drain Flow:&quot;, wb.drain_flow)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;Architectural Notes&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Integration with PySWMM&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The classes in this file build on top of the lower-level &lt;code inline=&quot;&quot;&gt;toolkitapi&lt;/code&gt; and the &lt;code inline=&quot;&quot;&gt;pyswmm.swmm5&lt;/code&gt; interface.&lt;/li&gt;
&lt;li&gt;They rely on numeric SWMM parameters, object indices, and enumerations for LID usage (&lt;code inline=&quot;&quot;&gt;LidUParams&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;LidUOptions&lt;/code&gt;, etc.).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Error Handling&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Custom exceptions (&lt;code inline=&quot;&quot;&gt;PYSWMMException&lt;/code&gt;) are raised if invalid IDs or indexes are used, or if the SWMM model is not open.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Consistency and Scalability&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Each subcatchment is associated with exactly one &lt;code inline=&quot;&quot;&gt;LidGroup&lt;/code&gt;, even if that group has zero or multiple LID units.&lt;/li&gt;
&lt;li&gt;The iteration pattern (&lt;code inline=&quot;&quot;&gt;__iter__&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;__next__&lt;/code&gt;) is consistent with Python best practices, allowing convenient loops over items.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Runtime Flexibility&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Because certain LID parameters can be adjusted mid-simulation, PySWMM opens the door to advanced real-time control scenarios, such as changing how water is routed or adjusting infiltration settings based on ongoing conditions.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;This code provides a high-level, object-oriented interface for managing and querying SWMM’s LID usage data at both subcatchment and individual LID levels. By encapsulating complex details into easy-to-use classes and properties, PySWMM empowers users to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enumerate and manage LID groups across all subcatchments,&lt;/li&gt;
&lt;li&gt;Modify LID unit parameters (e.g., drain nodes, area, infiltration) before or during a run,&lt;/li&gt;
&lt;li&gt;Examine real-time or post-run data (flow rates, infiltration, evaporation) for each LID unit.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This design greatly simplifies typical LID modeling and real-time control workflows, making sophisticated water management strategies more accessible to practitioners and researchers alike.&lt;/p&gt;</description><link>http://www.swmmfive.com/2024/12/pyswmm-lidgroupspy-summary.html</link><author>noreply@blogger.com (Robert Dickinson )</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-335789943869477383.post-5978214660810822912</guid><pubDate>Mon, 30 Dec 2024 20:18:00 +0000</pubDate><atom:updated>2024-12-30T15:37:03.772-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">PYSWMM lidlayers.py Summary</category><title> PYSWMM lidlayers.py Summary</title><description>&lt;p&gt;&amp;nbsp;Below is an extended summary of this code, focusing on its structure, purpose, and how each class fits into managing LID (Low Impact Development) layers in a SWMM model via PySWMM.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;This module defines &lt;strong&gt;layer-specific classes&lt;/strong&gt; that represent the different components of a Low Impact Development (LID) unit in SWMM (e.g., surface, soil, storage, pavement, drain, drain mat). Each class exposes properties that allow reading (and, in some cases, modifying) the physical or hydraulic parameters of the respective layer. These classes work in conjunction with PySWMM’s lower-level API (&lt;code inline=&quot;&quot;&gt;pyswmm.toolkitapi&lt;/code&gt;) to interface with SWMM’s C data structures.&lt;/p&gt;
&lt;h3&gt;Key Themes&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Layer Abstraction&lt;/strong&gt;&lt;br /&gt;
Each LID layer (e.g., &lt;strong&gt;Surface&lt;/strong&gt;, &lt;strong&gt;Soil&lt;/strong&gt;, &lt;strong&gt;Storage&lt;/strong&gt;) is encapsulated in its own class. This allows for a clean, modular approach where each set of parameters is logically grouped.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Property-Based Interface&lt;/strong&gt;&lt;br /&gt;
Parameters are generally accessed and modified through Pythonic properties. For example:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;lid_control_surface.roughness  # get the current roughness
lid_control_surface.roughness = 0.45  # set a new value
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Setters Before vs. During Simulation&lt;/strong&gt;&lt;br /&gt;
The docstrings and tables indicate that &lt;strong&gt;some parameters can only be changed before the simulation starts&lt;/strong&gt; (e.g., thickness, porosity), while others can be changed at runtime (e.g., roughness for certain layers, or the underdrain properties). This distinction is crucial for real-time simulation control and is enforced at a deeper level by SWMM or PySWMM.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Integration with &lt;code inline=&quot;&quot;&gt;LidControls&lt;/code&gt;&lt;/strong&gt;&lt;br /&gt;
In a typical workflow, a user would retrieve a &lt;code inline=&quot;&quot;&gt;LidControls&lt;/code&gt; object (e.g., &lt;code inline=&quot;&quot;&gt;lid_control = LidControls(sim)[&quot;LID_C1&quot;]&lt;/code&gt;) and then access one of these layer classes (&lt;code inline=&quot;&quot;&gt;lid_control.surface&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;lid_control.soil&lt;/code&gt;, etc.). The classes here rely on &lt;code inline=&quot;&quot;&gt;_lidcontrolid&lt;/code&gt; to locate and update the correct LID in the SWMM model.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;Classes and Their Roles&lt;/h2&gt;
&lt;h3&gt;1. &lt;code inline=&quot;&quot;&gt;Surface&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Represents the &lt;strong&gt;topmost (surface) layer&lt;/strong&gt; of an LID (e.g., a bioretention cell or green roof surface).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Key Properties&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;thickness&lt;/code&gt; (ponding or surface layer depth),&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;void_fraction&lt;/code&gt; (storage availability in the surface layer),&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;roughness&lt;/code&gt; (surface Manning’s n),&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;slope&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;side_slope&lt;/code&gt; (geometric slopes),&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;alpha&lt;/code&gt; (additional swale-flow parameter).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Setter Availability&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Most parameters can only be set before simulation except for &lt;code inline=&quot;&quot;&gt;roughness&lt;/code&gt;, which can also be changed during the simulation.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. &lt;code inline=&quot;&quot;&gt;Soil&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Corresponds to the &lt;strong&gt;soil layer&lt;/strong&gt; in LIDs such as bioretention or vegetative infiltration practices.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Key Properties&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;thickness&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;porosity&lt;/code&gt; (void volume fraction),&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;field_capacity&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;wilting_point&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;k_saturated&lt;/code&gt; (saturated hydraulic conductivity),&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;k_slope&lt;/code&gt; (slope of log(k) vs. moisture content curve),&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;suction_head&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Setter Availability&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Typically, soil parameters are only adjustable before a simulation starts.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. &lt;code inline=&quot;&quot;&gt;Storage&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Represents a &lt;strong&gt;storage or reservoir&lt;/strong&gt; layer (e.g., gravel layer beneath soil, or a storage zone in a permeable pavement design).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Key Properties&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;thickness&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;void_fraction&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;k_saturated&lt;/code&gt; (hydraulic conductivity in the storage zone),&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;clog_factor&lt;/code&gt; (captures deterioration or clogging over time).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Setter Availability&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;clog_factor&lt;/code&gt; can be adjusted before or during the simulation. Other parameters are typically set before simulation.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4. &lt;code inline=&quot;&quot;&gt;Pavement&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Used for &lt;strong&gt;permeable pavement&lt;/strong&gt;-related attributes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Key Properties&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;thickness&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;void_fraction&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;impervious_fraction&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;k_saturated&lt;/code&gt; (permeability),&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;clog_factor&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;regeneration&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;regeneration_degree&lt;/code&gt; (represent how often and effectively the pavement is maintained or unclogged).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Setter Availability&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;As with most layers, structural parameters (e.g., &lt;code inline=&quot;&quot;&gt;thickness&lt;/code&gt;) are set before the simulation; &lt;code inline=&quot;&quot;&gt;clog_factor&lt;/code&gt; is an exception that can be updated during runtime.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5. &lt;code inline=&quot;&quot;&gt;Drain&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Models the &lt;strong&gt;underdrain or outlet&lt;/strong&gt; of an LID, often found in rain barrels or bioretention cells with sub-surface drainage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Key Properties&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;coefficient&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;exponent&lt;/code&gt; (determine flow rate from underdrain),&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;offset&lt;/code&gt; (height of the drain above the bottom),&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;delay&lt;/code&gt; (rain barrel drain delay time),&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;open_head&lt;/code&gt; / &lt;code inline=&quot;&quot;&gt;close_head&lt;/code&gt; (head level triggers for opening or closing).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Setter Availability&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Underdrain parameters can typically be changed both before and during the simulation, enabling real-time control strategies.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6. &lt;code inline=&quot;&quot;&gt;DrainMat&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Represents a &lt;strong&gt;drainage mat layer&lt;/strong&gt;, such as in green roofs, which can be placed beneath soil to provide a drainage path.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Key Properties&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;thickness&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;void_fraction&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;roughness&lt;/code&gt; (akin to surface Manning’s n in the mat),&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;alpha&lt;/code&gt; (flow adjustment factor).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Setter Availability&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Similar to the other classes, with certain parameters (e.g., &lt;code inline=&quot;&quot;&gt;roughness&lt;/code&gt;) potentially modifiable during runtime, while others (e.g., &lt;code inline=&quot;&quot;&gt;thickness&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;void_fraction&lt;/code&gt;) must be set beforehand.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Typical Usage&lt;/h2&gt;
&lt;p&gt;A standard workflow might look like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from pyswmm import Simulation, LidControls

with Simulation(&#39;example_lid_model.inp&#39;) as sim:
    # Access a specific LID control by its name/ID
    lid_control = LidControls(sim)[&#39;MyGreenRoof&#39;]

    # Retrieve layer-specific handlers
    surface_layer = lid_control.surface
    soil_layer = lid_control.soil
    drain_mat_layer = lid_control.drain_mat

    # Inspect or change parameters:
    print(&quot;Current surface roughness:&quot;, surface_layer.roughness)
    surface_layer.roughness = 0.05

    print(&quot;Soil porosity:&quot;, soil_layer.porosity)
    soil_layer.porosity = 0.6

    # Step through simulation to see if changes are recognized
    for step in sim:
        # Potentially update drain coefficients at runtime
        pass
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Obtain &lt;code inline=&quot;&quot;&gt;lid_control&lt;/code&gt;&lt;/strong&gt; from &lt;code inline=&quot;&quot;&gt;LidControls(sim)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Access individual layers via properties like &lt;code inline=&quot;&quot;&gt;lid_control.surface&lt;/code&gt; or &lt;code inline=&quot;&quot;&gt;lid_control.soil&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Get or set the desired property.&lt;/li&gt;
&lt;li&gt;If the property is allowed to change during the simulation, you can do so within the simulation loop.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;Key Takeaways&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Layer-Specific Encapsulation&lt;/strong&gt;: Each class (Surface, Soil, Storage, Pavement, Drain, DrainMat) isolates the parameters relevant to that part of the LID, making code more organized and readable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Property Getters/Setters&lt;/strong&gt;: Provide a straightforward, Pythonic way to inspect and modify layer parameters without dealing with raw SWMM data structures.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pre-Simulation vs. Runtime Edits&lt;/strong&gt;: Some parameters (e.g., thickness) can only be changed before the model runs, while others (e.g., drain coefficients) can also be changed during the simulation—an important distinction for real-time control or scenario testing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deeper Integration&lt;/strong&gt;: Used in tandem with &lt;code inline=&quot;&quot;&gt;LidControls&lt;/code&gt; and &lt;code inline=&quot;&quot;&gt;Simulation&lt;/code&gt; classes, these layers form the backbone of how PySWMM manages LIDs, facilitating both design-time configuration and on-the-fly adjustments.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In short, these classes provide a powerful, granular interface to SWMM’s LID modeling capabilities, enabling a wide range of hydraulic/hydrologic and real-time control workflows in Python.&lt;/p&gt;</description><link>http://www.swmmfive.com/2024/12/pyswmm-lidlayerspy-summary.html</link><author>noreply@blogger.com (Robert Dickinson )</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-335789943869477383.post-7000778263923277535</guid><pubDate>Mon, 30 Dec 2024 20:17:00 +0000</pubDate><atom:updated>2024-12-30T15:48:56.608-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">PYSWMM raingages.py Summary</category><title>PYSWMM raingages.py Summary</title><description>&lt;p&gt;&amp;nbsp;Below is an extended summary of the code, focusing on how it is structured, its purpose, and how each component integrates with SWMM’s rain gage data in a Pythonic manner.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;This module defines classes (&lt;code inline=&quot;&quot;&gt;RainGages&lt;/code&gt; and &lt;code inline=&quot;&quot;&gt;RainGage&lt;/code&gt;) that give users high-level, Pythonic access to the &lt;strong&gt;rain gage objects&lt;/strong&gt; in a SWMM model. It is part of PySWMM’s object-oriented interface, leveraging underlying toolkit functions to manage and modify precipitation data. Specifically, it enables you to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Iterate over&lt;/strong&gt; all rain gages in a SWMM model.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Retrieve&lt;/strong&gt; or &lt;strong&gt;update&lt;/strong&gt; each gage’s precipitation rate (total precipitation, rainfall, snowfall).&lt;/li&gt;
&lt;li&gt;Integrate changes into running or completed simulations for scenario testing or real-time control.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;Key Classes&lt;/h2&gt;
&lt;h3&gt;1. &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;RainGages&lt;/code&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: Acts as a container/iterator for all &lt;strong&gt;rain gage&lt;/strong&gt; objects in a SWMM model.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Initialization&lt;/strong&gt;:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;raingages = RainGages(simulation_instance)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Validates that the SWMM model is open; if not, raises &lt;code inline=&quot;&quot;&gt;PYSWMMException&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Functionality&lt;/strong&gt;:
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Length and Existence&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;len(raingages)&lt;/code&gt; returns the count of all rain gages in the model.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;&quot;Gage1&quot; in raingages&lt;/code&gt; checks whether a given gage ID exists.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lookup&lt;/strong&gt; (&lt;code inline=&quot;&quot;&gt;__getitem__&lt;/code&gt;)
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;raingages[&quot;Gage1&quot;]&lt;/code&gt; returns a &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;RainGage&lt;/code&gt;&lt;/strong&gt; object corresponding to that gage ID, or raises an exception if the ID is invalid.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Iteration&lt;/strong&gt; (&lt;code inline=&quot;&quot;&gt;__iter__&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;__next__&lt;/code&gt;)
&lt;ul&gt;
&lt;li&gt;Allows a for-loop over all rain gages in the model:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;for gage in RainGages(sim):
    print(gage.raingageid, gage.total_precip)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Typical Usage&lt;/strong&gt;:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from pyswmm import Simulation, RainGages

with Simulation(&#39;my_model.inp&#39;) as sim:
    for gage in RainGages(sim):
        print(gage.raingageid)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;RainGage&lt;/code&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Purpose&lt;/strong&gt;: Represents an individual &lt;strong&gt;rain gage&lt;/strong&gt; in the SWMM model, enabling property-based access to precipitation parameters.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Initialization&lt;/strong&gt;:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;rg = RainGage(model, &quot;RainGageID&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Validates that the rain gage ID exists in the model.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Key Properties&lt;/strong&gt;:
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;raingageid&lt;/code&gt;&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Returns the SWMM ID of the gage (e.g., &lt;code inline=&quot;&quot;&gt;&quot;Gage1&quot;&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;total_precip&lt;/code&gt;&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Gets/sets total precipitation rate at the gage (in/hr or mm/hr, depending on model units).&lt;/li&gt;
&lt;li&gt;Setting this property can be used to modify precipitation mid-simulation for control or scenario testing.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;rainfall&lt;/code&gt;&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Retrieves the current rainfall portion of &lt;code inline=&quot;&quot;&gt;total_precip&lt;/code&gt; (i.e., not including snowfall).&lt;/li&gt;
&lt;li&gt;Read-only property (cannot be set directly).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;snowfall&lt;/code&gt;&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Retrieves the snowfall portion of &lt;code inline=&quot;&quot;&gt;total_precip&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Read-only property (cannot be set directly).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Usage Example&lt;/strong&gt;:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from pyswmm import Simulation, RainGages

with Simulation(&quot;my_model.inp&quot;) as sim:
    rg1 = RainGages(sim)[&quot;Gage1&quot;]
    
    for step in sim:
        # Print the real-time precipitation
        print(&quot;Total precip:&quot;, rg1.total_precip)
        
        # Dynamically adjust if needed
        if rg1.total_precip &amp;lt; 0.1:
            rg1.total_precip = 0.1  # Increase precipitation artificially
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Typical Workflow&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Open a SWMM simulation&lt;/strong&gt; (context manager with &lt;code inline=&quot;&quot;&gt;Simulation&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Create a &lt;code inline=&quot;&quot;&gt;RainGages&lt;/code&gt; instance&lt;/strong&gt; and loop or lookup a specific gage by its ID.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Read or modify&lt;/strong&gt; &lt;code inline=&quot;&quot;&gt;RainGage&lt;/code&gt; properties (like &lt;code inline=&quot;&quot;&gt;total_precip&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;(Optionally) step through the simulation if real-time changes are being made.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Close&lt;/strong&gt; the simulation context, freeing resources and finalizing results.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;Example Scenarios&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Pre-Run Rainfall Adjustment&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Before starting a simulation, set a new total precipitation rate for a gage to simulate a storm event more severe than the default.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Real-Time Control&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;During the simulation, detect if certain nodes are flooding and reduce &lt;code inline=&quot;&quot;&gt;total_precip&lt;/code&gt; to explore hypothetical weather diversion scenarios. (Although artificially changing precipitation mid-run can be used for scenario testing, it does not necessarily reflect typical physical reality, but it is helpful for stress testing or modeling alternative events.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Post-Run Data Extraction&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;If the precipitation rates are recorded over time, you can simply read them at each time step for data analysis or visualization purposes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;Design and Integration&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;These classes rely on PySWMM’s internal &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;_model&lt;/code&gt;&lt;/strong&gt; pointer to the SWMM solver object and the &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;toolkitapi&lt;/code&gt;&lt;/strong&gt; enumerations (&lt;code inline=&quot;&quot;&gt;RainGageResults.total_precip&lt;/code&gt;, etc.).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;RainGage&lt;/code&gt;&lt;/strong&gt; retrieves or sets precipitation using SWMM’s internal functions (&lt;code inline=&quot;&quot;&gt;getGagePrecip&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;setGagePrecip&lt;/code&gt;), bridging low-level C structures with Pythonic properties.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;RainGages&lt;/code&gt;&lt;/strong&gt; streamlines iteration, enabling code that is more natural for Python developers (e.g., for-loops, membership checks, etc.).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;This module encapsulates SWMM’s rain gage objects into a clean, intuitive interface. Developers and modelers can easily:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Discover&lt;/strong&gt; all rain gages.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Get or set&lt;/strong&gt; precipitation rates at each gage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Integrate&lt;/strong&gt; real-time or scenario-based changes into the SWMM simulation loop.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Such functionality is particularly valuable for dynamic modeling scenarios, calibration, and sensitivity analyses, as well as for educational demonstrations of how changing rainfall intensities can affect drainage system behavior.&lt;/p&gt;</description><link>http://www.swmmfive.com/2024/12/pyswmm-raingagespy-summary.html</link><author>noreply@blogger.com (Robert Dickinson )</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-335789943869477383.post-5229400231572598319</guid><pubDate>Mon, 30 Dec 2024 20:16:00 +0000</pubDate><atom:updated>2024-12-30T15:52:33.872-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">PYSWMM reader.py Summary</category><title>PYSWMM reader.py Summary</title><description>&lt;p&gt;&amp;nbsp;Below is an extended summary of the &lt;code inline=&quot;&quot;&gt;SWMMBinReader&lt;/code&gt; class and its supporting components. It explains the purpose of this code, how it fits into PySWMM’s architecture, and the role of each method in reading and processing a SWMM output file (.out).&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;This module provides a &lt;strong&gt;low-level output reading interface&lt;/strong&gt; for SWMM (Storm Water Management Model) binary result files. It defines a &lt;code inline=&quot;&quot;&gt;SWMMBinReader&lt;/code&gt; class (though it raises a “Not Implemented” exception by design in this snippet) that, once implemented, would allow Python code to open and parse SWMM’s binary &lt;code inline=&quot;&quot;&gt;.out&lt;/code&gt; files to extract simulation results (e.g., flow rates, water depths, pollutant concentrations, etc.).&lt;/p&gt;
&lt;p&gt;Key tasks include:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Opening/Closing&lt;/strong&gt; SWMM output files.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reading&lt;/strong&gt; metadata (e.g., start time, report interval, total number of simulation periods).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fetching&lt;/strong&gt; IDs for subcatchments, nodes, links, and pollutants stored in the output.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extracting&lt;/strong&gt; time series or single-time-step data for various attributes (rainfall, runoff, water depth, flow, etc.) across subcatchments, nodes, links, or system-level outputs.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Although the class currently raises &lt;code inline=&quot;&quot;&gt;OutReaderNotImplementedYet&lt;/code&gt;, it outlines how one would integrate with SWMM’s output API DLL (which is referred to as &lt;code inline=&quot;&quot;&gt;outputAPI_winx86.dll&lt;/code&gt; in some comments) and map its C functions to Python.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Structure and Key Components&lt;/h2&gt;
&lt;h3&gt;1. &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;_Opaque&lt;/code&gt; Class&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;code inline=&quot;&quot;&gt;ctypes.Structure&lt;/code&gt; used to represent the underlying C-struct pointer (&lt;code inline=&quot;&quot;&gt;smoapi&lt;/code&gt;) that references SWMM’s output reading library.&lt;/li&gt;
&lt;li&gt;Acts as a placeholder so that the Python code can store a pointer to the C library’s internal data structures.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;SWMMBinReader&lt;/code&gt; Class&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Purpose&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Creates a wrapper around SWMM’s output API library, providing methods to &lt;strong&gt;open&lt;/strong&gt;, &lt;strong&gt;close&lt;/strong&gt;, and &lt;strong&gt;read&lt;/strong&gt; data from a SWMM &lt;code inline=&quot;&quot;&gt;.out&lt;/code&gt; file in Pythonic ways.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Notable Attributes and Methods&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;__init__&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Note&lt;/em&gt;: The snippet immediately raises &lt;code inline=&quot;&quot;&gt;OutReaderNotImplementedYet&lt;/code&gt;, signaling that full functionality was not yet provided.&lt;/li&gt;
&lt;li&gt;Normally, it would load the SWMM output API DLL, store function pointers, and set up argument/return types for each C function.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;OpenBinFile(self, OutLoc)&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Would call C functions (&lt;code inline=&quot;&quot;&gt;SMO_init&lt;/code&gt; and &lt;code inline=&quot;&quot;&gt;SMO_open&lt;/code&gt;) to open a SWMM binary results file from disk.&lt;/li&gt;
&lt;li&gt;On failure, it raises an exception with a relevant error message.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;CloseBinFile(self)&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Closes the output file and frees resources by calling SWMM’s &lt;code inline=&quot;&quot;&gt;SMO_close&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Deletes any cached subcatchment, node, link, or pollutant ID lists from the class instance.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Helpers for ID Caching&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;_get_SubcatchIDs&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;_get_NodeIDs&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;_get_LinkIDs&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;_get_PollutantIDs&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Each retrieves the name strings for subcatchments, nodes, links, or pollutants from the output file and caches them in Python dictionaries (&lt;code inline=&quot;&quot;&gt;self.SubcatchmentIDs&lt;/code&gt;, etc.). These methods rely on SWMM’s &lt;code inline=&quot;&quot;&gt;SMO_getElementName&lt;/code&gt; function.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;get_IDs(self, SMO_elementIDType)&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Returns a list of IDs for a given element type (e.g., subcatchments, nodes, links, pollutants).&lt;/li&gt;
&lt;li&gt;If not already cached, it calls one of the &lt;code inline=&quot;&quot;&gt;_get_*IDs&lt;/code&gt; methods to build the dictionary.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;get_Units(self, unit)&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Returns the flow/concentration unit system used by the output.&lt;/li&gt;
&lt;li&gt;Internally calls SWMM’s &lt;code inline=&quot;&quot;&gt;SMO_getUnits&lt;/code&gt; to determine if flow is in CFS, CMS, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;get_Times(self, SMO_timeElementType)&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fetches time-related parameters (e.g., reporting interval, number of periods) from the output.&lt;/li&gt;
&lt;li&gt;Ties to SWMM’s &lt;code inline=&quot;&quot;&gt;SMO_getTimes&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;get_StartTime(self)&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code inline=&quot;&quot;&gt;_get_StartTimeSWMM(self)&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Retrieves the simulation start date/time as a floating-point “Julian date” from the SWMM library.&lt;/li&gt;
&lt;li&gt;Converts it to a Python &lt;code inline=&quot;&quot;&gt;datetime&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;get_TimeSeries(self)&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Constructs a Python list of &lt;code inline=&quot;&quot;&gt;datetime&lt;/code&gt; objects for each reporting timestep by starting at &lt;code inline=&quot;&quot;&gt;get_StartTime&lt;/code&gt; and incrementing in steps of the reporting interval.&lt;/li&gt;
&lt;li&gt;Returns a convenient timeline for index-based data retrieval.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;get_ProjectSize(self, SMO_elementCount)&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Returns the total count of a particular type of element (subcatchments, nodes, links, or pollutants).&lt;/li&gt;
&lt;li&gt;Calls SWMM’s &lt;code inline=&quot;&quot;&gt;SMO_getProjectSize&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;11&quot;&gt;
&lt;li&gt;&lt;strong&gt;Data Retrieval Methods&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;get_Series(...)&lt;/code&gt;&lt;/strong&gt;: Returns time-series data for a particular element (subcatchment, node, link, or system attribute) from a start to end index. Internally uses SWMM’s &lt;code inline=&quot;&quot;&gt;SMO_getSubcatchSeries&lt;/code&gt;, &lt;code inline=&quot;&quot;&gt;SMO_getNodeSeries&lt;/code&gt;, etc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;get_Attribute(...)&lt;/code&gt;&lt;/strong&gt;: Returns a snapshot (e.g., across all nodes or all links) of a particular attribute at one time index.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;get_Result(...)&lt;/code&gt;&lt;/strong&gt;: Returns &lt;strong&gt;all&lt;/strong&gt; attributes for a specific subcatchment, node, or link (or system-level data) at a single time index.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Error Handling&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Many methods check the return value of SWMM’s C functions (&lt;code inline=&quot;&quot;&gt;ErrNo&lt;/code&gt;) and raise exceptions with a descriptive message if non-zero. They use a dictionary &lt;code inline=&quot;&quot;&gt;tka.DLLErrorKeys&lt;/code&gt; to map numeric error codes to strings.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Typical Usage Flow (Hypothetical)&lt;/h2&gt;
&lt;p&gt;Although this particular snippet includes a raised exception to indicate “not yet implemented,” a fully functional version would follow this workflow:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Instantiate&lt;/strong&gt; the reader:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;reader = SWMMBinReader()
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Open&lt;/strong&gt; a SWMM &lt;code inline=&quot;&quot;&gt;.out&lt;/code&gt; file:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;reader.OpenBinFile(&quot;my_simulation.out&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Query&lt;/strong&gt; basic info (e.g., number of nodes):
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;node_count = reader.get_ProjectSize(tka.SMO_elementCount.nodeCount.value)
node_ids = reader.get_IDs(tka.SMO_elementType.SM_node.value)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fetch&lt;/strong&gt; a timeseries for a particular node attribute:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;flow_series = reader.get_Series(
    tka.SMO_elementType.SM_node.value,
    tka.SMO_systemAttribute.total_inflow,
    &quot;Node1&quot;,
    0,   # start index
    100  # end index
)
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Close&lt;/strong&gt; once done:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;reader.CloseBinFile()
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;Integration with PySWMM&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;This code references and expands upon PySWMM’s &lt;code inline=&quot;&quot;&gt;toolkitapi&lt;/code&gt; module (&lt;code inline=&quot;&quot;&gt;pyswmm.toolkitapi as tka&lt;/code&gt;), which defines enumerations and error-handling keys (e.g., &lt;code inline=&quot;&quot;&gt;DLLErrorKeys&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;The approach is consistent with how PySWMM typically uses &lt;code inline=&quot;&quot;&gt;ctypes&lt;/code&gt; to invoke underlying SWMM C functions.&lt;/li&gt;
&lt;li&gt;Once finished, this low-level API would be part of the backbone for a higher-level interface (like &lt;code inline=&quot;&quot;&gt;pyswmm.Output&lt;/code&gt;) that simplifies reading &lt;code inline=&quot;&quot;&gt;.out&lt;/code&gt; files for subcatchment or node results.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Although the snippet raises a “Not Implemented” exception by design, the &lt;code inline=&quot;&quot;&gt;SWMMBinReader&lt;/code&gt; class outlines a &lt;strong&gt;robust approach for opening and parsing SWMM output files&lt;/strong&gt; in Python. Its methods detail how one might:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Locate&lt;/strong&gt; and load a library (&lt;code inline=&quot;&quot;&gt;outputAPI_winx86.dll&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Initialize&lt;/strong&gt; a SWMM output reading session (&lt;code inline=&quot;&quot;&gt;smoapi&lt;/code&gt; pointer).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Retrieve&lt;/strong&gt; IDs, time steps, and simulation results for subcatchments, nodes, links, or system attributes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Convert&lt;/strong&gt; data (e.g., Julian times) into Python-friendly formats (&lt;code inline=&quot;&quot;&gt;datetime&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In a fully implemented system, &lt;code inline=&quot;&quot;&gt;SWMMBinReader&lt;/code&gt; would serve as the foundational class enabling advanced post-processing or real-time data consumption from SWMM binary outputs within Python.&lt;/p&gt;</description><link>http://www.swmmfive.com/2024/12/pyswmm-readerpy-summary.html</link><author>noreply@blogger.com (Robert Dickinson )</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-335789943869477383.post-6609463354418953212</guid><pubDate>Mon, 30 Dec 2024 20:15:00 +0000</pubDate><atom:updated>2024-12-30T15:58:08.440-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">PYSWMM subcatchments.py Summary</category><title>PYSWMM subcatchments.py Summary</title><description>&lt;p&gt;&amp;nbsp;Below is an extended summary of the code, describing its purpose, structure, and how the classes integrate with PySWMM to manage and query &lt;strong&gt;subcatchment&lt;/strong&gt; data within a SWMM model.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;This module provides Pythonic wrappers for interacting with &lt;strong&gt;subcatchments&lt;/strong&gt; in a SWMM (Storm Water Management Model) simulation. It defines two main classes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;Subcatchments&lt;/code&gt;&lt;/strong&gt; – A container/iterator over all subcatchments, allowing you to list, retrieve, and check the existence of subcatchments by ID.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;Subcatchment&lt;/code&gt;&lt;/strong&gt; – A single subcatchment object, offering property-based access to both static parameters (e.g., area, slope) and dynamic simulation results (e.g., rainfall, runoff).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Together, they bridge SWMM’s low-level C toolkit and Python, enabling users to modify or read subcatchment data in near real-time as a simulation proceeds.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;code inline=&quot;&quot;&gt;Subcatchments&lt;/code&gt;&lt;/h2&gt;
&lt;h3&gt;Purpose&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Acts as a Python collection of &lt;strong&gt;all&lt;/strong&gt; subcatchments in an open SWMM model.&lt;/li&gt;
&lt;li&gt;Integrates with PySWMM’s internal &lt;code inline=&quot;&quot;&gt;_model&lt;/code&gt; pointer (which references the SWMM engine) to iterate through or lookup individual subcatchments.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Key Behaviors&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Initialization&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;subcatchments = Subcatchments(simulation_object)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Checks if the model is open; otherwise raises a &lt;code inline=&quot;&quot;&gt;PYSWMMException&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Length and Containment&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;len(subcatchments)&lt;/code&gt; returns the total number of subcatchments in the model.&lt;/li&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;&quot;S1&quot; in subcatchments&lt;/code&gt; checks if a subcatchment with ID &lt;code inline=&quot;&quot;&gt;&quot;S1&quot;&lt;/code&gt; exists.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Lookup&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;subcatchments[&quot;S1&quot;]&lt;/code&gt; returns a &lt;code inline=&quot;&quot;&gt;Subcatchment&lt;/code&gt; instance corresponding to subcatchment &lt;code inline=&quot;&quot;&gt;S1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Raises a &lt;code inline=&quot;&quot;&gt;PYSWMMException&lt;/code&gt; if the ID is invalid.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Iteration&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code inline=&quot;&quot;&gt;for sc in subcatchments:&lt;/code&gt; yields &lt;code inline=&quot;&quot;&gt;Subcatchment&lt;/code&gt; objects one by one, in the order the subcatchments are stored in SWMM.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Example Usage&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from pyswmm import Simulation, Subcatchments

with Simulation(&quot;my_model.inp&quot;) as sim:
    subcs = Subcatchments(sim)
    print(len(subcs))           # e.g., prints total number of subcatchments

    for sc in subcs:
        print(sc.subcatchmentid)   # e.g., &quot;S1&quot;, &quot;S2&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;code inline=&quot;&quot;&gt;Subcatchment&lt;/code&gt;&lt;/h2&gt;
&lt;h3&gt;Purpose&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Represents &lt;strong&gt;one&lt;/strong&gt; subcatchment in a SWMM model.&lt;/li&gt;
&lt;li&gt;Exposes both &lt;strong&gt;static&lt;/strong&gt; parameters (width, area, slope) and &lt;strong&gt;dynamic&lt;/strong&gt; (time-varying) results (runoff, infiltration, etc.).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Initialization&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;subcatchment_obj = Subcatchment(model, &quot;S1&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Validates that &lt;code inline=&quot;&quot;&gt;&quot;S1&quot;&lt;/code&gt; exists in the model’s subcatchment list.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Key Properties&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Identifiers &amp;amp; Connections&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;subcatchmentid&lt;/code&gt;&lt;/strong&gt;: The SWMM ID (e.g., &quot;S1&quot;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;connection&lt;/code&gt;&lt;/strong&gt;: A tuple indicating where runoff is sent (another subcatchment or a node). Example return: &lt;code inline=&quot;&quot;&gt;(2, &#39;J2&#39;)&lt;/code&gt;, meaning the runoff flows to a node with ID &quot;J2.&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Subcatchment Parameters&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;width&lt;/code&gt;&lt;/strong&gt; (effective flow width).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;area&lt;/code&gt;&lt;/strong&gt; (subcatchment area).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;percent_impervious&lt;/code&gt;&lt;/strong&gt; (fraction of area that is impervious).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;slope&lt;/code&gt;&lt;/strong&gt; (average slope).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;curb_length&lt;/code&gt;&lt;/strong&gt; (total length of curbs).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each parameter has both a getter and setter, allowing real-time or pre-run modifications:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;s1.area = 50.0
current_area = s1.area
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Simulation Results&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;rainfall&lt;/code&gt;&lt;/strong&gt;: Instantaneous rainfall on the subcatchment (in user-defined units).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;evaporation_loss&lt;/code&gt;&lt;/strong&gt;: Current evaporation rate from the subcatchment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;infiltration_loss&lt;/code&gt;&lt;/strong&gt;: Current infiltration rate.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;runon&lt;/code&gt;&lt;/strong&gt;: Lateral inflow from other surfaces.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;runoff&lt;/code&gt;&lt;/strong&gt;: Current runoff rate leaving the subcatchment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;snow_depth&lt;/code&gt;&lt;/strong&gt;: Current snow depth (if snowmelt is modeled).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pollutant-Related&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;buildup&lt;/code&gt;&lt;/strong&gt;: Surface buildup amounts for each pollutant.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;conc_ponded&lt;/code&gt;&lt;/strong&gt;: Pollutant concentration in any ponded water.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;pollut_quality&lt;/code&gt;&lt;/strong&gt;: Pollutant concentration in subcatchment runoff.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;runoff_total_loading&lt;/code&gt;&lt;/strong&gt;: Total pollutant mass leaving the subcatchment in runoff.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each of these returns a dictionary keyed by pollutant ID, e.g.:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;{
    &quot;TSS&quot;: 12.3,
    &quot;Lead&quot;: 0.05
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code inline=&quot;&quot;&gt;statistics&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Returns rolling/cumulative subcatchment flow stats (total precipitation, runon, evap, infiltration, total runoff, and peak runoff rate).&lt;/li&gt;
&lt;li&gt;Example structure:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;{
  &quot;precipitation&quot;: 2.15,
  &quot;runon&quot;: 0.5,
  &quot;evaporation&quot;: 0.1,
  &quot;infiltration&quot;: 0.3,
  &quot;runoff&quot;: 1.7,
  &quot;peak_runoff_rate&quot;: 0.12
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Example Usage&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;with Simulation(&quot;my_model.inp&quot;) as sim:
    s1 = Subcatchments(sim)[&quot;S1&quot;]
    # Modify area
    s1.area = 20.0
    # Access time-varying results during the run
    for step in sim:
        print(&quot;Runoff at this timestep:&quot;, s1.runoff)
        print(&quot;Pollutant buildup:&quot;, s1.buildup)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;Typical Workflow&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Open a Simulation&lt;/strong&gt; (context-manager recommended):
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from pyswmm import Simulation, Subcatchments

with Simulation(&quot;model.inp&quot;) as sim:
    subc_collection = Subcatchments(sim)
    ...
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Access a Subcatchment&lt;/strong&gt;:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;s1 = subc_collection[&quot;S1&quot;]
print(s1.area, s1.percent_impervious)
s1.slope = 0.015
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Iterate&lt;/strong&gt; During a Simulation:
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;for step in sim:
    current_runoff = s1.runoff
    # Possibly adjust properties or log data
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Utilize Pollutant Data&lt;/strong&gt; (if water quality is enabled):
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# e.g., TSS concentration in S1&#39;s runoff
tss_conc = s1.pollut_quality[&quot;TSS&quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Close&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;The &lt;code inline=&quot;&quot;&gt;Simulation&lt;/code&gt; context manager automatically finalizes the SWMM run.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;Error Handling&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;code inline=&quot;&quot;&gt;PYSWMMException&lt;/code&gt; is raised if:
&lt;ul&gt;
&lt;li&gt;The SWMM model file hasn’t been opened.&lt;/li&gt;
&lt;li&gt;A subcatchment ID doesn’t exist when requested.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Key Benefits&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pythonic Access&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Subcatchment properties (e.g., area, slope) and real-time results (e.g., runoff rate) can be read or updated via standard property syntax, making the code more readable and maintainable than direct calls to the C API.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Real-Time Control&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Parameters can be modified mid-simulation if needed, supporting advanced scenario testing or real-time control strategies.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Intuitive Iteration&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;code inline=&quot;&quot;&gt;Subcatchments&lt;/code&gt; class supports Python’s iteration protocol and membership checks, improving discoverability and dynamic analysis of subcatchments.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pollutant Loading &amp;amp; Quality&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Built-in methods return dictionaries keyed by pollutant ID, simplifying water quality analysis or post-processing tasks.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;The &lt;code inline=&quot;&quot;&gt;Subcatchments&lt;/code&gt; and &lt;code inline=&quot;&quot;&gt;Subcatchment&lt;/code&gt; classes offer a high-level interface to SWMM’s subcatchment data, allowing Python developers and modelers to manipulate and observe hydrologic processes in near real-time. By exposing subcatchment parameters and simulation outputs in a straightforward, property-based manner, they further streamline typical tasks like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Parameter adjustments&lt;/strong&gt; (e.g., changing area or slope).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hydrologic result retrieval&lt;/strong&gt; (e.g., rainfall, infiltration, or runoff).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pollutant water quality checks&lt;/strong&gt; (e.g., buildup, runoff concentration).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Together, they make modeling workflows in PySWMM more intuitive, robust, and Pythonic.&lt;/p&gt;</description><link>http://www.swmmfive.com/2024/12/pyswmm-subcatchmentspy-summary.html</link><author>noreply@blogger.com (Robert Dickinson )</author><thr:total>0</thr:total></item></channel></rss>