diff --git a/src/Model/HydraulicStructures/Basic/HydraulicStructures.py b/src/Model/HydraulicStructures/Basic/HydraulicStructures.py index 28e6cda7..6572bd1e 100644 --- a/src/Model/HydraulicStructures/Basic/HydraulicStructures.py +++ b/src/Model/HydraulicStructures/Basic/HydraulicStructures.py @@ -161,7 +161,7 @@ class BasicHS(SQLSubModel): bhs.enabled = enabled - data['bhs_id'] = bhs_id + data['bhs_id'] = bhs_pid bhs._data = BHSValue._db_load( execute, data ) diff --git a/src/Model/HydraulicStructures/Basic/Types.py b/src/Model/HydraulicStructures/Basic/Types.py index 0182409b..b125541d 100644 --- a/src/Model/HydraulicStructures/Basic/Types.py +++ b/src/Model/HydraulicStructures/Basic/Types.py @@ -47,9 +47,9 @@ class DischargeWeir(BasicHS): self._type = "S1" self._data = [ - BHSValue("width", float, 1.0, status=status), - BHSValue("elevation", float, 1.0, status=status), - BHSValue("discharge_coefficient", float, 0.4, status=status), + BHSValue(-1, "width", float, 1.0, status=status), + BHSValue(-1, "elevation", float, 1.0, status=status), + BHSValue(-1, "discharge_coefficient", float, 0.4, status=status), ] @@ -63,11 +63,11 @@ class TrapezoidalWeir(BasicHS): self._type = "S2" self._data = [ - BHSValue("width", float, 1.0, status=status), - BHSValue("elevation", float, 1.0, status=status), - BHSValue("loading_elevation", float, 9999.999, status=status), - BHSValue("discharge_coefficient", float, 0.4, status=status), - BHSValue("half-angle_tangent", float, 0.0, status=status), + BHSValue(-1, "width", float, 1.0, status=status), + BHSValue(-1, "elevation", float, 1.0, status=status), + BHSValue(-1, "loading_elevation", float, 9999.999, status=status), + BHSValue(-1, "discharge_coefficient", float, 0.4, status=status), + BHSValue(-1, "half-angle_tangent", float, 0.0, status=status), ] @@ -81,10 +81,10 @@ class TriangularWeir(BasicHS): self._type = "S3" self._data = [ - BHSValue("elevation", float, 1.0, status=status), - BHSValue("loading_elevation", float, 9999.999, status=status), - BHSValue("discharge_coefficient", float, 0.4, status=status), - BHSValue("half-angle_tangent", float, 0.0, status=status), + BHSValue(-1, "elevation", float, 1.0, status=status), + BHSValue(-1, "loading_elevation", float, 9999.999, status=status), + BHSValue(-1, "discharge_coefficient", float, 0.4, status=status), + BHSValue(-1, "half-angle_tangent", float, 0.0, status=status), ] @@ -98,12 +98,12 @@ class RectangularOrifice(BasicHS): self._type = "OR" self._data = [ - BHSValue("width", float, 0.0, status=status), - BHSValue("elevation", float, 0.0, status=status), - BHSValue("loading_elevation", float, 9999.999, + BHSValue(-1, "width", float, 0.0, status=status), + BHSValue(-1, "elevation", float, 0.0, status=status), + BHSValue(-1, "loading_elevation", float, 9999.999, status=status), - BHSValue("discharge_coefficient", float, 0.4, status=status), - BHSValue("maximal_loading_elevation", float, 9999.999, + BHSValue(-1, "discharge_coefficient", float, 0.4, status=status), + BHSValue(-1, "maximal_loading_elevation", float, 9999.999, status=status), ] @@ -118,10 +118,10 @@ class CircularOrifice(BasicHS): self._type = "OC" self._data = [ - BHSValue("diameter", float, 0.0, status=status), - BHSValue("elevation", float, 0.0, status=status), - BHSValue("siltation_height", float, 0.0, status=status), - BHSValue("discharge_coefficient", float, 0.4, status=status), + BHSValue(-1, "diameter", float, 0.0, status=status), + BHSValue(-1, "elevation", float, 0.0, status=status), + BHSValue(-1, "siltation_height", float, 0.0, status=status), + BHSValue(-1, "discharge_coefficient", float, 0.4, status=status), ] @@ -135,11 +135,11 @@ class VaultedOrifice(BasicHS): self._type = "OV" self._data = [ - BHSValue("elevation", float, 1.0, status=status), - BHSValue("width", float, 1.0, status=status), - BHSValue("top_of_the_vault", float, 0.0, status=status), - BHSValue("bottom_of_the_vault", float, 0.0, status=status), - BHSValue("discharge_coefficient", float, 0.4, status=status), + BHSValue(-1, "elevation", float, 1.0, status=status), + BHSValue(-1, "width", float, 1.0, status=status), + BHSValue(-1, "top_of_the_vault", float, 0.0, status=status), + BHSValue(-1, "bottom_of_the_vault", float, 0.0, status=status), + BHSValue(-1, "discharge_coefficient", float, 0.4, status=status), ] @@ -153,11 +153,11 @@ class RectangularGate(BasicHS): self._type = "V1" self._data = [ - BHSValue("width", float, 1.0, status=status), - BHSValue("elevation", float, 0.0, status=status), - BHSValue("discharge coefficient", float, 0.4, status=status), - BHSValue("opening", float, 1.0, status=status), - BHSValue("maximal_opening", float, 1.0, status=status), + BHSValue(-1, "width", float, 1.0, status=status), + BHSValue(-1, "elevation", float, 0.0, status=status), + BHSValue(-1, "discharge coefficient", float, 0.4, status=status), + BHSValue(-1, "opening", float, 1.0, status=status), + BHSValue(-1, "maximal_opening", float, 1.0, status=status), ] @@ -171,11 +171,11 @@ class SimplifiedRectangularGate(BasicHS): self._type = "V2" self._data = [ - BHSValue("width", float, 1.0, status=status), - BHSValue("elevation", float, 0.0, status=status), - BHSValue("discharge coefficient", float, 0.4, status=status), - BHSValue("opening", float, 1.0, status=status), - BHSValue("maximal_opening", float, 1.0, status=status), + BHSValue(-1, "width", float, 1.0, status=status), + BHSValue(-1, "elevation", float, 0.0, status=status), + BHSValue(-1, "discharge coefficient", float, 0.4, status=status), + BHSValue(-1, "opening", float, 1.0, status=status), + BHSValue(-1, "maximal_opening", float, 1.0, status=status), ] @@ -189,9 +189,9 @@ class Borda(BasicHS): self._type = "BO" self._data = [ - BHSValue("step_space", float, 0.1, status=status), - BHSValue("weir", float, 0.15, status=status), - BHSValue("coefficient", float, 0.4, status=status), + BHSValue(-1, "step_space", float, 0.1, status=status), + BHSValue(-1, "weir", float, 0.15, status=status), + BHSValue(-1, "coefficient", float, 0.4, status=status), ] @@ -205,12 +205,12 @@ class CheckValve(BasicHS): self._type = "CV" self._data = [ - BHSValue("width", float, 0.0, status=status), - BHSValue("elevation", float, 0.0, status=status), - BHSValue("loading_elevation", float, 9999.999, + BHSValue(-1, "width", float, 0.0, status=status), + BHSValue(-1, "elevation", float, 0.0, status=status), + BHSValue(-1, "loading_elevation", float, 9999.999, status=status), - BHSValue("discharge_coefficient", float, 0.4, status=status), - BHSValue("maximal_loading_elevation", float, 9999.999, + BHSValue(-1, "discharge_coefficient", float, 0.4, status=status), + BHSValue(-1, "maximal_loading_elevation", float, 9999.999, status=status), ] @@ -225,11 +225,11 @@ class UserDefined(BasicHS): self._type = "UD" self._data = [ - BHSValue("parameter_1", float, 0.0, status=status), - BHSValue("parameter_2", float, 0.0, status=status), - BHSValue("parameter_3", float, 0.0, status=status), - BHSValue("parameter_4", float, 0.0, status=status), - BHSValue("parameter_5", float, 0.0, status=status), + BHSValue(-1, "parameter_1", float, 0.0, status=status), + BHSValue(-1, "parameter_2", float, 0.0, status=status), + BHSValue(-1, "parameter_3", float, 0.0, status=status), + BHSValue(-1, "parameter_4", float, 0.0, status=status), + BHSValue(-1, "parameter_5", float, 0.0, status=status), ] diff --git a/src/Model/Tools/PamhyrDB.py b/src/Model/Tools/PamhyrDB.py index 05c9a895..0bbb1f2c 100644 --- a/src/Model/Tools/PamhyrDB.py +++ b/src/Model/Tools/PamhyrDB.py @@ -216,7 +216,7 @@ class SQLSubModel(PamhyrID): node_id = next(it) if node_id == -1: - return + continue execute( f"UPDATE {table} " + @@ -236,7 +236,7 @@ class SQLSubModel(PamhyrID): reach_id = next(it) if reach_id == -1: - return + continue execute( f"UPDATE {table} " + diff --git a/src/Model/Tools/PamhyrID.py b/src/Model/Tools/PamhyrID.py index 503fb0ad..949a0a6d 100644 --- a/src/Model/Tools/PamhyrID.py +++ b/src/Model/Tools/PamhyrID.py @@ -33,7 +33,7 @@ class PamhyrID(object): @classmethod def get_new_pamhyr_id(cls, id): - pid = id + pid = int(id) if pid < 0: pid = PamhyrID._pamhyr_id_cnt diff --git a/src/Solver/Mage.py b/src/Solver/Mage.py index 0fc12352..8f80daa9 100644 --- a/src/Solver/Mage.py +++ b/src/Solver/Mage.py @@ -20,6 +20,7 @@ import os import logging import numpy as np +from itertools import chain from tools import timer, trace, logger_exception from Solver.CommandLine import CommandLineSolver @@ -109,6 +110,46 @@ class Mage(CommandLineSolver): # Export # ########## + _alph = list( + map( + chr, + chain( + range(48,58), # 0..9 + range(65, 91), # A..Z + range(97, 123) # a..z + ) + ) + ) + + _l_alph = len(_alph) + + def get_reach_name(self, reach): + return f"Reach_{reach.pamhyr_id:>3}".replace(" ", "0") + + def get_node_name(self, node): + """Generate a 3 char name from node pamhyr_id + + Args: + node: The node + + Returns: + A 3 char name string + """ + n = node.pamhyr_id + + return "".join( + list( + map( + lambda i: self._alph[i % self._l_alph], + [ + int(n/1000), + int(n/10), + n + ] + ) + ) + ) + def cmd_args(self, study): lst = super(Mage, self).cmd_args(study) @@ -251,7 +292,7 @@ class Mage(CommandLineSolver): if bound.node is None: continue - name = f"{bound.node.id:3}".replace(" ", "x") + name = self.get_node_name(bound.node) f.write(f"* {bound.node.name} ({name}) {bound.bctype}\n") f.write(f"${name}\n") header = bound.header @@ -448,7 +489,7 @@ class Mage(CommandLineSolver): reservoir.sort() node = reservoir.node - name = f"{node.id:3}".replace(" ", "x") + name = self.get_node_name(node) f.write(f"* {node.name} ({name}) Reservoir\n") f.write(f"${name}\n") f.write(f"*{'Elev(m)':>9}|{'Area(ha)':>10}\n") @@ -826,14 +867,13 @@ class Mage8(Mage): edges = study.river.enable_edges() for e in edges: - name = f"Reach_{e.pamhyr_id:>3}".replace(" ", "0") - id = name + name = self.get_reach_name(e) + n1 = self.get_node_name(e.node1) + n2 = self.get_node_name(e.node2) - n1 = f"{e.node1.id:3}".replace(" ", "x") - n2 = f"{e.node2.id:3}".replace(" ", "x") file = os.path.join("net", name + ".ST") - f.write(f"{id} {n1} {n2} {file}\n") + f.write(f"{name} {n1} {n2} {file}\n") return files @@ -850,8 +890,7 @@ class Mage8(Mage): files.append(f"{name}.QSO") for bound in bounds: - # File header - name = f"{bound.node.id:3}".replace(" ", "x") + name = self.get_node_name(bound.node) f.write(f"* {bound.node.name} ({name}) {bound.bctype}\n") d50 = bound.d50