diff --git a/src/Model/BoundaryCondition/BoundaryCondition.py b/src/Model/BoundaryCondition/BoundaryCondition.py index 86e0f1d2048bd4e28c3c9fd981d512c52c2fed5d..d6abb6c9ea8a847ba3c236d517abe5a2f3c4a444 100644 --- a/src/Model/BoundaryCondition/BoundaryCondition.py +++ b/src/Model/BoundaryCondition/BoundaryCondition.py @@ -83,7 +83,8 @@ class BoundaryCondition(SQLSubModel): def _get_ctor_from_type(cls, t): from Model.BoundaryCondition.BoundaryConditionTypes import ( NotDefined, PonctualContribution, - TimeOverZ, TimeOverDischarge, ZOverDischarge + TimeOverZ, TimeOverDischarge, ZOverDischarge, + Solid, ) res = NotDefined @@ -95,6 +96,8 @@ class BoundaryCondition(SQLSubModel): res = TimeOverDischarge elif t == "ZD": res = ZOverDischarge + elif t == "SL": + res = Solid return res @classmethod diff --git a/src/Model/BoundaryCondition/BoundaryConditionList.py b/src/Model/BoundaryCondition/BoundaryConditionList.py index 1a342dc781bd846d47c81bdac4c0321a5c64ee6b..2514f32694a598ee1a2c690cf38dc58e4013d560 100644 --- a/src/Model/BoundaryCondition/BoundaryConditionList.py +++ b/src/Model/BoundaryCondition/BoundaryConditionList.py @@ -26,7 +26,8 @@ from Model.BoundaryCondition.BoundaryCondition import BoundaryCondition from Model.BoundaryCondition.BoundaryConditionTypes import ( NotDefined, PonctualContribution, - TimeOverZ, TimeOverDischarge, ZOverDischarge + TimeOverZ, TimeOverDischarge, ZOverDischarge, + Solid, ) class BoundaryConditionList(SQLSubModel): diff --git a/src/Model/BoundaryCondition/BoundaryConditionTypes.py b/src/Model/BoundaryCondition/BoundaryConditionTypes.py index b2c73f11326b652184cc92d9fd3d01ae361490a8..963e88e72d58463e2c62b84be9d11733acd3e0a3 100644 --- a/src/Model/BoundaryCondition/BoundaryConditionTypes.py +++ b/src/Model/BoundaryCondition/BoundaryConditionTypes.py @@ -83,3 +83,16 @@ class ZOverDischarge(BoundaryCondition): @property def _default_0(self): return 0.0 + + +class Solid(BoundaryCondition): + def __init__(self, id:int = -1, name:str = "", status = None): + super(Solid, self).__init__(id=id, name=name, status=status) + + self._type = "SL" + self._header = ["time", "solid"] + self._types = [TimeOverDischarge.time_convert, float] + + @classmethod + def compatibility(cls): + return ["solid"] diff --git a/src/Solver/ASolver.py b/src/Solver/ASolver.py index 64cc01cbffb4cb71dddf7c17e4f84b7160bcd43f..ea268999de48756001faaaedb0b7e42325459911 100644 --- a/src/Solver/ASolver.py +++ b/src/Solver/ASolver.py @@ -213,12 +213,22 @@ class AbstractSolver(object): # Command line executable path is between " char cmd = cmd.split("\"") exe = cmd[1].replace("\ ", " ") - args = "\"".join(cmd[2:]).split(" ")[1:] + args = list( + filter( + lambda s: s != "", + "\"".join(cmd[2:]).split(" ")[1:] + ) + ) else: # We suppose the command line executable path as no space char cmd = cmd.replace("\ ", "&_&").split(" ") exe = cmd[0].replace("&_&", " ") - args = list(map(lambda s: s.replace("&_&", "\ "), cmd[1:])) + args = list( + filter( + lambda s: s != "", + map(lambda s: s.replace("&_&", "\ "), cmd[1:]) + ) + ) logger.info(f"! {exe} {args}") return exe, args diff --git a/src/Solver/Mage.py b/src/Solver/Mage.py index 6c129f887d717a19d0b88b06fca112451143b7ad..81f99722f0f10b81425a04fca8ec222424c5ff22 100644 --- a/src/Solver/Mage.py +++ b/src/Solver/Mage.py @@ -127,23 +127,47 @@ class Mage(AbstractSolver): with mage_file_open(os.path.join(repertory, f"{name}.ST"), "w+") as f: files.append(f"{name}.ST") + cnt_num = 1 for profile in edge.reach.profiles: - num = f"{profile.num:>6}" + num = f"{cnt_num:>6}" c1 = f"{profile.code1:>6}" c2 = f"{profile.code2:>6}" t = f"{len(profile.points):>6}" kp = f"{profile.kp:>13.4f}" - name = profile.name + pname = profile.name + if profile.name == "": + pname = f"p{profile.id:>3}".replace(" ", "p") + name = f"{pname}" - f.write(f"{num}{c1}{c2}{t}{kp} {name}\n") + sediment = "" + if profile.sl is not None: + if not any(filter(lambda f: ".GRA" in f, files)): + files.append("0.GRA") + + nl = len(profile.sl) + sediment = f" {nl:>3}" + for l in profile.sl.layers: + sediment += f" {l.height:>10} {l.d50:>10} {l.sigma:>10} {l.critical_constraint:>10}" + + f.write(f"{num}{c1}{c2}{t}{kp} {name} {sediment}\n") + cnt_num += 1 for point in profile.points: x = f"{point.x:>13.4f}" y = f"{point.y:>13.4f}" z = f"{point.z:>13.4f}" - n = point.name + n = f"{point.name:<3}" - f.write(f"{x}{y}{z} {n}\n") + sediment = "" + prev = point.z + if point.sl is not None: + nl = len(point.sl) + sediment = f"{nl:>3}" + for l in point.sl.layers: + prev = round(prev - l.height, 5) + sediment += f" {prev:>10} {l.d50:>10} {l.sigma:>10} {l.critical_constraint:>10}" + + f.write(f"{x}{y}{z} {n} {sediment}\n") f.write(f" 999.9990 999.9990 999.9990\n") @@ -182,6 +206,7 @@ class Mage(AbstractSolver): AVA = [] HYD = [] LIM = [] + QSO = [] for tab in ["liquid", "solid", "suspenssion"]: for bound in lst.get_tab(tab): @@ -191,10 +216,13 @@ class Mage(AbstractSolver): HYD.append(bound) elif bound.bctype == "TZ": LIM.append(bound) + elif bound.bctype == "SL": + QSO.append(bound) files = files + self._export_BC("AVA", AVA, repertory, qlog) files = files + self._export_BC("HYD", HYD, repertory, qlog) files = files + self._export_BC("LIM", LIM, repertory, qlog) + files = files + self._export_QSO(QSO, repertory, qlog) return files @@ -332,12 +360,20 @@ class Mage(AbstractSolver): for file in files: EXT = file.split('.')[1] - f.write(f"{EXT} {file}\n") + if EXT not in ["ST", "GRA"]: + f.write(f"{EXT} {file}\n") f.write("* OUTPUT\n") f.write(f"TRA 0.TRA\n") f.write(f"BIN 0.BIN\n") + for file in files: + EXT = file.split('.')[1] + + if EXT in ["GRA"]: + f.write(f"{EXT} {file}\n") + + @timer def export(self, study, repertory, qlog = None): self._export_ST(study, repertory, qlog) @@ -459,11 +495,37 @@ class Mage8(Mage): return files + @timer + def _export_QSO(self, bounds, repertory, qlog): + files = [] + + if len(bounds) == 0: + return files + + if qlog is not None: + qlog.put(f"Export QSO file") + + with mage_file_open(os.path.join(repertory, f"0.QSO"), "w+") as f: + files.append(f"0.QSO") + + for bound in bounds: + name = f"{bound.node.id:3}".replace(" ", "x") + f.write(f"* {bound.node.name} ({name}) {bound.bctype}\n") + f.write(f"${name}\n") + header = bound.header + f.write(f"*{header[0]:>9}|{header[1]:>10}\n") + + for d in bound.data: + f.write(f"{d[0]:10.3f}{d[1]:10.3f}\n") + + return files + + @timer def export(self, study, repertory, qlog = None): files = [] - self._export_ST(study, repertory, qlog) + files = self._export_ST(study, repertory, qlog) files = files + self._export_PAR(study, repertory, qlog) files = files + self._export_NET(study, repertory, qlog) files = files + self._export_bound_cond(study, repertory, qlog) diff --git a/src/View/BoundaryCondition/Edit/translate.py b/src/View/BoundaryCondition/Edit/translate.py index 4c09f5fce4e24180390dfca3cd9d7d6bb46ac5e4..c803979592e1baa36c2e9981b83ec6dab3e6f2f3 100644 --- a/src/View/BoundaryCondition/Edit/translate.py +++ b/src/View/BoundaryCondition/Edit/translate.py @@ -26,5 +26,6 @@ table_headers = { "time": _translate("BoundaryCondition", "Time"), "date": _translate("BoundaryCondition", "Date"), "discharge": _translate("BoundaryCondition", "Discharge (m³/s)"), - "z": _translate("BoundaryCondition", "Z (m)") + "z": _translate("BoundaryCondition", "Z (m)"), + "solid": _translate("BoundaryCondition", "Solid (kg/s)"), } diff --git a/src/View/BoundaryCondition/translate.py b/src/View/BoundaryCondition/translate.py index 661c1ad071a4a475ab3783a53b4474c3b0e0e2f1..c4ff8f8815e620d75bbde9030d82224c43acb160 100644 --- a/src/View/BoundaryCondition/translate.py +++ b/src/View/BoundaryCondition/translate.py @@ -20,7 +20,8 @@ from PyQt5.QtCore import QCoreApplication from Model.BoundaryCondition.BoundaryConditionTypes import ( NotDefined, PonctualContribution, - TimeOverZ, TimeOverDischarge, ZOverDischarge + TimeOverZ, TimeOverDischarge, ZOverDischarge, + Solid ) _translate = QCoreApplication.translate @@ -31,6 +32,7 @@ long_types = { "TZ": _translate("BoundaryCondition", "Time over Z"), "TD": _translate("BoundaryCondition", "Time over Discharge"), "ZD": _translate("BoundaryCondition", "Z over Discharge"), + "SL": _translate("BoundaryCondition", "Solid"), } table_headers = { @@ -44,5 +46,6 @@ BC_types = { "PC": PonctualContribution, "TZ": TimeOverZ, "TD": TimeOverDischarge, - "ZD": ZOverDischarge + "ZD": ZOverDischarge, + "SL": Solid, } diff --git a/tests_cases/Saar/Saar.pamhyr b/tests_cases/Saar/Saar.pamhyr index df56a2984353c1c2f9d8f73ffc277b4fab764ba6..711ef7bc929574e1ca841b76442e1262bddd4c8b 100644 Binary files a/tests_cases/Saar/Saar.pamhyr and b/tests_cases/Saar/Saar.pamhyr differ