Merge branch 'master' into terraz_dev

adists_release
Theophile Terraz 2024-11-07 16:28:24 +01:00
commit f91527464d
6 changed files with 168 additions and 15 deletions

3
.gitignore vendored
View File

@ -41,6 +41,9 @@ __old__
*-venv *-venv
mage8
adists
### END CUSTOM ### ### END CUSTOM ###
# Created by https://www.toptal.com/developers/gitignore/api/python # Created by https://www.toptal.com/developers/gitignore/api/python

View File

@ -21,6 +21,7 @@ import logging
from functools import reduce from functools import reduce
from datetime import datetime from datetime import datetime
from numpy import sqrt from numpy import sqrt
from numpy import asarray
from tools import timer from tools import timer
from View.Tools.PamhyrPlot import PamhyrPlot from View.Tools.PamhyrPlot import PamhyrPlot
@ -31,6 +32,7 @@ logger = logging.getLogger()
unit = { unit = {
"bed_elevation": "0-meter", "bed_elevation": "0-meter",
"bed_elevation_envelop": "0-meter",
"water_elevation": "0-meter", "water_elevation": "0-meter",
"water_elevation_envelop": "0-meter", "water_elevation_envelop": "0-meter",
"discharge": "1-m3s", "discharge": "1-m3s",
@ -82,11 +84,97 @@ class CustomPlot(PamhyrPlot):
self._axes = {} self._axes = {}
def draw_bottom_with_bedload(self, reach):
self._bedrock = self.sl_compute_bedrock(reach)
rk = reach.geometry.get_rk()
z = self.sl_compute_current_z(reach)
return z
def sl_compute_current_z(self, reach):
z_br = self._bedrock
sl = self.sl_compute_current_rk(reach)
z = list(
map(
lambda z, sl: reduce(
lambda z, h: z + h[0],
sl, z
),
z_br, # Bedrock elevation
sl # Current sediment layers
)
)
return z
def sl_compute_bedrock(self, reach):
z_min = reach.geometry.get_z_min()
sl = self.sl_compute_initial(reach)
z = list(
map(
lambda z, sl: reduce(
lambda z, h: z - h[0],
sl, z
),
z_min, # Original geometry
sl # Original sediment layers
)
)
return z
def sl_compute_initial(self, reach):
"""
Get SL list for profile p at initial time (initial data)
"""
t0 = min(list(self.data.get("timestamps")))
return map(
lambda p: p.get_ts_key(t0, "sl")[0],
reach.profiles
)
def sl_compute_current_rk(self, reach):
"""
Get SL list for profile p at current time
"""
return map(
lambda p: p.get_ts_key(self._timestamp, "sl")[0],
reach.profiles
)
def get_ts_zmin(self, profile):
results = self.data
nt = len(list(results.get("timestamps")))
reach = results.river.reach(self._reach)
berdrock = self.sl_compute_bedrock(reach)
sl = reach.profile(profile).get_key("sl")
ts_z_bedrock = [berdrock[profile]]*nt
ts_z_min = list(
map(
lambda z, sl: reduce(
lambda z, h: z + h,
sl, z
),
ts_z_bedrock, # Bedrock elevations
asarray(sl)[:,0,:,0] # Sediment layers
)
)
return ts_z_min
def _draw_rk(self): def _draw_rk(self):
results = self.data results = self.data
reach = results.river.reach(self._reach) reach = results.river.reach(self._reach)
rk = reach.geometry.get_rk() rk = reach.geometry.get_rk()
if reach.has_sediment():
z_min = self.draw_bottom_with_bedload(reach)
else:
z_min = reach.geometry.get_z_min() z_min = reach.geometry.get_z_min()
q = list( q = list(
map( map(
lambda p: p.get_ts_key(self._timestamp, "Q"), lambda p: p.get_ts_key(self._timestamp, "Q"),
@ -120,6 +208,36 @@ class CustomPlot(PamhyrPlot):
) )
self.lines["bed_elevation"] = line self.lines["bed_elevation"] = line
if self._envelop and reach.has_sediment():
ax = self._axes[unit["bed_elevation_envelop"]]
e = list(
map(
lambda p: max(self.get_ts_zmin(p)),
range(len(reach))
)
)
line1 = ax.plot(
rk, e,
color='grey', lw=1.,
linestyle='dotted',
)
self.lines["bed_elevation_envelop"] = line1
e = list(
map(
lambda p: min(self.get_ts_zmin(p)),
range(len(reach))
)
)
line2 = ax.plot(
rk, e,
color='grey', lw=1.,
linestyle='dotted',
)
# self.lines["bed_elevation_envelop"] = line2
if "water_elevation" in self._y: if "water_elevation" in self._y:
ax = self._axes[unit["water_elevation"]] ax = self._axes[unit["water_elevation"]]
@ -371,6 +489,11 @@ class CustomPlot(PamhyrPlot):
reach = results.river.reach(self._reach) reach = results.river.reach(self._reach)
rk = reach.geometry.get_rk() rk = reach.geometry.get_rk()
z_min = reach.geometry.get_z_min() z_min = reach.geometry.get_z_min()
if reach.has_sediment():
z_min = self.draw_bottom_with_bedload(reach)
else:
z_min = reach.geometry.get_z_min()
q = list( q = list(
map( map(
lambda p: p.get_ts_key(self._timestamp, "Q"), lambda p: p.get_ts_key(self._timestamp, "Q"),
@ -520,6 +643,9 @@ class CustomPlot(PamhyrPlot):
q = profile.get_key("Q") q = profile.get_key("Q")
z = profile.get_key("Z") z = profile.get_key("Z")
z_min = profile.geometry.z_min() z_min = profile.geometry.z_min()
if reach.has_sediment():
ts_z_min = self.get_ts_zmin(self._profile)
else:
ts_z_min = list( ts_z_min = list(
map( map(
lambda ts: z_min, lambda ts: z_min,
@ -656,6 +782,9 @@ class CustomPlot(PamhyrPlot):
q = profile.get_key("Q") q = profile.get_key("Q")
z = profile.get_key("Z") z = profile.get_key("Z")
if reach.has_sediment():
ts_z_min = self.get_ts_zmin(self._profile)
else:
z_min = profile.geometry.z_min() z_min = profile.geometry.z_min()
ts_z_min = list( ts_z_min = list(
map( map(
@ -663,6 +792,8 @@ class CustomPlot(PamhyrPlot):
ts ts
) )
) )
if "bed_elevation" in self._y:
self.lines["bed_elevation"][0].set_ydata(ts_z_min)
if "water_elevation" in self._y: if "water_elevation" in self._y:
self.lines["water_elevation"][0].set_ydata(z) self.lines["water_elevation"][0].set_ydata(z)
@ -716,6 +847,9 @@ class CustomPlot(PamhyrPlot):
) )
self.lines["wet_area"][0].set_ydata(d) self.lines["wet_area"][0].set_ydata(d)
self.canvas.axes.relim(visible_only=True)
self.canvas.axes.autoscale_view()
def draw(self): def draw(self):
self.draw_static() self.draw_static()
@ -776,15 +910,15 @@ class CustomPlot(PamhyrPlot):
lw=1., lw=1.,
) )
self.canvas.figure.canvas.draw_idle()
if self.toolbar is not None: if self.toolbar is not None:
self.toolbar.update() self.toolbar.update()
self.canvas.draw_idle()
@timer @timer
def update(self): def update(self):
# if not self._init:
self.draw_update() self.draw_update()
self.draw_current() self.draw_current()
# self.draw_static()
return return
def set_reach(self, reach_id): def set_reach(self, reach_id):
@ -817,4 +951,5 @@ class CustomPlot(PamhyrPlot):
elif self._x == "time": elif self._x == "time":
x = self._timestamp x = self._timestamp
self._current.set_data([x, x], self.canvas.axes.get_ylim()) self._current.set_data([x, x], self.canvas.axes.get_ylim())
self.canvas.figure.canvas.draw_idle() self.canvas.draw_idle()

View File

@ -42,6 +42,9 @@ class CustomPlotTranslate(ResultsTranslate):
self._dict['discharge'] = self._dict["unit_discharge"] self._dict['discharge'] = self._dict["unit_discharge"]
self._dict['discharge_envelop'] = self._dict["unit_discharge_envelop"] self._dict['discharge_envelop'] = self._dict["unit_discharge_envelop"]
self._dict['bed_elevation'] = self._dict["unit_bed_elevation"] self._dict['bed_elevation'] = self._dict["unit_bed_elevation"]
self._dict['bed_elevation_envelop'] = self._dict[
"unit_bed_elevation_envelop"
]
self._dict['velocity'] = self._dict["unit_velocity"] self._dict['velocity'] = self._dict["unit_velocity"]
self._dict['width'] = self._dict["unit_width"] self._dict['width'] = self._dict["unit_width"]
self._dict['velocity_envelop'] = self._dict["unit_velocity_envelop"] self._dict['velocity_envelop'] = self._dict["unit_velocity_envelop"]

View File

@ -685,6 +685,7 @@ class ResultsWindow(PamhyrWindow):
my_dict[dict_x["rk"]] = reach.geometry.get_rk() my_dict[dict_x["rk"]] = reach.geometry.get_rk()
if "bed_elevation" in y: if "bed_elevation" in y:
my_dict[dict_y["bed_elevation"]] = reach.geometry.get_z_min() my_dict[dict_y["bed_elevation"]] = reach.geometry.get_z_min()
#if envelop and reach.has_sediment():
if "discharge" in y: if "discharge" in y:
my_dict[dict_y["discharge"]] = list( my_dict[dict_y["discharge"]] = list(
map( map(

View File

@ -113,6 +113,8 @@ class ResultsTranslate(MainTranslate):
} }
self._sub_dict["values_y_envelop"] = { self._sub_dict["values_y_envelop"] = {
"min_bed_elevation": self._dict["unit_min_bed_elevation"],
"max_bed_elevation": self._dict["unit_max_bed_elevation"],
"min_water_elevation": self._dict["unit_min_water_elevation"], "min_water_elevation": self._dict["unit_min_water_elevation"],
"max_water_elevation": self._dict["unit_max_water_elevation"], "max_water_elevation": self._dict["unit_max_water_elevation"],
"min_discharge": self._dict["unit_min_discharge"], "min_discharge": self._dict["unit_min_discharge"],

View File

@ -75,6 +75,15 @@ class UnitTranslate(CommonWordTranslate):
self._dict["unit_bed_elevation"] = _translate( self._dict["unit_bed_elevation"] = _translate(
"Unit", "Bed Elevation (m)" "Unit", "Bed Elevation (m)"
) )
self._dict["unit_bed_elevation_envelop"] = _translate(
"Unit", "Bed Elevation Envelop (m)"
)
self._dict["unit_max_bed_elevation"] = _translate(
"Unit", "Max Bed Elevation (m)"
)
self._dict["unit_min_bed_elevation"] = _translate(
"Unit", "Min Bed Elevation (m)"
)
self._dict["unit_water_elevation"] = _translate( self._dict["unit_water_elevation"] = _translate(
"Unit", "Water Elevation (m)" "Unit", "Water Elevation (m)"
) )