From 21e6c410e2528e65e15ca6c9c2a6a37321c5d516 Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby Date: Thu, 9 Oct 2025 15:26:24 +0200 Subject: [PATCH] Solver: RubarBE: Add read results method. --- src/Solver/RubarBE.py | 57 ++++++++++++++++++++++++++++++++---- src/View/RunSolver/Window.py | 3 +- 2 files changed, 53 insertions(+), 7 deletions(-) diff --git a/src/Solver/RubarBE.py b/src/Solver/RubarBE.py index 41e9d666..a3467d0f 100644 --- a/src/Solver/RubarBE.py +++ b/src/Solver/RubarBE.py @@ -20,7 +20,7 @@ import os import logging import numpy as np -from tools import timer, trace, old_pamhyr_date_to_timestamp +from tools import timer, trace, old_pamhyr_date_to_timestamp, logger_exception from Solver.CommandLine import CommandLineSolver @@ -543,8 +543,53 @@ class Rubar3(CommandLineSolver): for d0, d1 in bc.data: f.write(f"{d1} {d0}\n") - def read_hydlim(self, study, fname, results, qlog=None, name="0"): - return + def read_profil(self, study, fname, results, qlog=None, name="0"): + logger.info(f"read: profil.{name}") + with open(fname, "r") as f: + reachs = [] + for i, edge in enumerate(study.river.enable_edges()): + reach = edge.reach + # Add results reach to reach list + res_reach = results.river.add(i) + reachs.append((res_reach, len(reach) + 1)) + + def read_data_line(f): + line = f.readline().split() + return tuple(map(float, line)) + + ts = set() + end = False + while True: + line = f.readline() + if line == "": + return + + timestamp = float(line) + + for reach, lm in reachs: + # First profile + z, s, q, e = read_data_line(f) + reach.set(0, timestamp, "Z", z) + reach.set(0, timestamp, "Q", q) + reach.set(0, timestamp, "V", s) + + # For each profile + ind = 1 + pz, ps, pq, pe = read_data_line(f) + while ind < lm - 2: + z, s, q, e = read_data_line(f) + reach.set(ind, timestamp, "Z", (z + pz) / 2) + reach.set(ind, timestamp, "Q", (q + pq) / 2) + reach.set(ind, timestamp, "V", (q + ps) / 2) + + pz, ps, pq, pe = z, s, q, e + ind += 1 + + # Last profile + z, s, q, e = read_data_line(f) + reach.set(ind, timestamp, "Z", z) + reach.set(ind, timestamp, "Q", q) + reach.set(ind, timestamp, "V", s) @timer def results(self, study, repertory, qlog=None, name="0"): @@ -554,14 +599,14 @@ class Rubar3(CommandLineSolver): repertory=repertory, name=name, ) - results_file = f"hydlim.{name}" + results_file = f"profil.{name}" fname = os.path.join(repertory, results_file) if not os.path.isfile(fname): - logger.info(f"Result file {results_file} does not exist") + logger.warning(f"Result file {results_file} does not exist") return None try: - self.read_hydlim(study, fname, results, qlog, name=name) + self.read_profil(study, fname, results, qlog, name=name) except Exception as e: logger.error(f"Failed to read results") logger_exception(e) diff --git a/src/View/RunSolver/Window.py b/src/View/RunSolver/Window.py index 0b96c1d5..22b24bbc 100644 --- a/src/View/RunSolver/Window.py +++ b/src/View/RunSolver/Window.py @@ -500,7 +500,8 @@ class SolverLogWindow(PamhyrWindow): if self._results is None: def reading_fn(): self._results = self._solver.results( - self._study, self._workdir, qlog=self._output + self._study, self._workdir, + qlog=self._output, name=self._study.name ) dlg = WaitingDialog(