From 4d2ba40287425dbd13a03c7000745d05fb8f2ce2 Mon Sep 17 00:00:00 2001
From: Theophile Terraz <theophile.terraz@inrae.fr>
Date: Thu, 8 Aug 2024 11:43:42 +0200
Subject: [PATCH] work on get friction values from rk

---
 .../BoundaryCondition/BoundaryCondition.py     |  8 ++++----
 src/Model/Friction/Friction.py                 | 16 ++++++++++++++++
 .../InitialConditions/InitialConditions.py     | 18 +++++++++++++++---
 src/View/BoundaryCondition/Edit/Window.py      |  8 +++++++-
 4 files changed, 42 insertions(+), 8 deletions(-)

diff --git a/src/Model/BoundaryCondition/BoundaryCondition.py b/src/Model/BoundaryCondition/BoundaryCondition.py
index 455365d6..fd62afe9 100644
--- a/src/Model/BoundaryCondition/BoundaryCondition.py
+++ b/src/Model/BoundaryCondition/BoundaryCondition.py
@@ -373,13 +373,13 @@ class BoundaryCondition(SQLSubModel):
             self._status.modified()
 
     def reach(self, river):
-        edges = []
+        r = []
         if self._node is not None:
             if river is not None:
                 for edge in river.edges():
                     if edge.node1.name == self._node.name:
-                        edges.append(edge.reach)
+                        r.append(edge.reach)
                     if edge.node2.name == self._node.name:
-                        edges.append(edge.reach)
+                        r.append(edge.reach)
 
-        return edges
+        return r
diff --git a/src/Model/Friction/Friction.py b/src/Model/Friction/Friction.py
index d7b0386e..9f0e0f3c 100644
--- a/src/Model/Friction/Friction.py
+++ b/src/Model/Friction/Friction.py
@@ -22,6 +22,8 @@ from tools import trace, timer
 
 from Model.Tools.PamhyrDB import SQLSubModel
 
+from numpy import interp
+
 logger = logging.getLogger()
 
 
@@ -241,3 +243,17 @@ class Friction(SQLSubModel):
     def end_strickler(self, strickler):
         self._end_strickler = strickler
         self._status.modified()
+
+    def get_friction(self, rk):
+        if not self.contains_rk(rk):
+            return None
+        minor = interp(rk,
+                       [self.begin_rk, self.end_rk],
+                       [self.begin_strickler.minor,
+                        self.end_strickler.minor])
+        medium = interp(rk,
+                        [self.begin_rk, self.end_rk],
+                        [self.begin_strickler.medium,
+                         self.end_strickler.medium])
+
+        return minor, medium
diff --git a/src/Model/InitialConditions/InitialConditions.py b/src/Model/InitialConditions/InitialConditions.py
index 1b923cda..a4becbae 100644
--- a/src/Model/InitialConditions/InitialConditions.py
+++ b/src/Model/InitialConditions/InitialConditions.py
@@ -395,8 +395,14 @@ class InitialConditions(SQLSubModel):
         logger.debug(f"incline = {incline}")
         self._data = []
         for profile in profiles:
-            width = profile.width_approximation()
-            strickler = 25
+            width = profile.wet_width(profile.z_min() + height)
+            frictions = self._reach.frictions.frictions
+            strickler = None
+            for f in frictions:
+                if f.contains_rk(profile.rk):
+                    strickler = f.get_friction(profile.rk)[0]
+            if strickler is None:
+                strickler = 25.0
 
             if not compute_discharge:
                 discharge = data_discharge[profile.rk]
@@ -449,7 +455,13 @@ class InitialConditions(SQLSubModel):
         self._data = []
         for profile in profiles:
             width = profile.width_approximation()
-            strickler = 25
+            frictions = self._reach.frictions.frictions
+            strickler = None
+            for f in frictions:
+                if f.contains_rk(profile.rk):
+                    strickler = f.get_friction(profile.rk)[0]
+            if strickler is None:
+                strickler = 25.0
 
             if not compute_height:
                 height = data_height[profile.rk]
diff --git a/src/View/BoundaryCondition/Edit/Window.py b/src/View/BoundaryCondition/Edit/Window.py
index 4b4798a6..d639a3a3 100644
--- a/src/View/BoundaryCondition/Edit/Window.py
+++ b/src/View/BoundaryCondition/Edit/Window.py
@@ -333,9 +333,15 @@ class EditBoundaryConditionWindow(PamhyrWindow):
             reach = self._data.reach(self._study.river)[0]
             profile = reach.profiles[-1]
             incline = reach.get_incline_median_mean()
+            frictions = reach._parent.frictions.frictions
             z_min = profile.z_min()
             z_max = profile.z_max()
-            strickler = 25
+            strickler = None
+            for f in frictions:
+                if f.contains_rk(profile.rk):
+                    strickler = f.get_friction(profile.rk)[0]
+            if strickler is None:
+                strickler = 25.0
             height = [(i)*(z_max-z_min)/50 for i in range(51)]
             q = [((profile.wet_width(z_min + h) * 0.8) * strickler
                   * (h ** (5/3)) * (abs(incline) ** (0.5)))
-- 
GitLab