From 90a9122eb3e764bf31ae640f00c03915dbf07189 Mon Sep 17 00:00:00 2001 From: Katherine Klise Date: Fri, 21 Jul 2023 14:24:12 -0700 Subject: [PATCH 01/69] prototype storm water module in WNTR --- requirements.txt | 2 + wntr/__init__.py | 1 + wntr/stormwater/__init__.py | 10 +++ wntr/stormwater/fragility.py | 1 + wntr/stormwater/gis.py | 1 + wntr/stormwater/graphics.py | 154 +++++++++++++++++++++++++++++++++++ wntr/stormwater/io.py | 81 ++++++++++++++++++ wntr/stormwater/network.py | 108 ++++++++++++++++++++++++ wntr/stormwater/sim.py | 28 +++++++ 9 files changed, 386 insertions(+) create mode 100644 wntr/stormwater/__init__.py create mode 100644 wntr/stormwater/fragility.py create mode 100644 wntr/stormwater/gis.py create mode 100644 wntr/stormwater/graphics.py create mode 100644 wntr/stormwater/io.py create mode 100644 wntr/stormwater/network.py create mode 100644 wntr/stormwater/sim.py diff --git a/requirements.txt b/requirements.txt index 77fd539c5..d5afd92c0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,6 +12,8 @@ utm openpyxl geopandas; sys_platform == "darwin" or sys_platform == "linux" rtree; sys_platform == "darwin" or sys_platform == "linux" +pyswmm +swmmio # Documentation sphinx diff --git a/wntr/__init__.py b/wntr/__init__.py index d6e352ebe..67c39d0cd 100644 --- a/wntr/__init__.py +++ b/wntr/__init__.py @@ -7,6 +7,7 @@ from wntr import graphics from wntr import gis from wntr import utils +from wntr import stormwater __version__ = '1.0.0' diff --git a/wntr/stormwater/__init__.py b/wntr/stormwater/__init__.py new file mode 100644 index 000000000..1088a2f06 --- /dev/null +++ b/wntr/stormwater/__init__.py @@ -0,0 +1,10 @@ +""" +The wntr.stormwater package contains storm water resilience functionality +through integration of WNTR with SWMM, pyswmm, and swmmio +""" +from wntr.stormwater.network import * +from wntr.stormwater.sim import * +from wntr.stormwater.io import * +from wntr.stormwater.graphics import * +from wntr.stormwater.gis import * +from wntr.stormwater.fragility import * \ No newline at end of file diff --git a/wntr/stormwater/fragility.py b/wntr/stormwater/fragility.py new file mode 100644 index 000000000..6c9ea08c4 --- /dev/null +++ b/wntr/stormwater/fragility.py @@ -0,0 +1 @@ +from wntr.scenario import FragilityCurve diff --git a/wntr/stormwater/gis.py b/wntr/stormwater/gis.py new file mode 100644 index 000000000..2b579902a --- /dev/null +++ b/wntr/stormwater/gis.py @@ -0,0 +1 @@ +from wntr.gis import snap, intersect diff --git a/wntr/stormwater/graphics.py b/wntr/stormwater/graphics.py new file mode 100644 index 000000000..937ce877e --- /dev/null +++ b/wntr/stormwater/graphics.py @@ -0,0 +1,154 @@ +import networkx as nx +import matplotlib.pylab as plt + +def plot_network( + swn, + node_attribute=None, + link_attribute=None, + title=None, + node_size=20, + node_range=[None, None], + node_alpha=1, + node_cmap=None, + node_labels=False, + link_width=1, + link_range=[None, None], + link_alpha=1, + link_cmap=None, + link_labels=False, + add_colorbar=True, + node_colorbar_label="Node", + link_colorbar_label="Link", + directed=False, + ax=None, + filename=None, + inpdata=None, +): + + if ax is None: # create a new figure + plt.figure(facecolor="w", edgecolor="k") + ax = plt.gca() + + # Graph + G = swn.to_graph() + if not directed: + G = G.to_undirected() + + # Position + pos = nx.get_node_attributes(G, "coords") + pos = dict((k, (v[0][0], v[0][1])) for k,v in pos.items()) + if len(pos) == 0: + pos = None + + # Define node properties + add_node_colorbar = add_colorbar + if node_attribute is not None: + + if isinstance(node_attribute, list): + if node_cmap is None: + node_cmap = ["red", "red"] + add_node_colorbar = False + + if node_cmap is None: + node_cmap = plt.get_cmap("Spectral_r") + elif isinstance(node_cmap, list): + if len(node_cmap) == 1: + node_cmap = node_cmap * 2 + node_cmap = custom_colormap(len(node_cmap), node_cmap) + + node_attribute = dict(node_attribute) + nodelist, nodecolor = zip(*node_attribute.items()) + + else: + nodelist = None + nodecolor = "k" + + add_link_colorbar = add_colorbar + if link_attribute is not None: + + if isinstance(link_attribute, list): + if link_cmap is None: + link_cmap = ["red", "red"] + add_link_colorbar = False + + if link_cmap is None: + link_cmap = plt.get_cmap("Spectral_r") + elif isinstance(link_cmap, list): + if len(link_cmap) == 1: + link_cmap = link_cmap * 2 + link_cmap = custom_colormap(len(link_cmap), link_cmap) + + link_attribute = dict(link_attribute) + + # Replace link_attribute dictionary defined as + # {link_name: attr} with {(start_node, end_node, link_name): attr} + attr = {} + edge_tuples = list(G.edges(keys=True)) + for edge_tuple in list(G.edges(keys=True)): + edge_name = edge_tuple[2] + try: + value = link_attribute[edge_name] + attr[edge_tuple] = value + except: + pass + link_attribute = attr + + linklist, linkcolor = zip(*link_attribute.items()) + else: + linklist = None + linkcolor = "k" + + if title is not None: + ax.set_title(title) + + for subcatch in swn.subcatchments['geometry']: + ax.plot(*subcatch.boundary.xy, c='gray', linewidth=0.5) + + edge_background = nx.draw_networkx_edges(G, pos, edge_color="grey", width=0.5, ax=ax) + + nodes = nx.draw_networkx_nodes( + G, + pos, + nodelist=nodelist, + node_color=nodecolor, + node_size=node_size, + alpha=node_alpha, + cmap=node_cmap, + vmin=node_range[0], + vmax=node_range[1], + linewidths=0, + ax=ax, + ) + edges = nx.draw_networkx_edges( + G, + pos, + edgelist=linklist, + edge_color=linkcolor, + width=link_width, + alpha=link_alpha, + edge_cmap=link_cmap, + edge_vmin=link_range[0], + edge_vmax=link_range[1], + ax=ax, + ) + + if add_node_colorbar and node_attribute: + clb = plt.colorbar(nodes, shrink=0.5, pad=0, ax=ax) + clb.ax.set_title(node_colorbar_label, fontsize=10) + if add_link_colorbar and link_attribute: + if directed: + vmin = min(map(abs, link_attribute.values())) + vmax = max(map(abs, link_attribute.values())) + sm = plt.cm.ScalarMappable(cmap=link_cmap, norm=plt.Normalize(vmin=vmin, vmax=vmax)) + sm.set_array([]) + clb = plt.colorbar(sm, shrink=0.5, pad=0.05, ax=ax) + else: + clb = plt.colorbar(edges, shrink=0.5, pad=0.05, ax=ax) + clb.ax.set_title(link_colorbar_label, fontsize=10) + + ax.axis("off") + + if filename: + plt.savefig(filename) + + return ax diff --git a/wntr/stormwater/io.py b/wntr/stormwater/io.py new file mode 100644 index 000000000..f3773432f --- /dev/null +++ b/wntr/stormwater/io.py @@ -0,0 +1,81 @@ +import pandas as pd +import pyswmm +import swmmio +from swmm.toolkit.shared_enum import NodeAttribute, LinkAttribute, \ + SubcatchAttribute, SystemAttribute + +from wntr.sim import SimulationResults + + +def to_graph(swn): + + G = swn._swmmio_model.network + + return G + + +def read_inpfile(filename): + + model = swmmio.Model(filename) + + return model + + +def write_inpfile(swn, filename): + + swn._swmmio_model.inp.save(filename) + + +def read_outfile(outfile): + + results = SimulationResults() + + # Node results = INVERT_DEPTH, HYDRAULIC_HEAD, PONDED_VOLUME, + # LATERAL_INFLOW, TOTAL_INFLOW, FLOODING_LOSSES, POLLUT_CONC_0 + results.node = {} + + # Link results = FLOW_RATE, FLOW_DEPTH, FLOW_VELOCITY, FLOW_VOLUME, + # CAPACITY, POLLUT_CONC_0 + results.link = {} + + # Subcatchment results = RAINFALL, SNOW_DEPTH, EVAP_LOSS, INFIL_LOSS, + # RUNOFF_RATE, GW_OUTFLOW_RATE, GW_TABLE_ELEV, SOIL_MOISTURE, + # POLLUT_CONC_0 + results.subcatch = {} + + # System results = AIR_TEMP, RAINFALL, SNOW_DEPTH, EVAP_INFIL_LOSS, + # RUNOFF_FLOW, DRY_WEATHER_INFLOW, GW_INFLOW, RDII_INFLOW, DIRECT_INFLOW, + # TOTAL_LATERAL_INFLOW, FLOOD_LOSSES, OUTFALL_FLOWS, VOLUME_STORED, + # EVAP_RATE + results.system = {} + + with pyswmm.Output(outfile) as out: + times = out.times + + for attribute in NodeAttribute: + temp = {} + for node_name in out.nodes.keys(): + ts = out.node_series(node_name, attribute) + temp[node_name] = ts.values() + results.node[attribute.name] = pd.DataFrame(data=temp, index=times) + + for attribute in LinkAttribute: + temp = {} + for link_name in out.links.keys(): + ts = out.link_series(link_name, attribute) + temp[link_name] = ts.values() + results.link[attribute.name] = pd.DataFrame(data=temp, index=times) + + for attribute in SubcatchAttribute: + temp = {} + for subcatch_name in out.subcatchments.keys(): + ts = out.subcatch_series(subcatch_name, attribute) + temp[subcatch_name] = ts.values() + results.subcatch[attribute.name] = pd.DataFrame(data=temp, index=times) + + for attribute in SystemAttribute: + ts = out.system_series(attribute) + temp[attribute] = ts.values() + results.system = pd.DataFrame(data=temp, index=times) + + return results \ No newline at end of file diff --git a/wntr/stormwater/network.py b/wntr/stormwater/network.py new file mode 100644 index 000000000..f0386cee7 --- /dev/null +++ b/wntr/stormwater/network.py @@ -0,0 +1,108 @@ +import logging +import pandas as pd + +import swmmio + +from wntr.stormwater.io import to_graph, write_inpfile + +logger = logging.getLogger(__name__) + + +class StormWaterNetworkModel(object): + """ + Storm water network model class. + + Parameters + ------------------- + inp_file_name: string + Directory and filename of SWMM inp file to load into the + StormWaterNetworkModel object. + """ + + def __init__(self, inp_file_name=None): + + """ + swmmio.Model.links.geodataframe returns a geodataframe containing + PUMPS, CONDUITS, WEIRS, and ORIFICES joined with XSECTIONS and + COORDINATES + """ + + if inp_file_name: + self._swmmio_model = swmmio.Model(inp_file_name) + + # These dataframes can be modified to create scenarios + # prior to running pyswmm, the updates are saved to a new INP file + self.nodes = self._swmmio_model.nodes.geodataframe + self.links = self._swmmio_model.links.geodataframe + self.subcatchments = self._swmmio_model.subcatchments.geodataframe + self.raingages = self._swmmio_model.inp.raingages + + # nodes + self.junction_name_list = list(self._swmmio_model.inp.junctions.index) + self.outfall_name_list = list(self._swmmio_model.inp.outfalls.index) + self.storage_name_list = list(self._swmmio_model.inp.storage.index) + + # links + self.conduit_name_list = list(self._swmmio_model.inp.conduits.index) + self.weir_name_list = list(self._swmmio_model.inp.weirs.index) + self.orifice_name_list = list(self._swmmio_model.inp.orifices.index) + self.pump_name_list = list(self._swmmio_model.inp.pumps.index) + + # subcatchments + self.subcatchment_name_list = list(self._swmmio_model.inp.subcatchments.index) + + # raingages + self.raingage_name_list = list(self._swmmio_model.inp.raingages.index) + + else: + self._swmmio_model = None + + def udpate_inp_model(self, filename=None): + """ + Update self._swmmio_model.inp based udpates to self.nodes, self.links, + self.subcatchments, and self.raingages + """ + model_inp = self._swmmio_model.inp + + # nodes + for df in [model_inp.junctions, model_inp.outfalls, model_inp.storage]: + df = self.nodes.loc[df.index, df.columns] + # links + for df in [model_inp.conduits, model_inp.weirs, model_inp.orifices, model_inp.pumps]: + df = self.links.loc[df.index, df.columns] + # subcatchments + for df in [model_inp.subcatchments]: + df = self.subcatchments.loc[df.index, df.columns] + # raingages + for df in [model_inp.raingages]: + df = self.raingages.loc[df.index, df.columns] + + if filename: + write_inpfile(self, filename) + + + def to_graph(self, node_weight=None, link_weight=None, + modify_direction=False): + """ + Convert a StormWaterNetworkModel into a networkx MultiDiGraph + + Parameters + ---------- + node_weight : dict or pandas Series (optional) + Node weights + link_weight : dict or pandas Series (optional) + Link weights. + modify_direction : bool (optional) + If True, than if the link weight is negative, the link start and + end node are switched and the abs(weight) is assigned to the link + (this is useful when weighting graphs by flowrate). If False, link + direction and weight are not changed. + + Returns + -------- + networkx MultiDiGraph + """ + return to_graph(self) + + + \ No newline at end of file diff --git a/wntr/stormwater/sim.py b/wntr/stormwater/sim.py new file mode 100644 index 000000000..2ccedbc7e --- /dev/null +++ b/wntr/stormwater/sim.py @@ -0,0 +1,28 @@ +import os +import pyswmm + +from wntr.stormwater.io import read_outfile + +os.environ["CONDA_DLL_SEARCH_MODIFICATION_ENABLE"] = "1" +# See https://github.com/OpenWaterAnalytics/pyswmm/issues/298 + + +class SWMMSimulator(object): + + def __init__(self, swn): + self._swn = swn + + def run_sim(self, file_prefix='temp'): + + inpfile = file_prefix + '.inp' + outfile = file_prefix + '.out' + + # Update swmmio model inp based on swn data + self._swn.udpate_inp_model(inpfile) + + sim = pyswmm.Simulation(inpfile) + sim.execute() + + results = read_outfile(outfile) + + return results From 2a4cb857aab34432bfc5abb5031e326ff844b7c6 Mon Sep 17 00:00:00 2001 From: Katherine Klise Date: Fri, 21 Jul 2023 14:24:32 -0700 Subject: [PATCH 02/69] simple examples and benchmark model --- examples/networks/Example.inp | 481 +++++++++++++++++++++++++ examples/stormwater_criticality.py | 21 ++ examples/stormwater_getting_started.py | 53 +++ 3 files changed, 555 insertions(+) create mode 100644 examples/networks/Example.inp create mode 100644 examples/stormwater_criticality.py create mode 100644 examples/stormwater_getting_started.py diff --git a/examples/networks/Example.inp b/examples/networks/Example.inp new file mode 100644 index 000000000..697319f3e --- /dev/null +++ b/examples/networks/Example.inp @@ -0,0 +1,481 @@ +[TITLE] +;;Project Title/Notes +Example 3 +Detention Pond + +[OPTIONS] +;;Option Value +FLOW_UNITS CFS +INFILTRATION HORTON +FLOW_ROUTING DYNWAVE +LINK_OFFSETS DEPTH +MIN_SLOPE 0 +ALLOW_PONDING YES +SKIP_STEADY_STATE NO + +START_DATE 01/01/2007 +START_TIME 00:00:00 +REPORT_START_DATE 01/01/2007 +REPORT_START_TIME 00:00:00 +END_DATE 01/04/2007 +END_TIME 00:00:00 +SWEEP_START 01/01 +SWEEP_END 12/31 +DRY_DAYS 0 +REPORT_STEP 00:01:00 +WET_STEP 00:01:00 +DRY_STEP 01:00:00 +ROUTING_STEP 0:00:15 +RULE_STEP 00:00:00 + +INERTIAL_DAMPING PARTIAL +NORMAL_FLOW_LIMITED SLOPE +FORCE_MAIN_EQUATION H-W +VARIABLE_STEP 0.75 +LENGTHENING_STEP 0 +MIN_SURFAREA 0 +MAX_TRIALS 0 +HEAD_TOLERANCE 0 +SYS_FLOW_TOL 5 +LAT_FLOW_TOL 5 +MINIMUM_STEP 0.5 +THREADS 1 + +[EVAPORATION] +;;Data Source Parameters +;;-------------- ---------------- +CONSTANT 0.02 +DRY_ONLY NO + +[RAINGAGES] +;;Name Format Interval SCF Source +;;-------------- --------- ------ ------ ---------- +RainGage INTENSITY 0:05 1.0 TIMESERIES 100-yr + +[SUBCATCHMENTS] +;;Name Rain Gage Outlet Area %Imperv Width %Slope CurbLen SnowPack +;;-------------- ---------------- ---------------- -------- -------- -------- -------- -------- ---------------- +S1 RainGage J1 4.55 56.8 1587 2 0 +S2 RainGage J2 4.74 63.0 1653 2 0 +S3 RainGage J3 3.74 39.5 1456 3.1 0 +S4 RainGage J7 6.79 49.9 2331 3.1 0 +S5 RainGage J10 4.79 87.7 1670 2 0 +S6 RainGage J11 1.98 95.0 690 2 0 +S7 RainGage J10 2.33 0.0 907 3.1 0 + +[SUBAREAS] +;;Subcatchment N-Imperv N-Perv S-Imperv S-Perv PctZero RouteTo PctRouted +;;-------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- +S1 0.015 0.24 0.06 0.3 25 OUTLET +S2 0.015 0.24 0.06 0.3 25 OUTLET +S3 0.015 0.24 0.06 0.3 25 OUTLET +S4 0.015 0.24 0.06 0.3 25 OUTLET +S5 0.015 0.24 0.06 0.3 25 OUTLET +S6 0.015 0.24 0.06 0.3 25 OUTLET +S7 0.015 0.24 0.06 0.3 25 OUTLET + +[INFILTRATION] +;;Subcatchment Param1 Param2 Param3 Param4 Param5 +;;-------------- ---------- ---------- ---------- ---------- ---------- +S1 4.5 0.2 6.5 7 0 +S2 4.5 0.2 6.5 7 0 +S3 4.5 0.2 6.5 7 0 +S4 4.5 0.2 6.5 7 0 +S5 4.5 0.2 6.5 7 0 +S6 4.5 0.2 6.5 7 0 +S7 4.5 0.2 6.5 7 0 + +[JUNCTIONS] +;;Name Elevation MaxDepth InitDepth SurDepth Aponded +;;-------------- ---------- ---------- ---------- ---------- ---------- +J1 4973 0 0 0 12500 +J2 4969 0 0 0 12500 +J3 4973 0 0 0 12500 +J4 4971 0 0 0 1 +J5 4969.8 0 0 0 1 +J6 4969 0 0 0 1 +J7 4971.5 0 0 0 12500 +J8 4966.5 0 0 0 1 +J9 4964.8 0 0 0 1 +J10 4963.8 0 0 0 12500 +J11 4963 0 0 0 12500 +J_out 4954 0 0 0 0 + +[OUTFALLS] +;;Name Elevation Type Stage Data Gated Route To +;;-------------- ---------- ---------- ---------------- -------- ---------------- +O2 4954 FREE NO + +[STORAGE] +;;Name Elev. MaxDepth InitDepth Shape Curve Name/Params N/A Fevap Psi Ksat IMD +;;-------------- -------- ---------- ----------- ---------- ---------------------------- -------- -------- -------- -------- +SU1 4956 6 0 TABULAR SU1 0 0 + +[CONDUITS] +;;Name From Node To Node Length Roughness InOffset OutOffset InitFlow MaxFlow +;;-------------- ---------------- ---------------- ---------- ---------- ---------- ---------- ---------- ---------- +C1 J1 J5 185.00 0.05 0 0 0 0 +C2 J2 J11 526.00 0.016 0 4 0 0 +C3 J3 J4 109.00 0.016 0 0 0 0 +C4 J4 J5 133.00 0.05 0 0 0 0 +C5 J5 J6 207.00 0.05 0 0 0 0 +C6 J7 J6 140.00 0.05 0 0 0 0 +C7 J6 J8 95.00 0.016 0 0 0 0 +C8 J8 J9 166.00 0.05 0 0 0 0 +C9 J9 J10 320.00 0.05 0 0 0 0 +C10 J10 J11 145.00 0.05 0 0 0 0 +C11 J11 SU1 89.00 0.016 0 1 0 0 +C_out J_out O2 100 0.01 0 0 0 0 + +[ORIFICES] +;;Name From Node To Node Type Offset Qcoeff Gated CloseTime +;;-------------- ---------------- ---------------- ------------ ---------- ---------- -------- ---------- +Or1 SU1 J_out SIDE 0 0.65 NO 0 +Or2 SU1 J_out SIDE 1.5 0.65 NO 0 +Or3 SU1 J_out SIDE 2.22 0.65 NO 0 + +[WEIRS] +;;Name From Node To Node Type CrestHt Qcoeff Gated EndCon EndCoeff Surcharge RoadWidth RoadSurf Coeff. Curve +;;-------------- ---------------- ---------------- ------------ ---------- ---------- -------- -------- ---------- ---------- ---------- ---------- ---------------- +W1 SU1 J_out TRANSVERSE 3.17 3.3 NO 0 0 YES + +[XSECTIONS] +;;Link Shape Geom1 Geom2 Geom3 Geom4 Barrels Culvert +;;-------------- ------------ ---------------- ---------- ---------- ---------- ---------- ---------- +C1 TRAPEZOIDAL 3 5 5 5 1 +C2 TRAPEZOIDAL 1 0 0.0001 25 1 +;C1 CIRCULAR 2.25 0 0 0 1 +;C2 CIRCULAR 2.25 0 0 0 1 +C3 CIRCULAR 2.25 0 0 0 1 +C4 TRAPEZOIDAL 3 5 5 5 1 +C5 TRAPEZOIDAL 3 5 5 5 1 +C6 TRAPEZOIDAL 3 5 5 5 1 +;C4 CIRCULAR 3.0 0 0 0 1 +;C5 CIRCULAR 3.0 0 0 0 1 +;C6 CIRCULAR 3.0 0 0 0 1 +C7 CIRCULAR 3.5 0 0 0 1 +C8 TRAPEZOIDAL 3 5 5 5 1 +C9 TRAPEZOIDAL 3 5 5 5 1 +C10 TRAPEZOIDAL 3 5 5 5 1 +;C8 CIRCULAR 4.75 0 0 0 1 +;C9 CIRCULAR 5.75 0 0 0 1 +;C10 CIRCULAR 6.75 0 0 0 1 +C11 CIRCULAR 7.75 0 0 0 1 +C_out CIRCULAR 8.75 0 0 0 1 +Or1 RECT_CLOSED 0.3 0.25 0 0 +Or2 RECT_CLOSED 0.5 2 0 0 +Or3 RECT_CLOSED 0.25 0.35 0 0 +W1 RECT_OPEN 2.83 1.75 0 0 + +[CURVES] +;;Name Type X-Value Y-Value +;;-------------- ---------- ---------- ---------- +;WQCV +SU1 Storage 0 14706 +SU1 2.22 19659 +SU1 2.3 39317 +SU1 6 52644 + +[TIMESERIES] +;;Name Date Time Value +;;-------------- ---------- ---------- ---------- +2-yr 0:00 0.29 +2-yr 0:05 0.33 +2-yr 0:10 0.38 +2-yr 0:15 0.64 +2-yr 0:20 0.81 +2-yr 0:25 1.57 +2-yr 0:30 2.85 +2-yr 0:35 1.18 +2-yr 0:40 0.71 +2-yr 0:45 0.42 +2-yr 0:50 0.35 +2-yr 0:55 0.3 +2-yr 1:00 0.2 +2-yr 1:05 0.19 +2-yr 1:10 0.18 +2-yr 1:15 0.17 +2-yr 1:20 0.17 +2-yr 1:25 0.16 +2-yr 1:30 0.15 +2-yr 1:35 0.15 +2-yr 1:40 0.14 +2-yr 1:45 0.14 +2-yr 1:50 0.13 +2-yr 1:55 0.13 +; +10-yr 0:00 0.49 +10-yr 0:05 0.56 +10-yr 0:10 0.65 +10-yr 0:15 1.09 +10-yr 0:20 1.39 +10-yr 0:25 2.69 +10-yr 0:30 4.87 +10-yr 0:35 2.02 +10-yr 0:40 1.21 +10-yr 0:45 0.71 +10-yr 0:50 0.6 +10-yr 0:55 0.52 +10-yr 1:00 0.39 +10-yr 1:05 0.37 +10-yr 1:10 0.35 +10-yr 1:15 0.34 +10-yr 1:20 0.32 +10-yr 1:25 0.31 +10-yr 1:30 0.3 +10-yr 1:35 0.29 +10-yr 1:40 0.28 +10-yr 1:45 0.27 +10-yr 1:50 0.26 +10-yr 1:55 0.25 +; +100-yr 0:00 1 +100-yr 0:05 1.14 +100-yr 0:10 1.33 +100-yr 0:15 2.23 +100-yr 0:20 2.84 +100-yr 0:25 5.49 +100-yr 0:30 9.95 +100-yr 0:35 4.12 +100-yr 0:40 2.48 +100-yr 0:45 1.46 +100-yr 0:50 1.22 +100-yr 0:55 1.06 +100-yr 1:00 1 +100-yr 1:05 0.95 +100-yr 1:10 0.91 +100-yr 1:15 0.87 +100-yr 1:20 0.84 +100-yr 1:25 0.81 +100-yr 1:30 0.78 +100-yr 1:35 0.75 +100-yr 1:40 0.73 +100-yr 1:45 0.71 +100-yr 1:50 0.69 +100-yr 1:55 0.67 + +[REPORT] +;;Reporting Options +SUBCATCHMENTS ALL +NODES ALL +LINKS ALL + +[TAGS] +Link C1 Swale +Link C2 Gutter +Link C3 Culvert +Link C4 Swale +Link C5 Swale +Link C6 Swale +Link C7 Culvert +Link C8 Swale +Link C9 Swale +Link C10 Swale +Link C11 Culvert + +[MAP] +DIMENSIONS 0.000 0.000 1423.000 1475.000 +Units Feet + +[COORDINATES] +;;Node X-Coord Y-Coord +;;-------------- ------------------ ------------------ +J1 648.532 1043.713 +J2 1221.281 1005.760 +J3 405.287 905.702 +J4 505.345 862.573 +J5 631.281 859.123 +J6 822.772 819.444 +J7 831.398 709.035 +J8 915.930 840.146 +J9 1072.918 867.749 +J10 1254.058 640.029 +J11 1333.415 519.269 +J_out 1557.684 372.632 +O2 1557.684 293.275 +SU1 1471.427 458.889 + +[VERTICES] +;;Link X-Coord Y-Coord +;;-------------- ------------------ ------------------ +C2 1321.339 774.591 +C2 1374.819 652.105 +C2 1366.193 588.275 +C4 541.573 841.871 +C5 672.684 850.497 +C5 712.363 829.795 +C5 743.415 805.643 +C5 805.520 812.544 +C6 791.719 734.912 +C6 798.620 784.942 +C8 965.959 838.421 +C8 995.287 831.520 +C8 1038.415 850.497 +C9 1102.246 867.749 +C9 1131.573 852.222 +C9 1147.099 829.795 +C9 1162.626 809.094 +C9 1198.854 779.766 +C9 1219.556 757.339 +C9 1233.357 721.111 +C9 1238.532 715.936 +C9 1235.082 674.532 +C9 1247.158 646.930 +Or2 1573.211 665.906 +Or3 1592.187 852.222 +W1 1438.649 117.310 + +[Polygons] +;;Subcatchment X-Coord Y-Coord +;;-------------- ------------------ ------------------ +S1 282.657 1334.810 +S1 111.700 1101.604 +S1 172.525 1062.743 +S1 231.660 1027.262 +S1 306.002 990.092 +S1 370.206 959.679 +S1 409.066 946.163 +S1 444.547 936.025 +S1 493.545 924.198 +S1 532.405 915.750 +S1 569.576 907.302 +S1 610.125 897.165 +S1 655.744 897.165 +S1 684.338 1318.700 +S1 651.043 1321.922 +S1 596.269 1332.662 +S1 551.160 1346.624 +S1 495.312 1367.030 +S1 455.573 1384.214 +S1 410.465 1409.991 +S1 386.836 1427.175 +S1 363.208 1442.211 +S2 678.967 1238.149 +S2 673.584 1152.903 +S2 655.744 897.165 +S2 758.808 893.786 +S2 817.943 895.475 +S2 880.458 898.855 +S2 921.007 905.613 +S2 978.453 920.819 +S2 1042.657 937.715 +S2 1103.482 959.679 +S2 1159.238 985.023 +S2 1225.131 1010.367 +S2 1109.646 1274.665 +S2 1052.723 1400.325 +S2 985.061 1370.252 +S2 924.916 1348.772 +S2 861.549 1331.588 +S2 815.367 1325.144 +S2 762.740 1319.774 +S2 719.780 1316.552 +S2 684.338 1317.626 +S3 109.199 1103.258 +S3 141.754 1081.555 +S3 190.586 1051.713 +S3 247.557 1019.158 +S3 304.528 989.317 +S3 354.716 964.900 +S3 398.123 949.980 +S3 490.166 922.509 +S3 472.567 876.374 +S3 501.993 816.065 +S3 556.059 778.895 +S3 488.476 679.210 +S3 422.582 729.897 +S3 282.348 557.560 +S3 179.734 633.927 +S3 153.962 651.561 +S3 107.843 693.610 +S3 71.218 742.443 +S3 48.159 785.849 +S3 31.881 837.394 +S3 29.168 886.226 +S3 31.881 933.702 +S3 38.664 967.613 +S3 50.872 1001.525 +S3 65.793 1035.436 +S3 87.496 1070.704 +S3 109.199 1103.258 +S4 282.348 559.250 +S4 420.893 729.897 +S4 488.476 680.899 +S4 556.828 779.067 +S4 501.213 814.335 +S4 472.567 879.825 +S4 491.718 922.851 +S4 616.511 898.434 +S4 668.056 897.078 +S4 783.355 895.722 +S4 815.909 898.434 +S4 857.959 899.791 +S4 890.595 897.165 +S4 968.316 915.750 +S4 1042.657 937.715 +S4 1074.759 849.857 +S4 1054.484 773.826 +S4 1020.692 702.864 +S4 963.247 623.454 +S4 689.536 256.816 +S5 1301.482 474.258 +S5 1271.677 445.380 +S5 1232.340 393.835 +S5 1241.835 384.340 +S5 1222.844 366.706 +S5 1233.696 355.854 +S5 1026.159 66.931 +S5 1008.525 56.079 +S5 708.750 275.824 +S5 1023.446 704.462 +S5 1150.644 618.812 +S5 1251.203 640.809 +S5 1328.193 519.824 +S6 1334.478 519.824 +S6 1306.266 488.956 +S6 1293.380 474.205 +S6 1232.340 393.835 +S6 1241.835 381.627 +S6 1222.844 365.350 +S6 1232.340 353.142 +S6 1027.516 65.574 +S6 1012.595 56.079 +S6 707.393 273.111 +S6 688.403 254.121 +S6 739.948 218.853 +S6 788.780 159.169 +S6 806.414 106.268 +S6 813.197 1.821 +S6 994.961 12.673 +S6 1228.270 27.594 +S6 1222.844 115.763 +S6 1228.270 167.308 +S6 1241.835 229.705 +S6 1255.399 254.121 +S6 1279.815 302.953 +S6 1309.657 354.498 +S6 1335.430 401.974 +S6 1359.846 448.093 +S6 1370.616 475.830 +S6 1381.615 491.542 +S7 1122.467 968.970 +S7 1174.012 987.282 +S7 1225.557 1005.594 +S7 1377.480 675.977 +S7 1391.044 642.065 +S7 1396.470 598.659 +S7 1381.615 491.542 +S7 1331.336 519.824 +S7 1249.632 640.809 +S7 1150.644 617.241 +S7 1020.733 704.462 +S7 1054.645 772.285 +S7 1076.796 848.212 +S7 1056.370 900.062 +S7 1040.658 937.772 + +[SYMBOLS] +;;Gage X-Coord Y-Coord +;;-------------- ------------------ ------------------ +RainGage -148.485 1207.602 + diff --git a/examples/stormwater_criticality.py b/examples/stormwater_criticality.py new file mode 100644 index 000000000..74db9316a --- /dev/null +++ b/examples/stormwater_criticality.py @@ -0,0 +1,21 @@ +import wntr.stormwater as wntr + +inp_file = 'networks/Example.inp' + +# Conduit criticality analysis +conduits = ['C5'] #, 'C8', 'C11'] +results = {} +for conduit in conduits: + print(conduit) + swn = wntr.network.StormWaterNetworkModel(inp_file) + + swn.links.loc[conduit,"MaxFlow"] = 0.0000001 + + sim = wntr.sim.SWMMSimulator(swn) + results[conduit] = sim.run_sim(conduit) + +# Post process results +for conduit in conduits: + flowrate = results[conduit].link['FLOW_VELOCITY'].mean() + wntr.graphics.plot_network(swn, link_attribute=flowrate, + link_width=2, link_range=[0,1]) diff --git a/examples/stormwater_getting_started.py b/examples/stormwater_getting_started.py new file mode 100644 index 000000000..b64709b73 --- /dev/null +++ b/examples/stormwater_getting_started.py @@ -0,0 +1,53 @@ +import wntr.stormwater as wntr +import swmmio +import pyswmm +import time + +inp_file = 'networks/Example.inp' + +# using swmmio and pyswmm directly +tic = time.time() +model = swmmio.Model(inp_file) + +G = model.network # contains coordinates and attributes + +model.links.dataframe +model.links.geodataframe + +swmmio.graphics.swmm_graphics.draw_model(model) + +model.inp.save('Updated_model.inp') + +sim = pyswmm.Simulation('Updated_model.inp') +sim.execute() +sim.close() + +print("Run time swmmio pyswmm", time.time() - tic) +print() + +results1 = wntr.io.read_outfile('Updated_model.out') + +print("Run time with results object", time.time() - tic) +print() + +# using WNTR wrapper +tic = time.time() +swn = wntr.network.StormWaterNetworkModel(inp_file) + +G = swn.to_graph() + +swn._swmmio_model.links.dataframe +swn._swmmio_model.links.geodataframe + +wntr.graphics.plot_network(swn) + +sim = wntr.sim.SWMMSimulator(swn) +results2 = sim.run_sim() + +print("Run time WNTR wrapper", time.time() - tic) + +flowrate1 = results1.link['FLOW_VELOCITY'].loc['2007-01-01 00:01:00',:] +flowrate2 = results2.link['FLOW_VELOCITY'].loc['2007-01-01 00:01:00',:] + +wntr.graphics.plot_network(swn, link_attribute=flowrate1) +wntr.graphics.plot_network(swn, link_attribute=flowrate2) From 2b309563c14f5e35e40dc7e2862b59939a6498aa Mon Sep 17 00:00:00 2001 From: Katherine Klise Date: Fri, 4 Aug 2023 19:16:02 -0700 Subject: [PATCH 03/69] stormwater updates --- examples/stormwater_criticality.py | 61 +++++-- wntr/stormwater/__init__.py | 7 +- wntr/stormwater/graphics.py | 36 +++- wntr/stormwater/io.py | 45 ++++- wntr/stormwater/metrics.py | 1 + wntr/stormwater/network.py | 273 ++++++++++++++++++++++++----- wntr/stormwater/sim.py | 2 +- 7 files changed, 355 insertions(+), 70 deletions(-) create mode 100644 wntr/stormwater/metrics.py diff --git a/examples/stormwater_criticality.py b/examples/stormwater_criticality.py index 74db9316a..cb12deb42 100644 --- a/examples/stormwater_criticality.py +++ b/examples/stormwater_criticality.py @@ -1,21 +1,52 @@ -import wntr.stormwater as wntr +# Conduit criticality analysis +import matplotlib.pylab as plt +import wntr.stormwater as swntr inp_file = 'networks/Example.inp' +swn = swntr.network.StormWaterNetworkModel(inp_file) -# Conduit criticality analysis -conduits = ['C5'] #, 'C8', 'C11'] results = {} -for conduit in conduits: - print(conduit) - swn = wntr.network.StormWaterNetworkModel(inp_file) +fig, ax = plt.subplots() + +for conduit_name in swn.conduit_name_list: + print(conduit_name) + swn = swntr.network.StormWaterNetworkModel(inp_file) + swn.links.loc[conduit_name, "MaxFlow"] = 0.0000001 + sim = swntr.sim.SWMMSimulator(swn) + results[conduit_name] = sim.run_sim(conduit_name) + + flowrate = results[conduit_name].link['FLOW_VELOCITY'] + #swntr.graphics.plot_network(swn, + # link_attribute=flowrate.mean(axis=0), + # link_width=2, + # link_range=[0,1]) + flowrate.mean(axis=1).plot(ax=ax) - swn.links.loc[conduit,"MaxFlow"] = 0.0000001 - sim = wntr.sim.SWMMSimulator(swn) - results[conduit] = sim.run_sim(conduit) - -# Post process results -for conduit in conduits: - flowrate = results[conduit].link['FLOW_VELOCITY'].mean() - wntr.graphics.plot_network(swn, link_attribute=flowrate, - link_width=2, link_range=[0,1]) +################ + +# Pipe criticality analysis +import matplotlib.pylab as plt +import wntr + +inp_file = 'networks/Net1.inp' +wn = wntr.network.WaterNetworkModel(inp_file) + +# Pipe criticality analysis +results = {} +fig, ax = plt.subplots() + +for pipe_name in wn.pipe_name_list: + print(pipe_name) + wn = wntr.network.WaterNetworkModel(inp_file) + pipe = wn.get_link(pipe_name) + pipe.initial_status = "Closed" + sim = wntr.sim.EpanetSimulator(wn) + results[pipe_name] = sim.run_sim() + + flowrate = results[pipe_name].link['flowrate'] + #wntr.graphics.plot_network(wn, + # link_attribute=flowrate.mean(axis=0), + # link_width=2, + # link_range=[0,0.1]) + flowrate.mean(axis=1).plot(ax=ax) diff --git a/wntr/stormwater/__init__.py b/wntr/stormwater/__init__.py index 1088a2f06..120890d13 100644 --- a/wntr/stormwater/__init__.py +++ b/wntr/stormwater/__init__.py @@ -4,7 +4,8 @@ """ from wntr.stormwater.network import * from wntr.stormwater.sim import * -from wntr.stormwater.io import * -from wntr.stormwater.graphics import * from wntr.stormwater.gis import * -from wntr.stormwater.fragility import * \ No newline at end of file +from wntr.stormwater.fragility import * +from wntr.stormwater.metrics import * +from wntr.stormwater.graphics import * +from wntr.stormwater.io import * \ No newline at end of file diff --git a/wntr/stormwater/graphics.py b/wntr/stormwater/graphics.py index 937ce877e..c2e56e3c3 100644 --- a/wntr/stormwater/graphics.py +++ b/wntr/stormwater/graphics.py @@ -1,6 +1,31 @@ +import logging import networkx as nx import matplotlib.pylab as plt +from wntr.graphics.network import plot_network as _plot_network + +logger = logging.getLogger(__name__) + +""" +def plot_network(swn, node_attribute=None, link_attribute=None, title=None, + node_size=20, node_range=[None,None], node_alpha=1, node_cmap=None, node_labels=False, + link_width=1, link_range=[None,None], link_alpha=1, link_cmap=None, link_labels=False, + add_colorbar=True, node_colorbar_label='Node', link_colorbar_label='Link', + directed=False, ax=None, filename=None): + + if ax is None: # create a new figure + plt.figure(facecolor="w", edgecolor="k") + ax = plt.gca() + + for subcatch in swn.subcatchments['geometry']: + ax.plot(*subcatch.boundary.xy, c='gray', linewidth=0.5) + + _plot_network(swn, node_attribute, link_attribute, title, + node_size, node_range, node_alpha, node_cmap, node_labels, + link_width, link_range, link_alpha, link_cmap, link_labels, + add_colorbar, node_colorbar_label, link_colorbar_label, + directed, ax=ax, filename=filename) +""" def plot_network( swn, node_attribute=None, @@ -131,7 +156,16 @@ def plot_network( edge_vmax=link_range[1], ax=ax, ) - + if node_labels: + labels = dict(zip(swn.node_name_list, swn.node_name_list)) + nx.draw_networkx_labels(G, pos, labels, font_size=7, ax=ax) + # if link_labels: + # labels = {} + # for link_name in swn.link_name_list: + # link = wn.get_link(link_name) + # labels[(link.start_node_name, link.end_node_name)] = link_name + # nx.draw_networkx_edge_labels(G, pos, labels, font_size=7, ax=ax) + if add_node_colorbar and node_attribute: clb = plt.colorbar(nodes, shrink=0.5, pad=0, ax=ax) clb.ax.set_title(node_colorbar_label, fontsize=10) diff --git a/wntr/stormwater/io.py b/wntr/stormwater/io.py index f3773432f..f5982b4b8 100644 --- a/wntr/stormwater/io.py +++ b/wntr/stormwater/io.py @@ -1,3 +1,4 @@ +import logging import pandas as pd import pyswmm import swmmio @@ -5,6 +6,9 @@ SubcatchAttribute, SystemAttribute from wntr.sim import SimulationResults +from wntr.gis import WaterNetworkGIS + +logger = logging.getLogger(__name__) def to_graph(swn): @@ -14,11 +18,39 @@ def to_graph(swn): return G -def read_inpfile(filename): +def to_gis(swn, crs=None): + """ + Convert a StormWaterNetworkModel into GeoDataFrames + + Parameters + ---------- + swn : WaterNetworkModel + Water network model + crs : str, optional + Coordinate reference system, by default None - model = swmmio.Model(filename) + Returns + ------- + WaterNetworkGIS object that contains GeoDataFrames + + """ + gis_data = WaterNetworkGIS() + + # nodes + gis_data.junctions = swn.nodes.loc[swn.junction_name_list,:] + gis_data.outfalls = swn.nodes.loc[swn.outfall_name_list,:] + gis_data.storages = swn.nodes.loc[swn.storage_name_list,:] + + # links + gis_data.conduits = swn.links.loc[swn.conduit_name_list,:] + gis_data.weirs = swn.links.loc[swn.weir_name_list,:] + gis_data.orifices = swn.links.loc[swn.orifice_name_list,:] + gis_data.pumps = swn.links.loc[swn.pump_name_list,:] + + # subcatchments + gis_data.subcatchments = swn.subcatchments.loc[swn.subcatchment_name_list,:] - return model + return gis_data def write_inpfile(swn, filename): @@ -26,6 +58,13 @@ def write_inpfile(swn, filename): swn._swmmio_model.inp.save(filename) +def read_inpfile(filename): + + model = swmmio.Model(filename) + + return model + + def read_outfile(outfile): results = SimulationResults() diff --git a/wntr/stormwater/metrics.py b/wntr/stormwater/metrics.py new file mode 100644 index 000000000..43162151a --- /dev/null +++ b/wntr/stormwater/metrics.py @@ -0,0 +1 @@ +from wntr.metrics.topographic import * diff --git a/wntr/stormwater/network.py b/wntr/stormwater/network.py index f0386cee7..238c74489 100644 --- a/wntr/stormwater/network.py +++ b/wntr/stormwater/network.py @@ -1,9 +1,8 @@ import logging import pandas as pd - import swmmio -from wntr.stormwater.io import to_graph, write_inpfile +from wntr.stormwater.io import to_graph, to_gis, write_inpfile logger = logging.getLogger(__name__) @@ -12,6 +11,9 @@ class StormWaterNetworkModel(object): """ Storm water network model class. + Unlike the WaterNetworkModel, this class has no iterator methods, + add/remove methods, and no component registries. + Parameters ------------------- inp_file_name: string @@ -30,57 +32,210 @@ def __init__(self, inp_file_name=None): if inp_file_name: self._swmmio_model = swmmio.Model(inp_file_name) - # These dataframes can be modified to create scenarios + # These dataframes can be used to modify the network model # prior to running pyswmm, the updates are saved to a new INP file - self.nodes = self._swmmio_model.nodes.geodataframe - self.links = self._swmmio_model.links.geodataframe - self.subcatchments = self._swmmio_model.subcatchments.geodataframe - self.raingages = self._swmmio_model.inp.raingages - - # nodes - self.junction_name_list = list(self._swmmio_model.inp.junctions.index) - self.outfall_name_list = list(self._swmmio_model.inp.outfalls.index) - self.storage_name_list = list(self._swmmio_model.inp.storage.index) - - # links - self.conduit_name_list = list(self._swmmio_model.inp.conduits.index) - self.weir_name_list = list(self._swmmio_model.inp.weirs.index) - self.orifice_name_list = list(self._swmmio_model.inp.orifices.index) - self.pump_name_list = list(self._swmmio_model.inp.pumps.index) - - # subcatchments - self.subcatchment_name_list = list(self._swmmio_model.inp.subcatchments.index) - - # raingages - self.raingage_name_list = list(self._swmmio_model.inp.raingages.index) - + # before running the simulation + self.nodes = self._swmmio_model.nodes.geodataframe.copy() + self.links = self._swmmio_model.links.geodataframe.copy() + self.subcatchments = self._swmmio_model.subcatchments.geodataframe.copy() + self.raingages = self._swmmio_model.inp.raingages.copy() + self.options = self._swmmio_model.inp.options.copy() + else: self._swmmio_model = None - def udpate_inp_model(self, filename=None): - """ - Update self._swmmio_model.inp based udpates to self.nodes, self.links, - self.subcatchments, and self.raingages + self.nodes = None + self.links = None + self.subcatchments = None + self.raingages = None + self.options = None + + + @property + def node_name_list(self): + """Get a list of node names + + Returns + ------- + list of strings + """ - model_inp = self._swmmio_model.inp + return self.junction_name_list + self.outfall_name_list + self.storage_name_list + + @property + def junction_name_list(self): + """Get a list of junction names - # nodes - for df in [model_inp.junctions, model_inp.outfalls, model_inp.storage]: - df = self.nodes.loc[df.index, df.columns] - # links - for df in [model_inp.conduits, model_inp.weirs, model_inp.orifices, model_inp.pumps]: - df = self.links.loc[df.index, df.columns] - # subcatchments - for df in [model_inp.subcatchments]: - df = self.subcatchments.loc[df.index, df.columns] - # raingages - for df in [model_inp.raingages]: - df = self.raingages.loc[df.index, df.columns] - - if filename: - write_inpfile(self, filename) + Returns + ------- + list of strings + + """ + return list(self._swmmio_model.inp.junctions.index) + @property + def outfall_name_list(self): + """Get a list of outfall names + + Returns + ------- + list of strings + + """ + return list(self._swmmio_model.inp.outfalls.index) + + + @property + def storage_name_list(self): + """Get a list of storage names + + Returns + ------- + list of strings + + """ + return list(self._swmmio_model.inp.storage.index) + + @property + def link_name_list(self): + """Get a list of link names + + Returns + ------- + list of strings + + """ + return self.conduit_name_list + self.weir_name_list + \ + self.orifice_name_list + self.pump_name_list + + @property + def conduit_name_list(self): + """Get a list of conduit names + + Returns + ------- + list of strings + + """ + return list(self._swmmio_model.inp.conduits.index) + + @property + def weir_name_list(self): + """Get a list of weir names + + Returns + ------- + list of strings + + """ + return list(self._swmmio_model.inp.weirs.index) + + @property + def orifice_name_list(self): + """Get a list of orifice names + + Returns + ------- + list of strings + + """ + return list(self._swmmio_model.inp.orifices.index) + + @property + def pump_name_list(self): + """Get a list of pump names + + Returns + ------- + list of strings + + """ + return list(self._swmmio_model.inp.pumps.index) + + @property + def subcatchment_name_list(self): + """Get a list of subcatchment names + + Returns + ------- + list of strings + + """ + return list(self._swmmio_model.inp.subcatchments.index) + + @property + def raingage_name_list(self): + """Get a list of raingage names + + Returns + ------- + list of strings + + """ + return list(self._swmmio_model.inp.raingages.index) + + @property + def num_nodes(self): + """The number of nodes""" + return len(self.node_name_list) + + @property + def num_junctions(self): + """The number of junctions""" + return len(self.junction_name_list) + + @property + def num_outfalls(self): + """The number of outfalls""" + return len(self.outfall_name_list) + + @property + def num_storages(self): + """The number of storages""" + return len(self.storage_name_list) + + @property + def num_links(self): + """The number of links""" + return len(self.link_name_list) + + @property + def num_conduits(self): + """The number of conduits""" + return len(self.conduit_name_list) + + @property + def num_weirs(self): + """The number of weirs""" + return len(self.weir_name_list) + + @property + def num_orifices(self): + """The number of orifices""" + return len(self.orifice_name_list) + + @property + def num_pumps(self): + """The number of pumps""" + return len(self.pump_name_list) + + @property + def num_subcatchments(self): + """The number of subcatchments""" + return len(self.subcatchment_name_list) + + @property + def num_raingages(self): + """The number of raingages""" + return len(self.raingage_name_list) + + + def to_gis(self, crs=None): + + return to_gis(self) + + def to_graph(self, node_weight=None, link_weight=None, modify_direction=False): """ @@ -103,6 +258,30 @@ def to_graph(self, node_weight=None, link_weight=None, networkx MultiDiGraph """ return to_graph(self) - + + + def udpate_model_inp(self, filename=None): + """ + Update self._swmmio_model.inp based udpates to self.nodes, self.links, + self.subcatchments, and self.raingages + """ + model_inp = self._swmmio_model.inp + + # nodes + for df in [model_inp.junctions, model_inp.outfalls, model_inp.storage]: + df = self.nodes.loc[df.index, df.columns] + # links + for df in [model_inp.conduits, model_inp.weirs, model_inp.orifices, model_inp.pumps]: + df = self.links.loc[df.index, df.columns] + # subcatchments + for df in [model_inp.subcatchments]: + df = self.subcatchments.loc[df.index, df.columns] + # raingages + for df in [model_inp.raingages]: + df = self.raingages.loc[df.index, df.columns] + # options + for df in [model_inp.options]: + df = self.options.loc[df.index, df.columns] - \ No newline at end of file + if filename: + write_inpfile(self, filename) \ No newline at end of file diff --git a/wntr/stormwater/sim.py b/wntr/stormwater/sim.py index 2ccedbc7e..0569415d0 100644 --- a/wntr/stormwater/sim.py +++ b/wntr/stormwater/sim.py @@ -18,7 +18,7 @@ def run_sim(self, file_prefix='temp'): outfile = file_prefix + '.out' # Update swmmio model inp based on swn data - self._swn.udpate_inp_model(inpfile) + self._swn.udpate_model_inp(inpfile) sim = pyswmm.Simulation(inpfile) sim.execute() From 9f297bab536b15bdfc26a5672ae841e8fcfd60fb Mon Sep 17 00:00:00 2001 From: Katherine Klise Date: Tue, 19 Sep 2023 11:39:22 -0700 Subject: [PATCH 04/69] Added outline for storm water documentation --- documentation/apidoc/wntr.rst | 1 + documentation/apidoc/wntr.stormwater.io.rst | 7 +++ .../apidoc/wntr.stormwater.network.rst | 7 +++ documentation/apidoc/wntr.stormwater.rst | 20 +++++++ documentation/apidoc/wntr.stormwater.sim.rst | 7 +++ documentation/index.rst | 1 + documentation/index_latex.rst | 1 + documentation/stormwater.rst | 57 +++++++++++++++++++ 8 files changed, 101 insertions(+) create mode 100644 documentation/apidoc/wntr.stormwater.io.rst create mode 100644 documentation/apidoc/wntr.stormwater.network.rst create mode 100644 documentation/apidoc/wntr.stormwater.rst create mode 100644 documentation/apidoc/wntr.stormwater.sim.rst create mode 100644 documentation/stormwater.rst diff --git a/documentation/apidoc/wntr.rst b/documentation/apidoc/wntr.rst index abab02a50..de3bc9c80 100644 --- a/documentation/apidoc/wntr.rst +++ b/documentation/apidoc/wntr.rst @@ -22,5 +22,6 @@ Subpackages wntr.network wntr.scenario wntr.sim + wntr.stormwater wntr.utils diff --git a/documentation/apidoc/wntr.stormwater.io.rst b/documentation/apidoc/wntr.stormwater.io.rst new file mode 100644 index 000000000..fa0ac4d22 --- /dev/null +++ b/documentation/apidoc/wntr.stormwater.io.rst @@ -0,0 +1,7 @@ +wntr.stormwater.io module +===================================== + +.. automodule:: wntr.stormwater.io + :members: + :no-undoc-members: + :show-inheritance: diff --git a/documentation/apidoc/wntr.stormwater.network.rst b/documentation/apidoc/wntr.stormwater.network.rst new file mode 100644 index 000000000..4e9f615ff --- /dev/null +++ b/documentation/apidoc/wntr.stormwater.network.rst @@ -0,0 +1,7 @@ +wntr.stormwater.network module +===================================== + +.. automodule:: wntr.stormwater.network + :members: + :no-undoc-members: + :show-inheritance: diff --git a/documentation/apidoc/wntr.stormwater.rst b/documentation/apidoc/wntr.stormwater.rst new file mode 100644 index 000000000..cae3a6b43 --- /dev/null +++ b/documentation/apidoc/wntr.stormwater.rst @@ -0,0 +1,20 @@ +wntr.morph package +==================== + +.. automodule:: wntr.stormwater + :members: + :no-undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + + wntr.stormwater.fragility + wntr.stormwater.gis + wntr.stormwater.graphics + wntr.stormwater.io + wntr.stormwater.metrics + wntr.stormwater.network + wntr.stormwater.sim \ No newline at end of file diff --git a/documentation/apidoc/wntr.stormwater.sim.rst b/documentation/apidoc/wntr.stormwater.sim.rst new file mode 100644 index 000000000..a10fc24ed --- /dev/null +++ b/documentation/apidoc/wntr.stormwater.sim.rst @@ -0,0 +1,7 @@ +wntr.stormwater.sim module +===================================== + +.. automodule:: wntr.stormwater.sim + :members: + :no-undoc-members: + :show-inheritance: diff --git a/documentation/index.rst b/documentation/index.rst index 5ef2fdd51..8ed7c51df 100644 --- a/documentation/index.rst +++ b/documentation/index.rst @@ -30,6 +30,7 @@ designed to simulate and analyze resilience of water distribution networks. graphics gis advancedsim + stormwater license whatsnew developers diff --git a/documentation/index_latex.rst b/documentation/index_latex.rst index 6101da9a4..50a6b9901 100644 --- a/documentation/index_latex.rst +++ b/documentation/index_latex.rst @@ -29,6 +29,7 @@ WNTR documentation graphics gis advancedsim + stormwater license users developers diff --git a/documentation/stormwater.rst b/documentation/stormwater.rst new file mode 100644 index 000000000..384514893 --- /dev/null +++ b/documentation/stormwater.rst @@ -0,0 +1,57 @@ + +.. role:: red + +.. raw:: latex + + \clearpage + +.. _stormwater: + +Storm water resilience +====================================== + +The following section describes capabilities in WNTR to +quantify the resilience of storm water and wastewater systems. +The capabilities leverage SWMM, pyswmm and swmmio along with classes, modules, +and functions that were developed for drinking water resilience analysis in WNTR. + +This functionality resides in the :class:`~wntr.stormwater` module. +To import this module and use it under the WNTR namespace, run:: + + import wntr.stormwater as swntr + +.. note:: + The stormwater module is a beta release. + Additional development, testing, and use is needed before the + software is ready for widespread use. Feedback is appreciated. + +Network model +--------------- + + +Simulation +--------------- + + +Geospatial capabilities +------------------------- + + +Fragility curves +------------------------- + + +Resilience metrics +------------------- + + +Graphics +--------------- + + +File I/O +--------- + + +Example +--------- \ No newline at end of file From fc854086d7a28981422abb49b9d9bb891cea2a01 Mon Sep 17 00:00:00 2001 From: Katherine Klise Date: Mon, 16 Oct 2023 09:30:43 -0700 Subject: [PATCH 05/69] updated sim and network attributes --- wntr/stormwater/network.py | 103 ++++++++++++++++--------------------- wntr/stormwater/sim.py | 17 +++--- 2 files changed, 56 insertions(+), 64 deletions(-) diff --git a/wntr/stormwater/network.py b/wntr/stormwater/network.py index 238c74489..f175ac38f 100644 --- a/wntr/stormwater/network.py +++ b/wntr/stormwater/network.py @@ -23,33 +23,46 @@ class StormWaterNetworkModel(object): def __init__(self, inp_file_name=None): - """ - swmmio.Model.links.geodataframe returns a geodataframe containing - PUMPS, CONDUITS, WEIRS, and ORIFICES joined with XSECTIONS and - COORDINATES - """ - if inp_file_name: self._swmmio_model = swmmio.Model(inp_file_name) - # These dataframes can be used to modify the network model - # prior to running pyswmm, the updates are saved to a new INP file - # before running the simulation - self.nodes = self._swmmio_model.nodes.geodataframe.copy() - self.links = self._swmmio_model.links.geodataframe.copy() - self.subcatchments = self._swmmio_model.subcatchments.geodataframe.copy() - self.raingages = self._swmmio_model.inp.raingages.copy() - self.options = self._swmmio_model.inp.options.copy() + # Attributes of StormWaterNetworkModel link to attributes + # in swmmio.Model.inp, which contains dataframes from an INP file. + # The swmmio.Model.inp object also includes a .save method to + # write a new INP file. + + # Nodes = Junctions, outfall, and storage nodes + self.junctions = self._swmmio_model.inp.junctions + self.outfalls = self._swmmio_model.inp.outfalls + self.storage = self._swmmio_model.inp.junctions + + # Links = Conduits, weirs, orifices, and pumps + self.conduits = self._swmmio_model.inp.conduits + self.weirs = self._swmmio_model.inp.weirs + self.orifices = self._swmmio_model.inp.orifices + self.pumps = self._swmmio_model.inp.pumps + + self.subcatchments = self._swmmio_model.inp.subcatchments + self.subareas = self._swmmio_model.inp.subareas + + self.raingages = self._swmmio_model.inp.raingages + self.infiltration = self._swmmio_model.inp.infiltration + self.inflows = self._swmmio_model.inp.inflows + #self.dwf = self._swmmio_model.inp.dwf + + self.curves = self._swmmio_model.inp.curves + self.timeseries = self._swmmio_model.inp.timeseries + + self.options = self._swmmio_model.inp.options + self.files = self._swmmio_model.inp.files + + self.coordinates = self._swmmio_model.inp.coordinates + self.vertices = self._swmmio_model.inp.vertices + self.polygons = self._swmmio_model.inp.polygons + self.xsections = self._swmmio_model.inp.xsections else: self._swmmio_model = None - - self.nodes = None - self.links = None - self.subcatchments = None - self.raingages = None - self.options = None - @property def node_name_list(self): @@ -60,7 +73,8 @@ def node_name_list(self): list of strings """ - return self.junction_name_list + self.outfall_name_list + self.storage_name_list + return self.junction_name_list + self.outfall_name_list + \ + self.storage_name_list @property def junction_name_list(self): @@ -71,7 +85,7 @@ def junction_name_list(self): list of strings """ - return list(self._swmmio_model.inp.junctions.index) + return list(self.junctions.index) @property @@ -83,7 +97,7 @@ def outfall_name_list(self): list of strings """ - return list(self._swmmio_model.inp.outfalls.index) + return list(self.outfalls.index) @property @@ -95,7 +109,7 @@ def storage_name_list(self): list of strings """ - return list(self._swmmio_model.inp.storage.index) + return list(self.storage.index) @property def link_name_list(self): @@ -118,7 +132,7 @@ def conduit_name_list(self): list of strings """ - return list(self._swmmio_model.inp.conduits.index) + return list(self.conduits.index) @property def weir_name_list(self): @@ -129,7 +143,7 @@ def weir_name_list(self): list of strings """ - return list(self._swmmio_model.inp.weirs.index) + return list(self.weirs.index) @property def orifice_name_list(self): @@ -140,7 +154,7 @@ def orifice_name_list(self): list of strings """ - return list(self._swmmio_model.inp.orifices.index) + return list(self.orifices.index) @property def pump_name_list(self): @@ -151,7 +165,7 @@ def pump_name_list(self): list of strings """ - return list(self._swmmio_model.inp.pumps.index) + return list(self.pumps.index) @property def subcatchment_name_list(self): @@ -162,7 +176,7 @@ def subcatchment_name_list(self): list of strings """ - return list(self._swmmio_model.inp.subcatchments.index) + return list(self.subcatchments.index) @property def raingage_name_list(self): @@ -173,7 +187,7 @@ def raingage_name_list(self): list of strings """ - return list(self._swmmio_model.inp.raingages.index) + return list(self.raingages.index) @property def num_nodes(self): @@ -258,30 +272,3 @@ def to_graph(self, node_weight=None, link_weight=None, networkx MultiDiGraph """ return to_graph(self) - - - def udpate_model_inp(self, filename=None): - """ - Update self._swmmio_model.inp based udpates to self.nodes, self.links, - self.subcatchments, and self.raingages - """ - model_inp = self._swmmio_model.inp - - # nodes - for df in [model_inp.junctions, model_inp.outfalls, model_inp.storage]: - df = self.nodes.loc[df.index, df.columns] - # links - for df in [model_inp.conduits, model_inp.weirs, model_inp.orifices, model_inp.pumps]: - df = self.links.loc[df.index, df.columns] - # subcatchments - for df in [model_inp.subcatchments]: - df = self.subcatchments.loc[df.index, df.columns] - # raingages - for df in [model_inp.raingages]: - df = self.raingages.loc[df.index, df.columns] - # options - for df in [model_inp.options]: - df = self.options.loc[df.index, df.columns] - - if filename: - write_inpfile(self, filename) \ No newline at end of file diff --git a/wntr/stormwater/sim.py b/wntr/stormwater/sim.py index 0569415d0..502a5a1e4 100644 --- a/wntr/stormwater/sim.py +++ b/wntr/stormwater/sim.py @@ -1,7 +1,7 @@ import os import pyswmm -from wntr.stormwater.io import read_outfile +from wntr.stormwater.io import write_inpfile, read_outfile os.environ["CONDA_DLL_SEARCH_MODIFICATION_ENABLE"] = "1" # See https://github.com/OpenWaterAnalytics/pyswmm/issues/298 @@ -16,12 +16,17 @@ def run_sim(self, file_prefix='temp'): inpfile = file_prefix + '.inp' outfile = file_prefix + '.out' - - # Update swmmio model inp based on swn data - self._swn.udpate_model_inp(inpfile) - sim = pyswmm.Simulation(inpfile) - sim.execute() + write_inpfile(self._swn, inpfile) + + # The use of swmmio run command seems slower and would not report errors + # import subprocess + # subprocess.run("python -m swmmio --run " + inpfile) + + with pyswmm.Simulation(inpfile) as sim: + for step in sim: + pass + sim.report() results = read_outfile(outfile) From 4e13a044e071f221f3b65b5112b81d7f5ae1f317 Mon Sep 17 00:00:00 2001 From: Katherine Klise Date: Mon, 16 Oct 2023 09:31:03 -0700 Subject: [PATCH 06/69] corrected rst for stormwater --- documentation/apidoc/wntr.stormwater.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/apidoc/wntr.stormwater.rst b/documentation/apidoc/wntr.stormwater.rst index cae3a6b43..ca3604b00 100644 --- a/documentation/apidoc/wntr.stormwater.rst +++ b/documentation/apidoc/wntr.stormwater.rst @@ -1,4 +1,4 @@ -wntr.morph package +wntr.stormwater package ==================== .. automodule:: wntr.stormwater From 7e621f0fcd1e6687d82fc6be2bbce576c66e0065 Mon Sep 17 00:00:00 2001 From: Katherine Klise Date: Tue, 17 Oct 2023 15:35:33 -0700 Subject: [PATCH 07/69] stormwater updates --- documentation/apidoc/wntr.stormwater.gis.rst | 8 + .../apidoc/wntr.stormwater.graphics.rst | 8 + documentation/apidoc/wntr.stormwater.io.rst | 1 + .../apidoc/wntr.stormwater.metrics.rst | 8 + .../apidoc/wntr.stormwater.network.rst | 1 + .../apidoc/wntr.stormwater.scenario.rst | 8 + documentation/apidoc/wntr.stormwater.sim.rst | 1 + wntr/stormwater/__init__.py | 10 +- wntr/stormwater/gis.py | 222 +++++++++++++ wntr/stormwater/graphics.py | 197 ++---------- wntr/stormwater/io.py | 106 ++++-- wntr/stormwater/network.py | 304 +++++++++++++----- wntr/stormwater/{fragility.py => scenario.py} | 0 wntr/stormwater/sim.py | 6 +- 14 files changed, 591 insertions(+), 289 deletions(-) create mode 100644 documentation/apidoc/wntr.stormwater.gis.rst create mode 100644 documentation/apidoc/wntr.stormwater.graphics.rst create mode 100644 documentation/apidoc/wntr.stormwater.metrics.rst create mode 100644 documentation/apidoc/wntr.stormwater.scenario.rst rename wntr/stormwater/{fragility.py => scenario.py} (100%) diff --git a/documentation/apidoc/wntr.stormwater.gis.rst b/documentation/apidoc/wntr.stormwater.gis.rst new file mode 100644 index 000000000..4aa561e02 --- /dev/null +++ b/documentation/apidoc/wntr.stormwater.gis.rst @@ -0,0 +1,8 @@ +wntr.stormwater.gis module +===================================== + +.. automodule:: wntr.stormwater.gis + :members: + :inherited-members: + :no-undoc-members: + :show-inheritance: diff --git a/documentation/apidoc/wntr.stormwater.graphics.rst b/documentation/apidoc/wntr.stormwater.graphics.rst new file mode 100644 index 000000000..1bc7a0eec --- /dev/null +++ b/documentation/apidoc/wntr.stormwater.graphics.rst @@ -0,0 +1,8 @@ +wntr.stormwater.graphics module +===================================== + +.. automodule:: wntr.stormwater.graphics + :members: + :inherited-members: + :no-undoc-members: + :show-inheritance: diff --git a/documentation/apidoc/wntr.stormwater.io.rst b/documentation/apidoc/wntr.stormwater.io.rst index fa0ac4d22..d41687e41 100644 --- a/documentation/apidoc/wntr.stormwater.io.rst +++ b/documentation/apidoc/wntr.stormwater.io.rst @@ -3,5 +3,6 @@ wntr.stormwater.io module .. automodule:: wntr.stormwater.io :members: + :inherited-members: :no-undoc-members: :show-inheritance: diff --git a/documentation/apidoc/wntr.stormwater.metrics.rst b/documentation/apidoc/wntr.stormwater.metrics.rst new file mode 100644 index 000000000..6e122af12 --- /dev/null +++ b/documentation/apidoc/wntr.stormwater.metrics.rst @@ -0,0 +1,8 @@ +wntr.stormwater.metrics module +===================================== + +.. automodule:: wntr.stormwater.metrics + :members: + :inherited-members: + :no-undoc-members: + :show-inheritance: diff --git a/documentation/apidoc/wntr.stormwater.network.rst b/documentation/apidoc/wntr.stormwater.network.rst index 4e9f615ff..e286fb891 100644 --- a/documentation/apidoc/wntr.stormwater.network.rst +++ b/documentation/apidoc/wntr.stormwater.network.rst @@ -3,5 +3,6 @@ wntr.stormwater.network module .. automodule:: wntr.stormwater.network :members: + :inherited-members: :no-undoc-members: :show-inheritance: diff --git a/documentation/apidoc/wntr.stormwater.scenario.rst b/documentation/apidoc/wntr.stormwater.scenario.rst new file mode 100644 index 000000000..c51b0bb98 --- /dev/null +++ b/documentation/apidoc/wntr.stormwater.scenario.rst @@ -0,0 +1,8 @@ +wntr.stormwater.scenario module +===================================== + +.. automodule:: wntr.stormwater.scenario + :members: + :inherited-members: + :no-undoc-members: + :show-inheritance: diff --git a/documentation/apidoc/wntr.stormwater.sim.rst b/documentation/apidoc/wntr.stormwater.sim.rst index a10fc24ed..bb4eae6d6 100644 --- a/documentation/apidoc/wntr.stormwater.sim.rst +++ b/documentation/apidoc/wntr.stormwater.sim.rst @@ -3,5 +3,6 @@ wntr.stormwater.sim module .. automodule:: wntr.stormwater.sim :members: + :inherited-members: :no-undoc-members: :show-inheritance: diff --git a/wntr/stormwater/__init__.py b/wntr/stormwater/__init__.py index 120890d13..324f9c5da 100644 --- a/wntr/stormwater/__init__.py +++ b/wntr/stormwater/__init__.py @@ -2,10 +2,10 @@ The wntr.stormwater package contains storm water resilience functionality through integration of WNTR with SWMM, pyswmm, and swmmio """ -from wntr.stormwater.network import * -from wntr.stormwater.sim import * from wntr.stormwater.gis import * -from wntr.stormwater.fragility import * -from wntr.stormwater.metrics import * from wntr.stormwater.graphics import * -from wntr.stormwater.io import * \ No newline at end of file +from wntr.stormwater.io import * +from wntr.stormwater.metrics import * +from wntr.stormwater.network import * +from wntr.stormwater.sim import * +from wntr.stormwater.scenario import * diff --git a/wntr/stormwater/gis.py b/wntr/stormwater/gis.py index 2b579902a..0c8f27f03 100644 --- a/wntr/stormwater/gis.py +++ b/wntr/stormwater/gis.py @@ -1 +1,223 @@ from wntr.gis import snap, intersect + +import swmmio + +import pandas as pd +import numpy as np + +try: + from shapely.geometry import LineString, Point + has_shapely = True +except ModuleNotFoundError: + has_shapely = False + +try: + import geopandas as gpd + has_geopandas = True +except ModuleNotFoundError: + has_geopandas = False + +import wntr.network.elements + +class StormWaterNetworkGIS: + """ + Storm Water network GIS class + + Contains methods to create GeoDataFrames from StormWaterNetworkModel. + The ability to a create StormWaterNetworkModel from GeoDataFrames is + not implemented. + + Parameters + ---------- + gis_data : dict, optional + Dictionary of GeoDataFrames containing data to populate an instance + of StormWaterNetworkGIS. Valid dictionary keys are + 'junctions', 'outfalls','storage', + 'conduits', 'weirs', 'orifices', and 'pumps' + + Raises + ------ + ModuleNotFoundError + if missing either shapely or geopandas + """ + + def __init__(self, gis_data=None) -> None: + + if not has_shapely or not has_geopandas: + raise ModuleNotFoundError('shapley and geopandas are required') + + self.junctions = gpd.GeoDataFrame() + self.outfalls = gpd.GeoDataFrame() + self.storage = gpd.GeoDataFrame() + self.conduits = gpd.GeoDataFrame() + self.weirs = gpd.GeoDataFrame() + self.orifices = gpd.GeoDataFrame() + self.pumps = gpd.GeoDataFrame() + + if isinstance(gis_data, dict): + for name in ["junctions", "outfalls", "storage", + "conduits", "weirs", "orifices", "pumps"]: + gdf = getattr(self, name) + if name in gis_data.keys(): + assert isinstance(gis_data[name], gpd.GeoDataFrame) + gdf = gis_data[name] + + def _create_gis(self, swn, crs: str = None) -> None: + """ + Create GIS data from a water network model. + + This method is used by wntr.network.io.to_gis + + Note: patterns, curves, rules, controls, sources, and options are not + saved to the GIS data + + Parameters + ---------- + wn : WaterNetworkModel + Water network model + crs : str, optional + Coordinate reference system, by default None + """ + + # create an updated swmmio model from inp file + filename = 'temp.inp' + swn._swmmio_model.inp.save(filename) + m = swmmio.Model(filename) + + self.junctions = m.nodes.geodataframe.loc[swn.junction_name_list,:] + self.outfalls = m.nodes.geodataframe.loc[swn.outfall_name_list,:] + self.storage = m.nodes.geodataframe.loc[swn.storage_name_list,:] + + self.conduits = m.links.geodataframe.loc[swn.conduit_name_list,:] + self.weirs = m.links.geodataframe.loc[swn.weir_name_list,:] + self.orifices = m.links.geodataframe.loc[swn.orifice_name_list,:] + self.pumps = m.links.geodataframe.loc[swn.pump_name_list,:] + + self.set_crs(crs, allow_override=True) + + def _create_swn(self, append=None): + raise NotImplementedError + + def to_crs(self, crs): + """ + Transform CRS of the junctions, tanks, reservoirs, pipes, pumps, + and valves GeoDataFrames. + + Calls geopandas.GeoDataFrame.to_crs on each GeoDataFrame. + + Parameters + ---------- + crs : str + Coordinate reference system + """ + for name in ["junctions", "outfalls", "storage", + "conduits", "weirs", "orifices", "pumps"]: + gdf = getattr(self, name) + if 'geometry' in gdf.columns: + gdf = gdf.to_crs(crs, inplace=True) + + def set_crs(self, crs, allow_override=False): + """ + Set CRS of the junctions, tanks, reservoirs, pipes, pumps, + and valves GeoDataFrames. + + Calls geopandas.GeoDataFrame.set_crs on each GeoDataFrame. + + Parameters + ---------- + crs : str + Coordinate reference system + allow_override : bool (optional) + Allow override of existing coordinate reference system + """ + + for name in ["junctions", "outfalls", "storage", + "conduits", "weirs", "orifices", "pumps"]: + gdf = getattr(self, name) + if 'geometry' in gdf.columns: + gdf = gdf.set_crs(crs, inplace=True, + allow_override=allow_override) + + def add_node_attributes(self, values, name): + raise NotImplementedError + + def add_link_attributes(self, values, name): + raise NotImplementedError + + def _read(self, files, index_col='index'): + + for name in ["junctions", "outfalls", "storage", + "conduits", "weirs", "orifices", "pumps"]: + gdf = getattr(self, name) + if name in files.keys(): + data = gpd.read_file(files[name]).set_index(index_col) + gdf = pd.concat([gdf, data]) + + def read_geojson(self, files, index_col='index'): + """ + Append information from GeoJSON files to a WaterNetworkGIS object + + Parameters + ---------- + files : dictionary + Dictionary of GeoJSON filenames, where the keys are in the set + ('junction', 'tanks', 'reservoirs', 'pipes', 'pumps', 'valves') and + values are the corresponding GeoJSON filename + index_col : str, optional + Column that contains the element name + """ + self._read(files, index_col) + + def read_shapefile(self, files, index_col='index'): + raise NotImplementedError + + def _write(self, prefix: str, driver="GeoJSON") -> None: + """ + Write the WaterNetworkGIS object to GIS files + + One file will be created for each type of network element (junctions, + pipes, etc.) if those elements exists in the network + + Parameters + ---------- + prefix : str + Filename prefix, will have the element type (junctions, + pipes, etc.) appended + driver : str, optional + GeoPandas driver. Use "GeoJSON" for GeoJSON files, use :code:`None` + for Esri Shapefile folders, by default "GeoJSON" + + """ + + if driver is None or driver == "": + extension = "" + else: + extension = "." + driver.lower() + + for name in ["junctions", "outfalls", "storage", + "conduits", "weirs", "orifices", "pumps"]: + gdf = getattr(self, name) + if len(gdf) > 0: + filename = prefix + "_" + name + extension + gdf.to_file(filename, driver=driver) + + def write_geojson(self, prefix: str): + """ + Write the WaterNetworkGIS object to a set of GeoJSON files, one file + for each network element. + + Parameters + ---------- + prefix : str + File prefix + """ + self._write(prefix=prefix, driver="GeoJSON") + + def write_shapefile(self, prefix: str): + raise NotImplementedError + + def _valid_names(self, complete_list=True, truncate_names=None): + raise NotImplementedError + + def _shapefile_field_name_map(self): + raise NotImplementedError diff --git a/wntr/stormwater/graphics.py b/wntr/stormwater/graphics.py index c2e56e3c3..6d89c6f8c 100644 --- a/wntr/stormwater/graphics.py +++ b/wntr/stormwater/graphics.py @@ -2,187 +2,28 @@ import networkx as nx import matplotlib.pylab as plt -from wntr.graphics.network import plot_network as _plot_network +from wntr.graphics.network import plot_network +from wntr.graphics.curve import plot_fragility_curve +from wntr.graphics.color import custom_colormap, random_colormap logger = logging.getLogger(__name__) -""" -def plot_network(swn, node_attribute=None, link_attribute=None, title=None, - node_size=20, node_range=[None,None], node_alpha=1, node_cmap=None, node_labels=False, - link_width=1, link_range=[None,None], link_alpha=1, link_cmap=None, link_labels=False, - add_colorbar=True, node_colorbar_label='Node', link_colorbar_label='Link', - directed=False, ax=None, filename=None): - - if ax is None: # create a new figure - plt.figure(facecolor="w", edgecolor="k") - ax = plt.gca() - - for subcatch in swn.subcatchments['geometry']: - ax.plot(*subcatch.boundary.xy, c='gray', linewidth=0.5) - - _plot_network(swn, node_attribute, link_attribute, title, - node_size, node_range, node_alpha, node_cmap, node_labels, - link_width, link_range, link_alpha, link_cmap, link_labels, - add_colorbar, node_colorbar_label, link_colorbar_label, - directed, ax=ax, filename=filename) -""" -def plot_network( - swn, - node_attribute=None, - link_attribute=None, - title=None, - node_size=20, - node_range=[None, None], - node_alpha=1, - node_cmap=None, - node_labels=False, - link_width=1, - link_range=[None, None], - link_alpha=1, - link_cmap=None, - link_labels=False, - add_colorbar=True, - node_colorbar_label="Node", - link_colorbar_label="Link", - directed=False, - ax=None, - filename=None, - inpdata=None, -): - - if ax is None: # create a new figure - plt.figure(facecolor="w", edgecolor="k") - ax = plt.gca() - - # Graph - G = swn.to_graph() - if not directed: - G = G.to_undirected() - - # Position - pos = nx.get_node_attributes(G, "coords") - pos = dict((k, (v[0][0], v[0][1])) for k,v in pos.items()) - if len(pos) == 0: - pos = None - - # Define node properties - add_node_colorbar = add_colorbar - if node_attribute is not None: - - if isinstance(node_attribute, list): - if node_cmap is None: - node_cmap = ["red", "red"] - add_node_colorbar = False - - if node_cmap is None: - node_cmap = plt.get_cmap("Spectral_r") - elif isinstance(node_cmap, list): - if len(node_cmap) == 1: - node_cmap = node_cmap * 2 - node_cmap = custom_colormap(len(node_cmap), node_cmap) - - node_attribute = dict(node_attribute) - nodelist, nodecolor = zip(*node_attribute.items()) - - else: - nodelist = None - nodecolor = "k" - - add_link_colorbar = add_colorbar - if link_attribute is not None: - if isinstance(link_attribute, list): - if link_cmap is None: - link_cmap = ["red", "red"] - add_link_colorbar = False - - if link_cmap is None: - link_cmap = plt.get_cmap("Spectral_r") - elif isinstance(link_cmap, list): - if len(link_cmap) == 1: - link_cmap = link_cmap * 2 - link_cmap = custom_colormap(len(link_cmap), link_cmap) - - link_attribute = dict(link_attribute) - - # Replace link_attribute dictionary defined as - # {link_name: attr} with {(start_node, end_node, link_name): attr} - attr = {} - edge_tuples = list(G.edges(keys=True)) - for edge_tuple in list(G.edges(keys=True)): - edge_name = edge_tuple[2] - try: - value = link_attribute[edge_name] - attr[edge_tuple] = value - except: - pass - link_attribute = attr - - linklist, linkcolor = zip(*link_attribute.items()) - else: - linklist = None - linkcolor = "k" - - if title is not None: - ax.set_title(title) +# def plot_network(swn, node_attribute=None, link_attribute=None, title=None, +# node_size=20, node_range=[None,None], node_alpha=1, node_cmap=None, node_labels=False, +# link_width=1, link_range=[None,None], link_alpha=1, link_cmap=None, link_labels=False, +# add_colorbar=True, node_colorbar_label='Node', link_colorbar_label='Link', +# directed=False, ax=None, filename=None): - for subcatch in swn.subcatchments['geometry']: - ax.plot(*subcatch.boundary.xy, c='gray', linewidth=0.5) - - edge_background = nx.draw_networkx_edges(G, pos, edge_color="grey", width=0.5, ax=ax) - - nodes = nx.draw_networkx_nodes( - G, - pos, - nodelist=nodelist, - node_color=nodecolor, - node_size=node_size, - alpha=node_alpha, - cmap=node_cmap, - vmin=node_range[0], - vmax=node_range[1], - linewidths=0, - ax=ax, - ) - edges = nx.draw_networkx_edges( - G, - pos, - edgelist=linklist, - edge_color=linkcolor, - width=link_width, - alpha=link_alpha, - edge_cmap=link_cmap, - edge_vmin=link_range[0], - edge_vmax=link_range[1], - ax=ax, - ) - if node_labels: - labels = dict(zip(swn.node_name_list, swn.node_name_list)) - nx.draw_networkx_labels(G, pos, labels, font_size=7, ax=ax) - # if link_labels: - # labels = {} - # for link_name in swn.link_name_list: - # link = wn.get_link(link_name) - # labels[(link.start_node_name, link.end_node_name)] = link_name - # nx.draw_networkx_edge_labels(G, pos, labels, font_size=7, ax=ax) +# if ax is None: # create a new figure +# plt.figure(facecolor="w", edgecolor="k") +# ax = plt.gca() - if add_node_colorbar and node_attribute: - clb = plt.colorbar(nodes, shrink=0.5, pad=0, ax=ax) - clb.ax.set_title(node_colorbar_label, fontsize=10) - if add_link_colorbar and link_attribute: - if directed: - vmin = min(map(abs, link_attribute.values())) - vmax = max(map(abs, link_attribute.values())) - sm = plt.cm.ScalarMappable(cmap=link_cmap, norm=plt.Normalize(vmin=vmin, vmax=vmax)) - sm.set_array([]) - clb = plt.colorbar(sm, shrink=0.5, pad=0.05, ax=ax) - else: - clb = plt.colorbar(edges, shrink=0.5, pad=0.05, ax=ax) - clb.ax.set_title(link_colorbar_label, fontsize=10) - - ax.axis("off") - - if filename: - plt.savefig(filename) - - return ax +# #for subcatch in swn.subcatchments['geometry']: +# # ax.plot(*subcatch.boundary.xy, c='gray', linewidth=0.5) + +# _plot_network(swn, node_attribute, link_attribute, title, +# node_size, node_range, node_alpha, node_cmap, node_labels, +# link_width, link_range, link_alpha, link_cmap, link_labels, +# add_colorbar, node_colorbar_label, link_colorbar_label, +# directed, ax=ax, filename=filename) diff --git a/wntr/stormwater/io.py b/wntr/stormwater/io.py index f5982b4b8..e5d8f7971 100644 --- a/wntr/stormwater/io.py +++ b/wntr/stormwater/io.py @@ -1,20 +1,36 @@ import logging import pandas as pd +import networkx as nx import pyswmm import swmmio from swmm.toolkit.shared_enum import NodeAttribute, LinkAttribute, \ SubcatchAttribute, SystemAttribute from wntr.sim import SimulationResults -from wntr.gis import WaterNetworkGIS +from wntr.stormwater.gis import StormWaterNetworkGIS +import wntr.stormwater logger = logging.getLogger(__name__) def to_graph(swn): - + """ + Convert a StormWaterNetworkModel into a NetworkX graph + + Parameters + ---------- + swn : StormWaterNetworkModel + Storm water network model + + Returns + ------- + NetworkX graph + + """ G = swn._swmmio_model.network - + geom = nx.get_node_attributes(G, 'geometry') + pos = dict([(k,v['coordinates']) for k,v in geom.items()]) + nx.set_node_attributes(G, pos, 'pos') return G @@ -31,42 +47,58 @@ def to_gis(swn, crs=None): Returns ------- - WaterNetworkGIS object that contains GeoDataFrames + StormWaterNetworkGIS object that contains GeoDataFrames """ - gis_data = WaterNetworkGIS() - - # nodes - gis_data.junctions = swn.nodes.loc[swn.junction_name_list,:] - gis_data.outfalls = swn.nodes.loc[swn.outfall_name_list,:] - gis_data.storages = swn.nodes.loc[swn.storage_name_list,:] - - # links - gis_data.conduits = swn.links.loc[swn.conduit_name_list,:] - gis_data.weirs = swn.links.loc[swn.weir_name_list,:] - gis_data.orifices = swn.links.loc[swn.orifice_name_list,:] - gis_data.pumps = swn.links.loc[swn.pump_name_list,:] - - # subcatchments - gis_data.subcatchments = swn.subcatchments.loc[swn.subcatchment_name_list,:] - + gis_data = StormWaterNetworkGIS() + gis_data._create_gis(swn, crs) return gis_data def write_inpfile(swn, filename): - + """ + Write the StormWaterNetworkModel to an EPANET INP file + + Parameters + ---------- + swn : WaterNetworkModel + Water network model + filename : string + Name of the inp file + """ swn._swmmio_model.inp.save(filename) - def read_inpfile(filename): + """ + Create a StormWaterNetworkModel from an SWMM INP file + + Parameters + ---------- + filename : string + Name of the inp file + + Returns + ------- + StormWaterNetworkModel + """ + swn = wntr.stormwater.network.StormWaterNetworkModel(filename) - model = swmmio.Model(filename) - - return model + return swn -def read_outfile(outfile): +def read_outfile(filename): + """ + Read a SWMM binary output file + Parameters + ---------- + filename : string + Name of the SWMM binary output file + + Returns + ------- + SimulationResults + """ results = SimulationResults() # Node results = INVERT_DEPTH, HYDRAULIC_HEAD, PONDED_VOLUME, @@ -88,7 +120,7 @@ def read_outfile(outfile): # EVAP_RATE results.system = {} - with pyswmm.Output(outfile) as out: + with pyswmm.Output(filename) as out: times = out.times for attribute in NodeAttribute: @@ -117,4 +149,22 @@ def read_outfile(outfile): temp[attribute] = ts.values() results.system = pd.DataFrame(data=temp, index=times) - return results \ No newline at end of file + return results + +def write_geojson(swn, prefix: str, crs=None): + """ + Write the StormWaterNetworkModel to a set of GeoJSON files, one file for each + network element. + + Parameters + ---------- + swn : wntr StormWaterNetworkModel + Storm water network model + prefix : str + File prefix + crs : str, optional + Coordinate reference system, by default None + """ + + swn_gis = swn.to_gis(crs) + swn_gis.write_geojson(prefix=prefix) diff --git a/wntr/stormwater/network.py b/wntr/stormwater/network.py index f175ac38f..cd8cba66e 100644 --- a/wntr/stormwater/network.py +++ b/wntr/stormwater/network.py @@ -1,8 +1,10 @@ import logging +import random +import numpy as np import pandas as pd import swmmio -from wntr.stormwater.io import to_graph, to_gis, write_inpfile +from wntr.stormwater.io import to_graph, to_gis logger = logging.getLogger(__name__) @@ -13,7 +15,7 @@ class StormWaterNetworkModel(object): Unlike the WaterNetworkModel, this class has no iterator methods, add/remove methods, and no component registries. - + Parameters ------------------- inp_file_name: string @@ -25,37 +27,37 @@ def __init__(self, inp_file_name=None): if inp_file_name: self._swmmio_model = swmmio.Model(inp_file_name) - + # Attributes of StormWaterNetworkModel link to attributes # in swmmio.Model.inp, which contains dataframes from an INP file. # The swmmio.Model.inp object also includes a .save method to # write a new INP file. - + # Nodes = Junctions, outfall, and storage nodes self.junctions = self._swmmio_model.inp.junctions self.outfalls = self._swmmio_model.inp.outfalls self.storage = self._swmmio_model.inp.junctions - + # Links = Conduits, weirs, orifices, and pumps self.conduits = self._swmmio_model.inp.conduits self.weirs = self._swmmio_model.inp.weirs self.orifices = self._swmmio_model.inp.orifices self.pumps = self._swmmio_model.inp.pumps - + self.subcatchments = self._swmmio_model.inp.subcatchments self.subareas = self._swmmio_model.inp.subareas - - self.raingages = self._swmmio_model.inp.raingages + + self.raingages = self._swmmio_model.inp.raingages self.infiltration = self._swmmio_model.inp.infiltration self.inflows = self._swmmio_model.inp.inflows #self.dwf = self._swmmio_model.inp.dwf - + self.curves = self._swmmio_model.inp.curves self.timeseries = self._swmmio_model.inp.timeseries - + self.options = self._swmmio_model.inp.options self.files = self._swmmio_model.inp.files - + self.coordinates = self._swmmio_model.inp.coordinates self.vertices = self._swmmio_model.inp.vertices self.polygons = self._swmmio_model.inp.polygons @@ -63,212 +65,362 @@ def __init__(self, inp_file_name=None): else: self._swmmio_model = None - + + @property + # def junctions(self): + # """Generator to get all junctions + + # Yields + # ------ + # name : str + # The name of the junction + # node : Junction + # The junction object + + # """ + # for name, junc in self.junctions.iterrows(): + # yield name, junc + @property def node_name_list(self): """Get a list of node names - + Returns ------- list of strings - + """ return self.junction_name_list + self.outfall_name_list + \ self.storage_name_list - + @property def junction_name_list(self): """Get a list of junction names - + Returns ------- list of strings - + """ return list(self.junctions.index) - @property def outfall_name_list(self): """Get a list of outfall names - + Returns ------- list of strings - + """ return list(self.outfalls.index) - - + @property def storage_name_list(self): """Get a list of storage names - + Returns ------- list of strings - + """ return list(self.storage.index) - + @property def link_name_list(self): """Get a list of link names - + Returns ------- list of strings - + """ return self.conduit_name_list + self.weir_name_list + \ self.orifice_name_list + self.pump_name_list - + @property def conduit_name_list(self): """Get a list of conduit names - + Returns ------- list of strings - + """ return list(self.conduits.index) - + @property def weir_name_list(self): """Get a list of weir names - + Returns ------- list of strings - + """ return list(self.weirs.index) - + @property def orifice_name_list(self): """Get a list of orifice names - + Returns ------- list of strings - + """ return list(self.orifices.index) - + @property def pump_name_list(self): """Get a list of pump names - + Returns ------- list of strings - + """ return list(self.pumps.index) - + @property def subcatchment_name_list(self): """Get a list of subcatchment names - + Returns ------- list of strings - + """ return list(self.subcatchments.index) - + @property def raingage_name_list(self): """Get a list of raingage names - + Returns ------- list of strings - + """ return list(self.raingages.index) - + @property def num_nodes(self): """The number of nodes""" return len(self.node_name_list) - + @property def num_junctions(self): """The number of junctions""" return len(self.junction_name_list) - + @property def num_outfalls(self): """The number of outfalls""" return len(self.outfall_name_list) - + @property def num_storages(self): """The number of storages""" return len(self.storage_name_list) - + @property def num_links(self): """The number of links""" return len(self.link_name_list) - + @property def num_conduits(self): """The number of conduits""" return len(self.conduit_name_list) - + @property def num_weirs(self): """The number of weirs""" return len(self.weir_name_list) - + @property def num_orifices(self): """The number of orifices""" return len(self.orifice_name_list) - + @property def num_pumps(self): """The number of pumps""" return len(self.pump_name_list) - + @property def num_subcatchments(self): """The number of subcatchments""" return len(self.subcatchment_name_list) - + @property def num_raingages(self): """The number of raingages""" return len(self.raingage_name_list) - - - def to_gis(self, crs=None): - - return to_gis(self) - - - def to_graph(self, node_weight=None, link_weight=None, - modify_direction=False): + + def get_node(self, name): + """Get a specific node + + Parameters + ---------- + name : str + The node name + + Returns + ------- + Junction, Outfall, or Storage + """ - Convert a StormWaterNetworkModel into a networkx MultiDiGraph - + return Node(self, name) + + def get_link(self, name): + """Get a specific link + Parameters ---------- - node_weight : dict or pandas Series (optional) - Node weights - link_weight : dict or pandas Series (optional) - Link weights. - modify_direction : bool (optional) - If True, than if the link weight is negative, the link start and - end node are switched and the abs(weight) is assigned to the link - (this is useful when weighting graphs by flowrate). If False, link - direction and weight are not changed. + name : str + The link name + + Returns + ------- + Pipe, Pump, or Valve + + """ + if name in self.conduit_name_list: + data = self.conduits + elif name in self.weir_name_list: + data = self.weirs + elif name in self.orifice_name_list: + data = self.orifices + elif name in self.pump_name_list: + data = self.pumps + start_node_name = data.loc[name, 'InletNode'] + end_node_name = data.loc[name, 'OutletNode'] + + return Link(self, name, start_node_name, end_node_name) + + def to_gis(self, crs=None): + """ + Convert a StormWaterNetworkModel into GeoDataFrames + + Parameters + ---------- + crs : str, optional + Coordinate reference system, by default None + """ + return to_gis(self, crs) + + def to_graph(self): + """ + Convert a StormWaterNetworkModel into a networkx MultiDiGraph + Returns -------- networkx MultiDiGraph """ return to_graph(self) + + +class Node(object): + """ + Base class for nodes. + """ + + def __init__(self, swn, name): + + # Set the node name + self._name = name + + @property + def name(self): + """str: The name of the node (read only)""" + return self._name + + +class Link(object): + """ + Base class for links. + """ + + def __init__(self, swn, link_name, start_node_name, end_node_name): + + self._link_name = link_name + self._start_node_name = start_node_name + self._end_node_name = end_node_name + + @property + def name(self): + """str: The link name (read-only)""" + return self._link_name + + @property + def start_node_name(self): + """str: The name of the start node (read only)""" + return self._start_node_name + + @property + def end_node_name(self): + """str: The name of the end node (read only)""" + return self._end_node_name + +def generate_valve_layer(swn, placement_type='strategic', n=1, seed=None): + """ + Generate valve layer data, which can be used in valve segmentation analysis. + + Parameters + ----------- + swn : wntr StrormWaterNetworkModel + A StormWaterNetworkModel object + + placement_type : string + Options include 'strategic' and 'random'. + + - If 'strategic', n is the number of pipes from each node that do not + contain a valve. In this case, n is generally 0, 1 or 2 + (i.e. N, N-1, N-2 valve placement). + - If 'random', then n randomly placed valves are used to define the + valve layer. + + n : int + + - If 'strategic', n is the number of pipes from each node that do not + contain a valve. + - If 'random', n is the number of number of randomly placed valves. + + seed : int or None + Random seed + + Returns + --------- + valve_layer : pandas DataFrame + Valve layer, defined by node and link pairs (for example, valve 0 is + on link A and protects node B). The valve_layer DataFrame is indexed by + valve number, with columns named 'node' and 'link'. + """ + + if seed is not None: + np.random.seed(seed) + random.seed(seed) + valve_layer = [] + if placement_type=='random': + s = swn.conduits['InletNode'] + all_valves = list(tuple(zip(s.index,s))) + s = swn.conduits['OutletNode'] + all_valves.extend(tuple(zip(s.index,s))) + for valve_tuple in random.sample(all_valves, n): + pipe_name, node_name = valve_tuple + valve_layer.append([pipe_name, node_name]) + + elif placement_type == 'strategic': + s = pd.concat([swn.conduits['InletNode'], swn.conduits['OutletNode']]) + s = s.to_frame('Node') + for node_name, group in s.groupby('Node'): + links = list(group.index) + for l in np.random.choice(links, max(len(links)-n,0), replace=False): + valve_layer.append([l, node_name]) + + valve_layer = pd.DataFrame(valve_layer, columns=['link', 'node']) + + return valve_layer diff --git a/wntr/stormwater/fragility.py b/wntr/stormwater/scenario.py similarity index 100% rename from wntr/stormwater/fragility.py rename to wntr/stormwater/scenario.py diff --git a/wntr/stormwater/sim.py b/wntr/stormwater/sim.py index 502a5a1e4..885bf7aa0 100644 --- a/wntr/stormwater/sim.py +++ b/wntr/stormwater/sim.py @@ -8,12 +8,14 @@ class SWMMSimulator(object): - + """ + SWMM simulator class. + """ def __init__(self, swn): self._swn = swn def run_sim(self, file_prefix='temp'): - + """Run a SWMM simulation""" inpfile = file_prefix + '.inp' outfile = file_prefix + '.out' From 5cb7597054cb9bf74e77aaf6d70e857aeefa3f16 Mon Sep 17 00:00:00 2001 From: Katherine Klise Date: Wed, 18 Oct 2023 08:40:57 -0700 Subject: [PATCH 08/69] bug fix --- wntr/stormwater/network.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wntr/stormwater/network.py b/wntr/stormwater/network.py index cd8cba66e..594e71cdd 100644 --- a/wntr/stormwater/network.py +++ b/wntr/stormwater/network.py @@ -36,7 +36,7 @@ def __init__(self, inp_file_name=None): # Nodes = Junctions, outfall, and storage nodes self.junctions = self._swmmio_model.inp.junctions self.outfalls = self._swmmio_model.inp.outfalls - self.storage = self._swmmio_model.inp.junctions + self.storage = self._swmmio_model.inp.storage # Links = Conduits, weirs, orifices, and pumps self.conduits = self._swmmio_model.inp.conduits From 9854c8e8d690f647cf5fcf3583e25cee26bb4fc4 Mon Sep 17 00:00:00 2001 From: Katherine Klise Date: Mon, 23 Oct 2023 13:40:05 -0700 Subject: [PATCH 09/69] minor updates --- wntr/stormwater/gis.py | 3 ++- wntr/stormwater/sim.py | 8 +++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/wntr/stormwater/gis.py b/wntr/stormwater/gis.py index 0c8f27f03..033c7b927 100644 --- a/wntr/stormwater/gis.py +++ b/wntr/stormwater/gis.py @@ -93,7 +93,8 @@ def _create_gis(self, swn, crs: str = None) -> None: self.orifices = m.links.geodataframe.loc[swn.orifice_name_list,:] self.pumps = m.links.geodataframe.loc[swn.pump_name_list,:] - self.set_crs(crs, allow_override=True) + if crs is not None: + self.set_crs(crs, allow_override=True) def _create_swn(self, append=None): raise NotImplementedError diff --git a/wntr/stormwater/sim.py b/wntr/stormwater/sim.py index 885bf7aa0..f7676fbe1 100644 --- a/wntr/stormwater/sim.py +++ b/wntr/stormwater/sim.py @@ -17,14 +17,20 @@ def __init__(self, swn): def run_sim(self, file_prefix='temp'): """Run a SWMM simulation""" inpfile = file_prefix + '.inp' + if os.path.isfile(inpfile): + os.remove(inpfile) + outfile = file_prefix + '.out' + if os.path.isfile(outfile): + os.remove(outfile) write_inpfile(self._swn, inpfile) - # The use of swmmio run command seems slower and would not report errors + # The use of swmmio run command seems slower # import subprocess # subprocess.run("python -m swmmio --run " + inpfile) + # The use of pyswmm has compatibility issues with some inp files with pyswmm.Simulation(inpfile) as sim: for step in sim: pass From 7ff13083a0345d2488e8f45054609cb44624b7b7 Mon Sep 17 00:00:00 2001 From: Katherine Klise Date: Thu, 26 Oct 2023 10:30:29 -0700 Subject: [PATCH 10/69] added ability to weight and modify direction in the graph --- wntr/stormwater/io.py | 42 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/wntr/stormwater/io.py b/wntr/stormwater/io.py index e5d8f7971..7f7d0a710 100644 --- a/wntr/stormwater/io.py +++ b/wntr/stormwater/io.py @@ -13,27 +13,59 @@ logger = logging.getLogger(__name__) -def to_graph(swn): +def to_graph(swn, node_weight=None, link_weight=None, modify_direction=False): """ - Convert a StormWaterNetworkModel into a NetworkX graph + Convert a StormWaterNetworkModel into a NetworkX MultiDiGraph Parameters ---------- swn : StormWaterNetworkModel Storm water network model - + node_weight : dict or pandas Series (optional) + Node weights + link_weight : dict or pandas Series (optional) + Link weights + modify_direction : bool (optional) + If True, then if the link weight is negative, the link start and + end node are switched and the abs(weight) is assigned to the link + (this is useful when weighting graphs by flowrate). If False, link + direction and weight are not changed. + Returns ------- - NetworkX graph + NetworkX MultiDiGraph """ G = swn._swmmio_model.network + + # Add a node attribute 'pos' to store the node position as a tuple geom = nx.get_node_attributes(G, 'geometry') pos = dict([(k,v['coordinates']) for k,v in geom.items()]) nx.set_node_attributes(G, pos, 'pos') + + if node_weight is not None: + nx.set_node_attributes(G, node_weight, 'weight') + + if link_weight is not None: + for name in swn.link_name_list: + link = swn.get_link(name) + start_node = link.start_node_name + end_node = link.end_node_name + try: + value = link_weight[name] + if modify_direction and value <= 0: # change the direction of the link and value + G.remove_edge(start_node, end_node, name) + if value == 0: + continue + G.add_edge(end_node, start_node, name) + nx.set_edge_attributes(G, name="weight", values={(end_node, start_node, name): -value}) + else: + nx.set_edge_attributes(G, name="weight", values={(start_node, end_node, name): value}) + except: + pass + return G - def to_gis(swn, crs=None): """ Convert a StormWaterNetworkModel into GeoDataFrames From f586507d574a2be9ce0ef4144178074a3f422239 Mon Sep 17 00:00:00 2001 From: Katherine Klise Date: Thu, 26 Oct 2023 10:30:50 -0700 Subject: [PATCH 11/69] added upstream and downstream metrics --- wntr/stormwater/metrics.py | 90 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) diff --git a/wntr/stormwater/metrics.py b/wntr/stormwater/metrics.py index 43162151a..772ca019b 100644 --- a/wntr/stormwater/metrics.py +++ b/wntr/stormwater/metrics.py @@ -1 +1,91 @@ +import networkx as nx +import itertools + from wntr.metrics.topographic import * + +def upstream_nodes(G, source_node): + """ + Steady state upstream nodes from a source node + + Parameters + ------------ + G : networkX MultiDiGraph + Graph + source_node : str + Source node name + + Returns + -------- + List of upstream node names + + """ + nodes = list(nx.traversal.bfs_tree(G, source_node, reverse=True)) + return nodes + +def upstream_edges(G, source_node): + """ + Steady state upstream edges from a source node + + Parameters + ------------ + G : networkX MultiDiGraph + Graph + source_node : str + Source node name + + Returns + -------- + List of upstream edge names + + """ + # NOTE: 'edge_bfs' yields edges even if they extend back to an already + # explored node while 'bfs_edges' yields the edges of the tree that results + # from a breadth-first-search (BFS) so no edges are reported if they extend + # to already explored nodes. AND Extracting edge names from u,v is slower + # edge_uv = list(nx.traversal.bfs_edges(G, node, reverse=False)) + # uG = G.to_undirected() + # edges = [] + # for u,v in edge_uv: + # edges.extend(list(uG[u][v].keys())) + edge_uvko = list(nx.traversal.edge_bfs(G, source_node, orientation='reverse')) + edges = [k for u,v,k,orentation in edge_uvko] + return edges + +def downstream_nodes(G, source_node): + """ + Steady state downstream nodes from a source node + + Parameters + ------------ + G : networkX MultiDiGraph + Graph + source_node : str + Source node name + + Returns + -------- + List of downstream node names + + """ + nodes = list(nx.traversal.bfs_tree(G, source_node, reverse=False)) + return nodes + +def downstream_edges(G, source_node): + """ + Steady state downstream edges from a source node + + Parameters + ------------ + G : networkX MultiDiGraph + Graph + source_node : str + Source node name + + Returns + -------- + List of downstream edge names + + """ + edge_uvko = list(nx.traversal.edge_bfs(G, source_node, orientation='original')) + edges = [k for u,v,k,orentation in edge_uvko] + return edges From 4522843914361586a9f3d4980f5df197b1e05f06 Mon Sep 17 00:00:00 2001 From: Katherine Klise Date: Thu, 26 Oct 2023 10:31:58 -0700 Subject: [PATCH 12/69] concatenated link and nodes into read only databases and updated Node and Link classes --- wntr/stormwater/network.py | 182 +++++++++++-------------------------- 1 file changed, 51 insertions(+), 131 deletions(-) diff --git a/wntr/stormwater/network.py b/wntr/stormwater/network.py index 594e71cdd..5d3cc21c3 100644 --- a/wntr/stormwater/network.py +++ b/wntr/stormwater/network.py @@ -43,7 +43,7 @@ def __init__(self, inp_file_name=None): self.weirs = self._swmmio_model.inp.weirs self.orifices = self._swmmio_model.inp.orifices self.pumps = self._swmmio_model.inp.pumps - + self.subcatchments = self._swmmio_model.inp.subcatchments self.subareas = self._swmmio_model.inp.subareas @@ -67,196 +67,128 @@ def __init__(self, inp_file_name=None): self._swmmio_model = None @property - # def junctions(self): - # """Generator to get all junctions - - # Yields - # ------ - # name : str - # The name of the junction - # node : Junction - # The junction object - - # """ - # for name, junc in self.junctions.iterrows(): - # yield name, junc - + def nodes(self): + """Nodes database (read only)""" + return pd.concat([self.junctions, + self.outfalls, + self.storage]) + @property - def node_name_list(self): - """Get a list of node names + def links(self): + """Links database (read only)""" + return pd.concat([self.conduits, + self.weirs, + self.orifices, + self.pumps]) - Returns - ------- - list of strings - - """ - return self.junction_name_list + self.outfall_name_list + \ - self.storage_name_list + @property + def node_name_list(self): + """List of node names""" + return list(self.nodes.index) @property def junction_name_list(self): - """Get a list of junction names - - Returns - ------- - list of strings - - """ + """List of junction names""" return list(self.junctions.index) @property def outfall_name_list(self): - """Get a list of outfall names - - Returns - ------- - list of strings - - """ + """List of outfall names""" return list(self.outfalls.index) @property def storage_name_list(self): - """Get a list of storage names - - Returns - ------- - list of strings - - """ + """List of storage names""" return list(self.storage.index) @property def link_name_list(self): - """Get a list of link names - - Returns - ------- - list of strings - - """ - return self.conduit_name_list + self.weir_name_list + \ - self.orifice_name_list + self.pump_name_list + """List of link names""" + return list(self.links.index) @property def conduit_name_list(self): - """Get a list of conduit names - - Returns - ------- - list of strings - - """ + """List of conduit names""" return list(self.conduits.index) @property def weir_name_list(self): - """Get a list of weir names - - Returns - ------- - list of strings - - """ + """List of weir names""" return list(self.weirs.index) @property def orifice_name_list(self): - """Get a list of orifice names - - Returns - ------- - list of strings - - """ + """List of orifice names""" return list(self.orifices.index) @property def pump_name_list(self): - """Get a list of pump names - - Returns - ------- - list of strings - - """ + """List of pump names""" return list(self.pumps.index) @property def subcatchment_name_list(self): - """Get a list of subcatchment names - - Returns - ------- - list of strings - - """ + """List of subcatchment names""" return list(self.subcatchments.index) @property def raingage_name_list(self): - """Get a list of raingage names - - Returns - ------- - list of strings - - """ + """List of raingage names""" return list(self.raingages.index) @property def num_nodes(self): - """The number of nodes""" + """Number of nodes""" return len(self.node_name_list) @property def num_junctions(self): - """The number of junctions""" + """Number of junctions""" return len(self.junction_name_list) @property def num_outfalls(self): - """The number of outfalls""" + """Number of outfalls""" return len(self.outfall_name_list) @property def num_storages(self): - """The number of storages""" + """Number of storages""" return len(self.storage_name_list) @property def num_links(self): - """The number of links""" + """Number of links""" return len(self.link_name_list) @property def num_conduits(self): - """The number of conduits""" + """Number of conduits""" return len(self.conduit_name_list) @property def num_weirs(self): - """The number of weirs""" + """Number of weirs""" return len(self.weir_name_list) @property def num_orifices(self): - """The number of orifices""" + """Number of orifices""" return len(self.orifice_name_list) @property def num_pumps(self): - """The number of pumps""" + """Number of pumps""" return len(self.pump_name_list) @property def num_subcatchments(self): - """The number of subcatchments""" + """Number of subcatchments""" return len(self.subcatchment_name_list) @property def num_raingages(self): - """The number of raingages""" + """Number of raingages""" return len(self.raingage_name_list) def get_node(self, name): @@ -269,10 +201,10 @@ def get_node(self, name): Returns ------- - Junction, Outfall, or Storage + Node """ - return Node(self, name) + return Node(name, self.nodes.loc[name,:]) def get_link(self, name): """Get a specific link @@ -284,22 +216,10 @@ def get_link(self, name): Returns ------- - Pipe, Pump, or Valve + Link """ - if name in self.conduit_name_list: - data = self.conduits - elif name in self.weir_name_list: - data = self.weirs - elif name in self.orifice_name_list: - data = self.orifices - elif name in self.pump_name_list: - data = self.pumps - - start_node_name = data.loc[name, 'InletNode'] - end_node_name = data.loc[name, 'OutletNode'] - - return Link(self, name, start_node_name, end_node_name) + return Link(name, self.links.loc[name,:]) def to_gis(self, crs=None): """ @@ -312,7 +232,7 @@ def to_gis(self, crs=None): """ return to_gis(self, crs) - def to_graph(self): + def to_graph(self, node_weight=None, link_weight=None, modify_direction=False): """ Convert a StormWaterNetworkModel into a networkx MultiDiGraph @@ -320,7 +240,7 @@ def to_graph(self): -------- networkx MultiDiGraph """ - return to_graph(self) + return to_graph(self, node_weight, link_weight, modify_direction) class Node(object): @@ -328,7 +248,7 @@ class Node(object): Base class for nodes. """ - def __init__(self, swn, name): + def __init__(self, name, data): # Set the node name self._name = name @@ -344,15 +264,15 @@ class Link(object): Base class for links. """ - def __init__(self, swn, link_name, start_node_name, end_node_name): + def __init__(self, name, data): - self._link_name = link_name - self._start_node_name = start_node_name - self._end_node_name = end_node_name + self._link_name = name + self._start_node_name = data['InletNode'] + self._end_node_name = data['OutletNode'] @property def name(self): - """str: The link name (read-only)""" + """str: The link name (read only)""" return self._link_name @property From b0131e31fef651703823d4b2f4405561389f4796 Mon Sep 17 00:00:00 2001 From: Katherine Klise Date: Fri, 27 Oct 2023 17:05:53 -0700 Subject: [PATCH 13/69] removed duplicate code --- examples/stormwater_criticality.py | 31 ++---------------------------- 1 file changed, 2 insertions(+), 29 deletions(-) diff --git a/examples/stormwater_criticality.py b/examples/stormwater_criticality.py index cb12deb42..f03dcd9ed 100644 --- a/examples/stormwater_criticality.py +++ b/examples/stormwater_criticality.py @@ -11,7 +11,7 @@ for conduit_name in swn.conduit_name_list: print(conduit_name) swn = swntr.network.StormWaterNetworkModel(inp_file) - swn.links.loc[conduit_name, "MaxFlow"] = 0.0000001 + swn.conduits.loc[conduit_name, "MaxFlow"] = 0.0000001 sim = swntr.sim.SWMMSimulator(swn) results[conduit_name] = sim.run_sim(conduit_name) @@ -22,31 +22,4 @@ # link_range=[0,1]) flowrate.mean(axis=1).plot(ax=ax) - -################ - -# Pipe criticality analysis -import matplotlib.pylab as plt -import wntr - -inp_file = 'networks/Net1.inp' -wn = wntr.network.WaterNetworkModel(inp_file) - -# Pipe criticality analysis -results = {} -fig, ax = plt.subplots() - -for pipe_name in wn.pipe_name_list: - print(pipe_name) - wn = wntr.network.WaterNetworkModel(inp_file) - pipe = wn.get_link(pipe_name) - pipe.initial_status = "Closed" - sim = wntr.sim.EpanetSimulator(wn) - results[pipe_name] = sim.run_sim() - - flowrate = results[pipe_name].link['flowrate'] - #wntr.graphics.plot_network(wn, - # link_attribute=flowrate.mean(axis=0), - # link_width=2, - # link_range=[0,0.1]) - flowrate.mean(axis=1).plot(ax=ax) +print(results['C1'].node.keys()) From 21f3e317726bf94502d1ec9fa90ae19e19aad6ef Mon Sep 17 00:00:00 2001 From: Katherine Klise Date: Fri, 27 Oct 2023 17:06:41 -0700 Subject: [PATCH 14/69] added directed network plot --- wntr/stormwater/graphics.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/wntr/stormwater/graphics.py b/wntr/stormwater/graphics.py index 6d89c6f8c..44dea0459 100644 --- a/wntr/stormwater/graphics.py +++ b/wntr/stormwater/graphics.py @@ -8,6 +8,15 @@ logger = logging.getLogger(__name__) +def plot_network_directed(swn, attribute): + G = swn.to_graph() + G_attr = swn.to_graph(link_weight=attribute, modify_direction=True) + + plt.figure(facecolor='w', edgecolor='k') + ax = plt.gca() + pos = nx.get_node_attributes(G, 'pos') + nx.draw_networkx_edges(G, pos, edge_color='grey', width=0.5, ax=ax) + nx.draw_networkx(G_attr, pos=pos, with_labels=False, node_size=3, ax=ax) # def plot_network(swn, node_attribute=None, link_attribute=None, title=None, # node_size=20, node_range=[None,None], node_alpha=1, node_cmap=None, node_labels=False, From 2af371cfc89ea9e63285fa5a23de12c2fbd5c9e3 Mon Sep 17 00:00:00 2001 From: Katherine Klise Date: Tue, 16 Jan 2024 10:40:18 -0800 Subject: [PATCH 15/69] stormwater updates, docs and tests --- .gitignore | 2 + documentation/_static/water_circle.jpg | Bin 0 -> 31963 bytes documentation/_static/water_drop.jpg | Bin 0 -> 34955 bytes documentation/attention.rst | 9 + documentation/citing_wntr.rst | 11 + documentation/figures/wntr_features.png | Bin 0 -> 452525 bytes documentation/index.rst | 28 +- documentation/installation.rst | 4 +- documentation/overview.rst | 18 +- documentation/references.bib | 30 ++ documentation/stormwater.rst | 444 +++++++++++++++- documentation/units.rst | 2 + documentation/userguide.rst | 36 +- documentation/wntr-api.rst | 1 + examples/networks/Example.inp | 481 ----------------- examples/networks/Site_Drainage_Model.inp | 498 +++++++++++++++++ wntr/stormwater/__init__.py | 4 +- wntr/stormwater/gis.py | 4 + wntr/stormwater/graphics.py | 4 + wntr/stormwater/io.py | 36 ++ wntr/stormwater/metrics.py | 4 + wntr/stormwater/network.py | 114 +++- wntr/stormwater/scenario.py | 4 + wntr/stormwater/sim.py | 74 ++- .../SWMM_examples/Culvert_Model.inp | 153 ++++++ .../SWMM_examples/Detention_Pond_Model.inp | 497 +++++++++++++++++ .../SWMM_examples/Groundwater_Model.inp | 147 +++++ .../SWMM_examples/Inlet_Drains_Model.inp | 502 ++++++++++++++++++ .../SWMM_examples/LID_Model.inp | 394 ++++++++++++++ .../SWMM_examples/Pump_Control_Model.inp | 300 +++++++++++ .../SWMM_examples/README.md | 1 + .../SWMM_examples/Site_Drainage_Model.inp | 498 +++++++++++++++++ 32 files changed, 3729 insertions(+), 571 deletions(-) create mode 100644 documentation/_static/water_circle.jpg create mode 100644 documentation/_static/water_drop.jpg create mode 100644 documentation/attention.rst create mode 100644 documentation/citing_wntr.rst create mode 100644 documentation/figures/wntr_features.png delete mode 100644 examples/networks/Example.inp create mode 100644 examples/networks/Site_Drainage_Model.inp create mode 100644 wntr/tests/networks_for_testing/SWMM_examples/Culvert_Model.inp create mode 100644 wntr/tests/networks_for_testing/SWMM_examples/Detention_Pond_Model.inp create mode 100644 wntr/tests/networks_for_testing/SWMM_examples/Groundwater_Model.inp create mode 100644 wntr/tests/networks_for_testing/SWMM_examples/Inlet_Drains_Model.inp create mode 100644 wntr/tests/networks_for_testing/SWMM_examples/LID_Model.inp create mode 100644 wntr/tests/networks_for_testing/SWMM_examples/Pump_Control_Model.inp create mode 100644 wntr/tests/networks_for_testing/SWMM_examples/README.md create mode 100644 wntr/tests/networks_for_testing/SWMM_examples/Site_Drainage_Model.inp diff --git a/.gitignore b/.gitignore index 01ebf9a57..5aee8f154 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,8 @@ docker/ *.html *.pickle *.xlsx +*.out +*.rpt temp* diff --git a/documentation/_static/water_circle.jpg b/documentation/_static/water_circle.jpg new file mode 100644 index 0000000000000000000000000000000000000000..beaf07d5f4d3ac6b939973b81af96f314351abcc GIT binary patch literal 31963 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�u4~A3&C%gz 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 UGYS_dJOkX{{zq3E=3hhq2PY=L3IG5A literal 0 HcmV?d00001 diff --git a/documentation/_static/water_drop.jpg b/documentation/_static/water_drop.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4578326fcd9f4a6923e1ef3b0fd1ec81927a4f91 GIT binary patch literal 34955 zcmdpe2UL^Wwr&6sr3!*{f}#k7qS9+@fQW$9&?8NO2nfMb=e%?Gxpj<}l{Ll+3IE7i|6Fr^-#6#V@sHzaz`6S>YAOIS z(u0?b7XUaO1Ka^nkdvQ0Nsm*cC*>JR%2TH(si~+=pP{9urKO>!p`oK^I!8y(NKZp^ z?!r07^UN$PEVK-)Y!{f>n3!3ZPcA}6LHeIllxHa^&oa}|&@unZkK;xF;~5Hea&8K; zO8|04G73hr;}!rA03f40`L<+afWJJ*$VuPvG}W22)HI|Il%E5TlTlERpQ1SV)}&AS zk=_TKVx(lcc>UJt^V$|vmzguG3#@GH99Q_S3J3~G zNJ>e|$jaThtE{4WPwl?0p1uLZ(8$=z+UD^STRZ#bu5Rugo?hO8uY!U@UcU*Aj(Haw z7ymvXF+C$QD?8_7Zr-QTvhs?`s_L4i=9bpB_OBhC{R4wT!{{F)qcfP%^CCZWisBU2$-KzOJxHB`@f797>!+D+X;WD^ zpTBe?;0*KasI-zVXZgf+uq>7?ebg5&OUzusolNbwnf7fFE|3A9pdi@|^Sx{X4CMC1>|7xeRpCO9l$RsyjD_zFog&-P+32bg1 zz-vT$P{FX|ne7y*^-bN^YZyC|MKVcT!xtn_%?X$5CjaL81(d=Y(Dhk*xGph&py|=v zn;Zk!YDQP9WgJhTj8egYmIw1P>v})>y?1~z^Fy-#rB1Fr845cmev?Q2K*O{2h;b@- z??Rv2rv)A7r|)ItwI;!_zIIPsccrhHHjP~l7*@9U5%?B1(qNBZ^>^^ZOsNI!-O6g+ z0(fqjpnl47u=aSj&4_%Fr5=U1(Q$vdgK|R_Dp{8O z!sr6(1%3fDl+(O=YBnx5Qg{rQbQE6;fYNMwSsJFQDQeaE#WTz}30ht*8vz25 zmS(Y(%Ppe~7{bAv@t7?ce< zBo_?#7vu+y^TaksHW%oh)me9clwYgpIjFk094WXHF(bx!3xlLvA{3UM4qd(y6WPv% z_+A0qG*WIY>lxy^B9JSZrp&DOj#*n7@ITovW^;HIIkg`N2Y!K{AKdZ!N3Ge3==(@XAgUnXqpzT3f=BrCt1MUCU-!nUicuuLQ#h&v!L& zjfvk6n)bxDnlxIAujV0ZsRj!DxEkCW6cwm2)wSm_YtoRQV%~RNVap-GY&{B)#S2OP z^tm}>6OCgtDHrZq^qjJW%vVpcF5@FT*Z8)DlUUY1x+r3dvoej1_h%Q$Lj^wkkM-!d z=ocJAn;UC(v#7EuL%jJUbfP&d>4SVFR`AGe+vCknmp|>I$7t5TtCz$4QEy}xWmxw2 zFd{CqtsFZ?g|6KLW}W>h69J20vQWYU#F-Vy?k8i_EhQ(pRv$U@PBA0)Mrx^0slGDE z;zDC^pUQ9TW}t0`1E(^lGJw;+$D1&g=Mx2e*9)!fGI@nmj4_zEV!(@*X+<;gm7Dtm_{|32VUCZ|h}_^rKQ zwasj2TT%~DD|;L<6f*CJI1tBU@%dlCBk?z=1|>dSx`^oRI|iIRNtfgLvdQR#scXtsQ(8##{_HvHQLRHxsK(p zaG|Oh6|n2mZZId z#$Kd!k%ueGk1BxV~C}5uPe!(%`h+|yJyV9VaJXw$DhK?$SP!0!wXbe z$1{J!!ZqtM#JumWbJ(s#-8=J7#PD$MzB27lsnA0KBA(=pe`}|H`3t~58Ho0&1)TT~ z(tW@MLM@NJLC=9_gt1P$Hsh0z)3PnaKS$&I&mP6%CMn%Wj->Y4F@S;SV3m9N(oj-I zwRxM=bj+VS&6l#u&A!7+%VZ9UAaa?5S6^_k)yIhi;Av&NyGb@zK?}_vH;b zP0;3=H!{ndkY<}6diuWyTd3VUqkIvZA}{%77I@wmui9Kms2h6~JbdXGAdTZ`^wW@O z?fBU4Vsqt8wPMt?e|bm?Ul{c4$hQc5>Ym*KurX(4xE|J62xNrCD+!>*%3*C2&piaA z>Pmaz$3t=eMF>UVnm!Q@i1YD`y?H{1*~4%*t7X%C;rvW5#w+J>>sI+XIm ziBE!ohxP|68iS99Bo1I*Pnd2wvqiCS{bWoe_Q-xYG;WZ9vjfwu@eKtJf5zcN`unMk zv09%064%Jg`jdb~PQ;M6Bn3wTZOl0U6k zS5g>w(!^1r?8!&q9jNdl19YIT_Vekf^M>}jPw&QUo)%)5gkntnKpox1F!ozteAV^5 zz2Jf~FhQth&SL1{C>2Z6%!D_(C6PNd=kbwE-Jqqi#l{%6P_%sCL{lUij${|S+*_ut zd@<-xdi^tkc2xI`{}fA9$rg9}CNn6l%{~(?8I}G-C;e{Q+}CCCDeMQ$-5Mp;!<_m{ zKqk*L2^zKM7TH{#dbrCiE(`}5`{*|Tt=o0D=ro;AW*jB+7)hfuxc1^7NU^Sj~E!T(L3HWtU@Ps~E6K?)V z`bbt6Ar~_m_vgTn-G*lR3(&YpyBlY#P=4Di3`F~q;i0mx^T93Oi$I2*pdpE`6^rqO zFEX-fk>fo!iVZ>sQq{=UspkXRQqK);Ck#rboM-ECdv+t!`?+~4G(3*}Q?$2YkJz;) zRTkxeX9+YB{_dbnTr8mi)bA= zWNL0??k&2{TxV(;j<^et7R+%rg*G91?%=4tR2U~-JGjTA-|aPL&F!yLJ`zq%Ow7EZ z>Buwz%+<~1h|)o54{9sl`k<}M4EXo@%ec2Xy?<7IBG)yvw!-FcSV_a10u;-Y$nhmP zMF}`iOWd+l`sDS8iu80Y?^%Y4hJ&oS_*jhk>+g%BxLB=^0P3F=p@)HI{qviXeE2qf zHR{UNCVs(5vnK+7%J2WFAYpm3170XT*>%N-9Rtodg+nxJ-W4U}Mx7`3R09V!Wchu_ z$%4aP>c_sDM)49j4q(&37G>PR%Ne7e-*YTau~OgbdgO~j+y>2vud)iq@zePAlz+t~ zcg)NmGCa)6G=Eo)TR{Ig==rYf-&uWrTQb}1;H+-|5$2bn0FG+^H$0-1SgpVv5d)7O zmakujxW5e-;HgDx!WNDJqg}Vqe}2?46ik02`@0{MKK)$*Tzt^R|z|7pMT z`vv|QO&W_frh8hb@IJFJShkDA!Astn2e`6ShG|&Pn8w)WNLXqe8%D4*dH3unjNDRYt2-K4 zlaV@K!~ZC!(AV!k!}s1X;8jM;?CnqSa_;Yc#8`Zdem-~*#N`L;@4_P3&2*R0y;~*t ztXJs^=(H6j%EO#mNsNGHh|$$s4Pc*d@*k{LXFrfMLh79qY4ZWMFlUjVox0Vl__a9* zw3~xCmt|m^EEgSF$F3#0qhIBooU+svk5e)Z_A?L~;(NXwss7PIXY>B+7uKaxfFhdK z2JTwU8G)&uAxwQ0MVJXW|68OcJsIixp?DYA8%L=(HeNTE>fU@@5%QIbsZ$#t&i3bT z@Sp*vnbY8k5@x@hrh`0qTgLRPub!fq6Jt*{=(`)%7>4U-`rLdp{M9Q4g&&)QslQ@Uy_9-Ja%&{=v>`{0 zuh?UsAGA-M%L+ly-BjC-0o-r~4eSO)dY7>j4_|-K)@W@~eMGUg=uf>_FArI)d@aEV zK5r*&?3h75ZZv*TRfQYjyaA;r>fvqtub`^O z!m)W*`@tbKBgl-ImHuvl2@#$};ubDGaDzyLp-H)_gLsNfE_h*Kt=sqRV3;4Y?i7xs zetN`jEBr!OuKZJ6S#=w|f7N6j45J9SU(>ro6UMn{Jh?v6?b6nq2JCOR*}26wYc~pI z8pl6vCllsYM+L2RekM(wjoE=^o#)zrU4;8Zl{O${W|j-hgx2gVn~R~#!?!NoNOoP* zD;AUr{qC$A79JPWrYWN42!DlVXuD7^OG0-j`w^po1?alWLF18RZ$K23_o&;Su_u_Q zG6}4WcSPn&uZQt4IZmbcd2^CC2zFmXP?-%Z4fGz86ivfCAwTcPtV}A2@&%sP|JdCA zeXuc(eghvsG9iM95)vT63VY-C7ejXEe)g~oV)wc0@^YewU-yEg8Z=>ez! z1rN*tipMkWz_{izXYk>m^%j@aD`=y?+}@@ya2U4L;Zvf(HO9Wtz(oAdj*eL~@F1%-%rF zwmO0ENH5g4451M}pEUtw+I@+VL6KUc{nE=0oS)=A)kGH*T)V}6YwsKXD8XbGffusg zA{wQQ&EJ%Uj;YWa`u8aFWYqZ%G(XxQWuqE2zF1uh&&<06uUB1=>AsAO<+{4L^&974 zxKEo(9Y4r&VVi3zKk}9PeZ!(L+#xLpy5?M?Pnj#5 zreg~t=l68imY`&oHB-U>+3w zMT1Y$!nudQ^6X0AtckL^R6g^`<$j%SoSooMU^s4Mez)>MX_^|}TkC6**dGe|4=5dN zwp2%~t`)aySDJ?tXJ#9WuYvlMBz&(_<84sq&)Aij#EHOUfzJYoqU5L1%QD{B z7F~Vb?I-g)i{FD(HSNEgaIpZDKC`Pb|5Xn3v+~uF4Dy;OGNLe!p~WPkMk7@upn1}i zsTeg>($i}_%#yF0!73N|bu?CXFj{YDWIKL!0LOR4)I)O&urlxD)ENM1$80H>AqHJh z_S~R0C6=S_&xqim>EXv{QAf#Br`XnFtzHEV-IEmt3+=isLEp`$utVN`1iK-#r}b@n z!(ku^xwuf!tL=X&wRMu7;(NkAUoUZ(QGeOL$qqB$zdARSWoO-XZA$plG2pyUz`z!& z*eyb_TtjNP+f)s<(AKx#JL_$2#m5^?GN_Ff#7GYmtLHNHLl*5i)KwcL%8!_ckA{Ch zen6#n@bIwguiWoR+p0!a#_|}eYvx3|EfjJp14T&A^ex=~ao|5S+kWPUKaE zU~lLbU|5W=Bw8UU&dyc6jU1z}#lAEzR<$l4dSKjkH1)7FczIMWb<&1`>$MBJ)*Wcl z1`Lr*D9!x-qavk;=u^F_cEsc_geNY5cHdwG3Jq2o5_XJKY*wd= z^R|7wfExIQCU1`jSI)w#Ih&tNTlJF*TpB=2 z#REp@2gXmIPE+x2p4l+=uO5qggCioG%}+z#t5fR6L20Il zJ@8v2_ zE-dJT1vS>Tof`=`P`y=0u{Ng}tlR zUYw#(qV2%(=}4o;(s~P_OpMK%Q{%cz%dpiHF}1S3Rg2P+m-6a{kf+WnpKr3Le<7tW zu!s<0*RZ>Kp`+K5Jsf`?YCJ^@Hwd-Q=0xO;;l25`yH8WI$=R7q`n>G#Ei0er`BU1$ zzl900Tv6-O+qrf*h2-9gJ@1bJwx|G{@f~nz8QZCQIet6IR*|(|13&BmU!#&eQT^)q zhU+tN?Aq3$$^whcyn%xpcs@*JAR@rmBX>!NVWe`u`1~05HOuXiQYyttdcX93z@HhIQs0(22JDcs1!dkkeG#_nezy)} zh;~N^F}Aan^f$mEHuPLLzZI*hpkv%`z$@T8g$Phc?qymJ0{9 z@}=NIlxgFfyZ+6~&1#DB)D)gmyjy+)A2_+fT*Msnk>$`6(mWk??Q|)4b zSfWaw#!zB`@mhM!srQZV{ClL1QiJQoYD(kUmQ7&q6KP%>W=2&tgXlk?msqnr#nxD` zkRv7VE5xXHP+A;Hvuj+yz>kW+sW1_oZWBta3#GZE*k%OO= z`Ki)?=4GUiMNdG|z-)h+=k?Qnm*M+of1&iAT5ZnA&c)pp{ApU4^0~8N!vkV;3ptmAy+z4coY_+-f7e7*Hyi4$WscJ9Nx_PqK=CEJnP>d&=9_X`S7N2l~+ zdy;TR&sF-=Lp9PHbik4)5a~B+_b(2L7748zA?50Rs#+;)>uci*E-LqU5lbg%{F$QA zRThcC3eg+SqThL_PWYdN3yk@#myJp+JjKH~9#6B+J#PM+4(QVmHu46!#_}Y^Byhg&7f2o1@w!+gf zk)QC%xCt#mQa&IP6Hi{>z5hpU;qP(wKg#K_OcLpExA9sS^VsL0r?`NQZkINq%RKpi# zd+L<(>?#^82G$B+A+7~WB78%Hf3S7r>+cH^(tnWh@Nb(!1*NG0#)1)-a(_+_d?d5| zQ&}3vWog1gijSESYBevom6?NHd^q)VzFz1stM-BKE!^$-srhqDQDJ&??ces^AId>S zKZh7^ZG=LpT%F#;Dd%Y0<*8J?Ji5Y(?lU>)THA-@$64miT&K>u>m?h<;h9H&PU!+E zWP&nr=;lMKne~EUj`ETR3!PO6e!=)5t?gw{(kwS=<>$b~K?^%csU z*XLdBBS@#O7{Gb^*UCB1#$ozrDB3UWQ4t2cj{=`y9QaAeGz*h3`FDbspUOkNHjpXZ zP@Cq~b}iI2@H;)XFA}rs0d7&GD)ft@Y|^6c;-rdbw6T#r#q$a>S2fQ4fD)!yBfg!? zBa|u^OW09u0zxI@XvVAm?}l!a5()e!gyEfC6dh1*IB~2qLg!V@xDvRbpH4u zcx10g!9XaLDJfSw#q+7+g9n4W;fTP7QyWKDCTa2mt{_8Zebt?NJ5{kcK$QIf=oa=c zB-r(%#G2HkJWK{+pUyByKzf(vEbS7^-buw37uMAZG0D8O(4%ik$hRL(A5tu^3CV{gP_5z9;1=ES_F_KCC^RP4wMOh2U=&Rx|9MX^L&n}466lkv}UjDJ!`5x zV{^&2y%=(ep{eHUF~DwvJMZIxeiF~BgNnv;tq`0xd_{w^S+Ti%gC9|LLmtgCyAj62 zjrXzN_&CXDHhX>Kw#S2o%1$|k=dHf6MZO-m@AVN}qr_pHG}b7cM9&Zc69hDsaJ1?D z{w_W>KCaS|EAI)>BvJ$nS#VwH()>E#@}#d+??U~P41Cxu`nBW+mmxmTtKwyw#_;a- zk{`LLcf6zJlKnudh_m>_f!0ajr=fym#ky{bHu`5ih(`2+lmAxYUc-nJ2C}P!x*D{R z)tWUUX5a0pCXbpm^QwSQhUlhox*VxWLEiU_$qakU6WMp*c7v^8fmWsZa|bW}NfL}q zu)uvFAJmdKhYH^Inb6t2#ZsQB0VOUV?{6U1xIk9`@ZM4<% zHw-(Sy)pjvelFOVYT~A1$WDP-PK7x1gYMTQbvib^ev@&$T*5a)%oPC`Py3Sa`E~`^ zWyhlM8|<35cs>klQh5{C`+UucJfBC1LF$W5H{J&@*vOKcy2(1l zZ;6`0hMD>oV-#LGr=|wide?%D&sJ$j;#12Nc9TbSA`$X$}n@Y zNpWS0>n+-E#pBlfUaTyGdewl)Um5{j?F&52C?Z~;v*WqqCAMAiDsp2(!%+_4^XVvK8!IpL)LXcy@7W(wr|oR?gf*nO*g=R*yQHS9DEHvIZTvUVl>M z75dsNbZhwxiiQ$V7=Zj-spn(ZO~>_A44na%!YzucDCRFQghNZg@e3 z{y1=amhbFkE!slnk}{WzqhA|eX1bk%EaDa1gso+l>U@A?pt_Jiki~6l6UVH~_l$q++WLRop=pBsqrI_K+#5etSsTf(k!UCu6tTC~0DOb1#NG zaO2ron7#H6_b&PBrhM`H+!-Ok=6U!#a-~>OhKjA8d4#BiJ!lOI)UTv06m=$D)RmB1 z1R@c+UIpDJz>xBUm&>~=6=#!=0jQgDPY#-QP_ArC$>@1W!QrlzkwpwVLesTmTdd~E z0#9M)#G-d>8`A%TQdO(*Ikx!U&kcZD5dHBtQe_8BjQTNc)%FQO89>`x#H&-iB!;^h zRi>lh!gu-g{hDi|dXept1QjSEQYv1m-vmh(+1Nv+8=vvxfp(ceaLUYtmf@)%OYx8@ zl4#?}ehhe<&#FX&Ud7xPxAlIcJ5;Uxta{Ara9|~@~Gz$g%bwIJQf^tXj7EJOR1XiRnd=X z!5l8lsZL4nRp%|b;C}wBE~_M)i2VBo3jZh7lEangS`7;29E$qMwp)SV4C(X(4^-|< zu)L>^K%Z3vt9^Pnfa)ft;?0KuHi{Q=WQIIaxQf_m#S0GV`c;PMw>DK6didP+xxc|- zZ(1SkL$&3rh+Zt-UWVG(Zr&8f`bL7Jb}dPB#O1oiRXh`&cL#siQ5wP_TaN+ZqaiI5 zcfYXvh*0w%wxU%0Rbx`MD($=RX*ex?JTgCF{l^!J^T1Lg!F?;9oS`}mXG7Gd&dt{| z{e>n*aMiE#MwulHBRc)y_s?v9OO4cL?l=Bc$406ax%I2Ofqa%YpIK2A*E!Gm`ttQ2 znm2rI)A;jM95Dc|tweA5vH%eEKK`7!iv=_oj1D`6P) zqi@%FQpH@cK~5^vEIq~+)z8q=Y@5OTaa3SzP5r|FOm|)Eh0;}0HZf-=HU4s>`Ft;@ zkvfk{9m5==vyOasNUUJK;@#;`>+8ikryilZ{XdC?Qq~vdFWykPfVuvhiSP;gg9us% z&#ggY<|WKIS!9a#z*=3)1u7Rr2*4D$NH4Nk>FSVcE-Rg#3(k2d8POZsbx7$0Su>jP zUq$km*!N{$9Q?44u(;&BAJsEsE{HJKfX4=)cES~&OaN1@1Zr3o=-b_}4Vc|hY}>&h z`?ui)zQ;ai+19{oSNBXN>)WslEoPh;{^-g?{l>=+6;__`s-NAqIP~Vglb8F7VVmz*74f;_dV?*`~T}e6jEpe{&)ayR?y|uP>6opUQDS#fPmK;@p?^3U?eDhLm zoqCb@q(#QM{?pkUSfjHXszbW$h5zE6s10>2V)lCij+$*%%-wDj%O>@c7~|8XbrgtR zF)yx9@#nyUcf%>2=AxC*du#-=0k9lVV5F-^mELT`%nQ?8Lm)y{V1ickF@KYF%COX(m>^|%Dq&ktYbI`UNEAP|5rpc*T zzjgjHmf25v@1fp2+x~pPC&f|3#A~2M#Hl|cFZ|7Cu91p9M+L}zIJ+XG zHaYXvjA>q*%H2!ojQZx6gVn;UHMFEK-*M@pueSeSdMEiT6>(d8oCBX^TQoIYlu~F9 zWGpN1&4$6=Px;1>#Ttf8jmy6z9mSEYr%$~Un4FUA?w__c=UMaKyYu>xQpm&tHz?Za z)zSHw7HN+0MDBvo@SoxxLK~)pS6~69>Blv5->Fb@TBvV)I?wQCh`uYDl1f)x1RQ3A zCH3_0YQM;nVO~p53Ga^-G>h$w)NMu5`by8*rbs$mn#8Ca1LA`;q7fO0q@7mZZ#dmu zhaulf^IJF1!;Gz@XzwKzUFw)-p_u2Hc3y&7>KZ<-;}W%a-2`@C`mt3a>qo1zH-voN zq(pVpQ;auzg!a9|p_N}eL6^H9JvL5g*hIN&tCH6q127G(YvMDJapnfB#s!`59_x@e z685ZP_8!(3f^>t-COQ&tr*P46K8?!4@nH;Nv1nzViQ5`mQp$CC$kfN%Jd@e=AlzOH zoe4&&j1ZhFrN?#4F^93K{)Go&C(m3M=a@U|VDF%1P%X{M#3gXVhW_+n6~t+~jjHc* z`S>VaVF&rsSIHuwhgI|*5&Yir_j*PGMawVIAmATpC6uK4(K4MiX4(fn(~uv?Ql}Oa zUY#g-80&RWF7-V*Q+vXtqYHc6sK{Nk7Ivx)%>%%>MHZfQ5|SEGc!b5JW)RR3iI0Xw z1J!)G^t?wLMP^{xr1Izw>SN4=oUG-C_BDRxbER*1Q?FmTwtnWDDXJ^cZUmW?omfMv zLMJic|N9`tsSLM^62lj7U7psVX!M7Pari&M!+V;G)!vk!-nvRw?3=YlQcpVT{8lRP z9hf#;PK$=Y4%Dqo$1jm#@7!!o(Q{Kxs^JE`&Sz5w&B}_CIrFk{d@C%Z66TvETNZRD z$tiV#U3BT;q-rbevWI*HcnC&!2KbsoG$U?v*qQ4Cmv8tp)fEC{D)f%PBNqnV$esO? z&P^Fb?>$r?_PpNNn&Y*d9!h z@4dw5wm9vx9_<_6kue_J6J>#Usd~o%w~&XbX{hhc z)qYQDcg8YQr)I7XmK0Z-w|9ft{GV_(&?M|Q(Fw=b+>@Uipv zc=&;u>aW4SOQl{tZ$HV!_+xpztfFd!uDy!n=nfewjrUx}mxr_7czYZJ#9O*=xD}ep z?F0FzwafGib=7P7oaRd!Dx&+>FN|HjQN*s*pEnH|SGf;Mkk6RSVrBg!U66PAZ+zYF z!+#*a%51dP`B@zZc&aE$H+dNUEJ2hlGcl|1#YXtR-8P-~^>&G%4dg2+kOdaqTwDa6 z9a5XkRhX}byavfUjF22cYDDSi7R?j*igO+c!nS5NZl9QZbX+JPE6*?OsbfUGkmw>DVv@=rJf7<9it0HAgvQxf;rLpf zWlQ-LzJFu|*a{_l=ZW4eHCXh`hG(tLTqYz}D0&}~bS zZv^Il6egfVLe@uadrauL{Wjn-K3B4=9IV>u%riwxD%htMv`w$o9s9qJpJaX@uR?{J z3z4n^CXs%4VTJ$YW`@rV6#HnqntG?hVugD;=)1j9xcO4E`_ST z_B@c=KX27H&)n9~7>aL^2CtIyv?1cs8sMa#?GqrTI!6iAUO*yEJ3b^AMG?WzBch zA69#6>REj)`|7VOO`9}~xEZ4NcA1bV{-e+hv8tshmdWr(p+wAp8>o(lz}dx_AR?OP z&>?X*Uyv|gpM?h>sG4{tb@VIT$Bo$63PVyZRqcW&oO*ZL@8fB^_)~#<@7xeS{k}t! z+A7yq?8F*3lmvW%ef9i?7!3H+vNLL33y7gs{! z!kY5JIbo)K{i+L2Jnu8e>vS;-jSgBfgZ)s${lwIuymKu+tdFbKt$-du{3&2b1y!s;48;Yra4Fe^bsgol;2SgMsP#%*32#AVVjrwy>sc z;V|tBDo`qv;IaDv_eni_%JZ>DOK(Y4rS62*B*mf^D!ym2=DnLl{RKaMRU_S^X+p+g z-)OA2j^L6es)wQBH)~f(4;*|*VYC~b3Yc$DI^wrKo9BBQN7rp*EM5DoKt7<=FBfOk z_7D&J!V#Cn7a$#H8Q}jW(-FXey(4~q?Q+QT&ljwg)jCk0W=2J~3U+_siG)vkw#2qI zlD&{eq}Tt%lZegl4e)0MjlUo6;|0?8z$BjEz2Ct}rJFh%1^wVpPrRQhj5UwS%?C;J ziX~Kjcyvv50g9AY_JbT;_KaCeWg9Fr;wl}{m{+NPJ$2~4Z+i4Hg;L*%bswn}1^HR9 zq?qXk$c{^tgEN=!@9(|r`|0-hq2iIy9)~=X(>oV` zF7y~jO8*bLJ&0E47tVYB0IhA*_Y~v(atDLm{r9D&-J3s2`m zQvymvV8F~skL*NkI61^f)qHZZPuhb&c05^`Zbm}kyqcA~xfE?qZ{S;hImbR##azkm zf?c5-&c5x7sw7Q;@oH!-Yo>juhhO@H`p>N@TCOAB!Fm}i;pBvPQS7C4R)f_S{^gNi zQ^;F*hZ6sRN01x$1=a32aj&RAwAC@-0lMx;a-T;isR?7l(ud5o$SyIotsDX-iJO!c zY<>}FDUl~((G7|~Lg-^kZ(#dL>b^+~cSrB8M#Y}BnQ|nv<3Xd}nL}8Qd+4DSoe?C9 zv>ssb7F}2S&ZKqzzf8+a^>2y}vKD}aq&Fx*W=8MI26vAEfutp}*$7fd;cL;laun61 z>Z-ZqaES1LI%Z5|`I%)d4|`7{>2@MoJPcw)f5!25MnRK3iLeU%6WnuSyp?}VzgF2& zzx2lHI)!5X+SeHZ%Lu=bIvv@TPzD)=vMN#7AsP96 zRumH*Ycl4l^!Fbh10LTxROOq>@(sfHQ`^JohO!3Sd{oOmBR(jy`Fm+S^HYY01avQ1 z@ma5lwtum5A-q?!NAb)XkQP%Fcz?-P9E)x_x<*zO!L+>0*Ke6>s=Bxq1WxgG1L zbPQBeG~X@D-!h#qCM8ACh5j~3&T-ZF(6;eed7J8mrOiO2n)cO&*}_ZWS9fnuriUXx zX-4{QB(H;C6iFsna8{NHl{Wkc`sm{^&~cC=ngfBK;P{covbDqcm;@8jRh zMA%EhxP7#0dTiIv6%)myAY!#f8FpWdH}p#@9^QB`kcSuy?HSS2{4U(!poyMWDalKW z%W}vZ`R3szXEJs>Yto3GJYcf6xpk^6C$LtYGb?Lkcs*nyvc=K#7=XUBIlHK~i%L@B z_q9gX^J~ma$c@;Ajzl(1L{8-+F<@wC-BTW2D9h!a)m9U!=3){VAz|7cQ9iTrtseLU z3>kNtb)RsDiL314%=%A%p{)nrJHJI;6`ohu28U#9qxN^a2T)&=4(V1dt>73Lw$SFnLCORh2XwIDjws=Q&4c^T zHghMClt{h#qO_5-e^JCBLqLgN`S!maRQ?@Bg=<&wWF1K3k)&VbcvJDLHoSrmngrnv z1jpbwr}{ooX{p>eLpF&FlLP!cQHy<5j$? zgqw=!4UF4M2pVI=#CcyY?3M~XD6>4c@ag6D>zcJ{=e_gY2_B>xHu(c}2_?-4%#xZW z6Sv+1U$6Sg5thW=mcqQOs)A)L-J-8P>|AtV<9WqFT(0M-Cr1gF`SsLgm`BRRf6iO= z>}lQ@LEOa_4#p?ehM`RJW5_jlenj~&C9gZ7c!pMco8GqNa-33Tqs{;@+>Z|DXsWnW zbjft+@<^X5gF1borW8}SZtgW$^5QiGqv;6NwqcPc1%`Lr-|rg*b2H=>{{*I?fY__HaGisUN<*M#WTIUE%qzhOW zS{cqN-+jm|bfOc3q+2HW2Wt5;dUEaKK`_{vj>n3A0PddRJh%+5Eq5T?Jh0XGp3`fW{5BYaS>&9s|B&+UJ?E z&U40HC0RJ1S)L4>{KM;lK8j5Ihu^ZjeEm5INXMZC!wjB52UP!}#gfHz?tp>nLV5lm zN?Nw=?pSK$p;w0O+BZ>BBz5Ra`aIrx-{2E19NZsKU-pP}Fzb)4DqJO()?uQLKkE;V8`Y z4ddQ#&#FSY*p2oR47!~4SS4m%z1Ar?m9H{a@x-pIdnJ+b1HZRF_W1kLe*qXbPxsyG zBsOl=hF(`MbIpy*O^=zgLw@k5lZ39J$ZR1tl@f8eRR;lqW?R_y2KPI5_U@-Uo(c@Kcld1BMV0 zve}+!o%$+M2K#*k%Qn?opo>W>$0Pbr9Bi4XccuI78JQeFWaZEa1N)-MJ z+d*nP(|&3BWPd*hJ)j}|c7^ILx_NjY({f;`lr2~b%LCz=fX%L2*2U}^;jZ<;FDfDV zRzq}NwMp~Ppg;l3UMMQLw6)@B_hGrzNp0v4jE~Yt9fGz+ z+lJ+7WE|4WN^ZZD;CVqyjrZU6kFds9rk!S|UR6cgp{mh2<#4|iNlp}->%D{8;6yze z$)PaydxEezt&hL+ldMb$vKe4GGPo^`#8l0wHeB}`uL2v#xzHV+Jh6My?TZGpGt#f` zRE3|p!M6K_1^Zp*`*l2e(HE@UML$gtpB5kWeIImX=$8pWANo%JDg-(6hvU5_a8d>T z;p2Bemn+T6nsWaT!Yr!Klc6y&zC{GiEvAV;eG~3hx)-BRa`dtujrYNJsp6fo!W^Uk zXxfaP&u{D=^G4ZL3i_&= zKx(2^?`C(sjJN%BJaYQ1rujREEYzvJmLq-Us1O648<|$8voe^^u4E`Z!!I2u-ExLG zV;E>n&Nyat$4fCr16hwU&pF8A{SJU4xKeLEpZgRVOC|dEPm&?B=uw|8^L2 z^{*wn2{btR>QVnBa0hlq0wsURByJzh={@15>I~|-xLKGZoHbixBKM~L`B|UoTaVz>IqNIT=~V-`DwzhB{xn8{ztcC^u%BRt4fS8!4Jgy zy<%77FR=a<$eOxwHkDKN%J%Kph5Vpo)}aOn3J!5zn}5rrb)X4T z%O(of2Oz%rT{6kr`?)}XwBm^?qyF{`z^iX+%`Sx5i5_T(UAkSzVTImg!Hh$e68O3M znzHx2j{#Bp-<{12T0TE5J3(nDKVm?jX#OR8{f+29x>V0@o6%wp?k(Hu>~P77F9DDU zwa~nK=(gC%VFm&-A6Tc(w8~82&aQGUebzh}z52cTvL5bS*gB$m_7(@Fb`S-?TX!jU zPu1QHeivR)L2@1eCx_q9n%_FmT2#yT6|1S?+pD;7c_pC7l+nDlou$)P8#^%-Mx@EN zlTw0?u3s7hCjKy8sQyxvETUy)e!i}tuPZcX%~tb5T^|;pP13VaIMya0t0%;{q1W-% zy&F#gd>0#cgkR0#T3smrPjTM?)zsFli=v_kL==!7l_nq}2-1nlp(|aG8WE%_NRt+b zihv?Tx*$cRM5IJ|5eU*1A@mY@=ske|AauS@%L(c*$M+Blp#srF zh%q=2OZ5h`uAZw8|Muz!T}3)X2lp8A6UL8=L$zJ}vTVx{M zy_^%^1Xk#LYbOqlr4LuJz4-~;3_||ukv?$qI}JF<&m3DVR1u$DM#u7%0z~B@IRLc~ zTy*%JDPuOD+yJ+6JVF-OoF(d-eGN2a904URAJw;!5vjGhI}eEI;0R^uRKBsdE~%cY z25l*KS2c^2hAKq&TsN82xonpey~e@$wkw*f+9olE>JlP4;`G@TqL%@YxxT^oH8l}~ zT*4`X@>z#dM&Hus$!=XKCtE;=i6!_8GNYDMM!6A=d8awpLrY%)hRP0Wzx#amEnVX3 zqA%!4M{`UJU>5qaK{tjJu##akF1*9cN2dy3Pq`y@oaXS2;xMXfm$Dq$)KA|8lbT?b zs@#^Z&6T7~mbRzeG0SsOmFlMGgHm!_Dw0gr$U1XR_ffu`#L4g z8ERO_h)5GAY)>ZY`iAzav;xlq%4(ww%mAm)ERh(q1H~sr)veA{4B7(Jn;7SVC@eBM z=!xvkorPD<;w91UFS8J`Ln&>RqK$(C;t+wYEOXpM{`6jLq4CYnpW;i#u7AzU)r5pP z;0efH@qC^@q7Bb$fvOj++zM>cpLUPb?l!|qhn`T>tE1ymz1wIOORKhRltVC7PGG-Z zgpz4!9q43{nrxvcw4Vr%K98-B!i%gvQ4XBEK4f$a!+c#DMI-@*boH(s02Kw&n!)WL zr^wgxU5#dGPNQmVH_krUK3KP`kbAQ7i&DU%Ut-DXO>hL*V==RYff9+Cqy{3lkRPcl z^PpkcNY(&M$6BXE(CJnfCvS!nRG(z_#bMK^^=8((^y{kWbFY_ytkL=&cJprsP!zUA;Gl4KKvm-Gc+g^C3 zWT|3S+yBxkYMhk1fVAKYa4Q&(lgrY%mHY1SBeXF!iFW$i5CoSzDc*K6gfGosz+-)3 zwA-vNVp1{yiCDrpCtb3zX#Hf__(UKoKa@j`#h}I1ZE5*KKu^#L%LGXOk>FtU1SUu2s zdRrEI)^BOgFec#2(5UUh1e`ZDT?XbRa!T1`Z}}2JP2h`k2U`?xglEySr-**Ag&PnY z@TqFGko8K`F&uF6t>+^y%(ycp+?M@XgoW1Iq@*xZ&(q0xr^UC&_jy|zFTyVP|oeiZYsx$cB@q6P@5_*^+T;))*;=Ek`=?~TrA|`jR3bBpyoWJ z5pH44ak@_JuFH;G>J3!OIbi^3w>iK!qO8h?Pi$SOLm_yzcmb@_w}a%@MmW0#;GOf^YyriWb5H-^ zd5D4n=(fNZIc;u4V~}Isl`n1@DkekCfbg8q46}qRl4-f(;+y83Ug1ek1h_ER_v>-X zcHCE5$(8ey1`pvD_W9Jvs$FpYAD{Yu(W-^umgM?9X8s;OY6W*dIC5lbJ(@ zU$YS>-|~Z!?WRdC9z{!K)z7k{dop-PW^f#`xdV%)Tf{`0w0DbXu`RG<9STlFVxu@9 ztbTz;efMtJ*F4GE3+EC5s@KkEDcDMhS>HwX|O@H!|| z8T&41+!MjhayYn}%S&AwoTM#Z@%mrB7`y#1MEM_{DB>N6@Lem1zO^AX4z0nRxYOU86gkv zBj34NoMCjCLO%w$EqnfEpOBgY9jo=Fh5_)DrnH&r%ul&gwS!Ub0eng}o&iGk!1y0F z;(ad(aPoc~M8H7ftV#TmZbUJ{{OgBh)1=}kw9HrT7*F-zX0tdZug~y1-s>m7nTn35 zM&VG`Lf$zk_d+HViniGGHHxj3v`fpcmD`3IfNmTx3ox5WytgK%V?9C|;M_Eh3_J@I z_7p_@VFR&I5^M)}M3o=4z>eYVfV?9vilRPLP+JmvJSj8<;X15 zoLlC&G6ZOVKEevU3jU3I+jBLr!NjY)Pr0D!VDTrzx>SgQUseP;#)6s&J67oK*gaGB ziVeFmk@;J#$VQBDRgotj+=*q+M@u>LI`MDcwP6m;=SlfJe!Sj1SMx#@NpI>`^n zt0OF^2{7wBR>S(Xc^azA*Kpz5aMG&oWjQZ?b{Nfg`mv)eKVGM5$~M7*|j zS>nq2p7*5LnE19!6TqVg?Nit1__(JU*=2avHwBA04#J= z10&Cs^Olrp7~EbjOxB3Wcam1M7`*0jk|YjTI*D`W8^HZ$cwDRQjy+G&vLy>g^vDDv zzP))I_ZpnEs-Zcg9LEwsZzF_#AwN>e}(z~IFn_-l8(~Zc7F_JjA;h32G#5c)0#is={+ee9Q+Q_S_NSs>g~4H zpDXJj5G0h>Ivzy@7VjLa-@-wkt=68J?vOawBE@w4>G0g>XK)_!byq1Uzi&rovi1iZ z{bETPXizNB9O)A*{N3>RjLEH|AL$Ng(9xHBKu*^SS;Ay-1w)ayHs+5gX&sxJeT zE2=adkRVvAVo95~!Z71ZaawJU55q+9mRKQlGm>5ZgMxi=WUi=;E+TR8Kejg~Gpd9apOrIgX%ern*W`N3|eeq}5Dmub3vLEgyJ@fu4zO|=Kdi;yG{p&N)W^?G_lq})g>BO$2#jB`(|_$*&4|C zb7#D?3q(&;#=eCVkv6=cn7+o!;hWdH04hW9db?m`uoxhy^F2S&PSj=Et0yPbR&1%$ z-FT=R%Cw}2W$X7I)!lBrGS*N6>Nh)97~G|LXi)A`@6Bg`D7wUjIs3LAZE=!m*9-ic zFBY`P62FLcC4PYneW92h=#kGy-QHCh;M+^YJ-M{b44ummVIe#ST3qsIGP4wh?G^^N zRY>0}%RFIa8Qn8+T?kD%%HB4&znO^>`}9p+FWcok_PZ^DX$}l$gcw8Z=+y(*O4II1 z@FJHzOuk)8RP6*b^~UX{V4oDCNAuqjtPm)e`HI@6K=O8o~Ni{pYXe+tr`nyJc+h~7Rj z=;QR#DJdp2l2G;P5kPtKrR0yvB1aGnH5FU@=@(Pi238kr_l}IAa(pM)adk1zWO!6W z^o%MhI?8oDJJpRx#{3&W2{C*><7%pw{&!iQpPNY zIk8Fg@+3mxepNe@ollV@Hn~X!f;9`zDXCVE-n?WnxB`~ZAH}J(JQ~jZ)Zs%B*YOe3 zaq)QM^esnzAS802527I3d2*vEwPhj&&KkBpsKy%+r0KEh5`8!bOtvIS-ATTQm#wwE z5x!b^Ba4eRtxC;bV6Gn^716U5`}y^+^i!Jn!byeB#*4qalK{;>MT37jF8k`r|EIxc zbvj{;XRE!By3u+YV}5_;wVQ2~?CZb|4{7wkGGFz}Gzoc>=|n7x8aijrfDZzUkk>(s zQ|Ds#54!2DF=2kc)Q@TUrqoQ@Ddb~{a!n{foLUZhH#XQV|&Fi@7gX>jJSut z70gfc#*DN>Dv$};Vjxoa###P>y}+I7FoD`^G;ommJO<9(MXp zCOrNPwEF9>jsse~0N8qRwP8wBzB8zW3?V{ktnjdayNVC0YQWC%{YgtCv$jc4?G@TZ zd~STsx%E?BIX~#ecq^BnZy)V^b#-TxiYjh>XA*cIf>?B}8OC-xUln!sT|qwTH@!Mh z=g-aqc#)C6NRmob%aGKrg3kvJ+Au$WG(X}$8w&A)W&GBnc~E^8+-&w_%4}ltv@&Mrnz znU|#&;2x=*Z@>aGpeDiC z^F*)2PB`oL2c=GZqNK^OH>^O4sk4D^bnr}<;g6Ks8R0YEEceX%jnNOwW#Wssd_1jg zTrpGi0oV{oy+Md0h|g*6+miDK4b*0DulIc_+pEc(hc#`XJ~5y)m(-hUVR{UhGxq2{ zfz<81nM>Qj$8!A>FO@G*Je)fAfeYn4MZ8!kt-|RivICwwqAKKIG61;aV~~A?;=`^F z8wij@n_h1fO=vX->0W3H zGL}^@lu|QlgJ92Brgx%vYKK_Qf(>qid$amg>4;l;QQ7fLy)`j=yQvD=B(Y*hP7t~h zmvh`kWQQiUTcVO2YrAGYf^&bY%Dy}yjnC#5+=(A9uvZzi(lC4<=`;O!b_ZESu;w4S z*1J|lKL6}W#iBqI!yT~|4LSRu4GXTPd4khdzY5oWe`IUM+ZR`24N^P&81eL`rYY$) zV7|AKL%ey$Ee#UXAGn3q4euDP--PkZxN}1NwwfygTDJJMt_VEO5Qr&>p_Kz{_A-$c z2mIvoH#)@$Kj`ibD;Smm^@s@%Ef*CTHFZh~E1b$!_6Sp5gCxoc13c=KNntq6Z#D++egaNqXeva{3cyG+%kErj0w=Q@bHA zA;HeK*icWeog}cMjdM@&_&`kZqnUsmDn)VwijfG0@gmph$!B)~eNgYtb5dJsC#1n< z%Egow1dypr=6mi}@Y_cM#HeAKR(M^e<$Z+s^oC ztKZk;PpfipA~sL={c?pbZdTh}>|2%moSrK|ym8`8C0;YUK-SU}#N01_rtPk#01oJP zGf>%A7>Hb*#0N_rABQ)}7U-AiRl`Pap2c#3aG4Ifi>`B}-`R@U23%a$A+dz&i&BPp ztJ#FuZ6vO@PvGIVqY4aZeJfjChzZhhbv9$pu+(Ojvg|D@WV1flc@m@yQANN-&fMi> zqimw?(UW#QJ`*z1k+LXNjE|D9*0ndmJGN{b_mc!1 z=DwH#;EUf&`kRBR?f@tKkQ`&@o}(R5mr?2b&cTuqO|_61 z7xHZ!;oeQTE7>qu=~8P}nLB^@l44Ee*%HwPmh!!oEaGl+26$Lz&DWqjN`Y0VX%z@b z>vxdMeBRUg>g9WNUaS}TsBi4#KLpLcaYg4f5ua0-Ar0$@jPB&tf}nRd07Yw^nlR&j z*1>wW9{7FE&6oLpJ~QAJp|olAQ~_}G|DaQ+<|;GiKR7wriO`z-;!6)GhXyerS8Q%s zRi4(whU~!`R22QAIVvJt=Y1518c|369xK%0)}BR=+iU&i2A|Rm0V?zhgTDoX`j5*d zB$F)dLc{JX5yKAwrwGESUZxxN8w!76U=>-XUe{O+HekM=e}s!S;+uS$9^Z&|mboo% zV6gbco~s2lW?QTBN<7kHoC%j~CiE`EN|6EzD!ZUF0=UnW=qV5ZG= zT}&RSljQ#r@fr0|c{$}GM{aR9Wo|$jlDFvT9}u1Hdj~kmt3$IOL>v-IO{KB5VGGS` zujRF%ZWhC?@vsObj|DK2CS3iB1niS!V>$2SGldXMOcfs#B_9pz!tmVo)K6wSWR-z9 zSR=)?rbDon(nh%HGlx&*?6C8A{K|Msh*c0oj8)BwIkEpH7Tx+Vc5?0=qfq zgM0gmDn{IwoKC3<5vjOZm@@uq##c@!%nRx3#{_?)nyaR_`1|pCBdg#}AVy?FF!!=c zUd?=G@W3&G_z*w4KAm55z5)9;(n ze~z#GKKJK{%YUBfKF|{AxQdzr5w&VfNZa4-hnG;xyG-E;1ky~QUuRS#DRGq}si&;+ zG>br#rcpD1SANhj!B|0$VLZ0ktqiFj`2Cg2!jojT%qK1n8|)Yc6Ho$+o-mQh!ZpFV zVVa`_>QPc`fN}m-JmJjyf9OerNy4>AYU;$d+B(r5x%_cGK+c_EPwc>~D4+Y-v z`7QG74TVjaEyld8z3ez637T|1-OfKT$H=c>JQ7|di-SZeiv~_*vQ8}SE;eGvaXh?Q zsK%M$2H_G{paUZF{B4r$# zuShb2%#2UkH!VknQN^dE&$nH})O&Ho830P~{3|MyiyoFBb}n)|Rm9vdObyiawzhvw zhG-L*|GIG6Fe%QA@oiu{6lhf?IIs%zsmc#>ld3#1)}F*WWP z;raFN^2hd&fX6y*BM=(I8WJ*mR04v;bAY-RKV;KtZdzX!*BHYmeHOEmXGOT6fAwavJ%~-mO17NIOCt zRdeQsf~;?H7h?wBIJTo1j%xD;nvJKh9cEv?=grb!8sYEb!9cg9})hmgB$;HPa4nns#ssH1X@* zc9Tc1Qd)w9RL{Mn2}&%&)^0p?C3>Oqa7aMBdmwdTHT<3Ry|Ti)B!I-bR8z1*;KaZ! zrnZqIk}VvTqxz^%{U^MQI@!W;XJRM;buRvcCv(#Vx0P#B^u#i1D+$UF;87O!Sr9MJ zSRcwPBYJN4!}&^%^#{&fj%lqTzcjx;=Y)7M6&p|xVFKu*z^+S07>881ypqmD{8=WM6r#w3DL5iHMP4M<1&x!H941W z+L~rNed!7m(D9x#wTd0jXdz#q$kMv|1@ZR?3QxyguQo|CQOAN5&H7hTzvI?JoTm#p z(7MG@cgrgxH6j=g@Vr8xYEMIn{lY!xTY=sXgD=xrq3`nwNiTJ^b*(fX{t5;C-Dj@? zl8^dc^;8V66BttiySic#aPp&KC)g;{23r@M1%D%3&tHbyX4g_NL_g2sRhQEXyu4+b z?8<&mtYI_zPJ|WXZYD;5YN>l82X7jCM1~yJIV*)ErGO}9ZM*s~Z`r9@v*jvfE2)G; zEf`h*yOf`^t&5`9-hM+WAmhkB;rWMm`pdfhO9g`TzwGbd4Co^9Ybz0C@QxFHHuya5 zMu64kdcO>6T)NU2jLTet@~-hGqNbocF8l}ZLKR3v+E=bo!5a@t-Yw_W-tRlSjkzdA zOlr$dno&iV%i-$K-LIU-%*1g(ku^sm9;Eitu+QOe)hSEB<&hY_4Y%3uzj!zpdR`~3 z+P)m38>-c>V=x@V_IN%iyI2%aD0<)Q7~U9Lk&HuY`WNx)=V>8U2c3fbdHP9`)rF#c ziRS08S(l0>3h1zSJob9C#;sX{0Eayj^0qzKAzzI{cg3`!&Ug)7;Wog23(e+15r5=rt{( zcx#!9#9k|_JF_YuuCY5nvc=n2-{2PuseRkCq;@*As4VWDitA1g?qYdW#S6ad0?43w zdyn1X+cm2A(?PgBv)KJ~N$c7&g5`%n57L8{z`3G#u0coRCj1tnYGm#og+$$E?&A~7 zn<@78jvTrC#nx5gZoOt3W@t4Fy9V(xziFHImYmPqDhCOngW#8^Ws%P^F5&jvEBqb- ziHbN*NS6=M&9L_2DzBbSG)uPBq#Gy+9Y-5a6j)7XK zY}a;UqrM9pL%qv~GBzwE+qe(D7A}4V!uCdanvZY&{ zDmwhuXy|*U&L0%&e{AfieU;tkIH#(FQ?RRa#|TfOx9%h41J#QeU!7m;RP+ z);Pb7?bB%K^!nam$_gh?Ibn@#(GRVOX=3&s)nmfInyGO(7D4EGrUqZzjFpW_z|bv)_leIs+)jxS=e|22{Jkzo-W?*mx8Aj3n zNYpgarJmc-<;j`xc03!NMgIjH8bm+!gAOwfkvNOLn6NxUH||Wl6ZB20opOw1)~Td^ z$SftI;}fwHD3Q;I=HY`L&yjn#LycKupW>M_<(_($ai#OnbNHQn}krIgg&REZKIN( zZo@xw&frCG$b$phfop+=No2#CxSe(5;V?j;2?1GhGj-2d?W691MX!hkri^u97a2F7}F@! zCD*c^U}e7rHO#r8`I<-{-4^rGA9M$8KW`V&1ES+C7eV|nf&y6W>fX{kitdUA$eu@ zDKUCU?h%MA-)+^co?vM|$z~qauUPRjs}J{M|LFbLzm}UoRj7T`Ku=JJXj@)P-1&jzg#2!_CQ$c}2=tF3zQCvcx~$UVC{uN~uv%qCPqIYQ@ecCNZQ@V6n>A z!iVyN99~8X;xX;cYAteAi@Ilx#Cnme*Cba_ftu=EWIZJBMn@Q*^YM zBDikzH=BI}bD|uT(2QjmWcW#4sz7qw(1xy?%2k>WRTE`F+Q@9piq%$*7VrKt<1)3- zc@xl$!M_&sYqxN2w`yh)G$}x6R98(YM;LO04SuI)A8;$ZH=o4z}B(I2?w%oePW!u?|S}P|4=qeh?-u8rr)zjDxOo2ng>U;7^zv+lxE4yQlk4k|F+=@I0> zpErq?DmP(ixRqw)g-LL%gGFuRZNIR*_TOn%D3vT+jpU}N^r)V3&PCrYHg5obPVq|; zSdQw43s|d)avDeG9P_$1lG2stBElt}$qCb?rfqK=mZ?m2QLWCtc>C+gVA5F{h6S|& zYGa?x3}1of90nw1B#BXEh@X2~#=Y-`Kj`dTI?E~B;mWRNWXU-UXT)*@2 zxYX2vuc`x!v;)NBSUB&V7xfKU{D#}j@hLIRfREema~seb6cr+98cBD->=?sNQf`(o zY1Qov={*6uuwirLvi!TyTI2a-`@q{bK2`|j$=;jy12;iNkmh)gh+WH*PBoTyLV>21 zS_$wH#CnX^9yjStqs_6NT2O9bbj&@z0%+^FjoNZ&f9m+LwnBLp@o5kLP?#Ncrms?M z4LDxq)z|auv6ABmMm=ZOE|s(Uv9k03%^%UiiF7TegL09oQw^6?qWqJiA&#hH#6H+p zXKD;=jQYO$5L1x3R2eONqE2(q=x%wAMb7C?JyQpEC*y)@7mbA$nhZ4+W;q=eXUUmt zU1}98ggE(RgKL(0T6WHiqtyI6ZtOblMmRHX#H|FuGdAU+SoecYs+XR%6gZm> zjondxF85)_V+&v+_Sq7j7O>}QEOcR|#XJXJ7Vj-QR>bR8)aTP^FC7!`w43^Nh_Pj}WA4rm zWcxRHFBrUg=8>@KR6&OmnXDNFgd>CQMVeg8H$Dx7Mn4*|GO{bKYd@ca4;S46eP<=t#vrUHV1jCEDOBO_&}au zs~)&di99K9mADwnT$+h3bqMDtn}kwY0)&KI83#m_8gFvyMJZIF<=EOsN@kSFe zLu=(^2`Z}4Yfd6`_y=9Cocs^E?x%x-lcngGDKdthmDciIf|52g_Ssp=x)@#T8VHGP zyAZ>)^8m~M`2yx`&3V)0`x-pXs6WeW_Jb}IGNVso--b{aT*$MG*0~iw=x%#JzD2@6 zIl(WhvgkjdDcrYf^1Z{Kf`K5}13)8_ZCh!~bni)Dy%>SEvYkO~WxWqt)UZst7J|?n z4sgC>>khP}GHM+^AEnw2?{j?$CmfdTS;{P4&%dZTi9K%V4lTXf`-5&#-F5lC(WZE+ z|Ae%Km*uRtrf{QXmSc!BxI{8+?I9)%@c}Bod?H&bIO`CteB23su$KAl^xJNUTn~zw zc_zX0D&?>*VLwq4-8?{??;_s$M4)k=tIG+kixg)rV;ya*6NozafpS>CQXoe{!ehLy eYk-~anIRx{m%wPD_Fo3O{{({nKg~majQlUCFW_1L literal 0 HcmV?d00001 diff --git a/documentation/attention.rst b/documentation/attention.rst new file mode 100644 index 000000000..591430113 --- /dev/null +++ b/documentation/attention.rst @@ -0,0 +1,9 @@ +.. attention:: + WNTR now includes methods to simulate and analyze resilience of + stormwater and wastewater systems! + See :ref:`stormwater` for more information. + +.. attention:: + Version 1.1 is now available. + See `release notes `_ + for more information. \ No newline at end of file diff --git a/documentation/citing_wntr.rst b/documentation/citing_wntr.rst new file mode 100644 index 000000000..61a0e9c32 --- /dev/null +++ b/documentation/citing_wntr.rst @@ -0,0 +1,11 @@ +Citing WNTR +=========== + +To cite WNTR, use one of the following references: + +* Klise, K.A., Hart, D.B., Bynum, M., Hogge, J., Haxton, T., Murray, R., Burkhardt, J. (2020). Water Network Tool for Resilience (WNTR) User Manual: Version 0.2.3. U.S. EPA Office of Research and Development, Washington, DC, EPA/600/R-20/185, 82p. + +* Klise, K.A., Murray, R., Haxton, T. (2018). An overview of the Water Network Tool for Resilience (WNTR), In Proceedings of the 1st International WDSA/CCWI Joint Conference, Kingston, Ontario, Canada, July 23-25, 075, 8p. + +* Klise, K.A., Bynum, M., Moriarty, D., Murray, R. (2017). A software framework for assessing the resilience of drinking water systems to disasters with an example earthquake case study, Environmental Modelling and Software, 95, 420-431, doi: 10.1016/j.envsoft.2017.06.022 + diff --git a/documentation/figures/wntr_features.png b/documentation/figures/wntr_features.png new file mode 100644 index 0000000000000000000000000000000000000000..eda62c1774576af55c129d7ed9704a8edd16a78c GIT binary patch literal 452525 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