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