mirror of
https://gitlab.com/pamhyr/pamhyr2.git
synced 2026-10-30 03:20:41 +01:00
RubarBE: split critical Shields stress (TCADIM) from water viscosity (VISC)
This commit is contained in:
1 parent
bf2d3ae7a9
commit
657f54ff91
5 files changed
+81
-19
No files matched your search
@@ -315,6 +315,14 @@ class SolverParametersList(PamhyrModelList):
|
|||||||
|
|
||||||
n._lst = list(map(lambda t: t[1], sorted(lst)))
|
n._lst = list(map(lambda t: t[1], sorted(lst)))
|
||||||
|
|
||||||
|
# Parameters added to the solver after the study was saved
|
||||||
|
names = {p.name for p in n._lst}
|
||||||
|
n._lst += [
|
||||||
|
Parameter(name=name, value=value, status=status)
|
||||||
|
for name, value in st.default_parameters()
|
||||||
|
if name not in names
|
||||||
|
]
|
||||||
|
|
||||||
new[solver] = n
|
new[solver] = n
|
||||||
|
|
||||||
return new
|
return new
|
||||||
|
|||||||
+44
-1
@@ -92,6 +92,7 @@ class Rubar3(CommandLineSolver):
|
|||||||
("rubarbe_sediment_mult_3", ""),
|
("rubarbe_sediment_mult_3", ""),
|
||||||
("rubarbe_sediment_mult_4", ""),
|
("rubarbe_sediment_mult_4", ""),
|
||||||
("rubarbe_sediment_mult_5", ""),
|
("rubarbe_sediment_mult_5", ""),
|
||||||
|
("rubarbe_sediment_tcadim", "0.047"),
|
||||||
("rubarbe_sediment_visc", "1.3E-06"),
|
("rubarbe_sediment_visc", "1.3E-06"),
|
||||||
("rubarbe_sediment_opts", "3"),
|
("rubarbe_sediment_opts", "3"),
|
||||||
("rubarbe_sediment_odchar", "0"),
|
("rubarbe_sediment_odchar", "0"),
|
||||||
@@ -200,7 +201,7 @@ class Rubar3(CommandLineSolver):
|
|||||||
_ts_fields = (
|
_ts_fields = (
|
||||||
("ros", "real"), ("por", "real"), ("dcharg", "real"),
|
("ros", "real"), ("por", "real"), ("dcharg", "real"),
|
||||||
("halfa", "real"), ("mult_1", "multipliers"),
|
("halfa", "real"), ("mult_1", "multipliers"),
|
||||||
("visc", "real"), ("opts", "law"), ("odchar", "integer"),
|
("visc", "visc"), ("opts", "law"), ("odchar", "integer"),
|
||||||
("unisol", "integer"), ("typdef", "integer"),
|
("unisol", "integer"), ("typdef", "integer"),
|
||||||
("depot", "depot"), ("choixc", "integer"),
|
("depot", "depot"), ("choixc", "integer"),
|
||||||
("option", "options"), ("capsol", "integer"),
|
("option", "options"), ("capsol", "integer"),
|
||||||
@@ -208,6 +209,28 @@ class Rubar3(CommandLineSolver):
|
|||||||
("defond", "integer"), ("varcons", "integer"),
|
("defond", "integer"), ("varcons", "integer"),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# rubar_init.f90 (inits): laws whose critical stress may come from the
|
||||||
|
# Shields diagram, and laws without critical stress
|
||||||
|
_shields_laws = {1, 10, 11, 12, 14, 25, 26}
|
||||||
|
_no_threshold_laws = {2, 3, 8, 13, 18, 19, 22, 23, 24}
|
||||||
|
_brownlie_law = 16
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def tcadim_required(cls, opts, option):
|
||||||
|
"""True if RubarBE reads the dimensionless critical stress TCADIM
|
||||||
|
for transport law OPTS and options OPTION (notice §3.10)"""
|
||||||
|
try:
|
||||||
|
law = int(opts)
|
||||||
|
except ValueError:
|
||||||
|
return False
|
||||||
|
|
||||||
|
shields = len(option) == 3 and option[1] != "1"
|
||||||
|
if shields and law in cls._shields_laws:
|
||||||
|
return False
|
||||||
|
if law in cls._no_threshold_laws or law == cls._brownlie_law:
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _reaches_without_solid_boundary(study):
|
def _reaches_without_solid_boundary(study):
|
||||||
river = study.river
|
river = study.river
|
||||||
@@ -344,6 +367,26 @@ class Rubar3(CommandLineSolver):
|
|||||||
value = self._required(values, key)
|
value = self._required(values, key)
|
||||||
if kind == "real":
|
if kind == "real":
|
||||||
result = self._real(value, key)
|
result = self._real(value, key)
|
||||||
|
elif kind == "visc":
|
||||||
|
# Notice annex 1: TCADIM then VISC, read as (A50, A20) then
|
||||||
|
# two F10.0. A single value would be read as TCADIM, with
|
||||||
|
# VISC = 0 (rubar_init.f90, inits).
|
||||||
|
if Decimal(self._real(value, key)) <= 0:
|
||||||
|
raise ValueError(f"{key}: expected a positive viscosity")
|
||||||
|
tcadim_key = prefix + "tcadim"
|
||||||
|
tcadim = values.get(tcadim_key, "")
|
||||||
|
if tcadim:
|
||||||
|
result = self._real(tcadim, tcadim_key)
|
||||||
|
elif self.tcadim_required(values.get(prefix + "opts", ""),
|
||||||
|
values.get(prefix + "option", "")):
|
||||||
|
message = trad["missing_tcadim"].format(key=tcadim_key)
|
||||||
|
logger.warning(message)
|
||||||
|
if qlog is not None:
|
||||||
|
qlog.put(trad["warning"].format(message=message))
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
result = " " * 10
|
||||||
|
result += self._real(value, key)
|
||||||
elif kind == "multipliers":
|
elif kind == "multipliers":
|
||||||
result = self._real(value, key)
|
result = self._real(value, key)
|
||||||
extras = [values.get(prefix + f"mult_{i}", "")
|
extras = [values.get(prefix + f"mult_{i}", "")
|
||||||
|
|||||||
@@ -43,6 +43,12 @@ class RunSolverTranslate(PamhyrTranslate):
|
|||||||
"Export cancelled: REGIME=1 is incompatible with CONDAM=0. "
|
"Export cancelled: REGIME=1 is incompatible with CONDAM=0. "
|
||||||
"A reflecting upstream boundary cannot impose the water depth."
|
"A reflecting upstream boundary cannot impose the water depth."
|
||||||
)
|
)
|
||||||
|
self._dict["missing_tcadim"] = _translate(
|
||||||
|
"Solver",
|
||||||
|
"Export cancelled: {key}: the selected transport law and options "
|
||||||
|
"use a dimensionless critical stress given by the user. "
|
||||||
|
"Fill it in the parameters (tab Solid Transport)."
|
||||||
|
)
|
||||||
self._dict["missing_solid_boundary"] = _translate(
|
self._dict["missing_solid_boundary"] = _translate(
|
||||||
"Solver",
|
"Solver",
|
||||||
"Export cancelled: sediment transport (TRASED) is enabled but "
|
"Export cancelled: sediment transport (TRASED) is enabled but "
|
||||||
|
|||||||
@@ -156,10 +156,15 @@ def fields():
|
|||||||
add('sediment_option', 2, 'Calcul de la contrainte critique',
|
add('sediment_option', 2, 'Calcul de la contrainte critique',
|
||||||
'Trois choix indépendants, enregistrés ensemble dans OPTION.',
|
'Trois choix indépendants, enregistrés ensemble dans OPTION.',
|
||||||
kind='options')
|
kind='options')
|
||||||
add('sediment_visc', 2, 'Viscosité ou seuil critique',
|
add('sediment_tcadim', 2, 'Seuil critique adimensionnel (—)',
|
||||||
'Selon la configuration : seuil critique adimensionnel fourni, ou '
|
'Contrainte critique adimensionnelle (TCADIM) fournie par '
|
||||||
'viscosité cinématique de l’eau. À 15 °C : environ 1,30 × 10⁻⁶ m²/s. '
|
'l’utilisateur, par exemple 0,047 pour Meyer-Peter et Müller ou 0,15 '
|
||||||
'Un changement de mode ne convertit pas la valeur.', positive=True)
|
'pour Recking et al. (2008). Utilisée lorsque le seuil n’est pas '
|
||||||
|
'calculé par le diagramme de Shields et que la loi en a besoin.',
|
||||||
|
positive=True, optional=True)
|
||||||
|
add('sediment_visc', 2, 'Viscosité cinématique de l’eau (m²/s)',
|
||||||
|
'Viscosité cinématique de l’eau, variable avec la température. '
|
||||||
|
'À 15 °C : environ 1,30 × 10⁻⁶ m²/s.', positive=True)
|
||||||
choice('sediment_choixc', 2, 'Calcul de la contrainte hydrodynamique de '
|
choice('sediment_choixc', 2, 'Calcul de la contrainte hydrodynamique de '
|
||||||
'cisaillement',
|
'cisaillement',
|
||||||
'MPC : méthode des perpendiculaires confondues (notice §8.5).',
|
'MPC : méthode des perpendiculaires confondues (notice §8.5).',
|
||||||
@@ -327,6 +332,10 @@ def active(field, values):
|
|||||||
return False
|
return False
|
||||||
if key == 'tiopdt':
|
if key == 'tiopdt':
|
||||||
return values.get('rubarbe_iopdt', '').lower() == 'm'
|
return values.get('rubarbe_iopdt', '').lower() == 'm'
|
||||||
|
if key == 'sediment_tcadim':
|
||||||
|
return Rubar3.tcadim_required(
|
||||||
|
values.get('rubarbe_sediment_opts', ''),
|
||||||
|
values.get('rubarbe_sediment_option', ''))
|
||||||
if key in ('ros', 'dm', 'segma'):
|
if key in ('ros', 'dm', 'segma'):
|
||||||
return (not transport and
|
return (not transport and
|
||||||
values.get('rubarbe_optfpc', '0') not in ('', '0'))
|
values.get('rubarbe_optfpc', '0') not in ('', '0'))
|
||||||
|
|||||||
@@ -296,16 +296,6 @@ class RubarForm(QWidget):
|
|||||||
self._refreshing = False
|
self._refreshing = False
|
||||||
|
|
||||||
def _update_context(self, values):
|
def _update_context(self, values):
|
||||||
option = values.get('rubarbe_sediment_option', '')
|
|
||||||
label = self.labels.get('rubarbe_sediment_visc')
|
|
||||||
if label is not None:
|
|
||||||
if len(option) == 3 and all(c in '12' for c in option):
|
|
||||||
title = ('Seuil critique adimensionnel (—)' if option[1] == '1'
|
|
||||||
else 'Viscosité cinématique de l’eau (m²/s)')
|
|
||||||
label.setText(tr(title))
|
|
||||||
else:
|
|
||||||
label.setText(tr(
|
|
||||||
'Viscosité / seuil : préciser les trois choix'))
|
|
||||||
warnings = []
|
warnings = []
|
||||||
if not self.editable:
|
if not self.editable:
|
||||||
warnings.append(tr('Étude en lecture seule.'))
|
warnings.append(tr('Étude en lecture seule.'))
|
||||||
@@ -334,15 +324,21 @@ class RubarForm(QWidget):
|
|||||||
warnings.append(tr('La fin du calcul doit suivre son début.'))
|
warnings.append(tr('La fin du calcul doit suivre son début.'))
|
||||||
except (KeyError, ValueError):
|
except (KeyError, ValueError):
|
||||||
pass
|
pass
|
||||||
if transport and len(option) == 3 and option[1] == '2':
|
if transport:
|
||||||
try:
|
try:
|
||||||
if float(values.get('rubarbe_sediment_visc', '0')) > 0.001:
|
if float(values.get('rubarbe_sediment_visc', '0')) > 0.001:
|
||||||
warnings.append(tr(
|
warnings.append(tr(
|
||||||
'Viscosité élevée pour de l’eau : vérifiez la valeur, '
|
'Viscosité élevée pour de l’eau : vérifiez la valeur. '
|
||||||
'qui n’a pas été convertie lors du changement '
|
'Le seuil critique adimensionnel se saisit dans son '
|
||||||
'de mode.'))
|
'propre champ.'))
|
||||||
except ValueError:
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
|
if (FIELDS['rubarbe_sediment_tcadim'].key in self.editors and
|
||||||
|
active(FIELDS['rubarbe_sediment_tcadim'], values) and
|
||||||
|
not values.get('rubarbe_sediment_tcadim', '').strip()):
|
||||||
|
warnings.append(tr(
|
||||||
|
'La loi et les options choisies utilisent un seuil '
|
||||||
|
'critique adimensionnel : renseignez-le.'))
|
||||||
self.notice.setText('\n'.join(warnings))
|
self.notice.setText('\n'.join(warnings))
|
||||||
self.notice.setVisible(bool(warnings))
|
self.notice.setVisible(bool(warnings))
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user