Compare commits

..
5 changed files with 102 additions and 8 deletions

No files matched your search

+39 -1
View File
@@ -143,8 +143,32 @@ class Rubar3(CommandLineSolver):
self._study = study self._study = study
name = study.name.replace(" ", "_") name = study.name.replace(" ", "_")
values = self._parameter_values(study)
if (values.get("rubarbe_regime") == "1" and
values.get("rubarbe_condam") == "0"):
trad = RunSolverTranslate()
message = trad["incompatible_upstream_boundary"]
logger.warning(message)
if qlog is not None:
qlog.put(trad["warning"].format(message=message))
return False
trased = self._parameter_flag(study, "trased") == "O"
if trased:
# Notice §3.6: HYDROS is required at each upstream boundary
missing = self._reaches_without_solid_boundary(study)
if missing:
trad = RunSolverTranslate()
message = trad["missing_solid_boundary"].format(
reaches=", ".join(missing)
)
logger.warning(message)
if qlog is not None:
qlog.put(trad["warning"].format(message=message))
return False
self._export_donnee(study, repertory, qlog, name=name) self._export_donnee(study, repertory, qlog, name=name)
if self._parameter_flag(study, "trased") == "O": if trased:
if not self._export_ts(study, repertory, qlog, name=name): if not self._export_ts(study, repertory, qlog, name=name):
return False return False
self._export_geomac_i(study, repertory, qlog, name=name) self._export_geomac_i(study, repertory, qlog, name=name)
@@ -184,6 +208,20 @@ class Rubar3(CommandLineSolver):
("defond", "integer"), ("varcons", "integer"), ("defond", "integer"), ("varcons", "integer"),
) )
@staticmethod
def _reaches_without_solid_boundary(study):
river = study.river
solid = [
bc for bc in river.boundary_condition.get_tab("solid")
if not bc.is_deleted() and bc.bctype == "SL" and len(bc) > 0
]
return [
edge.name for edge in river.enable_edges()
if river.is_upstream_node(edge.node1)
and not any(bc.node == edge.node1 for bc in solid)
]
def _parameter_values(self, study): def _parameter_values(self, study):
return {p.name: str(p.value).strip() return {p.name: str(p.value).strip()
for p in study.river.get_params(self.type).parameters} for p in study.river.get_params(self.type).parameters}
+2 -2
View File
@@ -35,7 +35,7 @@ solver_long_name = {
# "mage_fake7": "Mage fake v7", # "mage_fake7": "Mage fake v7",
"adistswc": "Adis-TS_WC", "adistswc": "Adis-TS_WC",
"adisttwc": "Adis-TT_WC", "adisttwc": "Adis-TT_WC",
# "rubarbe": "RubarBE", "rubarbe": "RubarBE",
"rubar3": "Rubar3", "rubar3": "Rubar3",
} }
@@ -46,6 +46,6 @@ solver_type_list = {
# "mage_fake7": MageFake7, # "mage_fake7": MageFake7,
"adistswc": AdisTSwc, "adistswc": AdisTSwc,
"adisttwc": AdisTTwc, "adisttwc": AdisTTwc,
# "rubarbe": RubarBE, "rubarbe": RubarBE,
"rubar3": Rubar3, "rubar3": Rubar3,
} }
+12
View File
@@ -38,6 +38,18 @@ class RunSolverTranslate(PamhyrTranslate):
"Please choose another transport law from the list." "Please choose another transport law from the list."
) )
self._dict["warning"] = _translate("Solver", "Warning: {message}") self._dict["warning"] = _translate("Solver", "Warning: {message}")
self._dict["incompatible_upstream_boundary"] = _translate(
"Solver",
"Export cancelled: REGIME=1 is incompatible with CONDAM=0. "
"A reflecting upstream boundary cannot impose the water depth."
)
self._dict["missing_solid_boundary"] = _translate(
"Solver",
"Export cancelled: sediment transport (TRASED) is enabled but "
"no solid boundary condition is defined at the upstream node "
"of reach(es): {reaches}. Add a solid boundary condition, or "
"disable sediment transport in the solver parameters."
)
self._dict["export_failed"] = _translate( self._dict["export_failed"] = _translate(
"Solver", "Export failed; task cancelled" "Solver", "Export failed; task cancelled"
) )
+23
View File
@@ -199,6 +199,12 @@ class RubarForm(QWidget):
def apply_pending(self): def apply_pending(self):
"""Commit focused text before Ctrl+S; leave invalid drafts visible.""" """Commit focused text before Ctrl+S; leave invalid drafts visible."""
values = self.values()
if (values.get('rubarbe_condam') == '0' and
values.get('rubarbe_regime') == '1'):
self.tabs.setCurrentIndex(1)
self.editors['rubarbe_condam'].setFocus()
return False
for key, editor in self.editors.items(): for key, editor in self.editors.items():
if (isinstance(editor, QLineEdit) and editor.isModified() and if (isinstance(editor, QLineEdit) and editor.isModified() and
active(self.descriptions[key], self.values())): active(self.descriptions[key], self.values())):
@@ -220,6 +226,13 @@ class RubarForm(QWidget):
value = self._validated(key, value) value = self._validated(key, value)
if value is None: if value is None:
return False return False
values = self.values()
values[key] = value
if (key in ('rubarbe_condam', 'rubarbe_regime') and
values.get('rubarbe_condam') == '0' and
values.get('rubarbe_regime') == '1'):
self.refresh()
return False
if isinstance(self.editors[key], QLineEdit): if isinstance(self.editors[key], QLineEdit):
self.editors[key].setModified(False) self.editors[key].setModified(False)
if self.values()[key] != value: if self.values()[key] != value:
@@ -270,6 +283,16 @@ class RubarForm(QWidget):
self.errors[key].setVisible( self.errors[key].setVisible(
enabled and bool(self.errors[key].text())) enabled and bool(self.errors[key].text()))
self._update_context(values) self._update_context(values)
for key, forbidden, blocked in (
('rubarbe_regime', '1', values.get('rubarbe_condam') == '0'),
('rubarbe_condam', '0', values.get('rubarbe_regime') == '1'),
):
editor = self.editors.get(key)
if editor is None:
continue
index = editor.findData(forbidden)
if index >= 0:
editor.model().item(index).setEnabled(not blocked)
self._refreshing = False self._refreshing = False
def _update_context(self, values): def _update_context(self, values):
+26 -5
View File
@@ -37,7 +37,7 @@ logger = logging.getLogger()
class Config(SQL): class Config(SQL):
def __init__(self): def __init__(self):
self._version = '0.0.9' self._version = '0.0.10'
self.filename = Config.filename() self.filename = Config.filename()
self.set_default_value() self.set_default_value()
@@ -221,6 +221,26 @@ class Config(SQL):
"VALUES ('display_manning', 'False')" "VALUES ('display_manning', 'False')"
) )
if int(release) < 10:
posix = os.name == 'posix'
ext = "" if posix else ".exe"
path = os.path.join("@install_dir",
"rubar", f"rubarbe{ext}")
self.execute(f"""
INSERT OR IGNORE INTO solver VALUES (
'rubarbe',
'default-RubarBE',
'Default Pamhyr2 RubarBE version',
'', '', '',
'',
'"{path}" @args @input',
''
)
""")
self.execute( self.execute(
f"UPDATE info SET value='{self._version}' " + f"UPDATE info SET value='{self._version}' " +
"WHERE key='version'" "WHERE key='version'"
@@ -417,11 +437,12 @@ class Config(SQL):
new._cmd_solver = f""""{path}" @args @input""" new._cmd_solver = f""""{path}" @args @input"""
self._solvers.append(new) self._solvers.append(new)
# Rubar3 # RubarBE (same executable as Rubar3, see notice §10.3)
ctor = solver_type_list["rubar3"] ctor = solver_type_list["rubarbe"]
new = ctor("default-Rubar3") new = ctor("default-RubarBE")
new._description = "Default Pamhyr2 RubarBE version" new._description = "Default Pamhyr2 RubarBE version"
new._cmd_solver = f""""@install_dir/rubar/rubarbe{ext}" @args @input""" path = os.path.join("@install_dir", "rubar", f"rubarbe{ext}")
new._cmd_solver = f""""{path}" @args @input"""
self._solvers.append(new) self._solvers.append(new)
# Mage fake 7 # Mage fake 7