From c698f2af2b3b80df7f30dd94d268b7f946e8379a Mon Sep 17 00:00:00 2001
From: Pierre-Antoine Rouby <pierre-antoine.rouby@inrae.fr>
Date: Wed, 18 Sep 2024 16:05:40 +0200
Subject: [PATCH] RubarBE (Rubar3): Add minimal rubar3.

---
 src/Solver/RubarBE.py | 104 ++++++++++++++++++++++++++++++++++--------
 src/Solver/Solvers.py |   4 +-
 2 files changed, 89 insertions(+), 19 deletions(-)

diff --git a/src/Solver/RubarBE.py b/src/Solver/RubarBE.py
index 9d2e7bee..3ad4723e 100644
--- a/src/Solver/RubarBE.py
+++ b/src/Solver/RubarBE.py
@@ -30,13 +30,13 @@ from Model.Results.River.River import River, Reach, Profile
 logger = logging.getLogger()
 
 
-class RubarBE(CommandLineSolver):
-    _type = "rubarbe"
+class Rubar3(CommandLineSolver):
+    _type = "rubar3"
 
     def __init__(self, name):
-        super(RubarBE, self).__init__(name)
+        super(Rubar3, self).__init__(name)
 
-        self._type = "rubarbe"
+        self._type = "rubar3"
 
         self._cmd_input = ""
         self._cmd_solver = "@path @input -o @output"
@@ -44,9 +44,9 @@ class RubarBE(CommandLineSolver):
 
     @classmethod
     def default_parameters(cls):
-        lst = super(RubarBE, cls).default_parameters()
+        # lst = super(Rubar3, cls).default_parameters()
 
-        lst += [
+        lst = [
             ("rubarbe_cfl", "0.50000E+00"),
             ("rubarbe_condam", "1"),
             ("rubarbe_condav", "3"),
@@ -60,10 +60,10 @@ class RubarBE(CommandLineSolver):
             ("rubarbe_tinit", "000:00:00:00"),
             ("rubarbe_tmax", "999:99:99:00"),
             ("rubarbe_tiopdt", "000:00:00:00"),
-            ("rubarbe_dt", "3000.0"),
+            ("rubarbe_dt", "5.0"),
             ("rubarbe_ts", "999:99:99:00"),
-            ("rubarbe_dtsauv", "999:99:99:00"),
-            ("rubarbe_psave", "999:99:99:00"),
+            ("rubarbe_dtsauv", "00:00:00:05"),
+            ("rubarbe_psave", "00:00:00:05"),
             ("rubarbe_fdeb1", "1"),
             ("rubarbe_fdeb2", "10"),
             ("rubarbe_fdeb3", "100"),
@@ -119,21 +119,21 @@ class RubarBE(CommandLineSolver):
     ##########
 
     def cmd_args(self, study):
-        lst = super(RubarBE, self).cmd_args(study)
+        lst = super(Rubar3, self).cmd_args(study)
 
         return lst
 
     def input_param(self):
         name = self._study.name
-        return f"{name}.REP"
+        return f"{name}"
 
     def output_param(self):
         name = self._study.name
-        return f"{name}.BIN"
+        return f"{name}"
 
     def log_file(self):
         name = self._study.name
-        return f"{name}.TRA"
+        return f"{name}"
 
     def export(self, study, repertory, qlog=None):
         self._study = study
@@ -145,6 +145,10 @@ class RubarBE(CommandLineSolver):
         self._export_mail(study, repertory, qlog, name=name)
         self._export_condin(study, repertory, qlog, name=name)
         self._export_stricklers(study, repertory, qlog, name=name)
+        self._export_hydro(study, repertory, qlog, name=name)
+        self._export_condav(study, repertory, qlog, name=name)
+
+        return True
 
     def _export_donnee(self, study, repertory, qlog, name="0"):
         if qlog is not None:
@@ -168,6 +172,9 @@ class RubarBE(CommandLineSolver):
                 name = param.name
                 value = param.value
 
+                if "all_" in name:
+                    continue
+
                 if value != "":
                     # Value format
                     if value.count(':') == 3:
@@ -276,7 +283,9 @@ class RubarBE(CommandLineSolver):
                             if label[0] == "r":
                                 label = label[1].upper()
                             else:
-                                label = lable[0]
+                                label = label[1].upper()
+                        else:
+                            label = " "
 
                         y = point.y
                         z = point.z
@@ -392,7 +401,7 @@ class RubarBE(CommandLineSolver):
                 l_h_s = self._export_condin_profile_height_speed(last, data)
 
                 # First mail
-                f.write(f"{1:>5} {f_h_s[0]} {f_h_s[1]}")
+                f.write(f"{1:>5} {f_h_s[0]} {f_h_s[1]}\n")
 
                 ind = 2
                 it = iter(profiles)
@@ -418,7 +427,7 @@ class RubarBE(CommandLineSolver):
                     ind += 1
 
                 # Last mail
-                f.write(f"{ind:>5} {f_h_s[0]} {f_h_s[1]}")
+                f.write(f"{ind:>5} {f_h_s[0]} {f_h_s[1]}\n")
 
     def _export_condin_init_data(self, ics):
         data = {}
@@ -435,7 +444,66 @@ class RubarBE(CommandLineSolver):
         z = data[profile.rk][0]
         q = data[profile.rk][1]
 
-        height = z - profile.z_min()
+        #height = z - profile.z_min()
         speed = profile.speed(q, z)
 
-        return height, speed
+        return z, speed
+
+    def _export_hydro(self, study, repertory, qlog, name="0"):
+        if qlog is not None:
+            qlog.put("Export HYDRO file")
+
+        with open(
+                os.path.join(
+                    repertory, f"hydro.{name}"
+                ), "w+"
+        ) as f:
+            bcs = []
+            for edge in study.river.enable_edges():
+                for bound in study.river.boundary_condition.get_tab("liquid"):
+                    # BC is an hydrogramme
+                    if bound.bctype == "TD" or bound.bctype == "PC":
+                        # BC is on input node of this reach
+                        if bound.node == edge.node1:
+                            bcs.append(bound)
+
+            for bc in bcs:
+                f.write(f"{len(bc)}\n")
+                for d0, d1 in bc.data:
+                    f.write(f"{d0} {d1}\n")
+
+    def _export_condav(self, study, repertory, qlog, name="0"):
+        if qlog is not None:
+            qlog.put("Export CONDAV file")
+
+        with open(
+                os.path.join(
+                    repertory, f"condav.{name}"
+                ), "w+"
+        ) as f:
+            bcs = []
+            for edge in study.river.enable_edges():
+                for bound in study.river.boundary_condition.get_tab("liquid"):
+                    # BC is an hydrogramme
+                    if bound.bctype == "ZD" or bound.bctype == "TZ":
+                        # BC is on input node of this reach
+                        if bound.node == edge.node2:
+                            bcs.append(bound)
+
+            for bc in bcs:
+                f.write(f"{len(bc)}\n")
+                for d0, d1 in bc.data:
+                    f.write(f"{d0} {d1}\n")
+
+
+class RubarBE(Rubar3):
+    _type = "rubarbe"
+
+    def __init__(self, name):
+        super(RubarBE, self).__init__(name)
+
+        self._type = "rubarbe"
+
+        self._cmd_input = ""
+        self._cmd_solver = "@path @input -o @output"
+        self._cmd_output = ""
diff --git a/src/Solver/Solvers.py b/src/Solver/Solvers.py
index cd336e68..d0a8a981 100644
--- a/src/Solver/Solvers.py
+++ b/src/Solver/Solvers.py
@@ -22,7 +22,7 @@ from Solver.GenericSolver import GenericSolver
 from Solver.Mage import (
     Mage7, Mage8, MageFake7,
 )
-from Solver.RubarBE import RubarBE
+from Solver.RubarBE import Rubar3, RubarBE
 
 _translate = QCoreApplication.translate
 
@@ -32,6 +32,7 @@ solver_long_name = {
     "mage8": "Mage v8",
     # "mage_fake7": "Mage fake v7",
     # "rubarbe": "RubarBE",
+    # "rubar3": "Rubar3",
 }
 
 solver_type_list = {
@@ -40,4 +41,5 @@ solver_type_list = {
     "mage8": Mage8,
     # "mage_fake7": MageFake7,
     # "rubarbe": RubarBE,
+    # "rubar3": Rubar3,
 }
-- 
GitLab