From 6a241f7a679aca9e63529b527698cf87099c3e6b Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby <pierre-antoine.rouby@inrae.fr> Date: Tue, 20 Jun 2023 17:33:56 +0200 Subject: [PATCH] Solver: Add some mage export. --- src/Model/Geometry/Reach.py | 6 +- src/Solver/ASolver.py | 12 ++- src/Solver/Mage.py | 143 +++++++++++++++++++++++++++++++++++ src/Solver/Solvers.py | 4 +- src/View/RunSolver/Window.py | 6 +- 5 files changed, 163 insertions(+), 8 deletions(-) diff --git a/src/Model/Geometry/Reach.py b/src/Model/Geometry/Reach.py index 7f86b224..9b634455 100644 --- a/src/Model/Geometry/Reach.py +++ b/src/Model/Geometry/Reach.py @@ -261,7 +261,8 @@ class Reach: # Get all guide line name guide_set = reduce( lambda acc, x: set(x).union(acc), - points_name + points_name, + set() ) # Get incomplete guideline @@ -271,7 +272,8 @@ class Reach: map( lambda l: list(set(l).symmetric_difference(guide_set)), points_name - ) + ), + [] ) ) diff --git a/src/Solver/ASolver.py b/src/Solver/ASolver.py index fa26c5de..49f1746e 100644 --- a/src/Solver/ASolver.py +++ b/src/Solver/ASolver.py @@ -115,11 +115,17 @@ class AbstractSolver(object): self._path_output = path self._cmd_output = cmd - # Export - def export(self, study): + ########## + # Export # + ########## + + def export(self, study, repertory, qlog = None): raise NotImplementedMethodeError(self, self.export) - # Run + ####### + # Run # + ####### + def run_input_data_fomater(self): if self._cmd_input == "": return True diff --git a/src/Solver/Mage.py b/src/Solver/Mage.py index 57e32d61..28142dca 100644 --- a/src/Solver/Mage.py +++ b/src/Solver/Mage.py @@ -1,5 +1,9 @@ # -*- coding: utf-8 -*- +import os + +from tools import timer + from Solver.ASolver import AbstractSolver class Mage(AbstractSolver): @@ -45,6 +49,88 @@ class Mage(AbstractSolver): return lst + ########## + # Export # + ########## + + @timer + def _export_ST(self, study, repertory, qlog = None): + if qlog is not None: + qlog.put("Export ST file") + + # Write header + for edge in study.river.edges(): + name = f"Reach_{edge.id}" + + with open(os.path.join(repertory, f"{name}.ST"), "w+") as f: + f.write("* This file is generate by PAMHYR, please don't modify\n") + + for profile in edge.reach.profiles: + num = f"{profile.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 + + f.write(f"{num}{c1}{c2}{t}{kp} {name}\n") + + 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 + + f.write(f"{x}{y}{z} {n}\n") + + f.write(f" 999.9990 999.9990 999.9990\n") + + f.write("* END OF FILE") + + def _export_BC(self, bound, repertory, qlog = None): + t = "XX" + if bound.bctype == "ZD": + t = "AVA" + elif bound.bctype == "TD": + t = "HYD" + else: + return None + + if qlog is not None: + qlog.put(f"Export {t} file") + + with open(os.path.join(repertory, f"0.{t}"), "w+") as f: + f.write("* This file is generate by PAMHYR, please don't modify\n") + + 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.2f}{d[1]:10.3f}\n") + + f.write("* END OF FILE") + + + @timer + def _export_bound_cond(self, study, repertory, qlog = None): + # Write header + lst = study.river.boundary_condition + for tab in ["liquid", "solid", "suspenssion"]: + for bound in lst.get_tab(tab): + self._export_BC(bound, repertory, qlog) + + @timer + def export(self, study, repertory, qlog = None): + self._export_ST(study, repertory, qlog) + + return True + +########## +# MAGE 7 # +########## class Mage7(Mage): def __init__(self, name): @@ -58,6 +144,9 @@ class Mage7(Mage): return lst +########## +# MAGE 8 # +########## class Mage8(Mage): def __init__(self, name): @@ -75,3 +164,57 @@ class Mage8(Mage): lst.insert(i+1, ("mage_precision_reduction_factor_r", "1")) return lst + + ########## + # Export # + ########## + + @timer + def _export_PAR(self, study, repertory, qlog = None): + if qlog is not None: + qlog.put("Export PAR file") + + with open(os.path.join(repertory, "0.PAR"), "w+") as f: + f.write("* This file is generate by PAMHYR, please don't modify\n") + + params = study.river.get_params(self.type).parameters + for p in params: + name = p.name\ + .replace("all_", "")\ + .replace("mage_", "") + value = p.value + + f.write(f"{name} {value}\n") + + f.write("* END OF FILE") + + @timer + def _export_NET(self, study, repertory, qlog = None): + if qlog is not None: + qlog.put("Export NET file") + + with open(os.path.join(repertory, "0.NET"), "w+") as f: + f.write("* This file is generate by PAMHYR, please don't modify\n") + + edges = study.river.edges() + for e in edges: + name = e.name.replace(" ", "_") + if e._name == "": + name = f"Reach_{e.id}" + + n1 = f"{e.node1.id:3}".replace(" ", "x") + n2 = f"{e.node2.id:3}".replace(" ", "x") + files = name + ".ST" + + f.write(f"{name} {n1} {n2} {files}\n") + + f.write("* END OF FILE") + + @timer + def export(self, study, repertory, qlog = None): + self._export_PAR(study, repertory, qlog) + self._export_NET(study, repertory, qlog) + self._export_ST(study, repertory, qlog) + self._export_bound_cond(study, repertory, qlog) + + return True diff --git a/src/Solver/Solvers.py b/src/Solver/Solvers.py index 11000bfd..58db6f49 100644 --- a/src/Solver/Solvers.py +++ b/src/Solver/Solvers.py @@ -9,12 +9,12 @@ _translate = QCoreApplication.translate solver_long_name = { "generic": _translate("Solvers", "Generic"), - "mage7": _translate("Solvers", "Mage version 7"), + # "mage7": _translate("Solvers", "Mage version 7"), "mage8": _translate("Solvers", "Mage version 8"), } solver_type_list = { "generic": GenericSolver, - "mage7": Mage7, + # "mage7": Mage7, "mage8": Mage8, } diff --git a/src/View/RunSolver/Window.py b/src/View/RunSolver/Window.py index 9bde1e3d..901f0e4a 100644 --- a/src/View/RunSolver/Window.py +++ b/src/View/RunSolver/Window.py @@ -93,6 +93,11 @@ class SolverLogWindow(ASubMainWindow, ListedSubWindow): self._alarm.start(500) self._output = Queue() + self._log(f" *** Export study {self._solver.name}", color="blue") + self._solver.export(self._study, "/tmp/pamhyr/0/", qlog = self._output) + + self.update() + self._log(f" *** Run solver {self._solver.name}", color="blue") self._solver.run(self._process, self._output) @@ -133,7 +138,6 @@ class SolverLogWindow(ASubMainWindow, ListedSubWindow): self.find(QAction, "action_pause").setEnabled(False) self.find(QAction, "action_stop").setEnabled(False) - while self._output.qsize() != 0: s = self._output.get() self._log(s) -- GitLab