diff --git a/flo2d/flo2d.py b/flo2d/flo2d.py index c390f991..02920742 100644 --- a/flo2d/flo2d.py +++ b/flo2d/flo2d.py @@ -39,7 +39,8 @@ import pip from qgis.PyQt import QtCore, QtGui from PyQt5.QtGui import QFont -from PyQt5.QtWidgets import QApplication, QToolButton, QProgressDialog, QDockWidget, QTabWidget, QWidget, QVBoxLayout +from PyQt5.QtWidgets import QApplication, QToolButton, QProgressDialog, QDockWidget, QTabWidget, QWidget, QVBoxLayout, \ + QPushButton from osgeo import gdal, ogr from qgis._core import QgsMessageLog, QgsCoordinateReferenceSystem, QgsMapSettings, QgsProjectMetadata, \ QgsMapRendererParallelJob, QgsLayerTreeLayer, QgsVectorLayerExporter, QgsVectorFileWriter, QgsVectorLayer, \ @@ -1834,6 +1835,8 @@ def call_IO_methods_dat(self, calls, debug, *args): dat = "BRIDGE_COEFF_DATA.DAT" elif call == "import_hystruc_bridge_xs": dat = "BRIDGE_XSEC.DAT" + elif call == "import_swmminp": + dat = "SWMM.INP" else: dat = call.split("_")[-1].upper() + ".DAT" if call.startswith("import"): @@ -1924,6 +1927,7 @@ def import_gds(self): "import_breach", "import_gutter", "import_fpfroude", + "import_swmminp", "import_swmmflo", "import_swmmflort", "import_swmmoutf", @@ -2043,6 +2047,7 @@ def import_gds(self): import_calls.remove("import_raincell") if "Storm Drain" not in dlg_components.components: + import_calls.remove("import_swmminp") import_calls.remove("import_swmmflo") import_calls.remove("import_swmmflort") import_calls.remove("import_swmmoutf") @@ -2195,30 +2200,6 @@ def import_gds(self): for table in tables: self.gutils.clear_tables(table) - # Import first the grid - if "import_cont_toler" in import_calls: - self.call_IO_methods(["import_cont_toler"], True) - import_calls.remove("import_cont_toler") - - if "import_mannings_n_topo" in import_calls: - self.call_IO_methods(["import_mannings_n_topo"], True) - import_calls.remove("import_mannings_n_topo") - - # Import the SWMM.INP - if "Storm Drain" in dlg_components.components: - swmm_converter = SchemaSWMMConverter(self.con, self.iface, self.lyrs) - swmm_converter.create_user_swmm_inlets_junctions() - swmm_converter.create_user_swmm_outlets() - - if os.path.isfile(dir_name + r"\SWMM.INP"): - if self.f2d_widget.storm_drain_editor.import_storm_drain_INP_file( - "Force import of SWMM.INP", False - ): - self.files_used += "SWMM.INP" + "\n" - else: - self.uc.bar_error("ERROR 100623.0944: SWMM.INP file not found!") - self.uc.log_info("ERROR 100623.0944: SWMM.INP file not found!") - self.call_IO_methods(import_calls, True) # The strings list 'export_calls', contains the names of # the methods in the class Flo2dGeoPackage to import (read) the # FLO-2D .DAT files @@ -2636,6 +2617,7 @@ def import_selected_components(self): "import_breach", "import_gutter", "import_fpfroude", + "import_swmminp", "import_swmmflo", "import_swmmflort", "import_swmmoutf", @@ -2729,9 +2711,12 @@ def import_selected_components(self): import_calls.remove("import_raincell") if "Storm Drain" not in dlg_components.components: + import_calls.remove("import_swmminp") import_calls.remove("import_swmmflo") import_calls.remove("import_swmmflort") import_calls.remove("import_swmmoutf") + import_calls.remove("import_swmmflodropbox") + import_calls.remove("import_sdclogging") if "Spatial Tolerance" not in dlg_components.components: import_calls.remove("import_tolspatial") @@ -2741,29 +2726,6 @@ def import_selected_components(self): if import_calls: - if "Storm Drain" in dlg_components.components: - try: - swmm_converter = SchemaSWMMConverter(self.con, self.iface, self.lyrs) - swmm_converter.create_user_swmm_inlets_junctions() - swmm_converter.create_user_swmm_outlets() - except Exception as e: - self.uc.log_info(traceback.format_exc()) - QApplication.restoreOverrideCursor() - self.uc.show_error( - "ERROR 100623.1044:\n\nConverting Schematic SD Inlets to User Storm Drain Inlets/Junctions failed!" - + "\n_______________________________________________________________", - e, - ) - - if os.path.isfile(outdir + r"\SWMM.INP"): - if self.f2d_widget.storm_drain_editor.import_storm_drain_INP_file( - "Force import of SWMM.INP", True - ): - self.files_used += "SWMM.INP" + "\n" - else: - self.uc.bar_error("ERROR 100623.0944: SWMM.INP file not found!") - self.uc.log_info("ERROR 100623.0944: SWMM.INP file not found!") - self.call_IO_methods( import_calls, True ) # The strings list 'import_calls', contains the names of @@ -2845,6 +2807,25 @@ def import_selected_components2(self): """ self.gutils.disable_geom_triggers() self.f2g = Flo2dGeoPackage(self.con, self.iface) + s = QSettings() + last_dir = s.value("FLO-2D/lastGdsDir", "") + fname, __ = QFileDialog.getOpenFileName( + None, "Select FLO-2D file to import", directory=last_dir, filter="DAT or INP (*.DAT *.dat *.INP *.inp)" + ) + if not fname: + self.gutils.enable_geom_triggers() + return + dir_name = os.path.dirname(fname) + s.setValue("FLO-2D/lastGdsDir", dir_name) + bname = os.path.basename(fname) + + if bname.lower().endswith("inp"): + swmm_file_name = bname + swmm_file_path = fname + else: + swmm_file_name = "SWMM.INP" + swmm_file_path = os.path.join(dir_name, swmm_file_name) + file_to_import_calls = { "CONT.DAT": "import_cont_toler", "TOLER.DAT": "import_cont_toler", @@ -2872,6 +2853,7 @@ def import_selected_components2(self): "BREACH.DAT": "import_breach", "GUTTER.DAT": "import_gutter", "FPFROUDE.DAT": "import_fpfroude", + f"{swmm_file_name}": "import_swmminp", "SWMMFLO.DAT": "import_swmmflo", "SWMMFLORT.DAT": "import_swmmflort", "SWMMOUTF.DAT": "import_swmmoutf", @@ -2882,22 +2864,11 @@ def import_selected_components2(self): "MANNINGS_N.DAT": "import_mannings_n", "TOPO.DAT": "import_topo" } - s = QSettings() - last_dir = s.value("FLO-2D/lastGdsDir", "") - fname, __ = QFileDialog.getOpenFileName( - None, "Select FLO-2D file to import", directory=last_dir, filter="(*.DAT)" - ) - if not fname: - self.gutils.enable_geom_triggers() - return - dir_name = os.path.dirname(fname) - s.setValue("FLO-2D/lastGdsDir", dir_name) - bname = os.path.basename(fname) if bname not in file_to_import_calls: QMessageBox.critical( self.iface.mainWindow(), - "Import selected GDS file", + "Import selected DAT file", "Import from {0} file is not supported.".format(bname), ) self.uc.log_info(f"Import from {bname} file is not supported.") @@ -2909,11 +2880,14 @@ def import_selected_components2(self): QApplication.setOverrideCursor(Qt.WaitCursor) try: method = getattr(self.f2g, call_string) - method() + if call_string == "import_swmminp": + method(swmm_file=swmm_file_path) + else: + method() QApplication.restoreOverrideCursor() QMessageBox.information( self.iface.mainWindow(), - "Import selected GDS file", + "Import selected DAT file", "Import from {0} was successful.".format(bname), ) self.uc.log_info(f"Import from {bname} was successful.") @@ -3439,7 +3413,78 @@ def import_inp(self): """ Function to export FLO-2D to SWMM's INP file """ - self.f2d_widget.storm_drain_editor.import_storm_drain_INP_file("Choose", True) + try: + + if self.gutils.is_table_empty("grid"): + self.uc.bar_warn("There is no grid! Please create it before running tool.") + self.uc.log_info("There is no grid! Please create it before running tool.") + return False + + QApplication.setOverrideCursor(Qt.WaitCursor) + + self.f2g = Flo2dGeoPackage(self.con, self.iface, parsed_format="DAT") + s = QSettings() + last_dir = s.value("FLO-2D/lastGdsDir", "") + fname, __ = QFileDialog.getOpenFileName( + None, "Select SWMM INP file to import", directory=last_dir, filter="(*.INP)" + ) + if not fname: + QApplication.restoreOverrideCursor() + return + + dir_name = os.path.dirname(fname) + s.setValue("FLO-2D/lastGdsDir", dir_name) + + sd_user_tables = [ + 'user_swmm_inlets_junctions', + 'user_swmm_conduits', + 'user_swmm_pumps', + 'user_swmm_orifices', + 'user_swmm_weirs', + 'user_swmm_outlets', + 'user_swmm_storage_units' + ] + empty_sd = all((self.gutils.is_table_empty(sd_user_table) for sd_user_table in sd_user_tables)) + + if self.f2g.set_parser(fname, get_cell_size=False): + if not empty_sd: + QApplication.restoreOverrideCursor() + msg = QMessageBox() + msg.setWindowTitle("Replace or complete Storm Drain User Data") + msg.setText( + "There is already Storm Drain data in the Users Layers.\n\nWould you like to keep it and " + "complete it with data taken from the .INP file?\n\n" + + "or you prefer to erase it and create new storm drains from the .INP file?\n" + ) + + msg.addButton(QPushButton("Keep existing and complete"), QMessageBox.YesRole) + msg.addButton(QPushButton("Create new Storm Drains"), QMessageBox.NoRole) + msg.addButton(QPushButton("Cancel"), QMessageBox.RejectRole) + msg.setDefaultButton(QMessageBox().Cancel) + msg.setIcon(QMessageBox.Question) + ret = msg.exec_() + QApplication.setOverrideCursor(Qt.WaitCursor) + if ret == 0: + self.f2g.import_swmminp(swmm_file=fname, delete_existing=False) + elif ret == 1: + self.f2g.import_swmminp(swmm_file=fname) + else: + QApplication.restoreOverrideCursor() + return + else: + self.f2g.import_swmminp(swmm_file=fname) + + self.lyrs.refresh_layers() + + self.uc.bar_info("Import from INP completed! Check log messages for more information. ") + self.uc.log_info("Import from INP completed!") + + QApplication.restoreOverrideCursor() + + except Exception as e: + QApplication.restoreOverrideCursor() + self.uc.log_info(f"ERROR 08272024.0932: Could not import SWMM INP file!\n{e}") + self.uc.bar_error("ERROR 08272024.0932: Could not import SWMM INP file!") @connection_required def export_inp(self): diff --git a/flo2d/flo2d_ie/flo2d_parser.py b/flo2d/flo2d_ie/flo2d_parser.py index 7991ec8f..2bc960f9 100644 --- a/flo2d/flo2d_ie/flo2d_parser.py +++ b/flo2d/flo2d_ie/flo2d_parser.py @@ -8,6 +8,7 @@ # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version import os +import re from collections import OrderedDict, defaultdict from itertools import chain, repeat, zip_longest from operator import attrgetter @@ -312,6 +313,7 @@ def __init__(self): "FPXSEC.DAT": None, "BREACH.DAT": None, "FPFROUDE.DAT": None, + "SWMM.INP": None, "SWMMFLO.DAT": None, "SWMMFLORT.DAT": None, "SWMMOUTF.DAT": None, @@ -416,6 +418,41 @@ def double_parser(file1, file2): if row: yield row + @staticmethod + def swmminp_parser(swmminp_file): + """ + This is the new swmm parser. Usage example: + + To get data from a specific section + junctions_data = sections.get('JUNCTIONS', []) + + To print all sections + for section, lines in sections.items(): + print(f"[{section}]") + for line in lines: + print(line) + print("\n") + """ + sections = defaultdict(list) + current_section = None + + with open(swmminp_file, 'r') as inp_file: + for line in inp_file: + line = line.strip() + + # Ignore empty lines and comments + if not line or line.startswith(';'): + continue + + # Check for section headers (e.g., [JUNCTIONS]) + if line.startswith('[') and line.endswith(']'): + current_section = line[1:-1].strip().upper() # Strip brackets and set as current section + elif current_section: + # Split the line by any whitespace (e.g., space, tab) + sections[current_section].append(re.split(r'\s+', line)) + + return sections + @staticmethod def fix_row_size(row, fix_size, default=None, index=None): loops = fix_size - len(row) @@ -840,10 +877,8 @@ def parse_mult(self): mult = self.dat_files["MULT.DAT"] par = self.single_parser(mult) head = next(par) - self.fix_row_size(head, 8) data = [] for row in par: - self.fix_row_size(row, 5) data.append(row) return head, data @@ -963,6 +998,14 @@ def parse_gutter(self): data.append(row) return head, data + def parse_swmminp(self, swmm_file): + if swmm_file == "SWMM.INP": + swmminp = self.dat_files[swmm_file] + else: + swmminp = swmm_file + swmminp_dict = self.swmminp_parser(swmminp) + return swmminp_dict + def parse_swmmflo(self): swmmflo = self.dat_files["SWMMFLO.DAT"] par = self.single_parser(swmmflo) diff --git a/flo2d/flo2d_ie/flo2dgeopackage.py b/flo2d/flo2d_ie/flo2dgeopackage.py index 01687b79..d847fcda 100644 --- a/flo2d/flo2d_ie/flo2dgeopackage.py +++ b/flo2d/flo2d_ie/flo2dgeopackage.py @@ -16,7 +16,7 @@ import numpy as np from PyQt5.QtCore import QSettings -from qgis._core import QgsMessageLog +from qgis._core import QgsMessageLog, QgsGeometry, QgsPointXY, QgsVectorLayer, QgsFeature from qgis.PyQt import QtCore, QtGui from qgis.core import NULL, QgsApplication from qgis.PyQt.QtCore import Qt @@ -1622,6 +1622,1738 @@ def import_gutter(self): self.batch_execute(gutter_globals_sql, gutter_areas_sql, cells_sql) + def import_swmminp(self, swmm_file="SWMM.INP", delete_existing=True): + """ + Function to import the SWMM.INP -> refactored from the old method on the storm drain editor widget + """ + swmminp_dict = self.parser.parse_swmminp(swmm_file) + + coordinates_data = swmminp_dict.get('COORDINATES', []) + if len(coordinates_data) == 0: + self.uc.show_warn( + "WARNING 060319.1729: SWMM input file has no coordinates defined!" + ) + self.uc.log_info( + "WARNING 060319.1729: SWMM input file has no coordinates defined!" + ) + return + + # QApplication.setOverrideCursor(Qt.WaitCursor) + + self.import_swmminp_control(swmminp_dict) + self.import_swmminp_inflows(swmminp_dict, delete_existing) + self.import_swmminp_patterns(swmminp_dict, delete_existing) + self.import_swmminp_ts(swmminp_dict, delete_existing) + self.import_swmminp_curves(swmminp_dict, delete_existing) + self.import_swmminp_inlets_junctions(swmminp_dict, delete_existing) + self.import_swmminp_outfalls(swmminp_dict, delete_existing) + self.import_swmminp_storage_units(swmminp_dict, delete_existing) + self.import_swmminp_conduits(swmminp_dict, delete_existing) + self.import_swmminp_pumps(swmminp_dict, delete_existing) + self.import_swmminp_orifices(swmminp_dict, delete_existing) + self.import_swmminp_weirs(swmminp_dict, delete_existing) + + self.remove_outside_junctions() + + # QApplication.restoreOverrideCursor() + + def remove_outside_junctions(self): + """ + Function to remove outside junctions + """ + try: + # SELECT all the nodes connected to a conduit + inside_inlets_qry = self.execute(""" + SELECT DISTINCT conduit_inlet FROM user_swmm_conduits + UNION + SELECT DISTINCT pump_inlet FROM user_swmm_pumps + UNION + SELECT DISTINCT orifice_inlet FROM user_swmm_orifices + UNION + SELECT DISTINCT weir_inlet FROM user_swmm_weirs + ;""").fetchall() + inside_inlets = [inside_inlet[0] for inside_inlet in inside_inlets_qry] + inside_outlets_qry = self.execute(""" + SELECT DISTINCT conduit_outlet FROM user_swmm_conduits + UNION + SELECT DISTINCT pump_outlet FROM user_swmm_pumps + UNION + SELECT DISTINCT orifice_outlet FROM user_swmm_orifices + UNION + SELECT DISTINCT weir_outlet FROM user_swmm_weirs + ;""").fetchall() + inside_outlets = [inside_outlet[0] for inside_outlet in inside_outlets_qry] + inside_nodes = list(set(inside_inlets) | set(inside_outlets)) + + # Convert list to a SQL list + placeholders = ', '.join(['?'] * len(inside_nodes)) + + # Remove all the nodes that are not inside nodes. + inlet_junctions_delete_query = f""" + DELETE FROM user_swmm_inlets_junctions + WHERE name NOT IN ({placeholders}); + """ + inlet_junctions_delete = self.execute(inlet_junctions_delete_query, inside_nodes) + inlet_junctions_deleted_count = inlet_junctions_delete.rowcount + if inlet_junctions_deleted_count > 0: + self.uc.log_info(f"JUNCTIONS: {inlet_junctions_deleted_count} are outside the domain and not added to the project") + outfalls_delete_query = f""" + DELETE FROM user_swmm_outlets + WHERE name NOT IN ({placeholders}); + """ + outfalls_delete = self.execute(outfalls_delete_query, inside_nodes) + outfalls_deleted_count = outfalls_delete.rowcount + if outfalls_deleted_count > 0: + self.uc.log_info(f"OUTFALLS: {outfalls_deleted_count} are outside the domain and not added to the project") + storage_delete_query = f""" + DELETE FROM user_swmm_storage_units + WHERE name NOT IN ({placeholders}); + """ + storage_delete = self.execute(storage_delete_query, inside_nodes) + storage_deleted_count = storage_delete.rowcount + if storage_deleted_count > 0: + self.uc.log_info(f"STORAGES: {storage_deleted_count} are outside the domain and not added to the project") + + except Exception as e: + QApplication.setOverrideCursor(Qt.ArrowCursor) + msg = "ERROR 08282024.0505: Removing outside nodes failed!\n\n" \ + f"{e}" + self.uc.show_error(msg, e) + self.uc.log_info(msg) + QApplication.restoreOverrideCursor() + + def import_swmminp_control(self, swmminp_dict): + """ + Function to import swmm inp control data + """ + try: + self.gutils.clear_tables('swmm_control') + insert_controls_sql = """INSERT INTO swmm_control ( + name, + value + ) + VALUES (?, ?);""" + + controls_data = swmminp_dict.get('OPTIONS', []) + + for control in controls_data: + self.gutils.execute(insert_controls_sql, ( + control[0], + control[1] + ) + ) + + report_data = swmminp_dict.get('REPORT', []) + + for report in report_data: + self.gutils.execute(insert_controls_sql, ( + report[0], + report[1] + ) + ) + + # Adjust the TITLE + title_sql = self.gutils.execute("SELECT name, value FROM swmm_control WHERE name = 'TITLE';").fetchone() + if not title_sql: + self.gutils.execute("""INSERT INTO swmm_control (name, value) + VALUES + ('TITLE', 'INP file created by FLO-2D') + """) + + self.uc.log_info("Storm Drain control variables set") + + except Exception as e: + QApplication.setOverrideCursor(Qt.ArrowCursor) + msg = "ERROR 08272024.0849: creation of Storm Drain control variables failed!\n\n" \ + "Please check your SWMM input data.\n" \ + f"{e}" + self.uc.show_error(msg, e) + self.uc.log_info(msg) + QApplication.restoreOverrideCursor() + + def import_swmminp_weirs(self, swmminp_dict, delete_existing): + """ + Function to import swmm inp weirs + """ + try: + existing_weirs = [] + not_added = [] + if delete_existing: + self.gutils.clear_tables('user_swmm_weirs') + else: + existing_weirs_qry = self.gutils.execute("SELECT weir_name FROM user_swmm_weirs;").fetchall() + existing_weirs = [weir[0] for weir in existing_weirs_qry] + + insert_weirs_sql = """INSERT INTO user_swmm_weirs ( + weir_name, + weir_inlet, + weir_outlet, + weir_type, + weir_crest_height, + weir_disch_coeff, + weir_flap_gate, + weir_end_contrac, + weir_end_coeff, + weir_shape, + weir_height, + weir_length, + weir_side_slope, + geom + ) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);""" + + replace_user_swmm_weirs_sql = """UPDATE user_swmm_weirs + SET weir_inlet = ?, + weir_outlet = ?, + weir_type = ?, + weir_crest_height = ?, + weir_disch_coeff = ?, + weir_flap_gate = ?, + weir_end_contrac = ?, + weir_end_coeff = ?, + weir_shape = ?, + weir_height = ?, + weir_length = ?, + weir_side_slope = ? + WHERE weir_name = ?;""" + + weirs_data = swmminp_dict.get('WEIRS', []) + coordinates_data = swmminp_dict.get('COORDINATES', []) + coordinates_dict = {item[0]: item[1:] for item in coordinates_data} + xsections_data = swmminp_dict.get('XSECTIONS', []) + xsections_dict = {item[0]: item[1:] for item in xsections_data} + vertices_data = swmminp_dict.get('VERTICES', []) + + if len(weirs_data) > 0: + added_weirs = 0 + updated_weirs = 0 + for weir in weirs_data: + """ + [WEIRS] + ;; Inlet Outlet Weir Crest Disch. Flap End End + ;;Name Node Node Type Height Coeff. Gate Con. Coeff. + ;;-------------- ---------------- ---------------- ------------ ---------- ---------- ---- -------- ---------- + weir1 Cistern3 Ocistern V-NOTCH 4.50 3.30 NO 0 0.00 + """ + + # SWMM Variables + weir_name = weir[0] + weir_inlet = weir[1] + weir_outlet = weir[2] + weir_type = weir[3] + weir_crest_height = weir[4] + weir_disch_coeff = weir[5] + weir_flap_gate = weir[6] + weir_end_contrac = weir[7] + weir_end_coeff = weir[8] + + weir_shape = xsections_dict[weir_name][0] + weir_height = xsections_dict[weir_name][1] + weir_length = xsections_dict[weir_name][2] + weir_side_slope = xsections_dict[weir_name][3] + + # QGIS Variables + linestring_list = [] + inlet_x = coordinates_dict[weir_inlet][0] + inlet_y = coordinates_dict[weir_inlet][1] + inlet_grid = self.grid_on_point(inlet_x, inlet_y) + + linestring_list.append((inlet_x, inlet_y)) + + for vertice in vertices_data: + if vertice[0] == weir_name: + linestring_list.append((vertice[1], vertice[2])) + + outlet_x = coordinates_dict[weir_outlet][0] + outlet_y = coordinates_dict[weir_outlet][1] + outlet_grid = self.grid_on_point(outlet_x, outlet_y) + + linestring_list.append((outlet_x, outlet_y)) + + # Both ends of the orifice is outside the grid + if not inlet_grid and not outlet_grid: + not_added.append(weir_name) + continue + + # Orifice inlet is outside the grid, and it is an Inlet + if not inlet_grid and weir_inlet.lower().startswith("i"): + not_added.append(weir_name) + continue + + geom = "LINESTRING({})".format(", ".join("{0} {1}".format(x, y) for x, y in linestring_list)) + geom = self.gutils.wkt_to_gpb(geom) + + if weir_name in existing_weirs: + updated_weirs += 1 + self.gutils.execute( + replace_user_swmm_weirs_sql, + ( + weir_inlet, + weir_outlet, + weir_type, + weir_crest_height, + weir_disch_coeff, + weir_flap_gate, + weir_end_contrac, + weir_end_coeff, + weir_shape, + weir_height, + weir_length, + weir_side_slope, + weir_name, + ), + ) + else: + added_weirs += 1 + self.gutils.execute(insert_weirs_sql, ( + weir_name, + weir_inlet, + weir_outlet, + weir_type, + weir_crest_height, + weir_disch_coeff, + weir_flap_gate, + weir_end_contrac, + weir_end_coeff, + weir_shape, + weir_height, + weir_length, + weir_side_slope, + geom + ) + ) + self.uc.log_info(f"WEIRS: {added_weirs} added and {updated_weirs} updated from imported SWMM INP file") + + if len(not_added) > 0: + self.uc.log_info( + f"WEIRS: {len(not_added)} are outside the domain and not added to the project") + + except Exception as e: + QApplication.setOverrideCursor(Qt.ArrowCursor) + msg = "ERROR 080422.1115: creation of Storm Drain Weirs layer failed!\n\n" \ + "Please check your SWMM input data.\n" \ + f"{e}" + self.uc.show_error(msg, e) + self.uc.log_info(msg) + QApplication.restoreOverrideCursor() + + def import_swmminp_orifices(self, swmminp_dict, delete_existing): + """ + Function to import swmm inp orifices + """ + try: + not_added = [] + existing_orifices = [] + if delete_existing: + self.gutils.clear_tables('user_swmm_orifices') + else: + existing_orifices_qry = self.gutils.execute("SELECT orifice_name FROM user_swmm_orifices;").fetchall() + existing_orifices = [orifice[0] for orifice in existing_orifices_qry] + + insert_orifices_sql = """INSERT INTO user_swmm_orifices ( + orifice_name, + orifice_inlet, + orifice_outlet, + orifice_type, + orifice_crest_height, + orifice_disch_coeff, + orifice_flap_gate, + orifice_open_close_time, + orifice_shape, + orifice_height, + orifice_width, + geom + ) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);""" + + replace_user_swmm_orificies_sql = """UPDATE user_swmm_orifices + SET orifice_inlet = ?, + orifice_outlet = ?, + orifice_type = ?, + orifice_crest_height = ?, + orifice_disch_coeff = ?, + orifice_flap_gate = ?, + orifice_open_close_time = ?, + orifice_shape = ?, + orifice_height = ?, + orifice_width = ? + WHERE orifice_name = ?;""" + + orifices_data = swmminp_dict.get('ORIFICES', []) + coordinates_data = swmminp_dict.get('COORDINATES', []) + coordinates_dict = {item[0]: item[1:] for item in coordinates_data} + xsections_data = swmminp_dict.get('XSECTIONS', []) + xsections_dict = {item[0]: item[1:] for item in xsections_data} + vertices_data = swmminp_dict.get('VERTICES', []) + + if len(orifices_data) > 0: + added_orifices = 0 + updated_orifices = 0 + for orifice in orifices_data: + """ + [ORIFICES] + ;; Inlet Outlet Orifice Crest Disch. Flap Open/Close + ;;Name Node Node Type Height Coeff. Gate Time + ;;-------------- ---------------- ---------------- ------------ ---------- ---------- ---- ---------- + orifice1 Cistern1 Cistern2 SIDE 0.50 0.65 NO 0.00 + """ + + # SWMM Variables + orifice_name = orifice[0] + orifice_inlet = orifice[1] + orifice_outlet = orifice[2] + orifice_type = orifice[3] + orifice_crest_height = orifice[4] + orifice_disch_coeff = orifice[5] + orifice_flap_gate = orifice[6] + orifice_open_close_time = orifice[7] + + orifice_shape = xsections_dict[orifice_name][0] + orifice_height = xsections_dict[orifice_name][1] + orifice_width = xsections_dict[orifice_name][2] + + # QGIS Variables + linestring_list = [] + inlet_x = coordinates_dict[orifice_inlet][0] + inlet_y = coordinates_dict[orifice_inlet][1] + inlet_grid = self.gutils.grid_on_point(inlet_x, inlet_y) + + linestring_list.append((inlet_x, inlet_y)) + + for vertice in vertices_data: + if vertice[0] == orifice_name: + linestring_list.append((vertice[1], vertice[2])) + + outlet_x = coordinates_dict[orifice_outlet][0] + outlet_y = coordinates_dict[orifice_outlet][1] + outlet_grid = self.gutils.grid_on_point(outlet_x, outlet_y) + + linestring_list.append((outlet_x, outlet_y)) + + # Both ends of the orifice is outside the grid + if not inlet_grid and not outlet_grid: + not_added.append(orifice_name) + continue + + # Orifice inlet is outside the grid, and it is an Inlet + if not inlet_grid and orifice_inlet.lower().startswith("i"): + not_added.append(orifice_name) + continue + + geom = "LINESTRING({})".format(", ".join("{0} {1}".format(x, y) for x, y in linestring_list)) + geom = self.gutils.wkt_to_gpb(geom) + + if orifice_name in existing_orifices: + updated_orifices += 1 + self.gutils.execute( + replace_user_swmm_orificies_sql, + ( + orifice_inlet, + orifice_outlet, + orifice_type, + orifice_crest_height, + orifice_disch_coeff, + orifice_flap_gate, + orifice_open_close_time, + orifice_shape, + orifice_height, + orifice_width, + orifice_name, + ) + ) + else: + added_orifices += 1 + self.gutils.execute(insert_orifices_sql, ( + orifice_name, + orifice_inlet, + orifice_outlet, + orifice_type, + orifice_crest_height, + orifice_disch_coeff, + orifice_flap_gate, + orifice_open_close_time, + orifice_shape, + orifice_height, + orifice_width, + geom + ) + ) + self.uc.log_info(f"ORIFICES: {added_orifices} added and {updated_orifices} updated from imported SWMM INP file") + + if len(not_added) > 0: + self.uc.log_info( + f"ORIFICES: {len(not_added)} are outside the domain and not added to the project") + + except Exception as e: + QApplication.setOverrideCursor(Qt.ArrowCursor) + msg = "ERROR 310322.0853: creation of Storm Drain Orifices layer failed!\n\n" \ + "Please check your SWMM input data.\n" \ + f"{e}" + self.uc.show_error(msg, e) + self.uc.log_info(msg) + QApplication.restoreOverrideCursor() + + def import_swmminp_pumps(self, swmminp_dict, delete_existing): + """ + Function to import swmm inp pumps + """ + try: + not_added = [] + existing_pumps = [] + if delete_existing: + self.gutils.clear_tables('user_swmm_pumps') + else: + existing_pumps_qry = self.gutils.execute("SELECT pump_name FROM user_swmm_pumps;").fetchall() + existing_pumps = [pump[0] for pump in existing_pumps_qry] + insert_pumps_sql = """INSERT INTO user_swmm_pumps ( + pump_name, + pump_inlet, + pump_outlet, + pump_curve, + pump_init_status, + pump_startup_depth, + pump_shutoff_depth, + geom + ) + VALUES (?, ?, ?, ?, ?, ?, ?, ?);""" + + replace_user_swmm_pumps_sql = """UPDATE user_swmm_pumps + SET pump_inlet = ?, + pump_outlet = ?, + pump_curve = ?, + pump_init_status = ?, + pump_startup_depth = ?, + pump_shutoff_depth = ? + WHERE pump_name = ?;""" + + pumps_data = swmminp_dict.get('PUMPS', []) + coordinates_data = swmminp_dict.get('COORDINATES', []) + coordinates_dict = {item[0]: item[1:] for item in coordinates_data} + vertices_data = swmminp_dict.get('VERTICES', []) + + if len(pumps_data) > 0: + added_pumps = 0 + updated_pumps = 0 + for pump in pumps_data: + """ + [PUMPS] + ;; Inlet Outlet Pump Init. Startup Shutoff + ;;Name Node Node Curve Status Depth Depth + ;;-------------- ---------------- ---------------- ---------------- ------ -------- -------- + CPump Ids1 Cistern1 P1 OFF 3.00 40.00 + """ + + # SWMM Variables + pump_name = pump[0] + pump_inlet = pump[1] + pump_outlet = pump[2] + pump_curve = pump[3] + pump_init_status = pump[4] + pump_startup_depth = pump[5] + pump_shutoff_depth = pump[6] + + # QGIS Variables + linestring_list = [] + inlet_x = coordinates_dict[pump_inlet][0] + inlet_y = coordinates_dict[pump_inlet][1] + inlet_grid = self.grid_on_point(inlet_x, inlet_y) + + linestring_list.append((inlet_x, inlet_y)) + + for vertice in vertices_data: + if vertice[0] == pump_name: + linestring_list.append((vertice[1], vertice[2])) + + outlet_x = coordinates_dict[pump_outlet][0] + outlet_y = coordinates_dict[pump_outlet][1] + outlet_grid = self.grid_on_point(outlet_x, outlet_y) + + linestring_list.append((outlet_x, outlet_y)) + + # Both ends of the pump is outside the grid + if not inlet_grid and not outlet_grid: + not_added.append(pump_name) + continue + + # Pump inlet is outside the grid, and it is an Inlet + if not inlet_grid and pump_inlet.lower().startswith("i"): + not_added.append(pump_name) + continue + + geom = "LINESTRING({})".format(", ".join("{0} {1}".format(x, y) for x, y in linestring_list)) + geom = self.gutils.wkt_to_gpb(geom) + + if pump_name in existing_pumps: + updated_pumps += 1 + self.gutils.execute( + replace_user_swmm_pumps_sql, + ( + pump_inlet, + pump_outlet, + pump_curve, + pump_init_status, + pump_startup_depth, + pump_shutoff_depth, + pump_name, + ), + ) + else: + added_pumps += 1 + self.gutils.execute(insert_pumps_sql, ( + pump_name, + pump_inlet, + pump_outlet, + pump_curve, + pump_init_status, + pump_startup_depth, + pump_shutoff_depth, + geom + ) + ) + self.uc.log_info(f"PUMPS: {added_pumps} added and {updated_pumps} updated from imported SWMM INP file") + + if len(not_added) > 0: + self.uc.log_info( + f"PUMPS: {len(not_added)} are outside the domain and not added to the project") + + except Exception as e: + QApplication.setOverrideCursor(Qt.ArrowCursor) + msg = "ERROR 050618.1805: creation of Storm Drain Pumps layer failed!\n\n" \ + "Please check your SWMM input data.\n" \ + f"{e}" + self.uc.show_error(msg, e) + self.uc.log_info(msg) + QApplication.restoreOverrideCursor() + + def import_swmminp_conduits(self, swmminp_dict, delete_existing): + """ + Function to import swmm inp conduits + """ + try: + existing_conduits = [] + not_added = [] + if delete_existing: + self.gutils.clear_tables('user_swmm_conduits') + else: + existing_conduits_qry = self.gutils.execute("SELECT conduit_name FROM user_swmm_conduits;").fetchall() + existing_conduits = [conduit[0] for conduit in existing_conduits_qry] + + insert_conduits_sql = """INSERT INTO user_swmm_conduits ( + conduit_name, + conduit_inlet, + conduit_outlet, + conduit_length, + conduit_manning, + conduit_inlet_offset, + conduit_outlet_offset, + conduit_init_flow, + conduit_max_flow, + losses_inlet, + losses_outlet, + losses_average, + losses_flapgate, + xsections_shape, + xsections_barrels, + xsections_max_depth, + xsections_geom2, + xsections_geom3, + xsections_geom4, + geom + ) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);""" + + replace_user_swmm_conduits_sql = """UPDATE user_swmm_conduits + SET conduit_inlet = ?, + conduit_outlet = ?, + conduit_length = ?, + conduit_manning = ?, + conduit_inlet_offset = ?, + conduit_outlet_offset = ?, + conduit_init_flow = ?, + conduit_max_flow = ?, + losses_inlet = ?, + losses_outlet = ?, + losses_average = ?, + losses_flapgate = ?, + xsections_shape = ?, + xsections_barrels = ?, + xsections_max_depth = ?, + xsections_geom2 = ?, + xsections_geom3 = ?, + xsections_geom4 = ? + WHERE conduit_name = ?;""" + + conduits_data = swmminp_dict.get('CONDUITS', []) + losses_data = swmminp_dict.get('LOSSES', []) + losses_dict = {item[0]: item[1:] for item in losses_data} + xsections_data = swmminp_dict.get('XSECTIONS', []) + xsections_dict = {item[0]: item[1:] for item in xsections_data} + coordinates_data = swmminp_dict.get('COORDINATES', []) + coordinates_dict = {item[0]: item[1:] for item in coordinates_data} + vertices_data = swmminp_dict.get('VERTICES', []) + + if len(conduits_data) > 0: + updated_conduits = 0 + added_conduits = 0 + for conduit in conduits_data: + """ + ;; Inlet Outlet Manning Inlet Outlet Init. Max. + ;;Name Node Node Length N Offset Offset Flow Flow + ;;-------------- ---------------- ---------------- ---------- ---------- ---------- ---------- ---------- ---------- + """ + # SWMM Variables + conduit_name = conduit[0] + conduit_inlet = conduit[1] + conduit_outlet = conduit[2] + conduit_length = conduit[3] + conduit_manning = conduit[4] + conduit_inlet_offset = conduit[5] + conduit_outlet_offset = conduit[6] + conduit_init_flow = conduit[7] + conduit_max_flow = conduit[8] + + """ + [LOSSES] + ;;Link Inlet Outlet Average Flap Gate + ;;-------------- ---------- ---------- ---------- ---------- + DS2-1 0.0 0.0 0.00 NO + """ + losses_inlet = losses_dict[conduit_name][0] + losses_outlet = losses_dict[conduit_name][1] + losses_average = losses_dict[conduit_name][2] + losses_flapgate = 'True' if losses_dict[conduit_name][3] == 'YES' else 'False' + + """ + [XSECTIONS] + ;;Link Shape Geom1 Geom2 Geom3 Geom4 Barrels + ;;-------------- ------------ ---------------- ---------- ---------- ---------- ---------- + DS2-1 CIRCULAR 1.00 0.00 0.000 0.00 1 + """ + xsections_shape = xsections_dict[conduit_name][0] + xsections_barrels = xsections_dict[conduit_name][5] + xsections_max_depth = xsections_dict[conduit_name][1] + xsections_geom2 = xsections_dict[conduit_name][2] + xsections_geom3 = xsections_dict[conduit_name][3] + xsections_geom4 = xsections_dict[conduit_name][4] + + # QGIS Variables + linestring_list = [] + inlet_x = coordinates_dict[conduit_inlet][0] + inlet_y = coordinates_dict[conduit_inlet][1] + inlet_grid = self.gutils.grid_on_point(inlet_x, inlet_y) + + linestring_list.append((inlet_x, inlet_y)) + + for vertice in vertices_data: + if vertice[0] == conduit_name: + linestring_list.append((vertice[1], vertice[2])) + + outlet_x = coordinates_dict[conduit_outlet][0] + outlet_y = coordinates_dict[conduit_outlet][1] + outlet_grid = self.gutils.grid_on_point(outlet_x, outlet_y) + + linestring_list.append((outlet_x, outlet_y)) + + # Both ends of the conduit is outside the grid + if not inlet_grid and not outlet_grid: + not_added.append(conduit_name) + continue + + # Conduit inlet is outside the grid, and it is an Inlet + if not inlet_grid and conduit_inlet.lower().startswith("i"): + not_added.append(conduit_name) + continue + + geom = "LINESTRING({})".format(", ".join("{0} {1}".format(x, y) for x, y in linestring_list)) + geom = self.gutils.wkt_to_gpb(geom) + + if conduit_name in existing_conduits: + updated_conduits += 1 + self.gutils.execute( + replace_user_swmm_conduits_sql, + ( + conduit_inlet, + conduit_outlet, + conduit_length, + conduit_manning, + conduit_inlet_offset, + conduit_outlet_offset, + conduit_init_flow, + conduit_max_flow, + losses_inlet, + losses_outlet, + losses_average, + losses_flapgate, + xsections_shape, + xsections_barrels, + xsections_max_depth, + xsections_geom2, + xsections_geom3, + xsections_geom4, + conduit_name, + ), + ) + + else: + added_conduits += 1 + self.gutils.execute(insert_conduits_sql, ( + conduit_name, + conduit_inlet, + conduit_outlet, + conduit_length, + conduit_manning, + conduit_inlet_offset, + conduit_outlet_offset, + conduit_init_flow, + conduit_max_flow, + losses_inlet, + losses_outlet, + losses_average, + losses_flapgate, + xsections_shape, + xsections_barrels, + xsections_max_depth, + xsections_geom2, + xsections_geom3, + xsections_geom4, + geom + ) + ) + self.uc.log_info(f"CONDUITS: {added_conduits} added and {updated_conduits} updated from imported SWMM INP file") + + if len(not_added) > 0: + self.uc.log_info( + f"CONDUITS: {len(not_added)} are outside the domain and not added to the project") + + except Exception as e: + QApplication.setOverrideCursor(Qt.ArrowCursor) + msg = "ERROR 050618.1804: creation of Storm Drain Conduits layer failed!\n\n" \ + "Please check your SWMM input data.\n" \ + f"{e}" + self.uc.show_error(msg, e) + self.uc.log_info(msg) + QApplication.restoreOverrideCursor() + + def import_swmminp_storage_units(self, swmminp_dict, delete_existing): + """ + Function to import swmm inp storage units + """ + try: + existing_storages = [] + if delete_existing: + self.gutils.clear_tables('user_swmm_storage_units') + else: + existing_storages_qry = self.gutils.execute("SELECT name FROM user_swmm_storage_units;").fetchall() + existing_storages = [storage[0] for storage in existing_storages_qry] + + insert_storage_units_sql = """ + INSERT INTO user_swmm_storage_units ( + name, + grid, + invert_elev, + max_depth, + init_depth, + external_inflow, + treatment, + ponded_area, + evap_factor, + infiltration, + infil_method, + suction_head, + conductivity, + initial_deficit, + storage_curve, + coefficient, + exponent, + constant, + curve_name, + geom + ) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);""" + + replace_user_swmm_storage_sql = """UPDATE user_swmm_storage_units + SET geom = ?, + "invert_elev" = ?, + "max_depth" = ?, + "init_depth" = ?, + "external_inflow" = ?, + "treatment" = ?, + "ponded_area" = ?, + "evap_factor" = ?, + "infiltration" = ?, + "infil_method" = ?, + "suction_head" = ?, + "conductivity" = ?, + "initial_deficit" = ?, + "storage_curve" = ?, + "coefficient" = ?, + "exponent" = ?, + "constant" = ?, + "curve_name" = ? + WHERE name = ?;""" + + storage_units_data = swmminp_dict.get('STORAGE', []) + coordinates_data = swmminp_dict.get('COORDINATES', []) + coordinates_dict = {item[0]: item[1:] for item in coordinates_data} + inflows_data = swmminp_dict.get('INFLOWS', []) + external_inflows = [external_inflow_name[0] for external_inflow_name in inflows_data] + + if len(storage_units_data) > 0: + added_storages = 0 + updated_storages = 0 + for storage_unit in storage_units_data: + """ + [STORAGE] + ;; Invert Max. Init. Storage Curve Ponded Evap. + ;;Name Elev. Depth Depth Curve Params Area Frac. Infiltration Parameters + ;;-------------- -------- -------- -------- ---------- -------- -------- -------- -------- -------- ----------------------- + Cistern1 1385 9 0 TABULAR Storage1 0 0 + Cistern2 1385 9 0 TABULAR Storage1 0 0 50 60 70 + Cistern3 1385 9 0 FUNCTIONAL 1000 100 10 0 0 + """ + + # SWMM VARIABLES + name = storage_unit[0] + invert_elev = storage_unit[1] + max_depth = storage_unit[2] + init_depth = storage_unit[3] + storage_curve = storage_unit[4] + if storage_curve == 'FUNCTIONAL': + coefficient = storage_unit[5] + exponent = storage_unit[6] + constant = storage_unit[7] + evap_factor = storage_unit[9] + curve_name = '*' + else: + coefficient = 1000 + exponent = 0 + constant = 0 + curve_name = storage_unit[5] + evap_factor = storage_unit[7] + infiltration = 'YES' if len(storage_unit) == 13 or len(storage_unit) == 11 else 'NO' + infil_method = 'GREEN_AMPT' + if len(storage_unit) == 13: + suction_head = storage_unit[10] + conductivity = storage_unit[11] + initial_deficit = storage_unit[12] + elif len(storage_unit) == 11: + suction_head = storage_unit[8] + conductivity = storage_unit[9] + initial_deficit = storage_unit[10] + else: + suction_head = 0 + conductivity = 0 + initial_deficit = 0 + external_inflow = 'YES' if name in external_inflows else 'NO' + treatment = 'NO' + ponded_area = 0 + + # QGIS VARIABLES + x = float(coordinates_dict[name][0]) + y = float(coordinates_dict[name][1]) + + grid_n = self.gutils.grid_on_point(x, y) + grid = -9999 if grid_n is None else grid_n + geom = "POINT({0} {1})".format(x, y) + geom = self.gutils.wkt_to_gpb(geom) + + if name in existing_storages: + updated_storages += 1 + self.gutils.execute( + replace_user_swmm_storage_sql, + ( + geom, + invert_elev, + max_depth, + init_depth, + external_inflow, + treatment, + ponded_area, + evap_factor, + infiltration, + infil_method, + suction_head, + conductivity, + initial_deficit, + storage_curve, + coefficient, + exponent, + constant, + curve_name, + name, + ), + ) + else: + added_storages += 1 + self.gutils.execute(insert_storage_units_sql, ( + name, + grid, + invert_elev, + max_depth, + init_depth, + external_inflow, + treatment, + ponded_area, + evap_factor, + infiltration, + infil_method, + suction_head, + conductivity, + initial_deficit, + storage_curve, + coefficient, + exponent, + constant, + curve_name, + geom + ) + ) + + self.uc.log_info(f"STORAGES: {added_storages} added and {updated_storages} updated from imported SWMM INP file") + + except Exception as e: + QApplication.setOverrideCursor(Qt.ArrowCursor) + msg = "ERROR 300124.1109: Creating Storm Drain Storage Units layer failed!\n\n" \ + "Please check your SWMM input data.\nAre the nodes coordinates inside the computational domain?\n" \ + f"{e}" + self.uc.show_error(msg, e) + self.uc.log_info(msg) + QApplication.restoreOverrideCursor() + + def import_swmminp_outfalls(self, swmminp_dict, delete_existing): + """ + Function to import swmm inp outfalls + """ + try: + existing_outfalls = [] + if delete_existing: + self.gutils.clear_tables('user_swmm_outlets') + else: + existing_outfalls_qry = self.gutils.execute("SELECT name FROM user_swmm_outlets;").fetchall() + existing_outfalls = [outfall[0] for outfall in existing_outfalls_qry] + + insert_outfalls_sql = """ + INSERT INTO user_swmm_outlets ( + grid, + name, + outfall_invert_elev, + flapgate, + swmm_allow_discharge, + outfall_type, + tidal_curve, + time_series, + fixed_stage, + geom + ) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);""" + + replace_user_swmm_outlets_sql = """UPDATE user_swmm_outlets + SET geom = ?, + outfall_type = ?, + outfall_invert_elev = ?, + swmm_allow_discharge = ?, + tidal_curve = ?, + time_series = ?, + fixed_stage = ?, + flapgate = ? + WHERE name = ?;""" + + outfalls_data = swmminp_dict.get('OUTFALLS', []) + coordinates_data = swmminp_dict.get('COORDINATES', []) + coordinates_dict = {item[0]: item[1:] for item in coordinates_data} + + if len(outfalls_data) > 0: + added_outfalls = 0 + updated_outfalls = 0 + for outfall in outfalls_data: + """ + [OUTFALLS] + ;; Invert Outfall Stage/Table Tide + ;;Name Elev. Type Time Series Gate + ;;-------------- ---------- ---------- ---------------- ---- + O-35-31-23 1397.16 FREE NO + """ + + # SWMM VARIABLES + name = outfall[0] + outfall_invert_elev = outfall[1] + outfall_type = outfall[2] + if len(outfall) == 5: + flapgate = "True" if outfall[4] == "YES" else "False" + tidal_curve = outfall[3] if outfall_type == "TIDAL" else '*' + time_series = outfall[3] if outfall_type == "TIMESERIES" else '*' + fixed_stage = outfall[3] if outfall_type == "FIXED" else '*' + else: + flapgate = "True" if outfall[3] == "YES" else "False" + tidal_curve = '*' + time_series = '*' + fixed_stage = '*' + + # QGIS VARIABLES + x = coordinates_dict[name][0] + y = coordinates_dict[name][1] + grid_n = self.gutils.grid_on_point(x, y) + grid = -9999 if grid_n is None else grid_n + geom = "POINT({0} {1})".format(x, y) + geom = self.gutils.wkt_to_gpb(geom) + + # FLO-2D VARIABLES + swmm_allow_discharge = 0 + + if name in existing_outfalls: + updated_outfalls += 1 + self.gutils.execute( + replace_user_swmm_outlets_sql, + ( + geom, + outfall_type, + outfall_invert_elev, + swmm_allow_discharge, + tidal_curve, + time_series, + fixed_stage, + flapgate, + name, + ), + ) + else: + added_outfalls += 1 + self.gutils.execute(insert_outfalls_sql, ( + grid, + name, + outfall_invert_elev, + flapgate, + swmm_allow_discharge, + outfall_type, + tidal_curve, + time_series, + fixed_stage, + geom + ) + ) + + self.uc.log_info(f"OUTFALLS: {added_outfalls} added and {updated_outfalls} updated from imported SWMM INP file") + + except Exception as e: + QApplication.setOverrideCursor(Qt.ArrowCursor) + msg = "ERROR 060319.1610: Creating Storm Drain Outfalls layer failed!\n\n" \ + "Please check your SWMM input data.\nAre the nodes coordinates inside the computational domain?\n" \ + f"{e}" + self.uc.show_error(msg, e) + self.uc.log_info(msg) + QApplication.restoreOverrideCursor() + + def import_swmminp_inlets_junctions(self, swmminp_dict, delete_existing): + """ + Function to import swmm inp inlets junctions + """ + try: + existing_inlets_junctions = [] + if delete_existing: + self.gutils.clear_tables('user_swmm_inlets_junctions') + else: + existing_inlets_junctions_qry = self.gutils.execute("SELECT name FROM user_swmm_inlets_junctions;").fetchall() + existing_inlets_junctions = [inlet_junction[0] for inlet_junction in existing_inlets_junctions_qry] + + insert_inlets_junctions_sql = """ + INSERT INTO user_swmm_inlets_junctions ( + grid, + name, + sd_type, + external_inflow, + junction_invert_elev, + max_depth, + init_depth, + surcharge_depth, + intype, + swmm_length, + swmm_width, + swmm_height, + swmm_coeff, + swmm_feature, + curbheight, + swmm_clogging_factor, + swmm_time_for_clogging, + drboxarea, + geom + ) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);""" + + replace_user_swmm_inlets_junctions_sql = """UPDATE user_swmm_inlets_junctions + SET geom = ?, + sd_type = ?, + external_inflow = ?, + junction_invert_elev = ?, + max_depth = ?, + init_depth = ?, + surcharge_depth = ?, + intype = ?, + swmm_length = ?, + swmm_width = ?, + swmm_height = ?, + swmm_coeff = ?, + swmm_feature = ?, + curbheight = ?, + swmm_clogging_factor = ?, + swmm_time_for_clogging = ?, + drboxarea = ? + WHERE name = ?;""" + + inlets_junctions_data = swmminp_dict.get('JUNCTIONS', []) + coordinates_data = swmminp_dict.get('COORDINATES', []) + coordinates_dict = {item[0]: item[1:] for item in coordinates_data} + inflows_data = swmminp_dict.get('INFLOWS', []) + external_inflows_inlet_junctions = [external_inflow_name[0] for external_inflow_name in inflows_data] + + if len(inlets_junctions_data) > 0: + added_inlets_junctions = 0 + updated_inlets_junctions = 0 + for inlet_junction in inlets_junctions_data: + """ + ;; Invert Max. Init. Surcharge Ponded + ;;Name Elev. Depth Depth Depth Area + ;;-------------- ---------- ---------- ---------- ---------- ---------- + I1-35-31-18 1399.43 15.00 0.00 0.00 0.00 + I1-35-32-54 1399.43 15.00 0.00 0.00 0.00 + """ + + # SWMM VARIABLES + name = inlet_junction[0] + junction_invert_elev = float(inlet_junction[1]) + max_depth = float(inlet_junction[2]) + init_depth = float(inlet_junction[3]) + surcharge_depth = float(inlet_junction[4]) + external_inflow = 1 if name in external_inflows_inlet_junctions else 0 + + # QGIS VARIABLES + x = coordinates_dict[name][0] + y = coordinates_dict[name][1] + grid_n = self.gutils.grid_on_point(x, y) + grid = -9999 if grid_n is None else grid_n + geom = "POINT({0} {1})".format(x, y) + geom = self.gutils.wkt_to_gpb(geom) + + # FLO-2D VARIABLES -> Updated later when other files are imported + sd_type = 'I' if name.lower().startswith("i") else 'J' + intype = 0 + swmm_length = 0 + swmm_width = 0 + swmm_height = 0 + swmm_coeff = 0 + swmm_feature = 0 + curbheight = 0 + swmm_clogging_factor = 0 + swmm_time_for_clogging = 0 + drboxarea = 0 + + if name in existing_inlets_junctions: + updated_inlets_junctions += 1 + self.gutils.execute(replace_user_swmm_inlets_junctions_sql, ( + geom, + sd_type, + external_inflow, + junction_invert_elev, + max_depth, + init_depth, + surcharge_depth, + intype, + swmm_length, + swmm_width, + swmm_height, + swmm_coeff, + swmm_feature, + curbheight, + swmm_clogging_factor, + swmm_time_for_clogging, + drboxarea, + name + ) + ) + + else: + added_inlets_junctions += 1 + self.gutils.execute(insert_inlets_junctions_sql, ( + grid, + name, + sd_type, + external_inflow, + junction_invert_elev, + max_depth, + init_depth, + surcharge_depth, + intype, + swmm_length, + swmm_width, + swmm_height, + swmm_coeff, + swmm_feature, + curbheight, + swmm_clogging_factor, + swmm_time_for_clogging, + drboxarea, + geom + ) + ) + + self.uc.log_info(f"JUNCTIONS: {added_inlets_junctions} added and {updated_inlets_junctions} updated from imported SWMM INP file") + + except Exception as e: + QApplication.setOverrideCursor(Qt.ArrowCursor) + msg = "ERROR 060319.1610: Creating Storm Drain Inlets/Junctions layer failed!\n\n" \ + "Please check your SWMM input data.\nAre the nodes coordinates inside the computational domain?\n" \ + f"{e}" + self.uc.show_error(msg, e) + self.uc.log_info(msg) + QApplication.restoreOverrideCursor() + + def import_swmminp_curves(self, swmminp_dict, delete_existing): + """ + Function to import swmm inp curves (pump, tidal, and other) + """ + try: + existing_curves = [] + if delete_existing: + self.gutils.clear_tables('swmm_pumps_curve_data') + self.gutils.clear_tables('swmm_tidal_curve') + self.gutils.clear_tables('swmm_tidal_curve_data') + self.gutils.clear_tables('swmm_other_curves') + else: + existing_pump_curves_qry = self.gutils.execute("SELECT DISTINCT pump_curve_name FROM swmm_pumps_curve_data;").fetchall() + existing_pump_curves = [pump_curve[0] for pump_curve in existing_pump_curves_qry] + existing_tidal_curves_qry = self.gutils.execute("SELECT DISTINCT tidal_curve_name FROM swmm_tidal_curve;").fetchall() + existing_tidal_curves = [tidal_curve[0] for tidal_curve in existing_tidal_curves_qry] + existing_other_curves_qry = self.gutils.execute("SELECT DISTINCT name FROM swmm_other_curves;").fetchall() + existing_other_curves = [other_curve[0] for other_curve in existing_other_curves_qry] + existing_curves = existing_pump_curves + existing_tidal_curves + existing_other_curves + + insert_pump_curves_sql = """INSERT INTO swmm_pumps_curve_data + ( pump_curve_name, + pump_curve_type, + x_value, + y_value, + description + ) + VALUES (?, ?, ?, ?, ?);""" + + replace_pump_curves_sql = """UPDATE swmm_pumps_curve_data + SET pump_curve_type = ?, + x_value = ?, + y_value = ? + WHERE + pump_curve_name = ?;""" + + insert_tidal_curves_sql = """INSERT OR REPLACE INTO swmm_tidal_curve + ( tidal_curve_name, + tidal_curve_description + ) + VALUES (?, ?);""" + + insert_tidal_curves_data_sql = """INSERT INTO swmm_tidal_curve_data + ( tidal_curve_name, + hour, + stage + ) + VALUES (?, ?, ?);""" + + replace_tidal_curves_data_sql = """UPDATE swmm_tidal_curve_data + SET hour = ?, + stage = ? + WHERE + tidal_curve_name = ?;""" + + insert_other_curves_sql = """INSERT INTO swmm_other_curves + ( name, + type, + description, + x_value, + y_value + ) + VALUES (?, ?, ?, ?, ?);""" + + replace_other_curves_sql = """UPDATE swmm_other_curves + SET type = ?, + x_value = ?, + y_value = ? + WHERE + name = ?;""" + + curves_data = swmminp_dict.get('CURVES', []) + + # Initialize the dictionaries for each group + groups = { + 'Pump': {}, + 'Tidal': {}, + 'Other': {} + } + + current_key = None + current_group_type = None + extra_column = None + data_added = False # Flag to track if data was added to the current group + current_group_data = [] # Initialize before entering the loop + + if len(curves_data) > 0: + for curve in curves_data: + if len(curve) == 4: # New set (defining the type and the key) + # Only store the current group if data was added + if current_key is not None and data_added: + groups[current_group_type][current_key] = current_group_data + + # Now, handle the new group definition + current_key = curve[0] + if 'Pump' in curve[1]: # Pump group + current_group_type = 'Pump' + extra_column = curve[1] # Use the entire Pump name (e.g., 'Pump4') + elif 'Tidal' in curve[1]: # Tidal group + current_group_type = 'Tidal' + extra_column = curve[1] # Use the entire Tidal name (e.g., 'Tidal') + else: # Other group + current_group_type = 'Other' + extra_column = curve[1] # Use the entire name (e.g., 'Storage') + + # Start a new group + current_group_data = [[curve[0], curve[2], curve[3], extra_column]] # Reset the list for the new group + data_added = False # Reset the flag for the new group + else: + # Add subsequent rows to the current group data + if extra_column is not None: + # Append the suffix (Pump name, Tidal name, or Storage name) as a new column + curve.append(extra_column) + + current_group_data.append(curve) + data_added = True # Mark that data has been added + + # After the loop, ensure the last group is stored if it has data + if current_key is not None and data_added: + groups[current_group_type][current_key] = current_group_data + + added_pumps_curves = 0 + updated_pumps_curves = 0 + for key, values in groups['Pump'].items(): + if key in existing_curves: + updated_pumps_curves += 1 + for value in values: + self.gutils.execute(replace_pump_curves_sql, + (value[3][-1], value[1], value[2], value[0])) + else: + added_pumps_curves += 1 + for value in values: + self.gutils.execute(insert_pump_curves_sql, (value[0], value[3][-1], value[1], value[2], '')) + self.uc.log_info(f"CURVES (pumps): {added_pumps_curves} added and {updated_pumps_curves} updated from imported SWMM INP file") + + added_tidal_curves = 0 + updated_tidal_curves = 0 + for key, values in groups['Tidal'].items(): + if key in existing_curves: + updated_tidal_curves += 1 + for value in values: + self.gutils.execute(replace_tidal_curves_data_sql, (value[1], value[2], value[0])) + else: + added_tidal_curves += 1 + for value in values: + self.gutils.execute(insert_tidal_curves_sql, (value[0], '')) + self.gutils.execute(insert_tidal_curves_data_sql, (value[0], value[1], value[2])) + self.uc.log_info(f"CURVES (tidal): {added_tidal_curves} added and {updated_tidal_curves} updated from imported SWMM INP file") + + added_other_curves = 0 + updated_other_curves = 0 + for key, values in groups['Other'].items(): + if key in existing_curves: + updated_other_curves += 1 + for value in values: + self.gutils.execute(replace_other_curves_sql, (value[3], value[1], value[2], value[0])) + else: + added_other_curves += 1 + for value in values: + self.gutils.execute(insert_other_curves_sql, (value[0], value[3], '', value[1], value[2])) + self.uc.log_info(f"CURVES (other): {added_other_curves} added and {updated_other_curves} updated from imported SWMM INP file") + + except Exception as e: + QApplication.setOverrideCursor(Qt.ArrowCursor) + msg = "ERROR 241121.0547: Reading storm drain curve data from SWMM input data failed!\n" \ + "__________________________________________________\n" \ + f"{e}" + self.uc.show_error(msg, e) + self.uc.log_info(msg) + QApplication.restoreOverrideCursor() + + def import_swmminp_ts(self, swmminp_dict, delete_existing): + """ + Function to import swmm inp time series + """ + try: + existing_time_series = [] + if delete_existing: + self.gutils.clear_tables('swmm_time_series') + self.gutils.clear_tables('swmm_time_series_data') + else: + existing_time_series_qry = self.gutils.execute("SELECT DISTINCT time_series_name FROM swmm_time_series;").fetchall() + existing_time_series = [time_series[0] for time_series in existing_time_series_qry] + insert_times_from_file_sql = """INSERT INTO swmm_time_series + ( time_series_name, + time_series_description, + time_series_file, + time_series_data + ) + VALUES (?, ?, ?, ?);""" + + replace_times_from_file_sql = """UPDATE swmm_time_series + SET + time_series_file = ?, + time_series_data = ? + WHERE + time_series_name = ?;""" + + insert_times_from_data_sql = """INSERT INTO swmm_time_series_data + ( time_series_name, + date, + time, + value + ) + VALUES (?, ?, ?, ?);""" + + replace_times_from_data_sql = """UPDATE swmm_time_series_data + SET + date = ?, + time = ?, + value = ? + WHERE + time_series_name = ?;""" + + time_series_data_data = swmminp_dict.get('TIMESERIES', []) + if len(time_series_data_data) > 0: + updated_time_series = 0 + added_time_series = 0 + + time_series_names = self.gutils.execute("SELECT DISTINCT time_series_name FROM swmm_time_series;").fetchall() + for time_series_name in time_series_names: + if time_series_name[0] in existing_time_series: + updated_time_series += 1 + + for time_series in time_series_data_data: + if time_series[1] == "FILE": + name = time_series[0] + description = "" + file = time_series[2] + file2 = file.replace('"', "") + if name in existing_time_series: + self.gutils.execute(replace_times_from_file_sql, (file2.strip(), "False", name)) + else: + added_time_series += 1 + self.gutils.execute(insert_times_from_file_sql, (name, description, file2.strip(), "False")) + else: + # See if time series data reference is already in table: + row = self.gutils.execute( + "SELECT * FROM swmm_time_series WHERE time_series_name = ?;", (time_series[0],) + ).fetchone() + if not row: + name = time_series[0] + description = "" + file = "" + file2 = file.replace('"', "") + if name in existing_time_series: + self.gutils.execute(replace_times_from_file_sql, (file2.strip(), "True", name)) + else: + added_time_series += 1 + self.gutils.execute(insert_times_from_file_sql, (name, description, file2.strip(), "True")) + + name = time_series[0] + date = time_series[1] + tme = time_series[2] + value = float_or_zero(time_series[3]) + + if name in existing_time_series: + self.gutils.execute(replace_times_from_data_sql, (date, tme, value, name)) + else: + self.gutils.execute(insert_times_from_data_sql, (name, date, tme, value)) + + self.uc.log_info( + f"TIMESERIES: {added_time_series} added and {updated_time_series} updated from imported SWMM INP file") + + except Exception as e: + QApplication.setOverrideCursor(Qt.ArrowCursor) + msg = "ERROR 020219.0812: Reading storm drain time series from SWMM input data failed!\n" \ + "__________________________________________________\n" \ + f"{e}" + self.uc.show_error(msg, e) + self.uc.log_info(msg) + QApplication.restoreOverrideCursor() + + def import_swmminp_inflows(self, swmminp_dict, delete_existing): + """ + Function to import swmm inp inflows + """ + try: + existing_inflows = [] + if delete_existing: + self.gutils.clear_tables('swmm_inflows') + else: + existing_inflows_qry = self.gutils.execute("SELECT DISTINCT node_name FROM swmm_inflows;").fetchall() + existing_inflows = [inflow[0] for inflow in existing_inflows_qry] + + insert_inflows_sql = """INSERT INTO swmm_inflows + ( node_name, + constituent, + baseline, + pattern_name, + time_series_name, + scale_factor + ) + VALUES (?, ?, ?, ?, ?, ?);""" + + replace_inflows_sql = """UPDATE swmm_inflows + SET + constituent = ?, + baseline = ?, + pattern_name = ?, + time_series_name = ?, + scale_factor = ? + WHERE node_name = ?;""" + + inflows_data = swmminp_dict.get('INFLOWS', []) + + if len(inflows_data) > 0: + added_inflows = 0 + update_inflows = 0 + for inflow in inflows_data: + """ + ;; Param Units Scale Baseline Baseline + ;;Node Parameter Time Series Type Factor Factor Value Pattern + ;;-------------- ---------------- ---------------- -------- -------- -------- -------- -------- + J3-38-32-2 FLOW ts_test FLOW 1.0 3.5 12 pattern_test + """ + + name = inflow[0] + constituent = inflow[1] + time_series_name = inflow[2] + scale_factor = inflow[5] + if len(inflow) == 6: + baseline = "?" + pattern_name = "?" + else: + baseline = inflow[6] + pattern_name = inflow[7] + + if name in existing_inflows: + update_inflows += 1 + self.gutils.execute( + replace_inflows_sql, + (constituent, baseline, pattern_name, time_series_name, scale_factor, name), + ) + else: + added_inflows += 1 + self.gutils.execute( + insert_inflows_sql, + (name, constituent, baseline, pattern_name, time_series_name, scale_factor), + ) + + self.uc.log_info( + f"INFLOWS: {added_inflows} added and {update_inflows} updated from imported SWMM INP file") + + except Exception as e: + QApplication.setOverrideCursor(Qt.ArrowCursor) + msg = "ERROR 020219.0812: Reading storm drain inflows from SWMM input data failed!\n" \ + "__________________________________________________\n" \ + f"{e}" + self.uc.show_error(msg, e) + self.uc.log_info(msg) + QApplication.restoreOverrideCursor() + + def import_swmminp_patterns(self, swmminp_dict, delete_existing): + """ + Function to import swmm inp patterns + """ + try: + """ + [PATTERNS] + ;;Name Type Multipliers + ;;-------------- ---------- ----------- + ;description + pattern_test HOURLY 1.0 2 3 4 5 6 + pattern_test 7 8 9 10 11 12 + """ + existing_patterns = [] + if delete_existing: + self.gutils.clear_tables('swmm_inflow_patterns') + else: + existing_patterns_qry = self.gutils.execute("SELECT DISTINCT pattern_name FROM swmm_inflow_patterns;").fetchall() + existing_patterns = [pattern[0] for pattern in existing_patterns_qry] + + insert_patterns_sql = """INSERT INTO swmm_inflow_patterns + ( pattern_name, + pattern_description, + hour, + multiplier + ) + VALUES (?, ?, ?, ?);""" + + replace_patterns_sql = """UPDATE swmm_inflow_patterns + SET + hour = ?, + multiplier = ? + WHERE + pattern_name = ?;""" + + patterns_data = swmminp_dict.get('PATTERNS', []) + + if len(patterns_data) > 0: + # Adjust the patterns by adding them into their own list + merged_patterns = {} + updated_patterns = 0 + added_patterns = 0 + # Step 1: Merge the patterns while skipping the element at index 1 only in the first occurrence + for pattern in patterns_data: + name = pattern[0] + + if name not in merged_patterns: + # For the first occurrence, skip the element at index 1 + merged_patterns[name] = pattern[2:] + else: + # For subsequent occurrences, don't skip + merged_patterns[name].extend(pattern[1:]) + + # Step 2: Convert to individual lists with a counter, resetting after 24 + add_results = [] + added_patterns = 0 + update_results = [] + updated_patterns = 0 + + for name, data in merged_patterns.items(): + if name in existing_patterns: + updated_patterns += 1 + counter = 0 # Start the counter at 0 + for value in data: + update_results.append([name, counter, value]) + counter += 1 + if counter > 24: # Reset counter if greater than 24 + counter = 0 + else: + added_patterns += 1 + counter = 0 # Start the counter at 0 + for value in data: + add_results.append([name, counter, value]) + counter += 1 + if counter > 24: # Reset counter if greater than 24 + counter = 0 + + for r in add_results: + self.gutils.execute(insert_patterns_sql, (r[0], "", r[1], r[2])) + + for r in update_results: + self.gutils.execute(replace_patterns_sql, (r[1], r[2], r[0])) + + self.uc.log_info( + f"PATTERNS: {added_patterns} added and {updated_patterns} updated from imported SWMM INP file") + + except Exception as e: + QApplication.setOverrideCursor(Qt.ArrowCursor) + msg = "ERROR 020219.0812: Reading storm drain patterns from SWMM input data failed!\n" \ + "__________________________________________________\n" \ + f"{e}" + self.uc.show_error(msg, e) + self.uc.log_info(msg) + QApplication.restoreOverrideCursor() + def import_swmmflo(self): swmmflo_sql = [ @@ -1772,17 +3504,18 @@ def import_swmmoutf(self): if x[1] != '-9999': gids.append(x[1]) cells = self.grid_centroids(gids, buffers=True) + have_outside = False for row in data: gid = row[1] # Outfall outside the grid -> Add exactly over the Storm Drain Outfalls if gid == '-9999': + have_outside = True outfall_name = row[0] geom_qry = self.execute(f"SELECT geom FROM user_swmm_outlets WHERE name = '{outfall_name}'").fetchone() if geom_qry: geom = geom_qry[0] else: # When there is no SWMM.INP - self.uc.bar_warn(f"{outfall_name} coordinates not found!") - self.uc.log_info(f"{outfall_name} coordinates not found!") + self.uc.log_info(f"{outfall_name} outside the grid!") continue else: geom = cells[gid] @@ -1790,6 +3523,9 @@ def import_swmmoutf(self): self.batch_execute(swmmoutf_sql) + if have_outside: + self.uc.bar_warn(f"Some Outfalls are outside the grid! Check log messages for more information.") + def import_tolspatial(self): tolspatial_sql = ["""INSERT INTO tolspatial (geom, tol) VALUES""", 2] cells_sql = ["""INSERT INTO tolspatial_cells (area_fid, grid_fid) VALUES""", 2] diff --git a/flo2d/gui/dlg_components.py b/flo2d/gui/dlg_components.py index e0661bde..3c693d53 100644 --- a/flo2d/gui/dlg_components.py +++ b/flo2d/gui/dlg_components.py @@ -136,14 +136,11 @@ def populate_components_dialog(self): self.rain_chbox.setChecked(True) self.rain_chbox.setEnabled(True) - if os.path.isfile(last_dir + r"\SWMMFLO.DAT"): - if os.path.getsize(last_dir + r"\SWMMFLO.DAT") > 0: - if os.path.isfile(last_dir + r"\SWMMOUTF.DAT"): - if os.path.getsize(last_dir + r"\SWMMOUTF.DAT") > 0: - if os.path.isfile(last_dir + r"\SWMM.INP"): - if os.path.getsize(last_dir + r"\SWMM.INP") > 0: - self.storm_drain_chbox.setChecked(True) - self.storm_drain_chbox.setEnabled(True) + if os.path.isfile(last_dir + r"\SWMMFLO.DAT") or os.path.isfile(last_dir + r"\SWMMOUTF.DAT") or os.path.isfile(last_dir + r"\SWMM.INP"): + if os.path.getsize(last_dir + r"\SWMMFLO.DAT") > 0 or os.path.getsize( + last_dir + r"\SWMMOUTF.DAT") > 0 or os.path.getsize(last_dir + r"\SWMM.INP") > 0: + self.storm_drain_chbox.setEnabled(True) + self.storm_drain_chbox.setChecked(True) if os.path.isfile(last_dir + r"\TOLSPATIAL.DAT"): if os.path.getsize(last_dir + r"\TOLSPATIAL.DAT") > 0: diff --git a/flo2d/gui/dlg_storm_drain_attributes.py b/flo2d/gui/dlg_storm_drain_attributes.py index 86e31e4b..0e96987b 100644 --- a/flo2d/gui/dlg_storm_drain_attributes.py +++ b/flo2d/gui/dlg_storm_drain_attributes.py @@ -751,7 +751,8 @@ def populate_attributes(self, fid): self.flapgate.setCurrentIndex(0) else: self.flapgate.setCurrentIndex(1) - self.fixed_stage.setValue(float(attributes[4])) + fixed_stage = 0 if attributes[4] == "*" else float(attributes[4]) + self.fixed_stage.setValue(fixed_stage) self.tidal_curve.setCurrentText(attributes[5]) self.time_series.setCurrentText(attributes[6]) self.outfall_type.setCurrentText(str(attributes[7])) diff --git a/flo2d/gui/storm_drain_editor_widget.py b/flo2d/gui/storm_drain_editor_widget.py index eb581c53..3b5a65a4 100644 --- a/flo2d/gui/storm_drain_editor_widget.py +++ b/flo2d/gui/storm_drain_editor_widget.py @@ -3647,7 +3647,7 @@ def export_storm_drain_INP_file(self, hdf5_dir=None, hdf5_file=None, set_dat_dir swmm_inp_file.write( "\n;;-------------- ---------------- ---------------- -------- -------- -------- -------- --------" ) - line = "\n{0:16} {1:<16} {2:<16} {3:<7} {4:<8} {5:<8.2f} {6:<8.2f} {7:<10}" + line = "\n{0:16} {1:<16} {2:<16} {3:<7} {4:<8} {5:<8.2f} {6:<10} {7:<10}" for row in inflows_rows: lrow = [ row[0], @@ -3656,13 +3656,14 @@ def export_storm_drain_INP_file(self, hdf5_dir=None, hdf5_file=None, set_dat_dir row[1], "1.0", row[5], - row[2], - row[3] if row[3] is not None else "", + row[2] if row[2] != "?" else "", + row[3] if row[3] != "?" else "", ] swmm_inp_file.write(line.format(*lrow)) except Exception as e: QApplication.restoreOverrideCursor() self.uc.show_error("ERROR 230220.0751.1622: error while exporting [INFLOWS] to .INP file!", e) + self.uc.log_info(f"ERROR 230220.0751.1622: error while exporting [INFLOWS] to .INP file!\n{e}") return # INP CURVES ################################################### @@ -3831,60 +3832,50 @@ def export_storm_drain_INP_file(self, hdf5_dir=None, hdf5_file=None, set_dat_dir SD_inflow_patterns_sql = """SELECT pattern_name, pattern_description, hour, multiplier FROM swmm_inflow_patterns ORDER BY pattern_name;""" + # Description line0 = "\n;{0:16}" - line1 = "\n{0:16} {1:<10} {2:<10.2f} {3:<10.2f} {4:<10.2f} {5:<10.2f} {6:<10.2f} {6:<10.2f}" + # Actual values + line1 = "\n{0:16} {1:<10} {2:<10.2f} {3:<10.2f} {4:<10.2f} {5:<10.2f} {6:<10.2f} {7:<10.2f}" pattern_rows = self.gutils.execute(SD_inflow_patterns_sql).fetchall() if not pattern_rows: pass else: - i = 1 - for row in pattern_rows: - # First line: - if i == 1: # Beginning of first line: - lrow0 = [row[1]] - swmm_inp_file.write(line0.format(*lrow0)) - lrow1 = [row[0], "HOURLY", row[3]] - i += 1 - elif i < 7: # Rest of first line: - lrow1.append(row[3]) - i += 1 - elif i == 7: - swmm_inp_file.write(line1.format(*lrow1)) - lrow1 = [row[0], " ", row[3]] - i += 1 - - # Second line - elif i > 7 and i < 13: - lrow1.append(row[3]) - i += 1 - elif i == 13: - swmm_inp_file.write(line1.format(*lrow1)) - lrow1 = [row[0], " ", row[3]] - i += 1 + current_pattern = None + row_buffer = [] - # Third line: - elif i > 13 and i < 19: - lrow1.append(row[3]) - i += 1 - elif i == 19: - swmm_inp_file.write(line1.format(*lrow1)) - lrow1 = [row[0], " ", row[3]] - i += 1 - - # Fourth line: - elif i > 19 and i < 24: - lrow1.append(row[3]) - i += 1 - elif i == 24: - swmm_inp_file.write(line1.format(*lrow1)) - lrow1 = [row[0], " ", row[3]] - i = 1 - - swmm_inp_file.write("\n") + for row in pattern_rows: + pattern_name = row[0] + multiplier = row[3] + + # Start a new pattern block + if pattern_name != current_pattern: + # if row_buffer: # Write the previous pattern's buffered rows + # row_buffer = [] + # swmm_inp_file.write(line1.format(*row_buffer)) + # swmm_inp_file.write("\n") + + # Start the new pattern with a description + swmm_inp_file.write(line0.format(row[1])) # Write description + current_pattern = pattern_name + row_buffer = [pattern_name, "HOURLY"] # Reset buffer with pattern name and "HOURLY" + + # Add the multiplier to the current row buffer + row_buffer.append(multiplier) + + # Once buffer has 8 elements (1 pattern name, 1 HOURLY, 6 multipliers), write them + if len(row_buffer) == 8: + swmm_inp_file.write(line1.format(*row_buffer)) + row_buffer = [pattern_name, ""] # Reset buffer for continuation line + + # Write any remaining data for the last pattern + if len(row_buffer) > 2: # Ensure there are still multipliers left to write + swmm_inp_file.write(line1.format(*row_buffer)) + swmm_inp_file.write("\n") except Exception as e: QApplication.restoreOverrideCursor() self.uc.show_error("ERROR 240220.0737: error while exporting [PATTERNS] to .INP file!", e) + self.uc.log_info(f"ERROR 240220.0737: error while exporting [PATTERNS] to .INP file!\n{e}") return # INP REPORT ################################################## diff --git a/flo2d/metadata.txt b/flo2d/metadata.txt index 5f714796..d46e8362 100644 --- a/flo2d/metadata.txt +++ b/flo2d/metadata.txt @@ -19,6 +19,7 @@ changelog= - Boundary Condition Editor Improved the Delete Schema Data button - Storm Drain + Improved the code for importing the SWMM.INP and other minor bug fixes Inlet type minimum value on dialog allow 0 Weir coefficient min/max limits removed on the dialog Inlet type set to 0 when importing from INP diff --git a/test/CompletedProjects/Coastal/SWMMOUTF.DAT b/test/CompletedProjects/Coastal/SWMMOUTF.DAT index 6ee17d92..d872d97e 100644 --- a/test/CompletedProjects/Coastal/SWMMOUTF.DAT +++ b/test/CompletedProjects/Coastal/SWMMOUTF.DAT @@ -1,10 +1,10 @@ -OUT5 54553 1 -OUT6 54564 1 -OUT7 54860 1 -OUT8 83232 1 -OUT9 83538 1 +OUT4 1614 1 OUT40 216735 1 OUT41 214607 1 OUT42 194240 1 OUT43 195456 1 -OUT4 1614 1 +OUT5 54553 1 +OUT6 54564 1 +OUT7 54860 1 +OUT8 83232 1 +OUT9 83538 1 \ No newline at end of file diff --git a/test/CompletedProjects/Coastal/swmm.inp b/test/CompletedProjects/Coastal/swmm.inp new file mode 100644 index 00000000..099f382b --- /dev/null +++ b/test/CompletedProjects/Coastal/swmm.inp @@ -0,0 +1,1519 @@ +[TITLE] +INP file created by FLO-2D + +[OPTIONS] +FLOW_UNITS CFS +INFILTRATION HORTON +FLOW_ROUTING DYNWAVE +START_DATE 12/15/2021 +START_TIME 00:00:00 +REPORT_START_DATE 12/15/2021 +REPORT_START_TIME 00:00:00 +END_DATE 12/16/2021 +END_TIME 00:00:00 +SWEEP_START 01/01 +SWEEP_END 12/31 +DRY_DAYS 0 +REPORT_STEP 00:06:00 +WET_STEP 00:05:00 +DRY_STEP 01:00:00 +ROUTING_STEP 00:01:00 +ALLOW_PONDING NO +INERTIAL_DAMPING PARTIAL +VARIABLE_STEP 0.75 +LENGTHENING_STEP 0 +MIN_SURFAREA 0 +NORMAL_FLOW_LIMITED BOTH +SKIP_STEADY_STATE NO +FORCE_MAIN_EQUATION H-W +LINK_OFFSETS DEPTH +MIN_SLOPE 0.01 + +[JUNCTIONS] +;; Invert Max. Init. Surcharge Ponded +;;Name Elev. Depth Depth Depth Area +;;-------------- ---------- ---------- ---------- ---------- ---------- +I2-62 5.91 3.71 0.00 0.00 0.00 +I2-63 5.87 2.92 0.00 0.00 0.00 +I2-64 5.81 2.43 0.00 0.00 0.00 +IM5-43 5.74 3.95 0.00 0.00 0.00 +I2-65 5.12 4.57 0.00 0.00 0.00 +I2-66 5.90 3.03 0.00 0.00 0.00 +I2-814 5.35 3.56 0.00 0.00 0.00 +I2-67 4.86 3.85 0.00 0.00 0.00 +IM5-44 4.75 6.30 0.00 0.00 0.00 +I2-68 4.49 5.71 0.00 0.00 0.00 +I2-69 4.72 5.29 0.00 0.00 0.00 +IM5-45 4.36 5.17 0.00 0.00 0.00 +I2-70 3.58 5.84 0.00 0.00 0.00 +I3-14 5.58 4.26 0.00 0.00 0.00 +I2-71 3.38 4.92 0.00 0.00 0.00 +I3-15 4.21 4.29 0.00 0.00 0.00 +I2-72 3.68 4.29 0.00 0.00 0.00 +I3-16 3.31 5.64 0.00 0.00 0.00 +I2-73 3.22 5.97 0.00 0.00 0.00 +I2-74 3.45 5.26 0.00 0.00 0.00 +I2-75 3.13 5.41 0.00 0.00 0.00 +I2-76 3.39 5.08 0.00 0.00 0.00 +I2-77 3.05 5.86 0.00 0.00 0.00 +I2-78 2.93 5.89 0.00 0.00 0.00 +I2-79 3.19 5.22 0.00 0.00 0.00 +I2-80 2.80 5.42 0.00 0.00 0.00 +I2-81 3.14 5.13 0.00 0.00 0.00 +I2-82 2.70 5.69 0.00 0.00 0.00 +I2-83 2.96 5.24 0.00 0.00 0.00 +I2-84 2.80 4.90 0.00 0.00 0.00 +I2-85 2.54 5.28 0.00 0.00 0.00 +I2-86 2.34 6.00 0.00 0.00 0.00 +IM5-46 2.30 5.48 0.00 0.00 0.00 +I2-87 2.43 5.31 0.00 0.00 0.00 +I2-88 4.35 3.73 0.00 0.00 0.00 +I2-89 2.79 5.36 0.00 0.00 0.00 +I2-90 2.59 5.40 0.00 0.00 0.00 +I2-91 2.95 4.47 0.00 0.00 0.00 +I2-92 3.45 3.44 0.00 0.00 0.00 +I2-93 3.22 4.82 0.00 0.00 0.00 +I2-94 3.41 4.54 0.00 0.00 0.00 +I2-96 6.02 3.49 0.00 0.00 0.00 +I2-97 5.67 3.76 0.00 0.00 0.00 +I3-17 5.47 2.70 0.00 0.00 0.00 +IM5-50 5.10 4.75 0.00 0.00 0.00 +I2-100 5.78 4.27 0.00 0.00 0.00 +IM5-51 4.83 4.43 0.00 0.00 0.00 +I2-101 5.70 3.93 0.00 0.00 0.00 +I2-102 6.10 3.63 0.00 0.00 0.00 +I2-815 5.72 3.79 0.00 0.00 0.00 +I2-103 6.92 2.47 0.00 0.00 0.00 +IM5-52 4.53 4.77 0.00 0.00 0.00 +I2-104 4.24 5.39 0.00 0.00 0.00 +I2-105 3.97 5.69 0.00 0.00 0.00 +I2-106 7.09 2.85 0.00 0.00 0.00 +IM5-460 3.61 5.92 0.00 0.00 0.00 +I2-108 5.98 3.46 0.00 0.00 0.00 +I2-107 6.54 2.55 0.00 0.00 0.00 +IM5-150 3.22 6.38 0.00 0.00 0.00 +IM5-53 2.96 5.94 0.00 0.00 0.00 +I2-109 6.02 3.18 0.00 0.00 0.00 +I2-110 6.96 2.42 0.00 0.00 0.00 +IM5-54 6.50 2.48 0.00 0.00 0.00 +IM5-55 6.26 2.27 0.00 0.00 0.00 +I2-111 6.50 1.89 0.00 0.00 0.00 +IM5-56 3.52 6.33 0.00 0.00 0.00 +IM5-57 2.69 6.42 0.00 0.00 0.00 +IM5-58 2.53 6.40 0.00 0.00 0.00 +I2-112 5.50 3.41 0.00 0.00 0.00 +IM5-59 2.10 6.71 0.00 0.00 0.00 +I3-18 3.50 4.17 0.00 0.00 0.00 +IM5-61 3.61 4.18 0.00 0.00 0.00 +IM5-60 1.77 6.47 0.00 0.00 0.00 +I2-114 4.15 3.96 0.00 0.00 0.00 +I2-113 5.90 2.48 0.00 0.00 0.00 +I3-852 3.24 4.63 0.00 0.00 0.00 +IM5-63 1.44 7.61 0.00 0.00 0.00 +I2-118 6.02 3.07 0.00 0.00 0.00 +I3-19 1.12 1.75 0.00 0.00 0.00 +I3-20 2.79 1.42 0.00 0.00 0.00 +IM5-66 1.33 7.68 0.00 0.00 0.00 +I2-117 6.08 2.09 0.00 0.00 0.00 +I2-116 4.88 3.49 0.00 0.00 0.00 +IM5-64 3.75 4.34 0.00 0.00 0.00 +I2-115 3.31 5.01 0.00 0.00 0.00 +I3-90 3.02 5.43 0.00 0.00 0.00 +IM5-65 3.10 5.97 0.00 0.00 0.00 +I4-1 5.24 0.00 0.00 0.00 0.00 +I2-120 5.95 3.54 0.00 0.00 0.00 +I2-122 5.64 3.67 0.00 0.00 0.00 +IM5-69 5.43 3.62 0.00 0.00 0.00 +IM5-70 4.95 3.75 0.00 0.00 0.00 +I2-121 4.96 3.71 0.00 0.00 0.00 +I2-123 5.21 2.73 0.00 0.00 0.00 +I3-849 4.24 5.30 0.00 0.00 0.00 +I2-124 6.45 2.69 0.00 0.00 0.00 +IM5-67 6.27 3.88 0.00 0.00 0.00 +I2-119 5.93 3.02 0.00 0.00 0.00 +IM5-68 3.64 4.40 0.00 0.00 0.00 +I3-21 3.13 3.67 0.00 0.00 0.00 +I2-125 7.40 1.81 0.00 0.00 0.00 +IM5-151 7.11 1.73 0.00 0.00 0.00 +IM5-72 6.93 2.18 0.00 0.00 0.00 +I2-127 6.87 2.50 0.00 0.00 0.00 +I2-126 6.67 2.66 0.00 0.00 0.00 +I2-128 6.27 2.67 0.00 0.00 0.00 +IM5-73 6.09 1.25 0.00 0.00 0.00 +I3-87 3.88 3.31 0.00 0.00 0.00 +I3-22 5.56 2.00 0.00 0.00 0.00 +I4-12 11.93 0.00 0.00 0.00 0.00 +I3-93 7.53 4.17 0.00 0.00 0.00 +I4-13 11.66 0.00 0.00 0.00 0.00 +I3-99 6.68 4.59 0.00 0.00 0.00 +I4-16 11.54 0.00 0.00 0.00 0.00 +I3-100 6.58 4.78 0.00 0.00 0.00 +I4-17 11.32 0.00 0.00 0.00 0.00 +I3-101 7.00 4.16 0.00 0.00 0.00 +I4-18 11.06 1.08 0.00 0.00 0.00 +I3-102 6.30 4.80 0.00 0.00 0.00 +I4-19 11.27 0.00 0.00 0.00 0.00 +I3-94 7.16 4.44 0.00 0.00 0.00 +I4-14 11.27 0.87 0.00 0.00 0.00 +I3-95 7.00 4.57 0.00 0.00 0.00 +I3-96 6.26 5.51 0.00 0.00 0.00 +I4-15 11.35 0.00 0.00 0.00 0.00 +I3-97 7.87 3.73 0.00 0.00 0.00 +I3-98 5.98 5.36 0.00 0.00 0.00 +I3-109 6.73 5.01 0.00 0.00 0.00 +I3-104 6.90 4.65 0.00 0.00 0.00 +I3-105 7.08 4.57 0.00 0.00 0.00 +I3-106 7.27 4.51 0.00 0.00 0.00 +I4-21 11.42 0.00 0.00 0.00 0.00 +I4-22 11.31 0.00 0.00 0.00 0.00 +I3-107 7.13 4.20 0.00 0.00 0.00 +I4-23 11.54 0.00 0.00 0.00 0.00 +I3-108 7.00 4.20 0.00 0.00 0.00 +I3-103 5.90 5.34 0.00 0.00 0.00 +I4-20 11.24 0.00 0.00 0.00 0.00 +I4-26 10.61 0.00 0.00 0.00 0.00 +I3-120 5.66 5.25 0.00 0.00 0.00 +I3-119 8.64 2.46 0.00 0.00 0.00 +I3-118 7.20 4.07 0.00 0.00 0.00 +I4-25 11.31 0.00 0.00 0.00 0.00 +I3-117 5.62 5.44 0.00 0.00 0.00 +I3-116 5.81 5.46 0.00 0.00 0.00 +I3-115 6.08 5.33 0.00 0.00 0.00 +I3-114 6.78 4.59 0.00 0.00 0.00 +I3-113 7.17 3.95 0.00 0.00 0.00 +I3-112 7.76 3.32 0.00 0.00 0.00 +I3-111 8.04 3.05 0.00 0.00 0.00 +I4-24 10.74 0.00 0.00 0.00 0.00 +I3-110 8.37 2.79 0.00 0.00 0.00 +I3-126 5.34 6.11 0.00 0.00 0.00 +I4-30 11.03 0.00 0.00 0.00 0.00 +I3-125 5.30 5.88 0.00 0.00 0.00 +I4-29 11.13 0.00 0.00 0.00 0.00 +I4-28 11.20 0.00 0.00 0.00 0.00 +I3-124 8.50 2.78 0.00 0.00 0.00 +I3-123 5.30 5.94 0.00 0.00 0.00 +I3-122 5.25 6.13 0.00 0.00 0.00 +I3-121 6.06 5.59 0.00 0.00 0.00 +I4-27 11.02 0.00 0.00 0.00 0.00 +I4-33 11.09 0.00 0.00 0.00 0.00 +I3-135 5.02 6.12 0.00 0.00 0.00 +I3-134 5.02 6.36 0.00 0.00 0.00 +I3-133 5.50 5.68 0.00 0.00 0.00 +I3-132 5.70 5.60 0.00 0.00 0.00 +I3-131 5.90 5.41 0.00 0.00 0.00 +I3-130 6.10 5.22 0.00 0.00 0.00 +I4-32 11.34 0.00 0.00 0.00 0.00 +I3-129 8.43 2.77 0.00 0.00 0.00 +I3-128 4.97 6.10 0.00 0.00 0.00 +I3-127 4.97 6.22 0.00 0.00 0.00 +I4-31 10.84 0.00 0.00 0.00 0.00 +I4-34 11.14 0.00 0.00 0.00 0.00 +I3-136 4.69 6.55 0.00 0.00 0.00 +I4-36 11.29 0.00 0.00 0.00 0.00 +I3-138 4.64 6.48 0.00 0.00 0.00 +I3-137 4.59 6.18 0.00 0.00 0.00 +I4-35 11.17 0.00 0.00 0.00 0.00 +I4-37 11.55 0.00 0.00 0.00 0.00 +I3-139 4.55 6.40 0.00 0.00 0.00 +I4-38 11.10 0.00 0.00 0.00 0.00 +I3-140 4.36 7.00 0.00 0.00 0.00 +I3-143 4.32 7.01 0.00 0.00 0.00 +I3-144 4.32 6.50 0.00 0.00 0.00 +I3-141 4.75 6.89 0.00 0.00 0.00 +I3-142 5.11 6.46 0.00 0.00 0.00 +I3-147 5.44 5.94 0.00 0.00 0.00 +I3-148 5.87 5.53 0.00 0.00 0.00 +I3-145 6.23 5.21 0.00 0.00 0.00 +I3-146 6.59 4.83 0.00 0.00 0.00 +I3-150 6.95 4.30 0.00 0.00 0.00 +I3-151 7.30 3.96 0.00 0.00 0.00 +I3-149 7.75 3.41 0.00 0.00 0.00 +I4-39 11.09 0.00 0.00 0.00 0.00 +I2-319 7.88 3.17 0.00 0.00 0.00 +I2-320 8.81 2.41 0.00 0.00 0.00 +I3-152 3.97 7.45 0.00 0.00 0.00 +I3-153 3.97 6.64 0.00 0.00 0.00 +IM5-153 3.72 8.37 0.00 0.00 0.00 +J1 3.67 7.51 0.00 0.00 0.00 +IM5-152 7.29 4.22 0.00 0.00 0.00 +I2-318 7.03 4.74 0.00 0.00 0.00 +IM5-154 6.85 3.45 0.00 0.00 0.00 +I3-196 5.40 5.50 0.00 0.00 0.00 +I3-197 5.25 6.11 0.00 0.00 0.00 +I3-198 5.46 5.82 0.00 0.00 0.00 +I3-199 5.32 6.05 0.00 0.00 0.00 +I3-194 5.69 5.55 0.00 0.00 0.00 +I3-195 5.76 5.44 0.00 0.00 0.00 +I2-321 8.50 2.59 0.00 0.00 0.00 +I2-322 8.65 2.00 0.00 0.00 0.00 +I4-67 10.72 0.00 0.00 0.00 0.00 +I3-188 6.05 4.81 0.00 0.00 0.00 +I4-68 11.15 0.00 0.00 0.00 0.00 +I3-189 6.10 4.76 0.00 0.00 0.00 +I4-69 11.11 0.00 0.00 0.00 0.00 +I3-190 6.02 5.22 0.00 0.00 0.00 +I3-191 5.96 5.19 0.00 0.00 0.00 +I3-192 7.26 4.21 0.00 0.00 0.00 +I4-70 11.15 0.00 0.00 0.00 0.00 +I4-59 10.92 0.00 0.00 0.00 0.00 +I3-180 6.40 4.61 0.00 0.00 0.00 +I4-63 10.92 0.00 0.00 0.00 0.00 +I3-184 6.33 4.54 0.00 0.00 0.00 +I4-64 10.97 0.00 0.00 0.00 0.00 +I3-185 6.38 4.55 0.00 0.00 0.00 +I4-65 10.84 0.00 0.00 0.00 0.00 +I3-186 6.45 4.36 0.00 0.00 0.00 +I4-66 11.08 0.00 0.00 0.00 0.00 +I3-187 6.73 4.46 0.00 0.00 0.00 +I4-60 11.01 0.00 0.00 0.00 0.00 +I3-181 6.79 4.56 0.00 0.00 0.00 +I3-182 6.76 4.37 0.00 0.00 0.00 +I4-61 11.15 0.00 0.00 0.00 0.00 +I3-183 6.70 4.48 0.00 0.00 0.00 +I4-62 11.23 0.00 0.00 0.00 0.00 +I4-58 11.11 0.00 0.00 0.00 0.00 +I3-179 7.07 4.26 0.00 0.00 0.00 +I3-175 7.06 4.00 0.00 0.00 0.00 +I3-176 7.16 3.95 0.00 0.00 0.00 +I4-55 10.97 0.00 0.00 0.00 0.00 +I4-56 11.05 0.00 0.00 0.00 0.00 +I3-177 7.13 3.66 0.00 0.00 0.00 +I3-178 7.13 4.36 0.00 0.00 0.00 +I4-57 11.39 0.00 0.00 0.00 0.00 +I3-172 7.40 3.75 0.00 0.00 0.00 +I4-52 10.90 0.00 0.00 0.00 0.00 +I3-166 7.60 3.16 0.00 0.00 0.00 +I3-167 8.78 2.90 0.00 0.00 0.00 +I3-168 8.88 2.61 0.00 0.00 0.00 +I3-169 8.95 2.59 0.00 0.00 0.00 +I3-170 8.70 2.09 0.00 0.00 0.00 +I3-171 7.44 3.74 0.00 0.00 0.00 +I4-53 11.21 0.00 0.00 0.00 0.00 +I3-173 9.16 2.33 0.00 0.00 0.00 +I3-174 9.28 1.93 0.00 0.00 0.00 +I4-54 10.85 0.00 0.00 0.00 0.00 +I4-48 11.31 0.00 0.00 0.00 0.00 +I4-49 11.36 0.00 0.00 0.00 0.00 +I3-163 9.10 2.39 0.00 0.00 0.00 +I3-164 8.71 2.76 0.00 0.00 0.00 +I3-165 7.71 3.88 0.00 0.00 0.00 +I4-46 11.48 0.07 0.00 0.00 0.00 +I4-47 11.27 0.00 0.00 0.00 0.00 +I3-162 7.76 3.80 0.00 0.00 0.00 +I3-159 7.78 3.91 0.00 0.00 0.00 +I3-160 8.58 3.00 0.00 0.00 0.00 +I4-44 11.13 0.00 0.00 0.00 0.00 +I4-45 11.00 0.00 0.00 0.00 0.00 +I3-161 7.83 3.58 0.00 0.00 0.00 +I4-40 10.84 0.30 0.00 0.00 0.00 +I4-41 11.06 0.00 0.00 0.00 0.00 +I3-155 8.98 2.49 0.00 0.00 0.00 +I4-42 11.32 0.00 0.00 0.00 0.00 +I4-43 11.30 0.41 0.00 0.00 0.00 +I3-156 8.86 2.44 0.00 0.00 0.00 +I3-157 8.56 2.55 0.00 0.00 0.00 +I3-158 8.23 2.90 0.00 0.00 0.00 +I3-154 8.86 2.28 0.00 0.00 0.00 +I3-193 5.62 5.57 0.00 0.00 0.00 +I4-50 11.04 0.61 0.00 0.00 0.00 +IM5-49 1.30 3.42 0.00 0.00 0.00 + +[OUTFALLS] +;; Invert Outfall Stage/Table Tide +;;Name Elev. Type Time Series Gate +;;-------------- ---------- ------------ ---------------- ---- +OUT5 1.61 FREE NO +OUT6 1.03 FREE NO +OUT7 0.30 FREE NO +OUT8 3.02 FREE NO +OUT9 3.55 FREE NO +OUT40 3.41 FREE NO +OUT41 4.39 FREE NO +OUT42 3.41 FREE NO +OUT43 3.41 FREE NO +OUT4 -0.60 FREE NO + +[CONDUITS] +;; Inlet Outlet Manning Inlet Outlet Init. Max. +;;Name Node Node Length N Offset Offset Flow Flow +;;-------------- ---------------- ---------------- ---------- ---------- ---------- ---------- ---------- ---------- +C127 I2-87 IM5-46 95.49 0.012 0.00 0.00 0.00 0.00 +C128 I2-88 I2-87 113.23 0.012 0.00 0.00 0.00 0.00 +C129 I2-90 I2-87 117.47 0.012 0.00 0.00 0.00 0.00 +C130 I2-89 I2-90 114.13 0.012 0.00 0.00 0.00 0.00 +C131 I2-91 I2-90 223.29 0.012 0.00 0.00 0.00 0.00 +C132 I2-92 I2-91 102.11 0.012 0.00 0.00 0.00 0.00 +C133 I2-93 I2-91 162.13 0.012 0.00 0.00 0.00 0.00 +C134 I2-94 I2-93 230.02 0.012 0.00 0.00 0.00 0.00 +C135 I2-86 IM5-46 75.83 0.012 0.00 0.00 0.00 0.00 +C136 I2-85 I2-86 404.19 0.012 0.00 0.00 0.00 0.00 +C137 I2-84 I2-85 120.12 0.012 0.00 0.00 0.00 0.00 +C138 I2-82 I2-85 310.85 0.012 0.00 0.00 0.00 0.00 +C139 I2-83 I2-82 122.22 0.012 0.00 0.00 0.00 0.00 +C140 I2-80 I2-82 180.68 0.012 0.00 0.00 0.00 0.00 +C141 I2-81 I2-80 121.99 0.012 0.00 0.00 0.00 0.00 +C142 I2-78 I2-80 262.02 0.012 0.00 0.00 0.00 0.00 +C143 I2-79 I2-78 122.52 0.012 0.00 0.00 0.00 0.00 +C144 I2-77 I2-78 230.78 0.012 0.00 0.00 0.00 0.00 +C145 I2-75 I2-77 161.34 0.012 0.00 0.00 0.00 0.00 +C146 I2-76 I2-75 122.37 0.012 0.00 0.00 0.00 0.00 +C147 I2-73 I2-75 177.64 0.012 0.00 0.00 0.00 0.00 +C148 I2-74 I2-73 132.78 0.012 0.00 0.00 0.00 0.00 +C149 I3-16 I2-73 186.57 0.012 0.00 0.00 0.00 0.00 +C150 I2-71 I3-16 130.48 0.012 0.00 0.00 0.00 0.00 +C151 I2-72 I2-71 133.25 0.012 0.00 0.00 0.00 0.00 +C152 I3-15 I2-72 20.00 0.012 0.00 0.00 0.00 0.00 +C153 I2-70 I2-71 390.91 0.012 0.00 0.00 0.00 0.00 +C154 I3-14 I2-70 20.00 0.012 0.00 0.00 0.00 0.00 +C155 IM5-45 I2-70 93.49 0.012 0.00 0.00 0.00 0.00 +C156 I2-68 IM5-45 185.00 0.012 0.00 0.00 0.00 0.00 +C157 I2-69 I2-68 121.16 0.012 0.00 0.00 0.00 0.00 +C158 IM5-44 I2-68 177.64 0.012 0.00 0.00 0.00 0.00 +C159 I2-814 I2-67 20.00 0.012 0.00 0.00 0.00 0.00 +C160 I2-67 IM5-44 148.71 0.012 0.00 0.00 0.00 0.00 +C161 I2-65 IM5-44 250.98 0.012 0.00 0.00 0.00 0.00 +C162 I2-66 I2-65 121.00 0.012 0.00 0.00 0.00 0.00 +C163 IM5-43 I2-65 79.48 0.012 0.00 0.00 0.00 0.00 +C164 I2-63 I2-64 20.00 0.012 0.00 0.00 0.00 0.00 +C165 I2-64 IM5-43 37.52 0.012 0.00 0.00 0.00 0.00 +C166 I2-62 IM5-43 78.53 0.012 0.00 0.00 0.00 0.00 +C167 I2-96 I2-97 117.42 0.012 0.00 0.00 0.00 0.00 +C168 I2-97 I3-17 25.80 0.012 0.00 0.00 0.00 0.00 +C169 I3-17 IM5-50 258.47 0.012 0.00 0.00 0.00 0.00 +C170 I2-100 IM5-50 20.00 0.012 0.00 0.00 0.00 0.00 +C171 IM5-50 IM5-51 168.74 0.012 0.00 0.00 0.00 0.00 +C172 I2-102 I2-101 146.80 0.012 0.00 0.00 0.00 0.00 +C173 I2-101 IM5-51 20.00 0.012 0.00 0.00 0.00 0.00 +C174 IM5-51 IM5-52 209.38 0.012 0.00 0.00 0.00 0.00 +C175 I2-103 I2-815 111.35 0.012 0.00 0.00 0.00 0.00 +C176 I2-815 IM5-52 20.00 0.012 0.00 0.00 0.00 0.00 +C177 IM5-52 I2-104 198.64 0.012 0.00 0.00 0.00 0.00 +C178 I2-104 I2-105 178.12 0.012 0.00 0.00 0.00 0.00 +C179 I2-105 IM5-460 262.01 0.012 0.00 0.00 0.00 0.00 +C180 I2-106 I2-107 271.90 0.012 0.00 0.00 0.00 0.00 +C181 I2-107 I2-108 111.08 0.012 0.00 0.00 0.00 0.00 +C182 I2-108 IM5-460 20.00 0.012 0.00 0.00 0.00 0.00 +C183 IM5-460 IM5-150 292.00 0.012 0.00 0.00 0.00 0.00 +C184 IM5-150 IM5-53 171.28 0.012 0.00 0.00 0.00 0.00 +C185 I2-109 IM5-53 20.00 0.012 0.00 0.00 0.00 0.00 +C186 IM5-53 IM5-57 168.98 0.012 0.00 0.00 0.00 0.00 +C187 I2-110 IM5-54 43.20 0.012 0.00 0.00 0.00 0.00 +C188 IM5-54 IM5-55 137.37 0.012 0.00 0.00 0.00 0.00 +C189 I2-111 IM5-55 20.00 0.012 0.00 0.00 0.00 0.00 +C190 IM5-55 IM5-56 73.19 0.012 0.00 0.00 0.00 0.00 +C191 IM5-56 IM5-57 47.08 0.012 0.00 0.00 0.00 0.00 +C192 IM5-57 IM5-58 67.80 0.012 0.00 0.00 0.00 0.00 +C193 I2-112 IM5-58 20.00 0.012 0.00 0.00 0.00 0.00 +C194 IM5-58 IM5-59 335.29 0.012 0.00 0.00 0.00 0.00 +C195 I3-18 IM5-59 20.00 0.012 0.00 0.00 0.00 0.00 +C196 I4-1 IM5-61 20.00 0.012 0.00 0.00 0.00 0.00 +C198 IM5-61 I3-852 379.41 0.012 0.00 0.00 0.00 0.00 +C199 I3-852 IM5-65 125.78 0.012 0.00 0.00 0.00 0.00 +C200 I2-118 IM5-65 20.00 0.012 0.00 0.00 0.00 0.00 +C201 IM5-65 I3-20 141.38 0.012 0.00 0.00 0.00 0.00 +C202 I3-20 OUT5 20.00 0.012 0.00 0.00 0.00 0.00 +C203 IM5-59 IM5-60 230.67 0.012 0.00 0.00 0.00 0.00 +C204 I2-113 I2-114 110.27 0.012 0.00 0.00 0.00 0.00 +C205 I2-114 IM5-60 20.00 0.012 0.00 0.00 0.00 0.00 +C206 IM5-60 IM5-63 235.50 0.012 0.00 0.00 0.00 0.00 +C207 IM5-63 IM5-66 34.64 0.012 0.00 0.00 0.00 0.00 +C208 IM5-66 I3-19 143.11 0.012 0.00 0.00 0.00 0.00 +C209 I3-19 OUT6 20.00 0.012 0.00 0.00 0.00 0.00 +C210 I2-117 I2-116 121.00 0.012 0.00 0.00 0.00 0.00 +C211 I2-116 IM5-64 20.00 0.012 0.00 0.00 0.00 0.00 +C212 IM5-64 I2-115 171.44 0.012 0.00 0.00 0.00 0.00 +C213 I2-115 I3-90 20.00 0.012 0.00 0.00 0.00 0.00 +C214 I3-90 OUT7 81.28 0.012 0.00 0.00 0.00 0.00 +C215 I2-120 I2-122 103.28 0.012 0.00 0.00 0.00 0.00 +C216 I2-122 IM5-69 60.18 0.012 0.00 0.00 0.00 0.00 +C217 IM5-69 I2-121 173.88 0.012 0.00 0.00 0.00 0.00 +C218 I2-123 I2-121 120.92 0.012 0.00 0.00 0.00 0.00 +C219 I2-121 IM5-70 20.00 0.012 0.00 0.00 0.00 0.00 +C220 IM5-70 I3-849 350.70 0.012 0.00 0.00 0.00 0.00 +C221 I3-849 IM5-68 292.61 0.012 0.00 0.00 0.00 0.00 +C222 I2-119 IM5-68 20.00 0.012 0.00 0.00 0.00 0.00 +C223 IM5-67 I2-119 54.16 0.012 0.00 0.00 0.00 0.00 +C224 I2-124 IM5-67 51.25 0.012 0.00 0.00 0.00 0.00 +C225 IM5-68 I3-21 253.10 0.012 0.00 0.00 0.00 0.00 +C226 I3-21 OUT8 55.36 0.012 0.00 0.00 0.00 0.00 +C227 I2-125 IM5-151 37.41 0.012 0.00 0.00 0.00 0.00 +C228 IM5-151 IM5-72 116.03 0.012 0.00 0.00 0.00 0.00 +C229 IM5-72 I2-127 20.00 0.012 0.00 0.00 0.00 0.00 +C230 I2-127 I2-126 110.76 0.012 0.00 0.00 0.00 0.00 +C231 I2-126 I2-128 151.26 0.012 0.00 0.00 0.00 0.00 +C232 I2-128 IM5-73 20.00 0.012 0.00 0.00 0.00 0.00 +C233 IM5-73 I3-87 244.08 0.012 0.00 0.00 0.00 0.00 +C234 I3-87 OUT9 36.30 0.012 0.00 0.00 0.00 0.00 +C235 I3-22 I2-123 172.62 0.012 0.00 0.00 0.00 0.00 +C595 I4-13 I3-99 20.00 0.012 0.00 0.00 0.00 0.00 +C587 I3-99 I3-100 49.66 0.012 0.00 0.00 0.00 0.00 +C588 I4-16 I3-100 20.00 0.012 0.00 0.00 0.00 0.00 +C589 I4-12 I3-93 20.00 0.012 0.00 0.00 0.00 0.00 +C590 I3-93 I3-101 49.04 0.012 0.00 0.00 0.00 0.00 +C591 I4-17 I3-101 20.00 0.012 0.00 0.00 0.00 0.00 +C592 I3-101 I3-100 44.51 0.012 0.00 0.00 0.00 0.00 +C593 I3-100 I3-102 283.58 0.012 0.00 0.00 0.00 0.00 +C594 I4-18 I3-102 20.00 0.012 0.00 0.00 0.00 0.00 +C579 I3-102 I3-96 49.34 0.012 0.00 0.00 0.00 0.00 +C580 I4-15 I3-97 20.00 0.012 0.00 0.00 0.00 0.00 +C581 I3-97 I3-96 97.10 0.012 0.00 0.00 0.00 0.00 +C582 I4-19 I3-94 20.00 0.012 0.00 0.00 0.00 0.00 +C583 I3-94 I3-95 48.71 0.012 0.00 0.00 0.00 0.00 +C584 I4-14 I3-95 20.00 0.012 0.00 0.00 0.00 0.00 +C585 I3-95 I3-96 42.07 0.012 0.00 0.00 0.00 0.00 +C586 I3-96 I3-98 276.46 0.012 0.00 0.00 0.00 0.00 +C571 I4-21 I3-106 105.07 0.012 0.00 0.00 0.00 0.00 +C572 I3-106 I3-105 176.25 0.012 0.00 0.00 0.00 0.00 +C573 I3-105 I3-104 58.87 0.012 0.00 0.00 0.00 0.00 +C574 I3-104 I3-109 80.66 0.012 0.00 0.00 0.00 0.00 +C575 I3-109 I3-98 99.79 0.012 0.00 0.00 0.00 0.00 +C576 I3-98 I3-103 54.68 0.012 0.00 0.00 0.00 0.00 +C577 I4-20 I3-103 90.50 0.012 0.00 0.00 0.00 0.00 +C578 I4-22 I3-107 20.00 0.012 0.00 0.00 0.00 0.00 +C596 I3-107 I3-108 51.92 0.012 0.00 0.00 0.00 0.00 +C597 I4-23 I3-108 20.00 0.012 0.00 0.00 0.00 0.00 +C598 I3-108 I3-103 43.04 0.012 0.00 0.00 0.00 0.00 +C612 I3-103 I3-120 280.32 0.012 0.00 0.00 0.00 0.00 +C611 I3-119 I3-118 89.89 0.012 0.00 0.00 0.00 0.00 +C610 I3-118 I3-116 55.53 0.012 0.00 0.00 0.00 0.00 +C609 I3-116 I3-117 42.33 0.012 0.00 0.00 0.00 0.00 +C608 I3-120 I3-117 55.29 0.012 0.00 0.00 0.00 0.00 +C607 I4-26 I3-120 128.12 0.012 0.00 0.00 0.00 0.00 +C606 I4-25 I3-117 92.62 0.012 0.00 0.00 0.00 0.00 +C605 I4-24 I3-110 82.14 0.012 0.00 0.00 0.00 0.00 +C604 I3-110 I3-111 73.53 0.012 0.00 0.00 0.00 0.00 +C603 I3-111 I3-112 62.47 0.012 0.00 0.00 0.00 0.00 +C602 I3-112 I3-113 131.58 0.012 0.00 0.00 0.00 0.00 +C601 I3-113 I3-114 86.29 0.012 0.00 0.00 0.00 0.00 +C600 I3-114 I3-115 154.84 0.012 0.00 0.00 0.00 0.00 +C599 I3-115 I3-116 60.95 0.012 0.00 0.00 0.00 0.00 +C622 I3-117 I3-126 276.58 0.012 0.00 0.00 0.00 0.00 +C620 I4-30 I3-126 92.21 0.012 0.00 0.00 0.00 0.00 +C621 I4-29 I3-125 20.00 0.012 0.00 0.00 0.00 0.00 +C626 I3-125 I3-122 48.15 0.012 0.00 0.00 0.00 0.00 +C623 I4-27 I3-121 47.21 0.012 0.00 0.00 0.00 0.00 +C624 I3-121 I3-122 66.81 0.012 0.00 0.00 0.00 0.00 +C629 I3-122 I3-135 279.50 0.012 0.00 0.00 0.00 0.00 +C630 I3-126 I3-123 52.17 0.012 0.00 0.00 0.00 0.00 +C627 I3-124 I3-123 98.48 0.012 0.00 0.00 0.00 0.00 +C628 I4-28 I3-124 67.21 0.012 0.00 0.00 0.00 0.00 +C633 I3-123 I3-134 276.91 0.012 0.00 0.00 0.00 0.00 +C634 I4-33 I3-135 20.00 0.012 0.00 0.00 0.00 0.00 +C631 I3-129 I3-128 95.13 0.012 0.00 0.00 0.00 0.00 +C632 I4-31 I3-127 50.43 0.012 0.00 0.00 0.00 0.00 +C615 I3-134 I3-127 60.23 0.012 0.00 0.00 0.00 0.00 +C616 I3-133 I3-134 90.90 0.012 0.00 0.00 0.00 0.00 +C613 I3-132 I3-133 88.27 0.012 0.00 0.00 0.00 0.00 +C614 I3-131 I3-132 81.64 0.012 0.00 0.00 0.00 0.00 +C618 I3-130 I3-131 76.41 0.012 0.00 0.00 0.00 0.00 +C619 I4-32 I3-130 74.55 0.012 0.00 0.00 0.00 0.00 +C617 I3-135 I3-128 61.04 0.012 0.00 0.00 0.00 0.00 +C635 I3-127 I3-137 360.27 0.012 0.00 0.00 0.00 0.00 +C638 I3-128 I3-136 273.54 0.012 0.00 0.00 0.00 0.00 +C639 I4-34 I3-136 58.52 0.012 0.00 0.00 0.00 0.00 +C636 I3-136 I3-138 56.99 0.012 0.00 0.00 0.00 0.00 +C637 I4-36 I3-138 20.00 0.012 0.00 0.00 0.00 0.00 +C642 I3-138 I3-140 269.03 0.012 0.00 0.00 0.00 0.00 +C643 I4-38 I3-140 53.63 0.012 0.00 0.00 0.00 0.00 +C640 I3-140 I3-143 61.04 0.012 0.00 0.00 0.00 0.00 +C641 I3-141 I3-143 74.99 0.012 0.00 0.00 0.00 0.00 +C646 I3-142 I3-141 61.78 0.012 0.00 0.00 0.00 0.00 +C647 I3-147 I3-142 57.90 0.012 0.00 0.00 0.00 0.00 +C644 I3-148 I3-147 74.17 0.012 0.00 0.00 0.00 0.00 +C645 I3-145 I3-148 62.25 0.012 0.00 0.00 0.00 0.00 +C651 I3-146 I3-145 63.64 0.012 0.00 0.00 0.00 0.00 +C652 I3-150 I3-146 60.14 0.012 0.00 0.00 0.00 0.00 +C649 I3-151 I3-150 61.97 0.012 0.00 0.00 0.00 0.00 +C650 I3-149 I3-151 77.13 0.012 0.00 0.00 0.00 0.00 +C655 I4-39 I3-149 34.47 0.012 0.00 0.00 0.00 0.00 +C656 I3-153 J1 233.53 0.012 0.00 0.00 0.00 0.00 +C653 J1 OUT40 156.38 0.012 0.00 0.00 0.00 0.00 +C654 I3-143 I3-152 342.10 0.012 0.00 0.00 0.00 0.00 +C659 I3-152 IM5-153 239.69 0.012 0.00 0.00 0.00 0.00 +C660 I3-137 I3-139 67.24 0.012 0.00 0.00 0.00 0.00 +C657 I4-37 I3-139 37.03 0.012 0.00 0.00 0.00 0.00 +C658 I4-35 I3-137 119.20 0.012 0.00 0.00 0.00 0.00 +C693 I3-139 I3-144 229.44 0.012 0.00 0.00 0.00 0.00 +C694 I3-144 I3-153 354.87 0.012 0.00 0.00 0.00 0.00 +C691 IM5-153 J1 44.41 0.012 0.00 0.00 0.00 0.00 +C692 I2-320 I2-319 40.79 0.012 0.00 0.00 0.00 0.00 +C697 I2-319 IM5-152 67.38 0.012 0.00 0.00 0.00 0.00 +C698 IM5-152 I2-318 48.43 0.012 0.00 0.00 0.00 0.00 +C695 I2-318 IM5-154 20.00 0.012 0.00 0.00 0.00 0.00 +C696 IM5-154 OUT41 33.51 0.012 0.00 0.00 0.00 0.00 +C701 I3-154 I3-158 49.91 0.012 0.00 0.00 0.00 0.00 +C702 I4-43 I3-156 62.27 0.012 0.00 0.00 0.00 0.00 +C699 I3-156 I3-157 47.70 0.012 0.00 0.00 0.00 0.00 +C700 I4-42 I3-157 65.41 0.012 0.00 0.00 0.00 0.00 +C705 I3-157 I3-158 44.77 0.012 0.00 0.00 0.00 0.00 +C706 I3-158 I3-161 282.31 0.012 0.00 0.00 0.00 0.00 +C703 I4-40 I3-161 54.11 0.012 0.00 0.00 0.00 0.00 +C704 I3-161 I3-159 49.80 0.012 0.00 0.00 0.00 0.00 +C787 I4-45 I3-159 58.14 0.012 0.00 0.00 0.00 0.00 +C709 I4-41 I3-155 20.00 0.012 0.00 0.00 0.00 0.00 +C707 I3-155 I3-160 47.18 0.012 0.00 0.00 0.00 0.00 +C708 I4-44 I3-160 63.92 0.012 0.00 0.00 0.00 0.00 +C713 I3-160 I3-159 43.84 0.012 0.00 0.00 0.00 0.00 +C714 I3-159 I3-162 280.39 0.012 0.00 0.00 0.00 0.00 +C710 I4-47 I3-162 67.44 0.012 0.00 0.00 0.00 0.00 +C712 I4-49 I3-163 85.21 0.012 0.00 0.00 0.00 0.00 +C715 I3-163 I3-164 49.75 0.012 0.00 0.00 0.00 0.00 +C716 I4-48 I3-164 20.00 0.012 0.00 0.00 0.00 0.00 +C788 I3-162 I3-165 48.14 0.012 0.00 0.00 0.00 0.00 +C789 I4-46 I3-165 20.00 0.012 0.00 0.00 0.00 0.00 +C719 I3-164 I3-165 43.84 0.012 0.00 0.00 0.00 0.00 +C720 I3-165 I3-171 283.73 0.012 0.00 0.00 0.00 0.00 +C717 I4-53 I3-171 97.98 0.012 0.00 0.00 0.00 0.00 +C718 I3-171 I3-172 55.30 0.012 0.00 0.00 0.00 0.00 +C663 I4-52 I3-172 59.73 0.012 0.00 0.00 0.00 0.00 +C664 I4-50 I3-168 48.71 0.012 0.00 0.00 0.00 0.00 +C661 I3-168 I3-167 72.25 0.012 0.00 0.00 0.00 0.00 +C662 I3-167 I3-166 50.50 0.012 0.00 0.00 0.00 0.00 +C667 I3-170 I3-166 49.47 0.012 0.00 0.00 0.00 0.00 +C668 I3-166 I3-172 47.15 0.012 0.00 0.00 0.00 0.00 +C665 I4-54 I3-174 82.86 0.012 0.00 0.00 0.00 0.00 +C666 I3-174 I3-173 73.03 0.012 0.00 0.00 0.00 0.00 +C671 I3-173 I3-169 79.86 0.012 0.00 0.00 0.00 0.00 +C672 I3-169 I3-170 93.54 0.012 0.00 0.00 0.00 0.00 +C669 I3-172 I3-178 276.01 0.012 0.00 0.00 0.00 0.00 +C674 I4-56 I3-177 20.00 0.012 0.00 0.00 0.00 0.00 +C675 I4-57 I3-178 96.80 0.012 0.00 0.00 0.00 0.00 +C673 I4-58 I3-179 20.00 0.012 0.00 0.00 0.00 0.00 +C791 I3-177 I3-175 58.52 0.012 0.00 0.00 0.00 0.00 +C678 I4-55 I3-176 20.00 0.012 0.00 0.00 0.00 0.00 +C679 I3-176 I3-175 20.00 0.012 0.00 0.00 0.00 0.00 +C677 I3-179 I3-181 267.39 0.012 0.00 0.00 0.00 0.00 +C681 I3-175 I3-182 274.07 0.012 0.00 0.00 0.00 0.00 +C682 I4-60 I3-181 20.00 0.012 0.00 0.00 0.00 0.00 +C680 I3-181 I3-187 58.78 0.012 0.00 0.00 0.00 0.00 +C790 I4-66 I3-187 20.00 0.012 0.00 0.00 0.00 0.00 +C685 I3-182 I3-183 51.12 0.012 0.00 0.00 0.00 0.00 +C686 I4-62 I3-183 173.02 0.012 0.00 0.00 0.00 0.00 +C683 I4-61 I3-182 89.78 0.012 0.00 0.00 0.00 0.00 +C684 I3-187 I3-186 279.25 0.012 0.00 0.00 0.00 0.00 +C689 I4-65 I3-186 20.00 0.012 0.00 0.00 0.00 0.00 +C690 I3-183 I3-185 285.78 0.012 0.00 0.00 0.00 0.00 +C687 I4-64 I3-185 100.35 0.012 0.00 0.00 0.00 0.00 +C688 I3-186 I3-180 47.02 0.012 0.00 0.00 0.00 0.00 +C723 I3-185 I3-184 41.29 0.012 0.00 0.00 0.00 0.00 +C724 I4-63 I3-184 62.20 0.012 0.00 0.00 0.00 0.00 +C721 I4-59 I3-180 61.08 0.012 0.00 0.00 0.00 0.00 +C722 I3-180 I3-189 285.85 0.012 0.00 0.00 0.00 0.00 +C727 I4-68 I3-189 65.27 0.012 0.00 0.00 0.00 0.00 +C728 I3-184 I3-190 282.75 0.012 0.00 0.00 0.00 0.00 +C725 I4-69 I3-190 63.57 0.012 0.00 0.00 0.00 0.00 +C726 I3-190 I3-191 54.69 0.012 0.00 0.00 0.00 0.00 +C731 I3-189 I3-188 49.88 0.012 0.00 0.00 0.00 0.00 +C732 I4-67 I3-188 20.00 0.012 0.00 0.00 0.00 0.00 +C729 I4-70 I3-192 39.92 0.012 0.00 0.00 0.00 0.00 +C730 I3-192 I3-191 102.14 0.012 0.00 0.00 0.00 0.00 +C735 I3-188 I3-195 282.98 0.012 0.00 0.00 0.00 0.00 +C736 I2-322 I2-321 28.18 0.012 0.00 0.00 0.00 0.00 +C733 I2-321 I3-195 107.05 0.012 0.00 0.00 0.00 0.00 +C734 I3-195 I3-194 73.64 0.012 0.00 0.00 0.00 0.00 +C739 I3-191 I3-193 304.54 0.012 0.00 0.00 0.00 0.00 +C740 I3-193 I3-199 263.18 0.012 0.00 0.00 0.00 0.00 +C737 I3-199 I3-197 63.26 0.012 0.00 0.00 0.00 0.00 +C738 I3-197 OUT43 79.97 0.012 0.00 0.00 0.00 0.00 +C742 I3-194 I3-198 217.94 0.012 0.00 0.00 0.00 0.00 +C743 I3-198 I3-196 62.50 0.012 0.00 0.00 0.00 0.00 +C741 I3-196 OUT42 80.71 0.012 0.00 0.00 0.00 0.00 +C786A I3-178 I3-179 58.55 0.012 0.00 0.00 0.00 0.00 +C124 IM5-46 IM5-49 175.00 0.012 0.00 0.00 0.00 0.00 +C123 IM5-49 OUT4 41.72 0.012 0.00 0.00 0.00 0.00 + +[XSECTIONS] +;;Link Shape Geom1 Geom2 Geom3 Geom4 Barrels +;;-------------- ------------ ---------- ---------- ---------- ---------- ---------- +C127 CIRCULAR 2.00 0.00 0.000 0.00 1 +C128 CIRCULAR 1.50 0.00 0.000 0.00 1 +C129 CIRCULAR 2.00 0.00 0.000 0.00 1 +C130 CIRCULAR 1.50 0.00 0.000 0.00 1 +C131 CIRCULAR 2.00 0.00 0.000 0.00 1 +C132 CIRCULAR 1.50 0.00 0.000 0.00 1 +C133 CIRCULAR 2.00 0.00 0.000 0.00 1 +C134 CIRCULAR 1.50 0.00 0.000 0.00 1 +C135 CIRCULAR 4.00 0.00 0.000 0.00 1 +C136 CIRCULAR 4.00 0.00 0.000 0.00 1 +C137 CIRCULAR 1.50 0.00 0.000 0.00 1 +C138 CIRCULAR 4.00 0.00 0.000 0.00 1 +C139 CIRCULAR 1.50 0.00 0.000 0.00 1 +C140 CIRCULAR 3.50 0.00 0.000 0.00 1 +C141 CIRCULAR 1.50 0.00 0.000 0.00 1 +C142 CIRCULAR 3.50 0.00 0.000 0.00 1 +C143 CIRCULAR 1.50 0.00 0.000 0.00 1 +C144 CIRCULAR 3.50 0.00 0.000 0.00 1 +C145 CIRCULAR 3.50 0.00 0.000 0.00 1 +C146 CIRCULAR 1.50 0.00 0.000 0.00 1 +C147 CIRCULAR 3.00 0.00 0.000 0.00 1 +C148 CIRCULAR 1.50 0.00 0.000 0.00 1 +C149 CIRCULAR 3.00 0.00 0.000 0.00 1 +C150 CIRCULAR 3.00 0.00 0.000 0.00 1 +C151 CIRCULAR 1.50 0.00 0.000 0.00 1 +C152 CIRCULAR 1.50 0.00 0.000 0.00 1 +C153 CIRCULAR 2.50 0.00 0.000 0.00 1 +C154 CIRCULAR 1.50 0.00 0.000 0.00 1 +C155 CIRCULAR 2.50 0.00 0.000 0.00 1 +C156 CIRCULAR 2.50 0.00 0.000 0.00 1 +C157 CIRCULAR 1.50 0.00 0.000 0.00 1 +C158 CIRCULAR 2.50 0.00 0.000 0.00 1 +C159 VERT_ELLIPSE 1.00 1.50 0.000 0.00 1 +C160 VERT_ELLIPSE 1.00 1.50 0.000 0.00 1 +C161 CIRCULAR 2.00 0.00 0.000 0.00 1 +C162 CIRCULAR 1.50 0.00 0.000 0.00 1 +C163 CIRCULAR 1.50 0.00 0.000 0.00 1 +C164 CIRCULAR 1.50 0.00 0.000 0.00 1 +C165 CIRCULAR 1.50 0.00 0.000 0.00 1 +C166 CIRCULAR 1.50 0.00 0.000 0.00 1 +C167 CIRCULAR 1.50 0.00 0.000 0.00 1 +C168 CIRCULAR 1.50 0.00 0.000 0.00 1 +C169 CIRCULAR 2.00 0.00 0.000 0.00 1 +C170 CIRCULAR 1.50 0.00 0.000 0.00 1 +C171 CIRCULAR 2.00 0.00 0.000 0.00 1 +C172 CIRCULAR 1.50 0.00 0.000 0.00 1 +C173 CIRCULAR 1.50 0.00 0.000 0.00 1 +C174 CIRCULAR 2.50 0.00 0.000 0.00 1 +C175 CIRCULAR 1.50 0.00 0.000 0.00 1 +C176 CIRCULAR 1.50 0.00 0.000 0.00 1 +C177 CIRCULAR 2.50 0.00 0.000 0.00 1 +C178 CIRCULAR 2.50 0.00 0.000 0.00 1 +C179 CIRCULAR 3.00 0.00 0.000 0.00 1 +C180 VERT_ELLIPSE 1.17 1.92 0.000 0.00 1 +C181 VERT_ELLIPSE 1.17 1.92 0.000 0.00 1 +C182 VERT_ELLIPSE 1.17 1.92 0.000 0.00 1 +C183 CIRCULAR 3.00 0.00 0.000 0.00 1 +C184 CIRCULAR 3.00 0.00 0.000 0.00 1 +C185 CIRCULAR 1.25 0.00 0.000 0.00 1 +C186 CIRCULAR 3.00 0.00 0.000 0.00 1 +C187 VERT_ELLIPSE 1.17 1.92 0.000 0.00 1 +C188 VERT_ELLIPSE 1.17 1.92 0.000 0.00 1 +C189 VERT_ELLIPSE 1.17 1.92 0.000 0.00 1 +C190 VERT_ELLIPSE 1.17 1.92 0.000 0.00 1 +C191 VERT_ELLIPSE 1.17 1.92 0.000 0.00 1 +C192 CIRCULAR 3.00 0.00 0.000 0.00 1 +C193 CIRCULAR 1.50 0.00 0.000 0.00 1 +C194 CIRCULAR 3.00 0.00 0.000 0.00 1 +C195 CIRCULAR 3.00 0.00 0.000 0.00 1 +C196 CIRCULAR 3.00 0.00 0.000 0.00 1 +C198 CIRCULAR 3.00 0.00 0.000 0.00 1 +C199 CIRCULAR 3.00 0.00 0.000 0.00 1 +C200 CIRCULAR 1.50 0.00 0.000 0.00 1 +C201 CIRCULAR 3.00 0.00 0.000 0.00 1 +C202 CIRCULAR 3.00 0.00 0.000 0.00 1 +C203 CIRCULAR 3.00 0.00 0.000 0.00 1 +C204 VERT_ELLIPSE 1.17 1.92 0.000 0.00 1 +C205 VERT_ELLIPSE 1.17 1.92 0.000 0.00 1 +C206 CIRCULAR 3.00 0.00 0.000 0.00 1 +C207 CIRCULAR 3.00 0.00 0.000 0.00 1 +C208 CIRCULAR 3.00 0.00 0.000 0.00 1 +C209 CIRCULAR 3.00 0.00 0.000 0.00 1 +C210 VERT_ELLIPSE 1.17 1.92 0.000 0.00 1 +C211 VERT_ELLIPSE 1.17 1.92 0.000 0.00 1 +C212 CIRCULAR 2.00 0.00 0.000 0.00 1 +C213 CIRCULAR 2.00 0.00 0.000 0.00 1 +C214 CIRCULAR 2.00 0.00 0.000 0.00 1 +C215 CIRCULAR 1.50 0.00 0.000 0.00 1 +C216 CIRCULAR 2.00 0.00 0.000 0.00 1 +C217 CIRCULAR 2.00 0.00 0.000 0.00 1 +C218 VERT_ELLIPSE 1.17 1.92 0.000 0.00 1 +C219 CIRCULAR 2.00 0.00 0.000 0.00 1 +C220 CIRCULAR 2.50 0.00 0.000 0.00 1 +C221 CIRCULAR 2.50 0.00 0.000 0.00 1 +C222 CIRCULAR 1.50 0.00 0.000 0.00 1 +C223 CIRCULAR 1.50 0.00 0.000 0.00 1 +C224 CIRCULAR 1.50 0.00 0.000 0.00 1 +C225 CIRCULAR 2.50 0.00 0.000 0.00 1 +C226 CIRCULAR 2.50 0.00 0.000 0.00 1 +C227 CIRCULAR 1.25 0.00 0.000 0.00 1 +C228 CIRCULAR 1.50 0.00 0.000 0.00 1 +C229 CIRCULAR 1.50 0.00 0.000 0.00 1 +C230 CIRCULAR 1.50 0.00 0.000 0.00 1 +C231 CIRCULAR 2.00 0.00 0.000 0.00 1 +C232 CIRCULAR 2.00 0.00 0.000 0.00 1 +C233 CIRCULAR 2.00 0.00 0.000 0.00 1 +C234 CIRCULAR 2.00 0.00 0.000 0.00 1 +C235 CIRCULAR 1.50 0.00 0.000 0.00 1 +C595 VERT_ELLIPSE 1.00 1.50 0.000 0.00 1 +C587 CIRCULAR 1.50 0.00 0.000 0.00 1 +C588 CIRCULAR 1.25 0.00 0.000 0.00 1 +C589 CIRCULAR 1.50 0.00 0.000 0.00 1 +C590 CIRCULAR 1.50 0.00 0.000 0.00 1 +C591 CIRCULAR 1.50 0.00 0.000 0.00 1 +C592 CIRCULAR 1.50 0.00 0.000 0.00 1 +C593 CIRCULAR 2.50 0.00 0.000 0.00 1 +C594 CIRCULAR 1.50 0.00 0.000 0.00 1 +C579 CIRCULAR 2.50 0.00 0.000 0.00 1 +C580 CIRCULAR 1.00 0.00 0.000 0.00 1 +C581 CIRCULAR 1.25 0.00 0.000 0.00 1 +C582 CIRCULAR 1.50 0.00 0.000 0.00 1 +C583 CIRCULAR 1.50 0.00 0.000 0.00 1 +C584 CIRCULAR 1.25 0.00 0.000 0.00 1 +C585 CIRCULAR 2.00 0.00 0.000 0.00 1 +C586 CIRCULAR 3.00 0.00 0.000 0.00 1 +C571 CIRCULAR 1.50 0.00 0.000 0.00 1 +C572 CIRCULAR 1.25 0.00 0.000 0.00 1 +C573 CIRCULAR 1.50 0.00 0.000 0.00 1 +C574 CIRCULAR 1.50 0.00 0.000 0.00 1 +C575 CIRCULAR 1.00 0.00 0.000 0.00 1 +C576 CIRCULAR 3.00 0.00 0.000 0.00 1 +C577 CIRCULAR 1.25 0.00 0.000 0.00 1 +C578 CIRCULAR 1.25 0.00 0.000 0.00 1 +C596 CIRCULAR 1.50 0.00 0.000 0.00 1 +C597 CIRCULAR 1.50 0.00 0.000 0.00 1 +C598 CIRCULAR 2.00 0.00 0.000 0.00 1 +C612 CIRCULAR 3.50 0.00 0.000 0.00 1 +C611 CIRCULAR 1.00 0.00 0.000 0.00 1 +C610 CIRCULAR 1.50 0.00 0.000 0.00 1 +C609 CIRCULAR 2.00 0.00 0.000 0.00 1 +C608 CIRCULAR 3.50 0.00 0.000 0.00 1 +C607 CIRCULAR 1.25 0.00 0.000 0.00 1 +C606 CIRCULAR 1.00 0.00 0.000 0.00 1 +C605 CIRCULAR 1.00 0.00 0.000 0.00 1 +C604 CIRCULAR 1.00 0.00 0.000 0.00 1 +C603 CIRCULAR 1.00 0.00 0.000 0.00 1 +C602 CIRCULAR 1.00 0.00 0.000 0.00 1 +C601 CIRCULAR 1.00 0.00 0.000 0.00 1 +C600 CIRCULAR 1.00 0.00 0.000 0.00 1 +C599 CIRCULAR 1.00 0.00 0.000 0.00 1 +C622 CIRCULAR 4.00 0.00 0.000 0.00 1 +C620 CIRCULAR 1.25 0.00 0.000 0.00 1 +C621 CIRCULAR 1.25 0.00 0.000 0.00 1 +C626 CIRCULAR 3.00 0.00 0.000 0.00 1 +C623 CIRCULAR 1.00 0.00 0.000 0.00 1 +C624 CIRCULAR 1.00 0.00 0.000 0.00 1 +C629 CIRCULAR 3.50 0.00 0.000 0.00 1 +C630 CIRCULAR 3.00 0.00 0.000 0.00 1 +C627 VERT_ELLIPSE 1.25 1.00 0.000 0.00 1 +C628 CIRCULAR 1.50 0.00 0.000 0.00 1 +C633 CIRCULAR 3.50 0.00 0.000 0.00 1 +C634 CIRCULAR 1.00 0.00 0.000 0.00 1 +C631 CIRCULAR 1.00 0.00 0.000 0.00 1 +C632 CIRCULAR 1.25 0.00 0.000 0.00 1 +C615 CIRCULAR 4.00 0.00 0.000 0.00 1 +C616 CIRCULAR 1.25 0.00 0.000 0.00 1 +C613 CIRCULAR 1.00 0.00 0.000 0.00 1 +C614 CIRCULAR 1.00 0.00 0.000 0.00 1 +C618 CIRCULAR 1.00 0.00 0.000 0.00 1 +C619 CIRCULAR 1.25 0.00 0.000 0.00 1 +C617 CIRCULAR 4.00 0.00 0.000 0.00 1 +C635 CIRCULAR 4.00 0.00 0.000 0.00 1 +C638 CIRCULAR 4.00 0.00 0.000 0.00 1 +C639 CIRCULAR 1.00 0.00 0.000 0.00 1 +C636 CIRCULAR 4.00 0.00 0.000 0.00 1 +C637 CIRCULAR 1.25 0.00 0.000 0.00 1 +C642 CIRCULAR 4.00 0.00 0.000 0.00 1 +C643 CIRCULAR 1.25 0.00 0.000 0.00 1 +C640 CIRCULAR 4.00 0.00 0.000 0.00 1 +C641 CIRCULAR 1.00 0.00 0.000 0.00 1 +C646 CIRCULAR 1.00 0.00 0.000 0.00 1 +C647 CIRCULAR 1.00 0.00 0.000 0.00 1 +C644 CIRCULAR 1.00 0.00 0.000 0.00 1 +C645 CIRCULAR 1.00 0.00 0.000 0.00 1 +C651 CIRCULAR 1.00 0.00 0.000 0.00 1 +C652 CIRCULAR 1.00 0.00 0.000 0.00 1 +C649 CIRCULAR 1.00 0.00 0.000 0.00 1 +C650 CIRCULAR 1.00 0.00 0.000 0.00 1 +C655 CIRCULAR 1.00 0.00 0.000 0.00 1 +C656 CIRCULAR 3.00 0.00 0.000 0.00 2 +C653 CIRCULAR 5.00 0.00 0.000 0.00 1 +C654 CIRCULAR 4.00 0.00 0.000 0.00 1 +C659 CIRCULAR 3.00 0.00 0.000 0.00 2 +C660 CIRCULAR 4.00 0.00 0.000 0.00 1 +C657 CIRCULAR 1.25 0.00 0.000 0.00 1 +C658 CIRCULAR 1.00 0.00 0.000 0.00 1 +C693 CIRCULAR 4.00 0.00 0.000 0.00 1 +C694 CIRCULAR 4.00 0.00 0.000 0.00 1 +C691 VERT_ELLIPSE 2.00 3.17 0.000 0.00 1 +C692 CIRCULAR 1.25 0.00 0.000 0.00 1 +C697 CIRCULAR 1.50 0.00 0.000 0.00 1 +C698 CIRCULAR 1.50 0.00 0.000 0.00 1 +C695 CIRCULAR 1.50 0.00 0.000 0.00 1 +C696 CIRCULAR 1.50 0.00 0.000 0.00 1 +C701 CIRCULAR 1.50 0.00 0.000 0.00 1 +C702 CIRCULAR 1.00 0.00 0.000 0.00 1 +C699 CIRCULAR 1.50 0.00 0.000 0.00 1 +C700 CIRCULAR 1.00 0.00 0.000 0.00 1 +C705 CIRCULAR 1.25 0.00 0.000 0.00 2 +C706 CIRCULAR 2.00 0.00 0.000 0.00 2 +C703 CIRCULAR 1.00 0.00 0.000 0.00 1 +C704 CIRCULAR 2.00 0.00 0.000 0.00 2 +C787 CIRCULAR 1.00 0.00 0.000 0.00 1 +C709 CIRCULAR 1.50 0.00 0.000 0.00 1 +C707 CIRCULAR 1.50 0.00 0.000 0.00 1 +C708 CIRCULAR 1.25 0.00 0.000 0.00 1 +C713 CIRCULAR 1.25 0.00 0.000 0.00 2 +C714 CIRCULAR 2.50 0.00 0.000 0.00 2 +C710 CIRCULAR 1.50 0.00 0.000 0.00 1 +C712 CIRCULAR 1.00 0.00 0.000 0.00 1 +C715 CIRCULAR 1.50 0.00 0.000 0.00 1 +C716 CIRCULAR 1.50 0.00 0.000 0.00 1 +C788 CIRCULAR 2.50 0.00 0.000 0.00 2 +C789 CIRCULAR 1.50 0.00 0.000 0.00 1 +C719 CIRCULAR 1.25 0.00 0.000 0.00 2 +C720 CIRCULAR 3.00 0.00 0.000 0.00 2 +C717 CIRCULAR 1.50 0.00 0.000 0.00 1 +C718 CIRCULAR 3.00 0.00 0.000 0.00 2 +C663 CIRCULAR 1.25 0.00 0.000 0.00 1 +C664 CIRCULAR 1.00 0.00 0.000 0.00 1 +C661 CIRCULAR 1.00 0.00 0.000 0.00 1 +C662 CIRCULAR 1.00 0.00 0.000 0.00 1 +C667 CIRCULAR 1.50 0.00 0.000 0.00 1 +C668 CIRCULAR 2.00 0.00 0.000 0.00 1 +C665 CIRCULAR 1.00 0.00 0.000 0.00 1 +C666 CIRCULAR 1.00 0.00 0.000 0.00 1 +C671 CIRCULAR 1.00 0.00 0.000 0.00 1 +C672 CIRCULAR 1.25 0.00 0.000 0.00 1 +C669 CIRCULAR 3.00 0.00 0.000 0.00 2 +C674 CIRCULAR 1.50 0.00 0.000 0.00 1 +C675 CIRCULAR 1.00 0.00 0.000 0.00 1 +C673 CIRCULAR 1.50 0.00 0.000 0.00 1 +C791 CIRCULAR 1.50 0.00 0.000 0.00 1 +C678 CIRCULAR 1.50 0.00 0.000 0.00 1 +C679 CIRCULAR 1.50 0.00 0.000 0.00 1 +C677 CIRCULAR 2.50 0.00 0.000 0.00 2 +C681 CIRCULAR 2.50 0.00 0.000 0.00 2 +C682 CIRCULAR 1.50 0.00 0.000 0.00 1 +C680 CIRCULAR 2.50 0.00 0.000 0.00 2 +C790 CIRCULAR 1.50 0.00 0.000 0.00 1 +C685 CIRCULAR 2.50 0.00 0.000 0.00 2 +C686 CIRCULAR 1.25 0.00 0.000 0.00 1 +C683 CIRCULAR 1.25 0.00 0.000 0.00 1 +C684 CIRCULAR 2.50 0.00 0.000 0.00 2 +C689 CIRCULAR 1.50 0.00 0.000 0.00 1 +C690 CIRCULAR 2.50 0.00 0.000 0.00 2 +C687 CIRCULAR 1.00 0.00 0.000 0.00 1 +C688 CIRCULAR 2.50 0.00 0.000 0.00 2 +C723 CIRCULAR 2.50 0.00 0.000 0.00 2 +C724 CIRCULAR 1.25 0.00 0.000 0.00 1 +C721 CIRCULAR 1.25 0.00 0.000 0.00 1 +C722 CIRCULAR 2.50 0.00 0.000 0.00 2 +C727 CIRCULAR 1.00 0.00 0.000 0.00 1 +C728 CIRCULAR 2.50 0.00 0.000 0.00 1 +C725 CIRCULAR 1.00 0.00 0.000 0.00 1 +C726 CIRCULAR 2.50 0.00 0.000 0.00 2 +C731 CIRCULAR 2.50 0.00 0.000 0.00 2 +C732 CIRCULAR 1.25 0.00 0.000 0.00 1 +C729 CIRCULAR 1.00 0.00 0.000 0.00 1 +C730 CIRCULAR 1.00 0.00 0.000 0.00 1 +C735 CIRCULAR 2.50 0.00 0.000 0.00 2 +C736 CIRCULAR 1.25 0.00 0.000 0.00 1 +C733 CIRCULAR 1.80 0.00 0.000 0.00 1 +C734 CIRCULAR 2.50 0.00 0.000 0.00 2 +C739 CIRCULAR 2.50 0.00 0.000 0.00 2 +C740 CIRCULAR 2.50 0.00 0.000 0.00 2 +C737 CIRCULAR 5.00 0.00 0.000 0.00 1 +C738 CIRCULAR 5.00 0.00 0.000 0.00 1 +C742 CIRCULAR 2.50 0.00 0.000 0.00 2 +C743 CIRCULAR 5.00 0.00 0.000 0.00 1 +C741 CIRCULAR 5.00 0.00 0.000 0.00 1 +C786A CIRCULAR 2.50 0.00 0.000 0.00 2 +C124 CIRCULAR 4.00 0.00 0.000 0.00 1 +C123 CIRCULAR 4.00 0.00 0.000 0.00 1 + +[LOSSES] +;;Link Inlet Outlet Average Flap Gate +;;-------------- ---------- ---------- ---------- ---------- +C127 0.0 0.0 0.00 NO +C128 0.0 0.0 0.00 NO +C129 0.0 0.0 0.00 NO +C130 0.0 0.0 0.00 NO +C131 0.0 0.0 0.00 NO +C132 0.0 0.0 0.00 NO +C133 0.0 0.0 0.00 NO +C134 0.0 0.0 0.00 NO +C135 0.0 0.0 0.00 NO +C136 0.0 0.0 0.00 NO +C137 0.0 0.0 0.00 NO +C138 0.0 0.0 0.00 NO +C139 0.0 0.0 0.00 NO +C140 0.0 0.0 0.00 NO +C141 0.0 0.0 0.00 NO +C142 0.0 0.0 0.00 NO +C143 0.0 0.0 0.00 NO +C144 0.0 0.0 0.00 NO +C145 0.0 0.0 0.00 NO +C146 0.0 0.0 0.00 NO +C147 0.0 0.0 0.00 NO +C148 0.0 0.0 0.00 NO +C149 0.0 0.0 0.00 NO +C150 0.0 0.0 0.00 NO +C151 0.0 0.0 0.00 NO +C152 0.0 0.0 0.00 NO +C153 0.0 0.0 0.00 NO +C154 0.0 0.0 0.00 NO +C155 0.0 0.0 0.00 NO +C156 0.0 0.0 0.00 NO +C157 0.0 0.0 0.00 NO +C158 0.0 0.0 0.00 NO +C159 0.0 0.0 0.00 NO +C160 0.0 0.0 0.00 NO +C161 0.0 0.0 0.00 NO +C162 0.0 0.0 0.00 NO +C163 0.0 0.0 0.00 NO +C164 0.0 0.0 0.00 NO +C165 0.0 0.0 0.00 NO +C166 0.0 0.0 0.00 NO +C167 0.0 0.0 0.00 NO +C168 0.0 0.0 0.00 NO +C169 0.0 0.0 0.00 NO +C170 0.0 0.0 0.00 NO +C171 0.0 0.0 0.00 NO +C172 0.0 0.0 0.00 NO +C173 0.0 0.0 0.00 NO +C174 0.0 0.0 0.00 NO +C175 0.0 0.0 0.00 NO +C176 0.0 0.0 0.00 NO +C177 0.0 0.0 0.00 NO +C178 0.0 0.0 0.00 NO +C179 0.0 0.0 0.00 NO +C180 0.0 0.0 0.00 NO +C181 0.0 0.0 0.00 NO +C182 0.0 0.0 0.00 NO +C183 0.0 0.0 0.00 NO +C184 0.0 0.0 0.00 NO +C185 0.0 0.0 0.00 NO +C186 0.0 0.0 0.00 NO +C187 0.0 0.0 0.00 NO +C188 0.0 0.0 0.00 NO +C189 0.0 0.0 0.00 NO +C190 0.0 0.0 0.00 NO +C191 0.0 0.0 0.00 NO +C192 0.0 0.0 0.00 NO +C193 0.0 0.0 0.00 NO +C194 0.0 0.0 0.00 NO +C195 0.0 0.0 0.00 NO +C196 0.0 0.0 0.00 NO +C198 0.0 0.0 0.00 NO +C199 0.0 0.0 0.00 NO +C200 0.0 0.0 0.00 NO +C201 0.0 0.0 0.00 NO +C202 0.0 0.0 0.00 NO +C203 0.0 0.0 0.00 NO +C204 0.0 0.0 0.00 NO +C205 0.0 0.0 0.00 NO +C206 0.0 0.0 0.00 NO +C207 0.0 0.0 0.00 NO +C208 0.0 0.0 0.00 NO +C209 0.0 0.0 0.00 NO +C210 0.0 0.0 0.00 NO +C211 0.0 0.0 0.00 NO +C212 0.0 0.0 0.00 NO +C213 0.0 0.0 0.00 NO +C214 0.0 0.0 0.00 NO +C215 0.0 0.0 0.00 NO +C216 0.0 0.0 0.00 NO +C217 0.0 0.0 0.00 NO +C218 0.0 0.0 0.00 NO +C219 0.0 0.0 0.00 NO +C220 0.0 0.0 0.00 NO +C221 0.0 0.0 0.00 NO +C222 0.0 0.0 0.00 NO +C223 0.0 0.0 0.00 NO +C224 0.0 0.0 0.00 NO +C225 0.0 0.0 0.00 NO +C226 0.0 0.0 0.00 NO +C227 0.0 0.0 0.00 NO +C228 0.0 0.0 0.00 NO +C229 0.0 0.0 0.00 NO +C230 0.0 0.0 0.00 NO +C231 0.0 0.0 0.00 NO +C232 0.0 0.0 0.00 NO +C233 0.0 0.0 0.00 NO +C234 0.0 0.0 0.00 NO +C235 0.0 0.0 0.00 NO +C595 0.0 0.0 0.00 NO +C587 0.0 0.0 0.00 NO +C588 0.0 0.0 0.00 NO +C589 0.0 0.0 0.00 NO +C590 0.0 0.0 0.00 NO +C591 0.0 0.0 0.00 NO +C592 0.0 0.0 0.00 NO +C593 0.0 0.0 0.00 NO +C594 0.0 0.0 0.00 NO +C579 0.0 0.0 0.00 NO +C580 0.0 0.0 0.00 NO +C581 0.0 0.0 0.00 NO +C582 0.0 0.0 0.00 NO +C583 0.0 0.0 0.00 NO +C584 0.0 0.0 0.00 NO +C585 0.0 0.0 0.00 NO +C586 0.0 0.0 0.00 NO +C571 0.0 0.0 0.00 NO +C572 0.0 0.0 0.00 NO +C573 0.0 0.0 0.00 NO +C574 0.0 0.0 0.00 NO +C575 0.0 0.0 0.00 NO +C576 0.0 0.0 0.00 NO +C577 0.0 0.0 0.00 NO +C578 0.0 0.0 0.00 NO +C596 0.0 0.0 0.00 NO +C597 0.0 0.0 0.00 NO +C598 0.0 0.0 0.00 NO +C612 0.0 0.0 0.00 NO +C611 0.0 0.0 0.00 NO +C610 0.0 0.0 0.00 NO +C609 0.0 0.0 0.00 NO +C608 0.0 0.0 0.00 NO +C607 0.0 0.0 0.00 NO +C606 0.0 0.0 0.00 NO +C605 0.0 0.0 0.00 NO +C604 0.0 0.0 0.00 NO +C603 0.0 0.0 0.00 NO +C602 0.0 0.0 0.00 NO +C601 0.0 0.0 0.00 NO +C600 0.0 0.0 0.00 NO +C599 0.0 0.0 0.00 NO +C622 0.0 0.0 0.00 NO +C620 0.0 0.0 0.00 NO +C621 0.0 0.0 0.00 NO +C626 0.0 0.0 0.00 NO +C623 0.0 0.0 0.00 NO +C624 0.0 0.0 0.00 NO +C629 0.0 0.0 0.00 NO +C630 0.0 0.0 0.00 NO +C627 0.0 0.0 0.00 NO +C628 0.0 0.0 0.00 NO +C633 0.0 0.0 0.00 NO +C634 0.0 0.0 0.00 NO +C631 0.0 0.0 0.00 NO +C632 0.0 0.0 0.00 NO +C615 0.0 0.0 0.00 NO +C616 0.0 0.0 0.00 NO +C613 0.0 0.0 0.00 NO +C614 0.0 0.0 0.00 NO +C618 0.0 0.0 0.00 NO +C619 0.0 0.0 0.00 NO +C617 0.0 0.0 0.00 NO +C635 0.0 0.0 0.00 NO +C638 0.0 0.0 0.00 NO +C639 0.0 0.0 0.00 NO +C636 0.0 0.0 0.00 NO +C637 0.0 0.0 0.00 NO +C642 0.0 0.0 0.00 NO +C643 0.0 0.0 0.00 NO +C640 0.0 0.0 0.00 NO +C641 0.0 0.0 0.00 NO +C646 0.0 0.0 0.00 NO +C647 0.0 0.0 0.00 NO +C644 0.0 0.0 0.00 NO +C645 0.0 0.0 0.00 NO +C651 0.0 0.0 0.00 NO +C652 0.0 0.0 0.00 NO +C649 0.0 0.0 0.00 NO +C650 0.0 0.0 0.00 NO +C655 0.0 0.0 0.00 NO +C656 0.0 0.0 0.00 NO +C653 0.0 0.0 0.00 NO +C654 0.0 0.0 0.00 NO +C659 0.0 0.0 0.00 NO +C660 0.0 0.0 0.00 NO +C657 0.0 0.0 0.00 NO +C658 0.0 0.0 0.00 NO +C693 0.0 0.0 0.00 NO +C694 0.0 0.0 0.00 NO +C691 0.0 0.0 0.00 NO +C692 0.0 0.0 0.00 NO +C697 0.0 0.0 0.00 NO +C698 0.0 0.0 0.00 NO +C695 0.0 0.0 0.00 NO +C696 0.0 0.0 0.00 NO +C701 0.0 0.0 0.00 NO +C702 0.0 0.0 0.00 NO +C699 0.0 0.0 0.00 NO +C700 0.0 0.0 0.00 NO +C705 0.0 0.0 0.00 NO +C706 0.0 0.0 0.00 NO +C703 0.0 0.0 0.00 NO +C704 0.0 0.0 0.00 NO +C787 0.0 0.0 0.00 NO +C709 0.0 0.0 0.00 NO +C707 0.0 0.0 0.00 NO +C708 0.0 0.0 0.00 NO +C713 0.0 0.0 0.00 NO +C714 0.0 0.0 0.00 NO +C710 0.0 0.0 0.00 NO +C712 0.0 0.0 0.00 NO +C715 0.0 0.0 0.00 NO +C716 0.0 0.0 0.00 NO +C788 0.0 0.0 0.00 NO +C789 0.0 0.0 0.00 NO +C719 0.0 0.0 0.00 NO +C720 0.0 0.0 0.00 NO +C717 0.0 0.0 0.00 NO +C718 0.0 0.0 0.00 NO +C663 0.0 0.0 0.00 NO +C664 0.0 0.0 0.00 NO +C661 0.0 0.0 0.00 NO +C662 0.0 0.0 0.00 NO +C667 0.0 0.0 0.00 NO +C668 0.0 0.0 0.00 NO +C665 0.0 0.0 0.00 NO +C666 0.0 0.0 0.00 NO +C671 0.0 0.0 0.00 NO +C672 0.0 0.0 0.00 NO +C669 0.0 0.0 0.00 NO +C674 0.0 0.0 0.00 NO +C675 0.0 0.0 0.00 NO +C673 0.0 0.0 0.00 NO +C791 0.0 0.0 0.00 NO +C678 0.0 0.0 0.00 NO +C679 0.0 0.0 0.00 NO +C677 0.0 0.0 0.00 NO +C681 0.0 0.0 0.00 NO +C682 0.0 0.0 0.00 NO +C680 0.0 0.0 0.00 NO +C790 0.0 0.0 0.00 NO +C685 0.0 0.0 0.00 NO +C686 0.0 0.0 0.00 NO +C683 0.0 0.0 0.00 NO +C684 0.0 0.0 0.00 NO +C689 0.0 0.0 0.00 NO +C690 0.0 0.0 0.00 NO +C687 0.0 0.0 0.00 NO +C688 0.0 0.0 0.00 NO +C723 0.0 0.0 0.00 NO +C724 0.0 0.0 0.00 NO +C721 0.0 0.0 0.00 NO +C722 0.0 0.0 0.00 NO +C727 0.0 0.0 0.00 NO +C728 0.0 0.0 0.00 NO +C725 0.0 0.0 0.00 NO +C726 0.0 0.0 0.00 NO +C731 0.0 0.0 0.00 NO +C732 0.0 0.0 0.00 NO +C729 0.0 0.0 0.00 NO +C730 0.0 0.0 0.00 NO +C735 0.0 0.0 0.00 NO +C736 0.0 0.0 0.00 NO +C733 0.0 0.0 0.00 NO +C734 0.0 0.0 0.00 NO +C739 0.0 0.0 0.00 NO +C740 0.0 0.0 0.00 NO +C737 0.0 0.0 0.00 NO +C738 0.0 0.0 0.00 NO +C742 0.0 0.0 0.00 NO +C743 0.0 0.0 0.00 NO +C741 0.0 0.0 0.00 NO +C786A 0.0 0.0 0.00 NO +C124 0.0 0.0 0.00 NO +C123 0.0 0.0 0.00 NO + +[REPORT] +INPUT YES +CONTROLS YES +SUBCATCHMENTS NONE +NODES ALL +LINKS ALL + +[COORDINATES] +;;Node X-Coord Y-Coord +;;-------------- ------------------ ------------------ +I2-62 393433.13345 704798.525024 +I2-63 393405.972315 704838.922786 +I2-64 393403.763235 704876.201087 +IM5-43 393433.972906 704877.452375 +I2-65 393433.794151 704957.177306 +I2-66 393563.18295 704955.998781 +I2-814 393402.105942 705168.202159 +I2-67 393401.796925 705200.820983 +IM5-44 393434.151662 705208.328712 +I2-68 393433.257885 705385.296607 +I2-69 393557.193287 705383.234065 +IM5-45 393408.366188 705572.185429 +I2-70 393420.87907 705675.148568 +I3-14 393406.310501 705675.237946 +I2-71 393418.122545 706052.352119 +I3-15 393561.027078 706052.419751 +I2-72 393551.370276 706052.413186 +I3-16 393409.461065 706183.797199 +I2-73 393419.738517 706371.086247 +I2-74 393560.866931 706370.32851 +I2-75 393412.053019 706550.067115 +I2-76 393535.818824 706549.798981 +I2-77 393411.337998 706697.897871 +I2-78 393407.137245 706937.877062 +I2-79 393536.377434 706950.658077 +I2-80 393416.127777 707200.140794 +I2-81 393535.036768 707201.764794 +I2-82 393400.344537 707372.744381 +I2-83 393537.449967 707386.508551 +I2-84 393537.628723 707689.856548 +I2-85 393399.301174 707691.173863 +I2-86 393403.025869 708100.27906 +IM5-46 393391.317387 708175.356349 +I2-87 393389.2617 708275.727534 +I2-88 393502.810956 708278.921747 +I2-89 393506.500627 708384.909278 +I2-90 393383.408504 708383.258969 +I2-91 393383.76497 708612.324045 +I2-92 393499.446632 708613.892711 +I2-93 393384.614058 708775.080881 +I2-94 393495.640012 708779.626225 +I2-96 393630.719701 705562.605882 +I2-97 393645.261635 705443.998423 +I3-17 393653.153015 705419.439078 +IM5-50 393909.605811 705422.56188 +I2-100 393909.272715 705443.861634 +IM5-51 394087.646238 705394.7952 +I2-101 394087.884579 705422.80022 +I2-102 394021.976368 705560.177838 +I2-815 394289.851713 705424.617099 +I2-103 394311.32889 705535.654494 +IM5-52 394289.401555 705397.893628 +I2-104 394480.695277 705398.175957 +I2-105 394659.663676 705387.168301 +I2-106 394654.420183 705500.260915 +IM5-460 394927.237076 705379.635744 +I2-108 394926.128466 705400.277034 +I2-107 394928.429363 705507.709049 +IM5-150 395237.520459 705380.375594 +IM5-53 395390.296783 705372.987035 +I2-109 395390.515233 705383.142779 +I2-110 395389.049057 705494.047145 +IM5-54 395431.370814 705502.708564 +IM5-55 395568.73763 705502.414645 +I2-111 395586.690018 705503.719767 +IM5-56 395559.518608 705429.950438 +IM5-57 395560.889066 705381.507712 +IM5-58 395636.740962 705375.489611 +I2-112 395627.183007 705383.330847 +IM5-59 395962.479166 705378.596055 +I3-18 395954.390978 705369.046405 +IM5-61 395966.604351 705500.618426 +IM5-60 396193.008829 705370.526587 +I2-114 396193.008831 705380.526573 +I2-113 396195.153866 705490.775758 +I3-852 396343.977354 705508.403734 +IM5-63 396409.322014 705370.365288 +I2-118 396470.623202 705501.525843 +I3-19 396611.196502 705365.240966 +I3-20 396606.375088 705526.445324 +IM5-66 396463.152249 705370.258303 +I2-117 396926.640284 705376.919655 +I2-116 396932.83714 705493.706549 +IM5-64 396938.318974 705502.04847 +I2-115 396765.58992 705503.614836 +I3-90 396754.505956 705507.007544 +IM5-65 396457.951085 705510.435925 +I4-1 395955.402343 705527.312573 +I2-120 397287.456774 705316.665497 +I2-122 397391.523623 705325.318915 +IM5-69 397412.140085 705381.567297 +IM5-70 397564.43028 705374.578864 +I2-121 397556.157392 705382.341904 +I2-123 397550.405939 705494.876493 +I3-849 397907.53102 705375.727952 +I2-124 398202.502031 705488.300037 +IM5-67 398204.991843 705437.111134 +I2-119 398207.126013 705382.997695 +IM5-68 398208.316856 705372.987035 +I3-21 398460.759953 705369.445631 +I2-125 398818.376592 705507.611904 +IM5-151 398851.017966 705526.064958 +IM5-72 398959.149328 705532.853992 +I2-127 398959.030158 705518.315215 +I2-126 398957.242604 705408.67854 +I2-128 398815.662046 705395.638295 +IM5-73 398813.642393 705372.569939 +I3-87 398561.204282 705372.152125 +I3-22 397389.914824 705526.776307 +I4-12 407127.3915 708778.275441 +I3-93 407149.120162 708777.321745 +I4-13 407215.708912 708778.784475 +I3-99 407195.702405 708777.260409 +I4-16 407217.236014 708729.40817 +I3-100 407195.040654 708727.606278 +I4-17 407126.373432 708732.462374 +I3-101 407150.53649 708728.304424 +I4-18 407215.224562 708446.342331 +I3-102 407195.190872 708444.025957 +I4-19 407130.954739 708440.531334 +I3-94 407149.558758 708442.20114 +I4-14 407131.153416 708400.565686 +I3-95 407151.255925 708393.521089 +I3-96 407193.307339 708394.719593 +I4-15 407315.064953 708403.053618 +I3-97 407289.997408 708403.671386 +I3-98 407194.069433 708118.261966 +I3-109 407283.926384 708117.437782 +I3-104 407374.462395 708115.453305 +I3-105 407437.47174 708117.437782 +I3-106 407609.550115 708118.573132 +I4-21 407713.853381 708120.873762 +I4-22 407131.463773 708113.476942 +I3-107 407151.917627 708120.385636 +I4-23 407130.445705 708068.427427 +I3-108 407151.409418 708068.471009 +I3-103 407194.169818 708063.579626 +I4-20 407289.509852 708077.279765 +I4-26 407341.18377 707780.282245 +I3-120 407195.391557 707783.263737 +I3-119 407054.359971 707777.920009 +I3-118 407150.03897 707782.871333 +I4-25 407287.154465 707737.789421 +I3-117 407195.057888 707727.971161 +I3-116 407152.728588 707727.404875 +I3-115 407083.136304 707733.896515 +I3-114 406932.167933 707733.467018 +I3-113 406850.815561 707731.607522 +I3-112 406709.47348 707730.031038 +I3-111 406654.712549 707727.454053 +I4-24 406501.270423 707724.472242 +I3-110 406588.140437 707727.454053 +I3-126 407197.355795 707447.206935 +I4-30 407287.978237 707447.085422 +I3-125 407134.058601 707444.952073 +I4-29 407108.771936 707444.952073 +I4-28 407359.222665 707405.975175 +I3-124 407284.006915 707407.102606 +I3-123 407195.82571 707400.901736 +I3-122 407151.45325 707397.116789 +I3-121 407082.841024 707403.39819 +I4-27 407033.395125 707400.499082 +I4-33 407116.663952 707119.044002 +I3-135 407153.130974 707122.23839 +I3-134 407195.00698 707125.459621 +I3-133 407282.62447 707115.795927 +I3-132 407375.792292 707117.394957 +I3-131 407462.798671 707116.654922 +I3-130 407533.814244 707120.303799 +I4-32 407608.358366 707121.305791 +I3-129 407056.749051 707078.456489 +I3-128 407154.2544 707058.905789 +I3-127 407193.329256 707045.277807 +I4-31 407268.061821 707078.456489 +I4-34 407080.908286 706782.425338 +I3-136 407152.833429 706785.368105 +I4-36 407132.705165 706738.263421 +I3-138 407154.463666 706728.403945 +I3-137 407198.322164 706702.21668 +I4-35 407340.378462 706695.452094 +I4-37 407230.225775 706652.368126 +I3-139 407198.63842 706634.587815 +I4-38 407082.693384 706447.497819 +I3-140 407155.752663 706459.376754 +I3-143 407154.634216 706401.702649 +I3-144 407203.041918 706405.189508 +I3-141 407081.479201 706408.098584 +I3-142 407007.531322 706408.35986 +I3-147 406956.635869 706406.856619 +I3-148 406887.655164 706404.914141 +I3-145 406836.591318 706404.279634 +I3-146 406758.208024 706405.138629 +I3-150 406682.616464 706403.850136 +I3-151 406632.580006 706402.991141 +I3-149 406562.583721 706399.787728 +I4-39 406526.923621 706401.326838 +I2-319 407162.150422 705809.640347 +I2-320 407199.555941 705806.792359 +I3-152 407162.273912 706056.295942 +I3-153 407203.40702 706050.319914 +IM5-153 407158.061425 705826.933358 +J1 407202.601906 705827.442392 +IM5-152 407156.170858 705740.015533 +I2-318 407105.886249 705712.359163 +IM5-154 407105.242003 705694.964515 +I3-196 405828.668063 705750.799189 +I3-197 405880.207763 705751.228687 +I3-198 405836.700095 705807.44283 +I3-199 405879.052361 705808.873616 +I3-194 405837.258013 706025.892337 +I3-195 405833.704743 706098.996233 +I2-321 405736.648224 706078.505781 +I2-322 405729.110483 706050.192788 +I4-67 405808.761352 706384.724725 +I3-188 405832.007287 706381.970581 +I4-68 405757.90835 706430.69373 +I3-189 405831.800931 706431.856011 +I4-69 405939.106134 706430.017794 +I3-190 405875.659756 706434.012518 +I3-191 405875.133829 706379.323945 +I3-192 405988.333758 706386.02599 +I4-70 406037.511221 706388.173477 +I4-59 405757.90835 706718.242305 +I3-180 405831.41384 706717.711916 +I4-63 405937.37587 706719.379272 +I3-184 405875.229685 706716.764098 +I4-64 405974.110702 706761.209936 +I3-185 405873.807779 706758.031757 +I4-65 405807.253103 706764.501849 +I3-186 405831.897442 706764.729896 +I4-66 405803.220336 707054.109349 +I3-187 405830.094671 707043.980824 +I4-60 405808.251225 707094.543083 +I3-181 405827.701693 707098.132843 +I3-182 405872.907902 707094.933524 +I4-61 405962.685586 707095.586768 +I3-183 405873.691029 707043.817453 +I4-62 406062.422076 707057.33058 +I4-58 405803.642173 707382.876719 +I3-179 405827.272196 707378.379961 +I3-175 405872.572646 707369.003357 +I3-176 405882.460094 707384.413444 +I4-55 405904.721403 707385.073677 +I4-56 405887.86396 707426.034123 +I3-177 405875.036561 707427.471781 +I3-178 405826.413201 707423.047701 +I4-57 405732.257029 707422.938274 +I3-172 405827.930087 707704.715806 +I4-52 405756.834606 707711.240522 +I3-166 405875.064166 707706.063261 +I3-167 405953.339586 707725.215798 +I3-168 406010.517716 707725.306055 +I3-169 405958.69843 707756.123011 +I3-170 405873.755778 707755.518573 +I3-171 405818.467497 707747.962558 +I4-53 405729.905056 707756.084468 +I3-173 406034.504739 707758.699996 +I3-174 406108.16356 707760.847483 +I4-54 406213.175698 707761.491729 +I4-48 405892.770564 708053.120531 +I4-49 405964.067149 708088.554075 +I3-163 405870.291931 708092.098817 +I3-164 405870.652158 708042.350526 +I3-165 405826.829423 708043.746835 +I4-46 405801.715964 708050.628981 +I4-47 405758.77578 708089.813021 +I3-162 405826.186716 708091.880955 +I3-159 405826.062747 708372.273941 +I3-160 405869.855955 708374.420607 +I4-44 405939.371043 708378.250138 +I4-45 405754.901867 708378.250138 +I3-161 405825.318006 708422.068164 +I4-40 405755.09393 708418.627832 +I4-41 405886.612144 708421.35748 +I3-155 405869.81528 708421.604597 +I4-42 405931.079952 708711.689521 +I4-43 405938.160717 708754.629069 +I3-156 405867.353398 708753.420084 +I3-157 405867.365202 708705.720019 +I3-158 405823.647125 708704.378142 +I3-154 405822.23047 708754.272102 +I3-193 405874.946418 706073.673934 +I4-50 406066.213321 707725.730461 +IM5-49 393180.525389 708165.351581 +OUT5 396632.527985 705551.146633 +OUT6 396638.009819 705321.624636 +OUT7 396657.077067 705516.348905 +OUT8 398516.550836 705369.471511 +OUT9 398529.778739 705346.352473 +OUT40 407271.152094 705589.867456 +OUT41 407120.81139 705587.21828 +OUT42 405797.079296 705562.771113 +OUT43 405869.073563 705561.821648 +OUT4 393177.45768 709024.309914 + +[INFLOWS] +;; Param Units Scale Baseline Baseline +;;Node Parameter Time Series Type Factor Factor Value Pattern +;;-------------- ---------------- ---------------- -------- -------- -------- -------- -------- + +[TIMESERIES] +;;Name Date Time Value +;;-------------- ---------- ---------- ---------- + +[PATTERNS] +;;Name Type Multipliers +;;-------------- ---------- ----------- + +[CONTROLS] \ No newline at end of file diff --git a/test/CompletedProjects/SelfHelpKit/SDCLOGGING.DAT b/test/CompletedProjects/SelfHelpKit/SDCLOGGING.DAT index 98f45374..26a37687 100644 --- a/test/CompletedProjects/SelfHelpKit/SDCLOGGING.DAT +++ b/test/CompletedProjects/SelfHelpKit/SDCLOGGING.DAT @@ -1,22 +1,22 @@ -D 34936 I1-35-31-18 20 0.5 -D 35151 I1-35-32-54 20 0.5 -D 13884 I1-36-30-36 20 0.5 -D 17120 I1-36-30-44 20 0.5 -D 17098 I1-36-30-45 20 0.5 -D 26192 I1-36-31-133 20 0.5 -D 25989 I1-36-31-136 20 0.5 -D 25784 I1-36-31-141 20 0.5 -D 25978 I1-36-31-146 20 0.5 -D 26177 I1-36-31-151 20 0.5 -D 26367 I1-36-31-155 20 0.5 -D 26368 I1-36-31-156 20 0.5 -D 34926 I1-36-31-176 20 0.5 -D 34923 I1-36-31-177 20 0.5 -D 34696 I1-36-31-179 20 0.5 -D 34674 I1-36-31-180 20 0.5 -D 34655 I1-36-31-181 20 0.5 -D 25925 I1-36-31-33 20 0.5 -D 17446 I1-36-31-34 20 0.5 -D 17449 I1-36-31-35 20 0.5 -D 17476 I1-36-31-40 20 0.5 -D 17831 I1-36-31-41 20 0.5 +D 34936 I1-35-31-18 20.00 0.50 +D 35151 I1-35-32-54 20.00 0.50 +D 13884 I1-36-30-36 20.00 0.50 +D 17120 I1-36-30-44 20.00 0.50 +D 17098 I1-36-30-45 20.00 0.50 +D 26192 I1-36-31-133 20.00 0.50 +D 25989 I1-36-31-136 20.00 0.50 +D 25784 I1-36-31-141 20.00 0.50 +D 25978 I1-36-31-146 20.00 0.50 +D 26177 I1-36-31-151 20.00 0.50 +D 26367 I1-36-31-155 20.00 0.50 +D 26368 I1-36-31-156 20.00 0.50 +D 34926 I1-36-31-176 20.00 0.50 +D 34923 I1-36-31-177 20.00 0.50 +D 34696 I1-36-31-179 20.00 0.50 +D 34674 I1-36-31-180 20.00 0.50 +D 34655 I1-36-31-181 20.00 0.50 +D 25925 I1-36-31-33 20.00 0.50 +D 17446 I1-36-31-34 20.00 0.50 +D 17449 I1-36-31-35 20.00 0.50 +D 17476 I1-36-31-40 20.00 0.50 +D 17831 I1-36-31-41 20.00 0.50 \ No newline at end of file diff --git a/test/CompletedProjects/SelfHelpKit/SWMM.INI b/test/CompletedProjects/SelfHelpKit/SWMM.INI deleted file mode 100644 index 5543cecc..00000000 --- a/test/CompletedProjects/SelfHelpKit/SWMM.INI +++ /dev/null @@ -1,5 +0,0 @@ -[SWMM5] -Version=50022 -[Results] -Saved=1 -Current=1 \ No newline at end of file diff --git a/test/CompletedProjects/SelfHelpKit/SWMMFLODROPBOX.DAT b/test/CompletedProjects/SelfHelpKit/SWMMFLODROPBOX.DAT index ee6cbfd3..dfe12d9a 100644 --- a/test/CompletedProjects/SelfHelpKit/SWMMFLODROPBOX.DAT +++ b/test/CompletedProjects/SelfHelpKit/SWMMFLODROPBOX.DAT @@ -1,17 +1,17 @@ -I3-37-32-50 41236 16.00 -I3-37-32-51 39928 16.00 -I3-37-32-49 43404 16.00 -I3-37-32-48 38644 16.00 -I3-36-31-168 25767 16.00 -I3-36-31-165 25757 16.00 -I3-36-31-167 25762 16.00 -I3-38-32-37 41862 16.00 -I3-38-32-36 47513 16.00 -I3-36-31-173 25747 32.00 -I3-36-31-171 25737 16.00 -I3-37-31-24 31238 10.00 -I3-37-31-42-3 35044 18.00 -I3-37-31-15 17596 48.00 +I3-36-31-165 25757 16.00 +I3-36-31-167 25762 16.00 +I3-36-31-168 25767 16.00 +I3-36-31-171 25737 16.00 +I3-36-31-173 25747 32.00 +I3-37-31-15 17596 48.00 +I3-37-31-24 31238 10.00 +I3-37-31-42-3 35044 18.00 +I3-37-32-48 38644 16.00 +I3-37-32-49 43404 16.00 +I3-37-32-50 41236 16.00 +I3-37-32-51 39928 16.00 +I3-38-32-36 47513 16.00 +I3-38-32-37 41862 16.00 Ids1 6357 36.00 Ids2 7046 36.00 Ids3 8086 36.00 diff --git a/test/data/import/MULT.DAT b/test/data/import/MULT.DAT index e031e84c..60e396b8 100644 --- a/test/data/import/MULT.DAT +++ b/test/data/import/MULT.DAT @@ -1,4 +1,4 @@ -15 1 1 0.060 0.005 0.009 0.00 0.00 +15 1 1 1 0.060 0.005 0.009 0.00 2 50 6 1 0.055 27 20 3 1 0.06 28 20 3 1 0.06 diff --git a/test/data/import_2/MULT.DAT b/test/data/import_2/MULT.DAT index 77e5f96d..3c8194ba 100644 --- a/test/data/import_2/MULT.DAT +++ b/test/data/import_2/MULT.DAT @@ -1,236 +1,236 @@ 0.0 3.0 1.0 1 0.04 0.0 0.0 0.0 - 602 5.1 2.00 0.035 - 663 5.1 2.00 0.035 - 726 5.1 2.00 0.035 - 790 5.1 2.00 0.035 - 791 5.1 2.00 0.035 - 858 5.1 2.00 0.035 - 859 5.1 2.00 0.035 - 929 5.1 2.00 0.035 - 930 5.1 2.00 0.035 - 1004 5.1 2.00 0.035 - 1080 5.1 2.00 0.035 - 1156 5.1 2.00 0.035 - 1157 5.1 2.00 0.035 - 1233 5.1 2.00 0.035 - 1308 5.1 2.00 0.035 - 1309 5.1 2.00 0.035 - 1383 5.1 2.00 0.035 - 1384 5.1 2.00 0.035 - 1459 5.1 2.00 0.035 - 1460 5.1 2.00 0.035 - 1536 5.1 2.00 0.035 - 1537 5.1 2.00 0.035 - 1614 5.1 2.00 0.035 - 1615 5.1 2.00 0.035 - 1693 5.1 2.00 0.035 - 1694 5.1 2.00 0.035 - 1774 5.1 2.00 0.035 - 1775 5.1 2.00 0.035 - 1776 5.1 2.00 0.035 - 1777 5.1 2.00 0.035 - 1857 5.1 2.00 0.035 - 1858 5.1 2.00 0.035 - 1949 5.1 2.00 0.035 - 1950 5.1 2.00 0.035 - 2055 5.1 2.00 0.035 - 2056 5.1 2.00 0.035 - 2057 5.1 2.00 0.035 - 2058 5.1 2.00 0.035 - 2175 5.1 2.00 0.035 - 2176 5.1 2.00 0.035 - 2177 5.1 2.00 0.035 - 2298 5.1 2.00 0.035 - 2299 5.1 2.00 0.035 - 2300 5.1 2.00 0.035 - 2444 5.1 2.00 0.035 - 2445 5.1 2.00 0.035 - 2590 5.1 2.00 0.035 - 2736 5.1 2.00 0.035 - 2884 5.1 2.00 0.035 - 3033 5.1 2.00 0.035 - 3184 5.1 2.00 0.035 - 3335 5.1 2.00 0.035 - 3486 5.1 2.00 0.035 - 3637 5.1 2.00 0.035 - 3788 5.1 2.00 0.035 - 3789 5.1 2.00 0.035 - 3939 5.1 2.00 0.035 - 3940 5.1 2.00 0.035 - 3941 5.1 2.00 0.035 - 4090 5.1 2.00 0.035 - 4091 5.1 2.00 0.035 - 4092 5.1 2.00 0.035 - 4093 5.1 2.00 0.035 - 4241 5.1 2.00 0.035 - 4242 5.1 2.00 0.035 - 4390 5.1 2.00 0.035 - 4391 5.1 2.00 0.035 - 4540 5.1 2.00 0.035 - 4541 5.1 2.00 0.035 - 4542 5.1 2.00 0.035 - 4692 5.1 2.00 0.035 - 4693 5.1 2.00 0.035 - 4694 5.1 2.00 0.035 - 4695 5.1 2.00 0.035 - 4696 5.1 2.00 0.035 - 4697 5.1 2.00 0.035 - 4698 5.1 2.00 0.035 - 4699 5.1 2.00 0.035 - 4700 5.1 2.00 0.035 - 4701 5.1 2.00 0.035 - 4702 5.1 2.00 0.035 - 4703 5.1 2.00 0.035 - 4704 5.1 2.00 0.035 - 4705 5.1 2.00 0.035 - 4706 5.1 2.00 0.035 - 4707 5.1 2.00 0.035 - 4708 5.1 2.00 0.035 - 4859 5.1 2.00 0.035 - 4860 5.1 2.00 0.035 - 4862 5.1 2.00 0.035 - 4863 5.1 2.00 0.035 - 4864 5.1 2.00 0.035 - 4865 5.1 2.00 0.035 - 4866 5.1 2.00 0.035 - 4867 5.1 2.00 0.035 - 4868 5.1 2.00 0.035 - 4873 5.1 2.00 0.035 - 4874 5.1 2.00 0.035 - 4875 5.1 2.00 0.035 - 4876 5.1 2.00 0.035 - 4877 5.1 2.00 0.035 - 5012 5.1 2.00 0.035 - 5013 5.1 2.00 0.035 - 5014 5.1 2.00 0.035 - 5017 5.1 2.00 0.035 - 5020 5.1 2.00 0.035 - 5021 5.1 2.00 0.035 - 5022 5.1 2.00 0.035 - 5023 5.1 2.00 0.035 - 5024 5.1 2.00 0.035 - 5025 5.1 2.00 0.035 - 5029 5.1 2.00 0.035 - 5030 5.1 2.00 0.035 - 5183 5.1 2.00 0.035 - 5184 5.1 2.00 0.035 - 5185 5.1 2.00 0.035 - 5186 5.1 2.00 0.035 - 5199 5.1 2.00 0.035 - 5200 5.1 2.00 0.035 - 5347 5.1 2.00 0.035 - 5348 5.1 2.00 0.035 - 5349 5.1 2.00 0.035 - 5350 5.1 2.00 0.035 - 5351 5.1 2.00 0.035 - 5352 5.1 2.00 0.035 - 5353 5.1 2.00 0.035 - 5355 5.1 2.00 0.035 - 5356 5.1 2.00 0.035 - 5357 5.1 2.00 0.035 - 5358 5.1 2.00 0.035 - 5359 5.1 2.00 0.035 - 5360 5.1 2.00 0.035 - 5361 5.1 2.00 0.035 - 5517 5.1 2.00 0.035 - 5518 5.1 2.00 0.035 - 5519 5.1 2.00 0.035 - 5525 5.1 2.00 0.035 - 5526 5.1 2.00 0.035 - 5527 5.1 2.00 0.035 - 5528 5.1 2.00 0.035 - 5700 5.1 2.00 0.035 - 5701 5.1 2.00 0.035 - 5702 5.1 2.00 0.035 - 5879 5.1 2.00 0.035 - 5880 5.1 2.00 0.035 - 5888 5.1 2.00 0.035 - 5889 5.1 2.00 0.035 - 5890 5.1 2.00 0.035 - 5891 5.1 2.00 0.035 - 5892 5.1 2.00 0.035 - 5893 5.1 2.00 0.035 - 5894 5.1 2.00 0.035 - 5895 5.1 2.00 0.035 - 5896 5.1 2.00 0.035 - 5897 5.1 2.00 0.035 - 5898 5.1 2.00 0.035 - 6061 5.1 2.00 0.035 - 6062 5.1 2.00 0.035 - 6065 5.1 2.00 0.035 - 6066 5.1 2.00 0.035 - 6067 5.1 2.00 0.035 - 6068 5.1 2.00 0.035 - 6078 5.1 2.00 0.035 - 6079 5.1 2.00 0.035 - 6244 5.1 2.00 0.035 - 6245 5.1 2.00 0.035 - 6246 5.1 2.00 0.035 - 6247 5.1 2.00 0.035 - 6261 5.1 2.00 0.035 - 6262 5.1 2.00 0.035 - 6263 5.1 2.00 0.035 - 6264 5.1 2.00 0.035 - 6265 5.1 2.00 0.035 - 6448 5.1 2.00 0.035 - 6449 5.1 2.00 0.035 - 6634 5.1 2.00 0.035 - 6635 5.1 2.00 0.035 - 6636 5.1 2.00 0.035 - 6637 5.1 2.00 0.035 - 6638 5.1 2.00 0.035 - 6639 5.1 2.00 0.035 - 6640 5.1 2.00 0.035 - 6641 5.1 2.00 0.035 - 6825 5.1 2.00 0.035 - 6826 5.1 2.00 0.035 - 7007 5.1 2.00 0.035 - 7008 5.1 2.00 0.035 - 7009 5.1 2.00 0.035 - 7010 5.1 2.00 0.035 - 7186 5.1 2.00 0.035 - 7187 5.1 2.00 0.035 - 7188 5.1 2.00 0.035 - 7189 5.1 2.00 0.035 - 7365 5.1 2.00 0.035 - 7366 5.1 2.00 0.035 - 7533 5.1 2.00 0.035 - 7534 5.1 2.00 0.035 - 7690 5.1 2.00 0.035 - 7836 5.1 2.00 0.035 - 7837 5.1 2.00 0.035 - 7838 5.1 2.00 0.035 - 7976 5.1 2.00 0.035 - 7977 5.1 2.00 0.035 - 8106 5.1 2.00 0.035 - 8107 5.1 2.00 0.035 - 8232 5.1 2.00 0.035 - 8233 5.1 2.00 0.035 - 8234 5.1 2.00 0.035 - 8235 5.1 2.00 0.035 - 8356 5.1 2.00 0.035 - 8357 5.1 2.00 0.035 - 8358 5.1 2.00 0.035 - 8359 5.1 2.00 0.035 - 8478 5.1 2.00 0.035 - 8479 5.1 2.00 0.035 - 8480 5.1 2.00 0.035 - 8481 5.1 2.00 0.035 - 8599 5.1 2.00 0.035 - 8600 5.1 2.00 0.035 - 8601 5.1 2.00 0.035 - 8708 5.1 2.00 0.035 - 8709 5.1 2.00 0.035 - 8804 5.1 2.00 0.035 - 8805 5.1 2.00 0.035 - 8884 5.1 2.00 0.035 - 8885 5.1 2.00 0.035 - 8886 5.1 2.00 0.035 - 8887 5.1 2.00 0.035 - 8936 5.1 2.00 0.035 - 8937 5.1 2.00 0.035 - 8938 5.1 2.00 0.035 - 8973 5.1 2.00 0.035 - 8974 5.1 2.00 0.035 - 8975 5.1 2.00 0.035 - 8976 5.1 2.00 0.035 + 602 5.1 2.00 0 0.035 + 663 5.1 2.00 0 0.035 + 726 5.1 2.00 0 0.035 + 790 5.1 2.00 0 0.035 + 791 5.1 2.00 0 0.035 + 858 5.1 2.00 0 0.035 + 859 5.1 2.00 0 0.035 + 929 5.1 2.00 0 0.035 + 930 5.1 2.00 0 0.035 + 1004 5.1 2.00 0 0.035 + 1080 5.1 2.00 0 0.035 + 1156 5.1 2.00 0 0.035 + 1157 5.1 2.00 0 0.035 + 1233 5.1 2.00 0 0.035 + 1308 5.1 2.00 0 0.035 + 1309 5.1 2.00 0 0.035 + 1383 5.1 2.00 0 0.035 + 1384 5.1 2.00 0 0.035 + 1459 5.1 2.00 0 0.035 + 1460 5.1 2.00 0 0.035 + 1536 5.1 2.00 0 0.035 + 1537 5.1 2.00 0 0.035 + 1614 5.1 2.00 0 0.035 + 1615 5.1 2.00 0 0.035 + 1693 5.1 2.00 0 0.035 + 1694 5.1 2.00 0 0.035 + 1774 5.1 2.00 0 0.035 + 1775 5.1 2.00 0 0.035 + 1776 5.1 2.00 0 0.035 + 1777 5.1 2.00 0 0.035 + 1857 5.1 2.00 0 0.035 + 1858 5.1 2.00 0 0.035 + 1949 5.1 2.00 0 0.035 + 1950 5.1 2.00 0 0.035 + 2055 5.1 2.00 0 0.035 + 2056 5.1 2.00 0 0.035 + 2057 5.1 2.00 0 0.035 + 2058 5.1 2.00 0 0.035 + 2175 5.1 2.00 0 0.035 + 2176 5.1 2.00 0 0.035 + 2177 5.1 2.00 0 0.035 + 2298 5.1 2.00 0 0.035 + 2299 5.1 2.00 0 0.035 + 2300 5.1 2.00 0 0.035 + 2444 5.1 2.00 0 0.035 + 2445 5.1 2.00 0 0.035 + 2590 5.1 2.00 0 0.035 + 2736 5.1 2.00 0 0.035 + 2884 5.1 2.00 0 0.035 + 3033 5.1 2.00 0 0.035 + 3184 5.1 2.00 0 0.035 + 3335 5.1 2.00 0 0.035 + 3486 5.1 2.00 0 0.035 + 3637 5.1 2.00 0 0.035 + 3788 5.1 2.00 0 0.035 + 3789 5.1 2.00 0 0.035 + 3939 5.1 2.00 0 0.035 + 3940 5.1 2.00 0 0.035 + 3941 5.1 2.00 0 0.035 + 4090 5.1 2.00 0 0.035 + 4091 5.1 2.00 0 0.035 + 4092 5.1 2.00 0 0.035 + 4093 5.1 2.00 0 0.035 + 4241 5.1 2.00 0 0.035 + 4242 5.1 2.00 0 0.035 + 4390 5.1 2.00 0 0.035 + 4391 5.1 2.00 0 0.035 + 4540 5.1 2.00 0 0.035 + 4541 5.1 2.00 0 0.035 + 4542 5.1 2.00 0 0.035 + 4692 5.1 2.00 0 0.035 + 4693 5.1 2.00 0 0.035 + 4694 5.1 2.00 0 0.035 + 4695 5.1 2.00 0 0.035 + 4696 5.1 2.00 0 0.035 + 4697 5.1 2.00 0 0.035 + 4698 5.1 2.00 0 0.035 + 4699 5.1 2.00 0 0.035 + 4700 5.1 2.00 0 0.035 + 4701 5.1 2.00 0 0.035 + 4702 5.1 2.00 0 0.035 + 4703 5.1 2.00 0 0.035 + 4704 5.1 2.00 0 0.035 + 4705 5.1 2.00 0 0.035 + 4706 5.1 2.00 0 0.035 + 4707 5.1 2.00 0 0.035 + 4708 5.1 2.00 0 0.035 + 4859 5.1 2.00 0 0.035 + 4860 5.1 2.00 0 0.035 + 4862 5.1 2.00 0 0.035 + 4863 5.1 2.00 0 0.035 + 4864 5.1 2.00 0 0.035 + 4865 5.1 2.00 0 0.035 + 4866 5.1 2.00 0 0.035 + 4867 5.1 2.00 0 0.035 + 4868 5.1 2.00 0 0.035 + 4873 5.1 2.00 0 0.035 + 4874 5.1 2.00 0 0.035 + 4875 5.1 2.00 0 0.035 + 4876 5.1 2.00 0 0.035 + 4877 5.1 2.00 0 0.035 + 5012 5.1 2.00 0 0.035 + 5013 5.1 2.00 0 0.035 + 5014 5.1 2.00 0 0.035 + 5017 5.1 2.00 0 0.035 + 5020 5.1 2.00 0 0.035 + 5021 5.1 2.00 0 0.035 + 5022 5.1 2.00 0 0.035 + 5023 5.1 2.00 0 0.035 + 5024 5.1 2.00 0 0.035 + 5025 5.1 2.00 0 0.035 + 5029 5.1 2.00 0 0.035 + 5030 5.1 2.00 0 0.035 + 5183 5.1 2.00 0 0.035 + 5184 5.1 2.00 0 0.035 + 5185 5.1 2.00 0 0.035 + 5186 5.1 2.00 0 0.035 + 5199 5.1 2.00 0 0.035 + 5200 5.1 2.00 0 0.035 + 5347 5.1 2.00 0 0.035 + 5348 5.1 2.00 0 0.035 + 5349 5.1 2.00 0 0.035 + 5350 5.1 2.00 0 0.035 + 5351 5.1 2.00 0 0.035 + 5352 5.1 2.00 0 0.035 + 5353 5.1 2.00 0 0.035 + 5355 5.1 2.00 0 0.035 + 5356 5.1 2.00 0 0.035 + 5357 5.1 2.00 0 0.035 + 5358 5.1 2.00 0 0.035 + 5359 5.1 2.00 0 0.035 + 5360 5.1 2.00 0 0.035 + 5361 5.1 2.00 0 0.035 + 5517 5.1 2.00 0 0.035 + 5518 5.1 2.00 0 0.035 + 5519 5.1 2.00 0 0.035 + 5525 5.1 2.00 0 0.035 + 5526 5.1 2.00 0 0.035 + 5527 5.1 2.00 0 0.035 + 5528 5.1 2.00 0 0.035 + 5700 5.1 2.00 0 0.035 + 5701 5.1 2.00 0 0.035 + 5702 5.1 2.00 0 0.035 + 5879 5.1 2.00 0 0.035 + 5880 5.1 2.00 0 0.035 + 5888 5.1 2.00 0 0.035 + 5889 5.1 2.00 0 0.035 + 5890 5.1 2.00 0 0.035 + 5891 5.1 2.00 0 0.035 + 5892 5.1 2.00 0 0.035 + 5893 5.1 2.00 0 0.035 + 5894 5.1 2.00 0 0.035 + 5895 5.1 2.00 0 0.035 + 5896 5.1 2.00 0 0.035 + 5897 5.1 2.00 0 0.035 + 5898 5.1 2.00 0 0.035 + 6061 5.1 2.00 0 0.035 + 6062 5.1 2.00 0 0.035 + 6065 5.1 2.00 0 0.035 + 6066 5.1 2.00 0 0.035 + 6067 5.1 2.00 0 0.035 + 6068 5.1 2.00 0 0.035 + 6078 5.1 2.00 0 0.035 + 6079 5.1 2.00 0 0.035 + 6244 5.1 2.00 0 0.035 + 6245 5.1 2.00 0 0.035 + 6246 5.1 2.00 0 0.035 + 6247 5.1 2.00 0 0.035 + 6261 5.1 2.00 0 0.035 + 6262 5.1 2.00 0 0.035 + 6263 5.1 2.00 0 0.035 + 6264 5.1 2.00 0 0.035 + 6265 5.1 2.00 0 0.035 + 6448 5.1 2.00 0 0.035 + 6449 5.1 2.00 0 0.035 + 6634 5.1 2.00 0 0.035 + 6635 5.1 2.00 0 0.035 + 6636 5.1 2.00 0 0.035 + 6637 5.1 2.00 0 0.035 + 6638 5.1 2.00 0 0.035 + 6639 5.1 2.00 0 0.035 + 6640 5.1 2.00 0 0.035 + 6641 5.1 2.00 0 0.035 + 6825 5.1 2.00 0 0.035 + 6826 5.1 2.00 0 0.035 + 7007 5.1 2.00 0 0.035 + 7008 5.1 2.00 0 0.035 + 7009 5.1 2.00 0 0.035 + 7010 5.1 2.00 0 0.035 + 7186 5.1 2.00 0 0.035 + 7187 5.1 2.00 0 0.035 + 7188 5.1 2.00 0 0.035 + 7189 5.1 2.00 0 0.035 + 7365 5.1 2.00 0 0.035 + 7366 5.1 2.00 0 0.035 + 7533 5.1 2.00 0 0.035 + 7534 5.1 2.00 0 0.035 + 7690 5.1 2.00 0 0.035 + 7836 5.1 2.00 0 0.035 + 7837 5.1 2.00 0 0.035 + 7838 5.1 2.00 0 0.035 + 7976 5.1 2.00 0 0.035 + 7977 5.1 2.00 0 0.035 + 8106 5.1 2.00 0 0.035 + 8107 5.1 2.00 0 0.035 + 8232 5.1 2.00 0 0.035 + 8233 5.1 2.00 0 0.035 + 8234 5.1 2.00 0 0.035 + 8235 5.1 2.00 0 0.035 + 8356 5.1 2.00 0 0.035 + 8357 5.1 2.00 0 0.035 + 8358 5.1 2.00 0 0.035 + 8359 5.1 2.00 0 0.035 + 8478 5.1 2.00 0 0.035 + 8479 5.1 2.00 0 0.035 + 8480 5.1 2.00 0 0.035 + 8481 5.1 2.00 0 0.035 + 8599 5.1 2.00 0 0.035 + 8600 5.1 2.00 0 0.035 + 8601 5.1 2.00 0 0.035 + 8708 5.1 2.00 0 0.035 + 8709 5.1 2.00 0 0.035 + 8804 5.1 2.00 0 0.035 + 8805 5.1 2.00 0 0.035 + 8884 5.1 2.00 0 0.035 + 8885 5.1 2.00 0 0.035 + 8886 5.1 2.00 0 0.035 + 8887 5.1 2.00 0 0.035 + 8936 5.1 2.00 0 0.035 + 8937 5.1 2.00 0 0.035 + 8938 5.1 2.00 0 0.035 + 8973 5.1 2.00 0 0.035 + 8974 5.1 2.00 0 0.035 + 8975 5.1 2.00 0 0.035 + 8976 5.1 2.00 0 0.035 \ No newline at end of file diff --git a/test/test_flo2dcoastal.py b/test/test_flo2dcoastal.py index b75b7e10..b7716706 100644 --- a/test/test_flo2dcoastal.py +++ b/test/test_flo2dcoastal.py @@ -144,22 +144,33 @@ def test_rain(self): in_lines, out_lines = compare_files(infile, outfile) self.assertEqual(in_lines, out_lines) - # def test_swmminp(self): - # """Testing the SWMMINP Import/Export""" - # file = IMPORT_DATA_DIR + r"\SWMM.INP" - # if os.path.isfile(file): - # f2d_plot = PlotWidget() - # f2g_table = TableEditorWidget(f2g.iface, f2d_plot, f2g.lyrs) - # sd = StormDrainEditorWidget(f2g.iface, f2d_plot, f2g_table, f2g.lyrs) - # StormDrainEditorWidget.import_storm_drain_INP_file(sd, mode=file, show_end_message=True) - # StormDrainEditorWidget.export_storm_drain_INP_file(specific_path=EXPORT_DATA_DIR) - # outfile = os.path.join(EXPORT_DATA_DIR, "SWMM.INP") - # in_lines, out_lines = compare_files(file, outfile) - # self.assertEqual(in_lines, out_lines) - # else: - # self.skipTest("Project does not have SWMM.INP") - - @unittest.skip("Storm Drain tests needs to be updated") + def test_swmminp(self): + self.f2g.import_swmminp() + # Number of inlets + n_inlets = self.f2g.execute("""SELECT COUNT(fid) FROM user_swmm_inlets_junctions WHERE sd_type = 'I';""").fetchone()[0] + self.assertEqual(n_inlets, 283) + # Number of junctions + n_junctions = self.f2g.execute("""SELECT COUNT(fid) FROM user_swmm_inlets_junctions WHERE sd_type = 'J';""").fetchone()[0] + self.assertEqual(n_junctions, 1) + # Number of junctions & inlets + n_inlets_junctions = self.f2g.execute("""SELECT COUNT(fid) FROM user_swmm_inlets_junctions;""").fetchone()[0] + self.assertEqual(n_inlets_junctions, 284) + # Number of outfalls: + n_outfalls = self.f2g.execute("""SELECT COUNT(fid) FROM user_swmm_outlets;""").fetchone()[0] + self.assertEqual(n_outfalls, 10) + # Number of conduits + n_conduits = self.f2g.execute("""SELECT COUNT(fid) FROM user_swmm_conduits;""").fetchone()[0] + self.assertEqual(n_conduits, 284) + # Number of RT + n_rt = self.f2g.execute("""SELECT COUNT(fid) FROM swmmflort;""").fetchone()[0] + self.assertEqual(n_rt, 59) + # Number of RT data + n_rt_data = self.f2g.execute("""SELECT COUNT(fid) FROM swmmflort_data;""").fetchone()[0] + self.assertEqual(n_rt_data, 437) + # Number of SD CONTROL + n_control = self.f2g.execute("""SELECT COUNT(fid) FROM swmm_control;""").fetchone()[0] + self.assertEqual(n_control, 32) + def test_swmmflo(self): self.f2g.import_swmmflo() self.f2g.export_swmmflo(EXPORT_DATA_DIR) @@ -168,8 +179,8 @@ def test_swmmflo(self): in_lines, out_lines = compare_files(infile, outfile) self.assertEqual(in_lines, out_lines) - @unittest.skip("Storm Drain tests needs to be updated") def test_swmmflort(self): + self.f2g.import_swmminp() self.f2g.import_swmmflort() self.f2g.export_swmmflort(EXPORT_DATA_DIR) infile = self.f2g.parser.dat_files["SWMMFLORT.DAT"] @@ -177,7 +188,6 @@ def test_swmmflort(self): in_lines, out_lines = compare_files(infile, outfile) self.assertEqual(in_lines, out_lines) - @unittest.skip("Storm Drain tests needs to be updated") def test_swmmoutf(self): self.f2g.import_swmmoutf() self.f2g.export_swmmoutf(EXPORT_DATA_DIR) diff --git a/test/test_flo2dgeopackage.py b/test/test_flo2dgeopackage.py index 234cee50..7a438d11 100644 --- a/test/test_flo2dgeopackage.py +++ b/test/test_flo2dgeopackage.py @@ -267,7 +267,6 @@ def test_import_fpfroude(self): count = self.f2g.execute("""SELECT COUNT(fid) FROM fpfroude;""").fetchone()[0] self.assertEqual(count, 8) - @unittest.skip("Storm Drain tests needs to be updated") def test_import_swmmflo(self): self.f2g.import_swmmflo() count = self.f2g.execute("""SELECT COUNT(fid) FROM swmmflo;""").fetchone()[0] @@ -275,14 +274,13 @@ def test_import_swmmflo(self): length = self.f2g.execute("""SELECT MAX(swmm_length) FROM swmmflo;""").fetchone()[0] self.assertEqual(length, 20) - @unittest.skip("Storm Drain tests needs to be updated") def test_import_swmmflort(self): self.f2g.import_swmmflort() fids = self.f2g.execute("""SELECT fid FROM swmmflort;""").fetchall() dist_fids = self.f2g.execute("""SELECT DISTINCT swmm_rt_fid FROM swmmflort_data;""").fetchall() self.assertListEqual(fids, dist_fids) - @unittest.skip("Storm Drain tests needs to be updated") + def test_import_swmmoutf(self): self.f2g.import_swmmoutf() expected = [(1492, "OUTFALL1", 1)] @@ -469,7 +467,6 @@ def test_export_fpfroude(self): in_len, out_len = file_len(infile), file_len(outfile) self.assertEqual(in_len, out_len) - @unittest.skip("Storm Drain tests needs to be updated") def test_export_swmmflo(self): self.f2g.import_swmmflo() self.f2g.export_swmmflo(EXPORT_DATA_DIR) @@ -478,16 +475,15 @@ def test_export_swmmflo(self): in_len, out_len = file_len(infile), file_len(outfile) self.assertEqual(in_len, out_len) - @unittest.skip("Storm Drain tests needs to be updated") - def test_export_swmmflort(self): - self.f2g.import_swmmflort() - self.f2g.export_swmmflort(EXPORT_DATA_DIR) - infile = self.f2g.parser.dat_files["SWMMFLORT.DAT"] - outfile = export_paths(infile) - in_len, out_len = file_len(infile), file_len(outfile) - self.assertEqual(in_len, out_len) + # @unittest.skip("This dataset does not have a .INP file.") + # def test_export_swmmflort(self): + # self.f2g.import_swmmflort() + # self.f2g.export_swmmflort(EXPORT_DATA_DIR) + # infile = self.f2g.parser.dat_files["SWMMFLORT.DAT"] + # outfile = export_paths(infile) + # in_len, out_len = file_len(infile), file_len(outfile) + # self.assertEqual(in_len, out_len) - @unittest.skip("Storm Drain tests needs to be updated") def test_export_swmmoutf(self): self.f2g.import_swmmoutf() self.f2g.export_swmmoutf(EXPORT_DATA_DIR) diff --git a/test/test_flo2dselfhelpkit.py b/test/test_flo2dselfhelpkit.py index af19116d..8ad50676 100644 --- a/test/test_flo2dselfhelpkit.py +++ b/test/test_flo2dselfhelpkit.py @@ -48,6 +48,7 @@ def setUpClass(cls): cls.f2g.disable_geom_triggers() cls.f2g.set_parser(CONT) cls.f2g.import_mannings_n_topo() + cls.f2g.import_swmminp() @classmethod def tearDownClass(cls): @@ -152,22 +153,54 @@ def test_rain(self): in_lines, out_lines = compare_files(infile, outfile) self.assertEqual(in_lines, out_lines) - # def test_swmminp(self): - # """Testing the SWMMINP Import/Export""" - # file = IMPORT_DATA_DIR + r"\SWMM.INP" - # if os.path.isfile(file): - # f2d_plot = PlotWidget() - # f2g_table = TableEditorWidget(f2g.iface, f2d_plot, f2g.lyrs) - # sd = StormDrainEditorWidget(f2g.iface, f2d_plot, f2g_table, f2g.lyrs) - # StormDrainEditorWidget.import_storm_drain_INP_file(sd, mode=file, show_end_message=True) - # StormDrainEditorWidget.export_storm_drain_INP_file(specific_path=EXPORT_DATA_DIR) - # outfile = os.path.join(EXPORT_DATA_DIR, "SWMM.INP") - # in_lines, out_lines = compare_files(file, outfile) - # self.assertEqual(in_lines, out_lines) - # else: - # self.skipTest("Project does not have SWMM.INP") - - @unittest.skip("Storm Drain tests needs to be updated") + def test_swmminp(self): + self.f2g.import_swmminp() + # Number of inlets + n_inlets = self.f2g.execute("""SELECT COUNT(fid) FROM user_swmm_inlets_junctions WHERE sd_type = 'I';""").fetchone()[0] + self.assertEqual(n_inlets, 182) + # Number of junctions + n_junctions = self.f2g.execute("""SELECT COUNT(fid) FROM user_swmm_inlets_junctions WHERE sd_type = 'J';""").fetchone()[0] + self.assertEqual(n_junctions, 88) + # Number of junctions & inlets + n_inlets_junctions = self.f2g.execute("""SELECT COUNT(fid) FROM user_swmm_inlets_junctions;""").fetchone()[0] + self.assertEqual(n_inlets_junctions, 270) + # Number of outfalls: + n_outfalls = self.f2g.execute("""SELECT COUNT(fid) FROM user_swmm_outlets;""").fetchone()[0] + self.assertEqual(n_outfalls, 19) + # Number of conduits + n_conduits = self.f2g.execute("""SELECT COUNT(fid) FROM user_swmm_conduits;""").fetchone()[0] + self.assertEqual(n_conduits, 274) + # Number of storage + n_storage_units = self.f2g.execute("""SELECT COUNT(fid) FROM user_swmm_storage_units;""").fetchone()[0] + self.assertEqual(n_storage_units, 3) + # Number of pumps + n_pumps = self.f2g.execute("""SELECT COUNT(fid) FROM user_swmm_pumps;""").fetchone()[0] + self.assertEqual(n_pumps, 1) + # Number of orifices + n_orifices = self.f2g.execute("""SELECT COUNT(fid) FROM user_swmm_orifices;""").fetchone()[0] + self.assertEqual(n_orifices, 2) + # Number of weirs + n_weirs = self.f2g.execute("""SELECT COUNT(fid) FROM user_swmm_weirs;""").fetchone()[0] + self.assertEqual(n_weirs, 1) + # Number of RT + n_rt = self.f2g.execute("""SELECT COUNT(fid) FROM swmmflort;""").fetchone()[0] + self.assertEqual(n_rt, 1) + # Number of RT data + n_rt_data = self.f2g.execute("""SELECT COUNT(fid) FROM swmmflort_data;""").fetchone()[0] + self.assertEqual(n_rt_data, 14) + # Number of Culvert Equations + n_culverts = self.f2g.execute("""SELECT COUNT(fid) FROM swmmflo_culvert;""").fetchone()[0] + self.assertEqual(n_culverts, 5) + # Number of SD CONTROL + n_control = self.f2g.execute("""SELECT COUNT(fid) FROM swmm_control;""").fetchone()[0] + self.assertEqual(n_control, 32) + # # Number of Pump Curve + n_pump_curve = self.f2g.execute("""SELECT COUNT(fid) FROM swmm_pumps_curve_data;""").fetchone()[0] + self.assertEqual(n_pump_curve, 3) + # Number of Other Curve + n_other_curve = self.f2g.execute("""SELECT COUNT(fid) FROM swmm_other_curves;""").fetchone()[0] + self.assertEqual(n_other_curve, 8) + def test_sdclogging(self): self.f2g.import_sdclogging() self.f2g.export_sdclogging(EXPORT_DATA_DIR) @@ -176,7 +209,6 @@ def test_sdclogging(self): in_lines, out_lines = compare_files(infile, outfile) self.assertEqual(in_lines, out_lines) - @unittest.skip("Storm Drain tests needs to be updated") def test_swmmflo(self): self.f2g.import_swmmflo() self.f2g.export_swmmflo(EXPORT_DATA_DIR) @@ -185,7 +217,6 @@ def test_swmmflo(self): in_lines, out_lines = compare_files(infile, outfile) self.assertEqual(in_lines, out_lines) - @unittest.skip("Storm Drain tests needs to be updated") def test_swmmflodropbox(self): self.f2g.import_swmmflodropbox() self.f2g.export_swmmflodropbox(EXPORT_DATA_DIR) @@ -194,7 +225,6 @@ def test_swmmflodropbox(self): in_lines, out_lines = compare_files(infile, outfile) self.assertEqual(in_lines, out_lines) - @unittest.skip("Storm Drain tests needs to be updated") def test_swmmflort(self): self.f2g.import_swmmflort() self.f2g.export_swmmflort(EXPORT_DATA_DIR) @@ -203,7 +233,6 @@ def test_swmmflort(self): in_lines, out_lines = compare_files(infile, outfile) self.assertEqual(in_lines, out_lines) - @unittest.skip("Storm Drain tests needs to be updated") def test_swmmoutf(self): self.f2g.import_swmmoutf() self.f2g.export_swmmoutf(EXPORT_DATA_DIR)