Research summary · 2023

Using SWMM for Emergency Response Planning: A Case Study Evaluating Biological Agent Transport Under Various Rainfall Scenarios and Urban Surfaces

How SWMM can support emergency-response planning for biological-agent transport under varying rainfall and urban surfaces.

Objective

This study aims to assess how biological agents, specifically surrogates for hazardous pathogens like Bacillus anthracis, could be transported through urban stormwater systems under different rainfall intensities and land surface types. The research supports emergency preparedness and homeland security response using hydrological modeling.

Methods

Tool Used: EPA Storm Water Management Model (SWMM/PCSWMM)

Simulations: Modeled biological contaminant runoff and transport under varying storm scenarios (e.g., low vs. high intensity rainfall)

Different urban surface configurations (e.g., impervious vs. pervious areas)

Data Inputs: Urban hydrologic and hydraulic parameters, agent decay rates, washoff coefficients, flow pathways

Approach: Integration of custom Python scripts for model automation and scenario comparisons

Key Findings

Surface type and rainfall intensity significantly affect biological agent fate:

Heavier storms result in faster and more widespread dispersal of biological agents.

Impervious surfaces contribute to quicker runoff and less opportunity for agent decay or settling.

The model identifies critical infrastructure zones most vulnerable to contamination.

Results help guide decontamination strategies and emergency planning by illustrating potential exposure zones.

Contributions

Demonstrated the applicability of SWMM for non-traditional pollutants such as pathogens.

Offered a framework for using hydrological modeling in biosecurity planning.

Supported by U.S. EPA Homeland Security Research Program in collaboration with USCG and DHS.

Supporting script

##############################################################################

## Programmer: Lifeng Yuan                                                  ##

## Development date: Dec. 1, 2021                                           ##

## Last update: Dec.10, 2021                                                ##

## Description: Output flow or velocity from certain conduits on land uses  ##

## Running env: IronPython (Python2.7) in PCSWMM                            ##

# ############################################################################

import os, sys, math, csv

# set work directory

path = r'C:\Users\lifengyuan\Stormwater Models\Stormwater_EC_EPA_v4'

os.chdir(path)

# confirm current work directory

print(os.getcwd())

# store swmm input file into a variable

swmm = pcpy.open_swmm_input('Stormwater_EC_EPA_v4.inp')

# obtain time step of swmm report in simulation options

outfile = pcpy.Graph.Files[0]

# identify and summarize conduits from asphalt, concrete, and grass

land_dict = {'S1A1000': ['C220233','C220231','C184791','C220229'],

             'S9100E0' :['C220236','C220235'],

             'S1C1000' :['C112822','C220243','C220241','C220240','C220238']}

# write a empty csv file

csv_file = open('output_velocity.csv','wb')

csv_writer = csv.writer(csv_file,delimiter = ',')

csv_writer.writerow(['Subcatchment','link','Year','Month','Day','Hour','Minute','Second','Velocity'])

csv_file.close()

# define a export_output function to write data and output statistics of surface runoff, velocity, flow

# take velocity as an example in the script

def export_output(sub,category,funcname,units,loc):

    csv_file = open('output_velocity.csv','ab')

    data = outfile.get_data(category,funcname,units,loc)

    velocity = []

    year = []

    month = []

    day = []

    hour = []

    minute = []

    second = []

    for i in range(len(data)):

        year.append(getattr(data[i].DateTime,'Year'))

        month.append(getattr(data[i].DateTime,'Month'))

        day.append(getattr(data[i].DateTime,'Day'))

        hour.append(getattr(data[i].DateTime,'Hour'))

        minute.append(getattr(data[i].DateTime,'Minute'))

        second.append(getattr(data[i].DateTime,'Second'))

        velocity.append(data[i].Value)

    # start to write csv file

    csv_writer = csv.writer(csv_file,delimiter = ',')

    for i in range(len(data)):

        csv_writer.writerow([sub,loc,year[i],month[i],day[i],hour[i],minute[i],second[i],velocity[i]])

    csv_file.close()

    print(sub, loc, 'successfully finished')

# define the output objectives

category = ['Subcatchments','Nodes','Links','System']

fnNames = ['Infiltration','Rainfall','Runoff','Depth','Volume','Flow','Velocity']

fnUnits = ['in/hr','ft','cfs','ft/s','ft2']

# export selected objectives

for k,v in land_dict.items():

    for i in range(len(v)):

        export_output(k,category[2],fnNames[6],fnUnits[3],v[i])