Source code for toolkitapi

# -*- coding: utf-8 -*-
# -----------------------------------------------------------------------------
# Copyright (c) 2014 Bryant E. McDonnell
#
# Licensed under the terms of the BSD2 License
# See LICENSE.txt for details
# -----------------------------------------------------------------------------
"""SWMM Object Enum."""
from swmm.toolkit import shared_enum
# Standard library imports
from enum import Enum
import ctypes


[docs] class SimulationTime(Enum): StartDateTime = 0 EndDateTime = 1 ReportStart = 2
[docs] class SimulationUnits(Enum): UnitSystem = 0 # (0-US, 1-SI) FlowUnits = 1
[docs] class SimAnalysisSettings(Enum): AllowPonding = 0 # No ponding at nodes SkipSteadyState = 1 # Do flow routing in steady state periods IgnoreRainfall = 2 # Analyze rainfall/runoff IgnoreRDII = 3 # Analyze RDII IgnoreSnowmelt = 4 # Analyze snowmelt IgnoreGwater = 5 # Analyze groundwater IgnoreRouting = 6 # Analyze flow routing IgnoreQuality = 7 # Analyze water quality
[docs] class SimulationParameters(Enum): RouteStep = 0 # Routing time step (sec) MinRouteStep = 1 # Minimum variable time step (sec) LengtheningStep = 2 # Time step for lengthening (sec) StartDryDays = 3 # Antecedent dry days CourantFactor = 4 # Courant time step factor MinSurfArea = 5 # Minimum nodal surface area MinSlope = 6 # Minimum conduit slope RunoffError = 7 # Runoff continuity error GwaterError = 8 # Groundwater continuity error FlowError = 9 # Flow routing error QualError = 10 # Quality routing error HeadTol = 11 # DW routing head tolerance (ft) SysFlowTol = 12 # Tolerance for steady system flow LatFlowTol = 13 # Tolerance for steady nodal inflow
[docs] class ObjectType(Enum): GAGE = 0 # rain gage SUBCATCH = 1 # subcatchment NODE = 2 # conveyance system node LINK = 3 # conveyance system link POLLUT = 4 # pollutant LANDUSE = 5 # land use category TIMEPATTERN = 6 # dry weather flow time pattern CURVE = 7 # generic table of values TSERIES = 8 # generic time series of values CONTROL = 9 # conveyance system control rules TRANSECT = 10 # irregular channel cross-section AQUIFER = 11 # groundwater aquifer UNITHYD = 12 # RDII unit hydrograph SNOWMELT = 13 # snowmelt parameter set SHAPE = 14 # custom conduit shape LID = 15 # LID treatment units MAX_OBJ_TYPES = 16 # MaximumObjectTypes
[docs] class NodeParams(Enum): invertElev = 0 # double fullDepth = 1 # double surDepth = 2 # double pondedArea = 3 # double initDepth = 4 # double
[docs] class NodeResults(Enum): totalinflow = 0 # Total Inflow outflow = 1 # Total Outflow losses = 2 # Losses (evap + exfiltration loss) newVolume = 3 # Current Volume overflow = 4 # overflow newDepth = 5 # Current water depth newHead = 6 # Current water head newLatFlow = 7 # Current Lateral Inflow hyd_res_time = 8 # Current hydraulic retention time
[docs] class NodePollut(Enum): nodeQual = 0 # Current Water Quality Value inflowQual = 1 # Current inflow water quality value reactorQual = 2 # Current quality value in the mixed reactor
[docs] class NodeType(Enum): junction = 0 # Junction Type outfall = 1 # Outfall Type storage = 2 # Storage Type divider = 3 # Divider Type
[docs] class LinkParams(Enum): offset1 = 0 # double offset2 = 1 # double q0 = 2 # double qLimit = 3 # double cLossInlet = 4 # double cLossOutlet = 5 # double cLossAvg = 6 # double seepRate = 7 # double
[docs] class LinkResults(Enum): newFlow = 0 # double newDepth = 1 # double newVolume = 2 # double surfArea1 = 3 # double surfArea2 = 4 # double setting = 5 # double targetSetting = 6 # double froude = 7 # double
[docs] class LinkPollut(Enum): linkQual = 0 # Current Water Quality Value totalLoad = 1 # Total Quality Mass Loading reactorQual = 2 # Current quality value in the mixed reactor
[docs] class LinkType(Enum): conduit = 0 # Conduit Type pump = 1 # Pump Type orifice = 2 # Orifice Type weir = 3 # Weir Type outlet = 4 # Outlet Type
[docs] class SubcParams(Enum): width = 0 # double area = 1 # double fracImperv = 2 # double slope = 3 # double curbLength = 4 # double
# initBuildup = 5 # double
[docs] class SubcResults(Enum): rainfall = 0 # Current Rainfall evapLoss = 1 # Current Evaporation Loss infilLoss = 2 # Current Infiltration Loss runon = 3 # Subcatchment Runon newRunoff = 4 # Current Runoff newSnowDepth = 5 # Current Snow Depth
[docs] class SubcPollut(Enum): buildup = 0 # Subcatchment Surface Buildup concPonded = 1 # Ponded Pollutant Concentration subcQual = 2 # Current Pollutant Runoff Quality subcTotalLoad = 3 # Total Pollutant Washoff Load
[docs] class LidUParams(Enum): unitArea = 0 # double fullWidth = 1 # double botWidth = 2 # double initSat = 3 # double fromImperv = 4 # double fromPerv = 5 # double
[docs] class LidResults(Enum): inflow = 0 # double evap = 1 # double infil = 2 # double surfFlow = 3 # double drainFlow = 4 # double initVol = 5 # double finalVol = 6 # double surfDepth = 7 # double paveDepth = 8 # double soilMoist = 9 # double storDepth = 10 # double dryTime = 11 # double oldDrainFlow = 12 # double newDrainFlow = 13 # double pervArea = 14 # double flowToPerv = 15 # double evapRate = 16 # double nativeInfil = 17 # double surfInflow = 18 # double surfInfil = 19 # double surfEvap = 20 # double surfOutflow = 21 # double paveEvap = 22 # double pavePerc = 23 # double soilEvap = 24 # double soilPerc = 25 # double storInflow = 26 # double storExfil = 27 # double storEvap = 28 # double storDrain = 29 # double
[docs] class LidUOptions(Enum): index = 0 # int number = 1 # int toPerv = 2 # int drainSub = 3 # int drainNode = 4 # int
[docs] class LidLayers(Enum): surface = 0 # int soil = 1 # int storage = 2 # int pavement = 3 # int drain = 4 # int drainMat = 5 # int
[docs] class LidLayersProperty(Enum): thickness = 0 # double voidFrac = 1 # double roughness = 2 # double surfSlope = 3 # double sideSlope = 4 # double alpha = 5 # double porosity = 6 # double fieldCap = 7 # double wiltPoint = 8 # double suction = 9 # double kSat = 10 # double kSlope = 11 # double clogFactor = 12 # double impervFrac = 13 # double coeff = 14 # double expon = 15 # double offset = 16 # double delay = 17 # double hOpen = 18 # double hClose = 19 # double qCurve = 20 # integer regenDays = 21 # double regenDegree = 22 # double
[docs] class RainGageResults(Enum): total_precip = 0 rainfall = 1 snowfall = 2
[docs] class HotstartFile(Enum): use = 0 save = 1
[docs] class NodeStats(ctypes.Structure): _fields_ = [ ("avgDepth", ctypes.c_double), ("maxDepth", ctypes.c_double), ("maxDepthDate", ctypes.c_double), ("maxRptDepth", ctypes.c_double), ("volFlooded", ctypes.c_double), ("timeFlooded", ctypes.c_double), ("timeSurcharged", ctypes.c_double), ("timeCourantCritical", ctypes.c_double), ("totLatFlow", ctypes.c_double), ("maxLatFlow", ctypes.c_double), ("maxInflow", ctypes.c_double), ("maxOverflow", ctypes.c_double), ("maxPondedVol", ctypes.c_double), ("maxInflowDate", ctypes.c_double), ("maxOverflowDate", ctypes.c_double) ] _py_alias_ids = { "avgDepth": "average_depth", "maxDepth": "max_depth", "maxDepthDate": "max_depth_date", "maxRptDepth": "max_report_depth", "volFlooded": "flooding_volume", "timeFlooded": "flooding_duration", "timeSurcharged": "surcharge_duration", "timeCourantCritical": "courant_crit_duration", "totLatFlow": "lateral_infow_vol", "maxLatFlow": "peak_lateral_inflowrate", "maxInflow": "peak_total_inflow", "maxOverflow": "peak_flooding_rate", "maxPondedVol": "max_ponded_volume", "maxInflowDate": "max_inflow_date", "maxOverflowDate": "max_flooding_date", "loads": "pollutant_loading" }
[docs] class StorageStats(ctypes.Structure): _fields_ = [("initVol", ctypes.c_double), ("avgVol", ctypes.c_double), ("maxVol", ctypes.c_double), ("maxFlow", ctypes.c_double), ("evapLosses", ctypes.c_double), ("exfilLosses", ctypes.c_double), ("maxVolDate", ctypes.c_double)] _py_alias_ids = { "initVol": "initial_volume", "avgVol": "average_volume", "maxVol": "max_volume", "maxFlow": "peak_flowrate", "evapLosses": "evap_loss", "exfilLosses": "exfil_loss", "maxVolDate": "max_vol_date" }
PollutArray = ctypes.POINTER(ctypes.c_double)
[docs] class OutfallStats(ctypes.Structure): _fields_ = [("avgFlow", ctypes.c_double), ("maxFlow", ctypes.c_double), ("totalLoad", PollutArray), ("totalPeriods", ctypes.c_int)] _py_alias_ids = { "avgFlow": "average_flowrate", "maxFlow": "peak_flowrate", "totalLoad": "pollutant_loading", "totalPeriods": "total_periods", "loads": "pollutant_loading" }
FlowClassArray = ctypes.c_double * 7
[docs] class LinkStats(ctypes.Structure): _fields_ = [("maxFlow", ctypes.c_double), ("maxFlowDate", ctypes.c_double), ("maxVeloc", ctypes.c_double), ("maxDepth", ctypes.c_double), ("timeNormalFlow", ctypes.c_double), ("timeInletControl", ctypes.c_double), ("timeSurcharged", ctypes.c_double), ("timeFullUpstream", ctypes.c_double), ("timeFullDnstream", ctypes.c_double), ("timeFullFlow", ctypes.c_double), ("timeCapacityLimited", ctypes.c_double), ("timeInFlowClass", FlowClassArray), ("timeCourantCritical", ctypes.c_double), ("flowTurns", ctypes.c_long), ("flowTurnSign", ctypes.c_int)] _py_alias_ids = { "maxFlow": "peak_flow", "maxFlowDate": "peak_flow_date", "maxVeloc": "peak_velocity", "maxDepth": "peak_depth", "timeNormalFlow": "time_normal_flow", "timeInletControl": "time_inlet_control", "timeSurcharged": "time_surcharged", "timeFullUpstream": "time_full_upstream", "timeFullDnstream": "time_full_downstream", "timeFullFlow": "time_full_flow", "timeCapacityLimited": "time_capacity_limited", "timeInFlowClass": "time_in_flow_class", "timeCourantCritical": "time_courant_crit", "flowTurns": "flow_turns", "flowTurnSign": "flow_turn_sign" }
[docs] class PumpStats(ctypes.Structure): _fields_ = [ ("utilized", ctypes.c_double), ("minFlow", ctypes.c_double), ("avgFlow", ctypes.c_double), ("maxFlow", ctypes.c_double), ("volume", ctypes.c_double), ("energy", ctypes.c_double), ("offCurveLow", ctypes.c_double), ("offCurveHigh", ctypes.c_double), ("startUps", ctypes.c_int), ("totalPeriods", ctypes.c_int), ] _py_alias_ids = { "utilized": "percent_utilized", "minFlow": "min_flowrate", "avgFlow": "average_flowrate", "maxFlow": "max_flowrate", "volume": "total_volume", "energy": "energy_consumed", "offCurveLow": "off_curve_low", "offCurveHigh": "off_curve_high", "startUps": "number_startups", "totalPeriods": "total_periods" }
[docs] class SubcStats(ctypes.Structure): _fields_ = [("precip", ctypes.c_double), ("runon", ctypes.c_double), ("evap", ctypes.c_double), ("infil", ctypes.c_double), ("runoff", ctypes.c_double), ("maxFlow", ctypes.c_double)] _py_alias_ids = { "precip": "precipitation", "runon": "runon", "evap": "evaporation", "infil": "infiltration", "runoff": "runoff", "maxFlow": "peak_runoff_rate", }
[docs] class RoutingTotals(ctypes.Structure): _fields_ = [("dwInflow", ctypes.c_double), ("wwInflow", ctypes.c_double), ("gwInflow", ctypes.c_double), ("iiInflow", ctypes.c_double), ("exInflow", ctypes.c_double), ("flooding", ctypes.c_double), ("outflow", ctypes.c_double), ("evapLoss", ctypes.c_double), ("seepLoss", ctypes.c_double), ("reacted", ctypes.c_double), ("initStorage", ctypes.c_double), ("finalStorage", ctypes.c_double), ("pctError", ctypes.c_double)] _py_alias_ids = { "dwInflow": "dry_weather_inflow", "wwInflow": "wet_weather_inflow", "gwInflow": "groundwater_inflow", "iiInflow": "II_inflow", "exInflow": "external_inflow", "flooding": "flooding", "outflow": "outflow", "evapLoss": "evaporation_loss", "seepLoss": "seepage_loss", "reacted": "reacted", "initStorage": "initial_storage", "finalStorage": "final_storage", "pctError": "routing_error" }
[docs] class RunoffTotals(ctypes.Structure): _fields_ = [ ("rainfall", ctypes.c_double), ("evap", ctypes.c_double), ("infil", ctypes.c_double), ("runoff", ctypes.c_double), ("drains", ctypes.c_double), ("runon", ctypes.c_double), ("initStorage", ctypes.c_double), ("finalStorage", ctypes.c_double), ("initSnowCover", ctypes.c_double), ("finalSnowCover", ctypes.c_double), ("snowRemoved", ctypes.c_double), ("pctError", ctypes.c_double) ] _py_alias_ids = { "rainfall": "rainfall", "evap": "evaporation", "infil": "infiltration", "runoff": "runoff", "drains": "drains", "runon": "runon", "initStorage": "init_storage", "finalStorage": "final_storage", "initSnowCover": "init_snow_cover", "finalSnowCover": "final_snow_cover", "snowRemoved": "snow_removed", "pctError": "routing_error" }
# --- SWMM Output API # ----------------------------------------------------------------------------- DLLErrorKeys = { 411: "Input Error 411: no memory allocated for results.", 412: "Input Error 412: no results; binary file hasn't been opened.", 421: "Input Error 421: invalid parameter code.", 434: "File Error 434: unable to open binary output file.", 435: "File Error 435: run terminated; no results in binary file.", 441: "Error 441: need to call SMR_open before calling this function" }
[docs] class SMO_elementCount(Enum): subcatchCount = 0 nodeCount = 1 linkCount = 2 pollutantCount = 3
[docs] class SMO_unit(Enum): flow_rate = 0 concentration = 1
[docs] class SMO_apiFunction(Enum): getAttribute = 0 getResult = 1
[docs] class SMO_elementType(Enum): SM_subcatch = 0 SM_node = 1 SM_link = 2 SM_sys = 3
[docs] class SMO_time(Enum): reportStep = 0 numPeriods = 1
[docs] class SMO_subcatchAttribute(Enum): rainfall_subcatch = 0 snow_depth_subcatch = 1 evap_loss = 2 infil_loss = 3 runoff_rate = 4 gwoutflow_rate = 5 gwtable_elev = 6 soil_moisture = 7 pollutant_conc_subcatch = 8
[docs] class SMO_nodeAttribute(Enum): invert_depth = 0 hydraulic_head = 1 stored_ponded_volume = 2 lateral_inflow = 3 total_inflow = 4 flooding_losses = 5 pollutant_conc_node = 6
[docs] class SMO_linkAttribute(Enum): flow_rate_link = 0 flow_depth = 1 flow_velocity = 2 flow_volume = 3 capacity = 4 pollutant_conc_link = 5
[docs] class SMO_systemAttribute(Enum): air_temp = 0 rainfall_system = 1 snow_depth_system = 2 evap_infil_loss = 3 runoff_flow = 4 dry_weather_inflow = 5 groundwater_inflow = 6 RDII_inflow = 7 direct_inflow = 8 total_lateral_inflow = 9 flood_losses = 10 outfall_flows = 11 volume_stored = 12 evap_rate = 13