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