From ec91a8b63f8c18f3a9ff69b85001d482aaec6871 Mon Sep 17 00:00:00 2001
From: Pierre-Antoine Rouby <pierre-antoine.rouby@inrae.fr>
Date: Mon, 22 Apr 2024 11:33:07 +0200
Subject: [PATCH] Solver: Fix SIN export and error handler at export.

---
 src/Solver/Mage.py           | 78 +++++++++++++++++-------------------
 src/View/RunSolver/Window.py | 23 +++++++----
 2 files changed, 53 insertions(+), 48 deletions(-)

diff --git a/src/Solver/Mage.py b/src/Solver/Mage.py
index 9811a785..f8b664fd 100644
--- a/src/Solver/Mage.py
+++ b/src/Solver/Mage.py
@@ -20,7 +20,7 @@ import os
 import logging
 import numpy as np
 
-from tools import timer, trace
+from tools import timer, trace, logger_exception
 
 from Solver.CommandLine import CommandLineSolver
 from Checker.Mage import (
@@ -137,7 +137,6 @@ class Mage(CommandLineSolver):
         for line in lines:
             rep_file.write(line.line)
 
-    @timer
     def _export_ST(self, study, repertory, qlog, name="0"):
         files = []
 
@@ -236,7 +235,6 @@ class Mage(CommandLineSolver):
         # Point line
         wfile.write(f"{x} {y} {z} {n} {sediment}\n")
 
-    @timer
     def _export_BC(self, t, bounds, repertory, qlog, name="0"):
         files = []
 
@@ -270,7 +268,6 @@ class Mage(CommandLineSolver):
 
         return files
 
-    @timer
     def _export_bound_cond(self, study, repertory, qlog, name="0"):
         files = []
         lst = study.river.boundary_condition
@@ -301,7 +298,6 @@ class Mage(CommandLineSolver):
 
         return files
 
-    @timer
     def _export_lateral_contrib(self, study, repertory, qlog, name="0"):
         files = []
         lst = study.river.lateral_contribution
@@ -320,7 +316,6 @@ class Mage(CommandLineSolver):
 
         return files
 
-    @timer
     def _export_LC(self, study, lateral, f, qlog, name="0"):
         if lateral.edge is None:
             return
@@ -352,7 +347,6 @@ class Mage(CommandLineSolver):
             else:
                 f.write(f"{d[0]:10.3f}{d[1]:10.3f}\n")
 
-    @timer
     def _export_RUG(self, study, repertory, qlog, name="0"):
         files = []
 
@@ -396,7 +390,6 @@ class Mage(CommandLineSolver):
 
         return files
 
-    @timer
     def _export_INI(self, study, repertory, qlog, name="0"):
         files = []
 
@@ -439,7 +432,6 @@ class Mage(CommandLineSolver):
             files.append(f"{name}.INI")
         return files
 
-    @timer
     def _export_CAS(self, study, repertory, qlog, name="0"):
         files = []
 
@@ -472,7 +464,6 @@ class Mage(CommandLineSolver):
 
         return files
 
-    @timer
     def _export_SIN(self, study, repertory, qlog, name="0"):
         files = []
 
@@ -504,34 +495,40 @@ class Mage(CommandLineSolver):
                 if not hs.input_reach.is_enable():
                     continue
 
+                if hs.input_kp is None:
+                    continue
+
                 f.write(
                     '* ouvrage au pk ' +
                     f"{float(hs.input_kp):>12.1f}" + ' ' +
                     hs.name + '\n'
                 )
 
-                for bhs in hs.basic_structures:
-                    reach_id = study.river.get_edge_id(hs.input_reach) + 1
-                    param_str = ' '.join(
-                        [
-                            f'{p:>10.3f}'
-                            for p in self._export_SIN_parameters(bhs)
-                        ]
-                    )
+                self._export_SIN_bhs(study, sin_dict, hs, f)
 
-                    name = bhs.name
-                    if name == "":
-                        name = f"HS_{bhs.id:>3}".replace(" ", "0")
-                    else:
-                        name = name.replace(" ", "_")
+        return files
 
-                    f.write(
-                        f"{sin_dict[bhs._type]} " +
-                        f"{reach_id} {float(hs.input_kp):>12.3f} " +
-                        f"{param_str} {name}\n"
-                    )
+    def _export_SIN_bhs(self, study, sin_dict, hs, f):
+        for bhs in hs.basic_structures:
+            reach_id = study.river.get_edge_id(hs.input_reach) + 1
+            param_str = ' '.join(
+                [
+                    f'{p:>10.3f}'
+                    for p in self._export_SIN_parameters(bhs)
+                ]
+            )
 
-        return files
+            name = bhs.name
+            if name == "":
+                name = f"HS_{bhs.id:>3}".replace(" ", "0")
+            else:
+                name = name.replace(" ", "_")
+
+            f.write(
+                f"{sin_dict[bhs._type]} " +
+                f"{reach_id} {float(hs.input_kp):>12.3f} " +
+                f"{param_str} {name}\n"
+            )
 
     def _export_SIN_parameters(self, bhs):
         res = [9999.999] * 5
@@ -591,7 +588,6 @@ class Mage(CommandLineSolver):
 
         return res
 
-    @timer
     def _export_VAR(self, study, repertory, qlog, name="0"):
         files = []
 
@@ -627,7 +623,6 @@ class Mage(CommandLineSolver):
 
         return files
 
-    @timer
     def _export_DEV(self, study, repertory, qlog, name="0"):
         files = []
 
@@ -650,7 +645,6 @@ class Mage(CommandLineSolver):
 
         return files
 
-    @timer
     def _export_REP(self, study, repertory, files, qlog, name="0"):
         if qlog is not None:
             qlog.put("Export REP file")
@@ -785,7 +779,6 @@ class Mage8(Mage):
 
         return lst
 
-    @timer
     def _export_PAR(self, study, repertory, qlog=None, name="0"):
         files = []
 
@@ -820,7 +813,6 @@ class Mage8(Mage):
 
         return files
 
-    @timer
     def _export_NET(self, study, repertory, qlog=None, name="0"):
         files = []
 
@@ -844,7 +836,6 @@ class Mage8(Mage):
 
         return files
 
-    @timer
     def _export_QSO(self, bounds, repertory, qlog, name="0"):
         files = []
 
@@ -902,14 +893,19 @@ class Mage8(Mage):
         # Generate files
         files = []
 
-        for func in self.export_func_dict():
-            files = files + func(study, repertory, qlog, name=name)
+        try:
+            for func in self.export_func_dict():
+                files = files + func(study, repertory, qlog, name=name)
 
-        self.export_additional_files(study, repertory, qlog, name=name)
-        self.export_study_description(study, repertory, qlog, name=name)
-        self._export_REP(study, repertory, files, qlog, name=name)
+            self.export_additional_files(study, repertory, qlog, name=name)
+            self.export_study_description(study, repertory, qlog, name=name)
+            self._export_REP(study, repertory, files, qlog, name=name)
 
-        return True
+            return True
+        except Exception as e:
+            logger.error(f"Failed to export study to {self._type}")
+            logger_exception(e)
+            return False
 
     ###########
     # RESULTS #
diff --git a/src/View/RunSolver/Window.py b/src/View/RunSolver/Window.py
index 6c55ea6a..eb6533c5 100644
--- a/src/View/RunSolver/Window.py
+++ b/src/View/RunSolver/Window.py
@@ -158,8 +158,11 @@ class SolverLogWindow(PamhyrWindow):
         self.setup_workdir()
         self.setup_process()
 
-        self.export()
-        self.run()
+        ok = self.export()
+        if ok:
+            self.run()
+        else:
+            self._log(f" *** Failed to export study to {self._solver._type}", color="red")
 
     def setup_action(self):
         self.find(QAction, "action_start").setEnabled(False)
@@ -210,9 +213,11 @@ class SolverLogWindow(PamhyrWindow):
 
     def export(self):
         self._log(f" *** Export study {self._solver.name}", color="blue")
-        self._solver.export(self._study, self._workdir, qlog=self._output)
+        ok = self._solver.export(self._study, self._workdir, qlog=self._output)
         self.update()
 
+        return ok
+
     def closeEvent(self, event):
         self._alarm.stop()
         super(SolverLogWindow, self).closeEvent(event)
@@ -319,10 +324,14 @@ class SolverLogWindow(PamhyrWindow):
     def start(self):
         if self._solver.is_stoped():
             self._log(f" *** Export study {self._solver.name}", color="blue")
-            self._solver.export(self._study, self._workdir, qlog=self._output)
-            self.update()
-
-            self._process = self.new_process(self._parent)
+            ok = self._solver.export(self._study, self._workdir, qlog=self._output)
+            if not ok:
+                self._log(f" *** Failed to export", color="red")
+                self.update()
+                return
+            else:
+                self.update()
+                self._process = self.new_process(self._parent)
 
         self._log(" *** Start", color="blue")
         self._results = None
-- 
GitLab