Compare commits

..

3 Commits

Author SHA1 Message Date
Dylan Jeannin 5287f30636 AdisTT: Handling cases where parameters do not have time series 2026-07-17 15:05:21 +02:00
Dylan Jeannin 67433ae325 AdisTS: delete duplicate function 2026-07-17 13:51:18 +02:00
Dylan Jeannin d27ce9d1d8 AdisTT: rewriting reach names in parser + copy the net folder from mage 2026-07-17 13:45:40 +02:00
5 changed files with 45 additions and 50 deletions

View File

@ -54,8 +54,10 @@ class Scenario(SQLSubModel):
"river_reach", "river_node", "river_reach", "river_node",
"geotiff", "reservoir", "reservoir_data", "geotiff", "reservoir", "reservoir_data",
# Temperature # Temperature
"boundary_condition_temperature", "boundary_condition_data_temperature", "boundary_condition_temperature",
"initial_conditions_temperature", "initial_conditions_temperature_spec", "boundary_condition_data_temperature",
"initial_conditions_temperature",
"initial_conditions_temperature_spec",
"weather_parameters", "weather_parameters_data", "weather_parameters", "weather_parameters_data",
] ]

View File

@ -117,9 +117,6 @@ class AdisTS(CommandLineSolver):
_nodes_names = {} _nodes_names = {}
_nodes_views = set() _nodes_views = set()
def get_reach_name(self, reach):
return f"Reach_{reach.pamhyr_id:>3}".replace(" ", "0")
def get_node_name(self, node): def get_node_name(self, node):
"""Generate a 3 char name for node """Generate a 3 char name for node
@ -182,7 +179,7 @@ class AdisTS(CommandLineSolver):
# Write header # Write header
edges = study.river.enable_edges() edges = study.river.enable_edges()
for edge in edges: for edge in edges:
name = f"Reach_{edge.id + 1:>3}".replace(" ", "0") name = self.get_reach_name(edge)
with adists_file_open( with adists_file_open(
os.path.join(repertory, "net", f"{name}.ST"), os.path.join(repertory, "net", f"{name}.ST"),
@ -277,7 +274,7 @@ class AdisTS(CommandLineSolver):
edges = study.river.enable_edges() edges = study.river.enable_edges()
for e in edges: for e in edges:
name = f"Reach_{e.id + 1:>3}".replace(" ", "0") name = self.get_reach_name(e)
id = name id = name
n1 = f"{self.get_node_name(e.node1):3}".replace(" ", "x") n1 = f"{self.get_node_name(e.node1):3}".replace(" ", "x")
@ -453,7 +450,8 @@ class AdisTS(CommandLineSolver):
_nodes_views = set() _nodes_views = set()
def get_reach_name(self, reach): def get_reach_name(self, reach):
return f"Reach_{reach.pamhyr_id:>3}".replace(" ", "0") index = self._study.river.get_edge_id(reach) + 1
return f"Reach_{index:03d}"
################################# #################################
# Adis-TS in weak coupling mode # # Adis-TS in weak coupling mode #

View File

@ -113,7 +113,8 @@ class AdisTT(CommandLineSolver):
_nodes_views = set() _nodes_views = set()
def get_reach_name(self, reach): def get_reach_name(self, reach):
return f"Reach_{reach.pamhyr_id:>3}".replace(" ", "0") index = self._study.river.get_edge_id(reach) + 1
return f"Reach_{index:03d}"
def get_node_name(self, node): def get_node_name(self, node):
"""Generate a 3 char name for node """Generate a 3 char name for node
@ -177,7 +178,7 @@ class AdisTT(CommandLineSolver):
# Write header # Write header
edges = study.river.enable_edges() edges = study.river.enable_edges()
for edge in edges: for edge in edges:
name = f"Reach_{edge.id + 1:>3}".replace(" ", "0") name = self.get_reach_name(edge)
with adistt_file_open( with adistt_file_open(
os.path.join(repertory, "net", f"{name}.ST"), os.path.join(repertory, "net", f"{name}.ST"),
@ -240,7 +241,7 @@ class AdisTT(CommandLineSolver):
edges = study.river.enable_edges() edges = study.river.enable_edges()
for e in edges: for e in edges:
name = f"Reach_{e.id + 1:>3}".replace(" ", "0") name = self.get_reach_name(e)
id = name id = name
n1 = f"{self.get_node_name(e.node1):3}".replace(" ", "x") n1 = f"{self.get_node_name(e.node1):3}".replace(" ", "x")
@ -412,9 +413,6 @@ class AdisTT(CommandLineSolver):
_nodes_names = {} _nodes_names = {}
_nodes_views = set() _nodes_views = set()
def get_reach_name(self, reach):
return f"Reach_{reach.pamhyr_id:>3}".replace(" ", "0")
################################# #################################
# Adis-TT in weak coupling mode # # Adis-TT in weak coupling mode #
################################# #################################
@ -478,7 +476,8 @@ class AdisTTwc(AdisTT):
) )
TEM_BCs = ( TEM_BCs = (
study.river._BoundaryConditionsTemperature.BCs_Temperature_List study.river._BoundaryConditionsTemperature
.BCs_Temperature_List
) )
if TEM_BCs: if TEM_BCs:
@ -527,8 +526,7 @@ class AdisTTwc(AdisTT):
f.write(f"*État initial pour le polluant {TEM_name}\n") f.write(f"*État initial pour le polluant {TEM_name}\n")
f.write(" ".join(("DEFAULT =", f.write(" ".join(("DEFAULT =",
f"{TEM_IC_default.temperature}", f"{TEM_IC_default.temperature}",
"0.0 0.0 0.0\n"))) "0.0 0.0 0.0\n"))) # fake 0 to match adists
# fake 0 to match adists
if len(TEM_IC_default._data) != 0: if len(TEM_IC_default._data) != 0:
self._export_ICs_AdisTT_Spec( self._export_ICs_AdisTT_Spec(
@ -551,8 +549,7 @@ class AdisTTwc(AdisTT):
f"{ic_spec.start_rk}", f"{ic_spec.start_rk}",
f"{ic_spec.end_rk}", f"{ic_spec.end_rk}",
f"{ic_spec.temperature}" f"{ic_spec.temperature}"
f"0.0 0.0 0.0 0.0\n"))) f"0.0 0.0 0.0 0.0\n"))) # fake 0 to match adists
# fake 0 to match adists
return True return True
@ -946,10 +943,6 @@ class AdisTTwc(AdisTT):
"CCF": ("cld0", "CLD"), "CCF": ("cld0", "CLD"),
} }
_required_weather_extensions = (
"TDA", "HSA", "RAY", "VEN", "TNA", "QNA",
)
def _export_temperature_initial_conditions(self, study, repertory): def _export_temperature_initial_conditions(self, study, repertory):
initial_conditions = study.river.ic_temperature.Initial_Conditions_List initial_conditions = study.river.ic_temperature.Initial_Conditions_List
filename = "TEM.INI" filename = "TEM.INI"
@ -1000,17 +993,15 @@ class AdisTTwc(AdisTT):
def _export_weather_file(self, study, repertory, weather_parameter, def _export_weather_file(self, study, repertory, weather_parameter,
extension): extension):
reach = weather_parameter.reach
if reach is None or len(weather_parameter.data) == 0:
return None
filename = f"TEM.{extension}" filename = f"TEM.{extension}"
path = os.path.join(repertory, filename) path = os.path.join(repertory, filename)
mode = "a" if os.path.exists(path) else "w+" mode = "a" if os.path.exists(path) else "w+"
with adistt_file_open(path, mode) as f: with adistt_file_open(path, mode) as f:
reach = weather_parameter.reach reach_name = self.get_reach_name(reach)
if reach is None:
return None
reach_name = (
f"Reach_{study.river.get_edge_id(reach) + 1:>3}"
.replace(" ", "0")
)
f.write( f.write(
f"${reach_name} {weather_parameter.begin_rk} " f"${reach_name} {weather_parameter.begin_rk} "
f"{weather_parameter.end_rk}\n" f"{weather_parameter.end_rk}\n"
@ -1034,13 +1025,6 @@ class AdisTTwc(AdisTT):
if os.path.exists(path): if os.path.exists(path):
os.remove(path) os.remove(path)
# These files are mandatory for the AdisTT master file. They are
# created even when no spatial time series is defined in the study.
for extension in self._required_weather_extensions:
adistt_file_open(
os.path.join(repertory, f"TEM.{extension}"), "w+"
).close()
initial_file = self._export_temperature_initial_conditions( initial_file = self._export_temperature_initial_conditions(
study, repertory study, repertory
) )
@ -1063,20 +1047,16 @@ class AdisTTwc(AdisTT):
filename = f"{name}.TEM" filename = f"{name}.TEM"
with adistt_file_open(os.path.join(repertory, filename), "w+") as f: with adistt_file_open(os.path.join(repertory, filename), "w+") as f:
defaults = study.river.weather_parameters defaults = study.river.weather_parameters
for type_, (parameter, _) in self._weather_files.items(): for type_, (parameter, extension) in self._weather_files.items():
default = defaults.default_for_type(type_) default = defaults.default_for_type(type_)
if default is not None: if default is not None:
f.write(f"{parameter} = {default.value}\n") prefix = "*" if extension in weather_files else ""
f.write(f"{prefix}{parameter} = {default.value}\n")
f.write(f"file_ini = {initial_file}\n") f.write(f"file_ini = {initial_file}\n")
f.write(f"file_cl = {boundary_file}\n") f.write(f"file_cl = {boundary_file}\n")
for extension in self._required_weather_extensions:
f.write(
f"file_{extension.lower()} = TEM.{extension}\n"
)
for _, extension in self._weather_files.values(): for _, extension in self._weather_files.values():
if (extension in weather_files if extension in weather_files:
and extension not in self._required_weather_extensions):
f.write( f.write(
f"file_{extension.lower()} = " f"file_{extension.lower()} = "
f"{weather_files[extension]}\n" f"{weather_files[extension]}\n"
@ -1117,6 +1097,20 @@ class AdisTTwc(AdisTT):
self._study = study self._study = study
name = study.name.replace(" ", "_") name = study.name.replace(" ", "_")
mage_path = os.path.join(
os.path.abspath(os.path.join(repertory, os.pardir)),
mage_rep
)
source_net = os.path.join(mage_path, "net")
destination_net = os.path.join(repertory, "net")
if qlog is not None:
qlog.put("Copy Mage net directory")
if os.path.exists(destination_net):
shutil.rmtree(destination_net)
shutil.copytree(source_net, destination_net)
# Node names must be deterministic and identical in NET and TEM.CDT. # Node names must be deterministic and identical in NET and TEM.CDT.
self._nodes_cnt = 0 self._nodes_cnt = 0
self._nodes_names = {} self._nodes_names = {}

View File

@ -130,7 +130,8 @@ class Mage(CommandLineSolver):
_nodes_views = set() _nodes_views = set()
def get_reach_name(self, reach): def get_reach_name(self, reach):
return f"Reach_{reach.pamhyr_id:>3}".replace(" ", "0") index = self._study.river.get_edge_id(reach) + 1
return f"Reach_{index:03d}"
def get_node_name(self, node): def get_node_name(self, node):
"""Generate a 3 char name for node """Generate a 3 char name for node
@ -210,7 +211,7 @@ class Mage(CommandLineSolver):
# Write header # Write header
edges = study.river.enable_edges() edges = study.river.enable_edges()
for edge in edges: for edge in edges:
name = f"Reach_{edge.pamhyr_id:>3}".replace(" ", "0") name = self.get_reach_name(edge)
with mage_file_open( with mage_file_open(
os.path.join(repertory, "net", f"{name}.ST"), os.path.join(repertory, "net", f"{name}.ST"),