From e66b7f665a47ab19378b03ca34ec29fc9891b5ea Mon Sep 17 00:00:00 2001
From: Pierre-Antoine Rouby <pierre-antoine.rouby@inrae.fr>
Date: Wed, 21 Jun 2023 12:03:29 +0200
Subject: [PATCH] Mage: Some minor fix, add INI export and minor change.

---
 src/Solver/ASolver.py        |  3 ++-
 src/Solver/Mage.py           | 48 +++++++++++++++++++++++++++---------
 src/View/RunSolver/Window.py | 12 ++++++---
 src/View/ui/SolverLog.ui     |  5 ++++
 4 files changed, 52 insertions(+), 16 deletions(-)

diff --git a/src/Solver/ASolver.py b/src/Solver/ASolver.py
index 49f1746e..7cef9f6a 100644
--- a/src/Solver/ASolver.py
+++ b/src/Solver/ASolver.py
@@ -160,7 +160,8 @@ class AbstractSolver(object):
     def _data_ready(self):
         s = self._process.readAll().data().decode()
         if self._output is not None:
-            self._output.put(s)
+            for x in s.split('\n'):
+                self._output.put(x)
 
     def _finished(self, exit_code, exit_status):
         if self._output is not None:
diff --git a/src/Solver/Mage.py b/src/Solver/Mage.py
index 38c600d2..96d6e74b 100644
--- a/src/Solver/Mage.py
+++ b/src/Solver/Mage.py
@@ -62,7 +62,9 @@ class Mage(AbstractSolver):
 
         # Write header
         for edge in study.river.edges():
-            name = f"Reach_{edge.id}"
+            name = edge.name.replace(" ", "_")
+            if edge._name == "":
+                name = f"Reach_{edge.id}"
 
             with open(os.path.join(repertory, f"{name}.ST"), "w+") as f:
                 files.append(f"{name}.ST")
@@ -88,8 +90,6 @@ class Mage(AbstractSolver):
 
                     f.write(f"     999.9990     999.9990     999.9990\n")
 
-                f.write("* END OF FILE")
-
         return files
 
     def _export_BC(self, bound, repertory, qlog):
@@ -118,9 +118,8 @@ class Mage(AbstractSolver):
             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(f"{d[0]:10.3f}{d[1]:10.3f}\n")
 
-            f.write("* END OF FILE")
 
         return files
 
@@ -167,7 +166,33 @@ class Mage(AbstractSolver):
                     f.write(f"K{num}      {bkp}{ekp}{coef_1}{coef_2}\n")
                     id += 1
 
-                f.write("* END OF FILE")
+
+        return files
+
+    @timer
+    def _export_INI(self, study, repertory, qlog):
+        files = []
+
+        if qlog is not None:
+            qlog.put("Export INI file")
+
+        # Write header
+        with open(os.path.join(repertory, "0.INI"), "w+") as f:
+            files.append("0.INI")
+            f.write("* This file is generate by PAMHYR, please don't modify\n")
+
+            reachs = study.river.edges()
+            for reach in reachs:
+                cond = study.river.initial_conditions.get(reach)
+
+                id = f"{reach.id+1:>3}"
+                id_sec = 1
+                for data in cond.data:
+                    discharge = f"{data['flow']:>10.5f}"
+                    cote = f"{data['elevation']:>11.6f}"
+
+                    f.write(f" {id}  {id_sec:>3}   {discharge}{cote}\n")
+                    id_sec += 1
 
         return files
 
@@ -189,7 +214,6 @@ class Mage(AbstractSolver):
             f.write("* OUTPUT\n")
             f.write(f"TRA 0.TRA\n")
             f.write(f"BIN 0.BIN\n")
-            f.write("* END OF FILE")
 
     @timer
     def export(self, study, repertory, qlog = None):
@@ -259,7 +283,6 @@ class Mage8(Mage):
 
                 f.write(f"{name} {value}\n")
 
-            f.write("* END OF FILE")
 
         return files
 
@@ -281,13 +304,13 @@ class Mage8(Mage):
                 if e._name == "":
                     name = f"Reach_{e.id}"
 
+                id = f"Bief_{e.id+1}"
+
                 n1 = f"{e.node1.id:3}".replace(" ", "x")
                 n2 = f"{e.node2.id:3}".replace(" ", "x")
                 file = name + ".ST"
 
-                f.write(f"{name} {n1} {n2} {file}\n")
-
-            f.write("* END OF FILE")
+                f.write(f"{id} {n1} {n2} {file}\n")
 
         return files
 
@@ -295,11 +318,12 @@ class Mage8(Mage):
     def export(self, study, repertory, qlog = None):
         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_ST(study, repertory, qlog)
         files = files + self._export_bound_cond(study, repertory, qlog)
         files = files + self._export_RUG(study, repertory, qlog)
+        files = files + self._export_INI(study, repertory, qlog)
         self._export_REP(study, repertory, files, qlog)
 
         return True
diff --git a/src/View/RunSolver/Window.py b/src/View/RunSolver/Window.py
index 901f0e4a..ae3aa2a1 100644
--- a/src/View/RunSolver/Window.py
+++ b/src/View/RunSolver/Window.py
@@ -79,7 +79,6 @@ class SolverLogWindow(ASubMainWindow, ListedSubWindow):
         self._study = study
         self._config = config
         self._solver = solver
-        self._process = QProcess(parent)
 
         super(SolverLogWindow, self).__init__(
             name=self._title, ui="SolverLog", parent=parent
@@ -90,17 +89,24 @@ class SolverLogWindow(ASubMainWindow, ListedSubWindow):
         self.setup_alarm()
         self.setup_connections()
 
+        self._workdir = "/tmp/pamhyr/0/"
         self._alarm.start(500)
         self._output = Queue()
+        self._process = self.new_process(parent)
 
         self._log(f" *** Export study {self._solver.name}", color="blue")
-        self._solver.export(self._study, "/tmp/pamhyr/0/", qlog = self._output)
+        self._solver.export(self._study, self._workdir, qlog = self._output)
 
         self.update()
 
         self._log(f" *** Run solver {self._solver.name}", color="blue")
         self._solver.run(self._process, self._output)
 
+    def new_process(self, parent):
+        new = QProcess(parent)
+        new.setWorkingDirectory(self._workdir)
+        return new
+
     def setup_action(self):
         self.find(QAction, "action_start").setEnabled(False)
         self.find(QAction, "action_pause").setEnabled(True)
@@ -145,7 +151,7 @@ class SolverLogWindow(ASubMainWindow, ListedSubWindow):
     def start(self):
         self._log(" *** Start", color="blue")
         if self._solver.is_stoped():
-            self._process = QProcess(self._parent)
+            self._process = self.new_process(self._parent)
         self._solver.start(self._process)
 
         self.find(QAction, "action_start").setEnabled(False)
diff --git a/src/View/ui/SolverLog.ui b/src/View/ui/SolverLog.ui
index 15e450e4..5d2bf17f 100644
--- a/src/View/ui/SolverLog.ui
+++ b/src/View/ui/SolverLog.ui
@@ -17,6 +17,11 @@
    <layout class="QGridLayout" name="gridLayout">
     <item row="0" column="0">
      <widget class="QTextEdit" name="textEdit">
+      <property name="font">
+       <font>
+        <family>Monospace</family>
+       </font>
+      </property>
       <property name="documentTitle">
        <string notr="true"/>
       </property>
-- 
GitLab