Below is a step-by-step explanation of the inflow.c file in EPA SWMM5. This file manages any external (direct) or dry-weather flow (DWF) inflows assigned to nodes in the drainage network. It covers:
- Direct/External Inflows: e.g., time series flows or concentrations added directly to a node.
- Dry-Weather Flows (DWF): e.g., constant or pattern-based baseline inflows for a node (like average daily sewage flows).
1. Overview of inflow.c
EPA SWMM5 allows you to specify additional inflows entering a drainage system node, beyond normal subcatchment runoff. They can be:
-
External inflows:
- Typically from time series, e.g., industrial wastewater discharges or other user-defined flows.
- Can be flows, or pollutant concentrations/mass loads.
-
Dry Weather Flows (DWF):
- Typically average flows that vary by monthly/daily/hourly patterns.
- E.g., base sanitary flows in a network.
The inflow.c file implements reading and storing these inflows, plus computing their actual flow/concentration at a given time step.
2. Data Structures
2.1 TExtInflow
typedef struct ExtInflow {
int param; // -1 for FLOW or pollutant index
int type; // type of inflow: FLOW_INFLOW, CONCEN_INFLOW, MASS_INFLOW
int tSeries; // index of time series for inflow
double cFactor; // units conversion factor
double sFactor; // scaling factor
double baseline; // baseline inflow value
int basePat; // baseline time pattern
struct ExtInflow* next;
} TExtInflow;
param: Which inflow parameter is assigned (either flow or pollutant). If-1, it’s FLOW; otherwise it’s a pollutant index.type: Tells if it’s FLOW_INFLOW, CONCEN_INFLOW, or MASS_INFLOW.tSeries: Index of a time series controlling the inflow variation over time.cFactor, sFactor: Additional conversion and scaling factors.baselineandbasePat: A constant baseline inflow plus an optional time pattern multiplier.- Linked together in a linked list via
next.
2.2 TDwfInflow
typedef struct DwfInflow {
int param; // -1 for FLOW or pollutant index
double avgValue; // average baseline DWF
int patterns[4]; // up to 4 pattern indexes
struct DwfInflow* next;
} TDwfInflow;
- For dry-weather flow:
param= -1 for flow, otherwise pollutant index.avgValue= average DWF. For flow, it’s eventually converted to user’s flow units.patterns= monthly/daily/hourly/weekend patterns. The code sorts them by pattern type for speed.
3. Reading Inflow Inputs
3.1 inflow_readExtInflow()
int inflow_readExtInflow(char* tok[], int ntoks)
- Parses a line of input data describing an external (direct) inflow.
- Data line format:
nodeIDFLOW | pollutIDtSeriesID(time series name, could be blank)- (optional)
CONCEN/MASSfor pollutant, plus numeric fields:- A
unitsFactorif MASS, - A
scaleFactor, - A
baseline, - A
basePat(pattern).
- A
- If the parameter is FLOW, then
param=-1; otherwise, it’s the pollutant index. - If it’s mass inflow, an additional factor in
cf(conversion factor) is read. - This eventually calls
inflow_setExtInflow()to create or update theTExtInflowobject and link it into the node’s list of external inflows.
Key: The code sets:
- Type =
FLOW_INFLOW,CONCEN_INFLOW, orMASS_INFLOW. - Time Series reference.
- Baseline flow or concentration.
- Optional time pattern.
3.2 inflow_setExtInflow()
int inflow_setExtInflow(int j, int param, int type, int tseries, int basePat,
double cf, double baseline, double sf)
- Actually allocates (or re-uses) a
TExtInflowstruct for a nodej. - Fills in the parameters for external inflow:
param, type, tseries, cFactor, sFactor, baseline, basePat.
- Returns 0 if success, or error code otherwise.
3.3 inflow_readDwfInflow()
int inflow_readDwfInflow(char* tok[], int ntoks)
- Reads a line describing dry weather flow for a node.
- Format:
nodeIDFLOWor pollutant nameavgValue- Up to 4 pattern IDs
- Identifies the node, the
param(flow or pollut index), the average value. - Finds up to 4 pattern references.
- Creates a
TDwfInflowobject and attaches it toNode[j].dwfInflow.
4. Managing Inflow Lists
4.1 Deleting Inflows
inflow_deleteExtInflows(int j): frees the linked list of external inflows on nodej.inflow_deleteDwfInflows(int j): frees the linked list of dry-weather inflows on nodej.
These are typically called at the end of a run or if the user re-initializes objects.
5. Computing Inflow Rates
During a simulation step, SWMM needs to compute the actual inflow from these data. Two main calls:
inflow_getExtInflow(): for external inflowsinflow_getDwfInflow(): for dry-weather flows
5.1 inflow_getExtInflow()
double inflow_getExtInflow(TExtInflow* inflow, DateTime aDate)
- For a given date/time, returns the current external inflow.
- Steps:
- Possibly apply the baseline pattern multiplier (monthly/daily/hourly/weekend).
- If time series is present, lookup the time series value at
aDateand scale it. - Then combine those plus the conversion factor:
5.2 inflow_getDwfInflow()
double inflow_getDwfInflow(TDwfInflow* inflow, int month, int day, int hour)
- For the current time’s
month, day, hour, it collects pattern multipliers from up to 4 patterns:- monthly,
- daily,
- hourly,
- weekend hourly.
- A final factor
fis then multiplied byinflow->avgValue. - Returns that product as the current DWF for the parameter (flow or pollutant).
5.3 Pattern Lookups
getPatternFactor(int p, int month, int day, int hour)
- Takes pattern index
pplus the current date/time, returns the pattern factor. - The code checks if pattern type is monthly/daily/hourly/weekend, picks the right factor from the pattern array. If out of range, defaults to 1.0.
6. Dry-Weather Flow Patterns
inflow_initDwfPattern(int j)
- Initializes the
Pattern[j]object with all factors = 1.0, no ID. Called when a Time Pattern is first created.
inflow_readDwfPattern(char* tok[], int ntoks)
- Reads lines defining a pattern’s values.
- Sets the pattern type = monthly/daily/hourly/weekend, then reads the numeric factors for up to 24 slots (for hourly) or 12 slots (monthly), etc.
7. Summary
-
Reading Inputs:
- External inflows from lines containing node, pollutant, time series, scaling, baseline, etc.
- DWF inflows from lines containing node, pollutant, average value, up to 4 patterns.
-
Managing Node Inflow Lists:
- Each node has a linked list of
TExtInflowobjects and a linked list ofTDwfInflowobjects. inflow_delete...()frees them.
- Each node has a linked list of
-
Using Patterns:
- Patterns can adjust baseline or time series inflow by monthly/daily/hourly/weekend multipliers.
-
Computing Inflows:
- External inflows use
inflow_getExtInflow()=> time series + baseline pattern. - DWF inflows use
inflow_getDwfInflow()=> average flow + pattern multipliers.
- External inflows use
In short, inflow.c parses inflow inputs and manages their time-dependent retrieval so that SWMM’s hydraulic/quality engine can incorporate these flows and pollutant loads at each node in each time step.