Skip to content

Commit 96a413c

Browse files
committed
fixed nesting with both disjoint and nested nests
1 parent 6d5a36a commit 96a413c

5 files changed

Lines changed: 42 additions & 55 deletions

File tree

dnora/executer/decorators.py

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,8 @@ def add_write_method(file_type: DnoraFileType):
55
def wrapper(c):
66
def write(self, **kwargs) -> None:
77
self._write(file_type=file_type, **kwargs)
8-
nest = self._nest
9-
10-
while nest is not None:
11-
nest._write(file_type=file_type, **kwargs)
12-
nest = nest._nest
8+
for __, single_nest in self._nest.items():
9+
exec(f"single_nest.write_{file_type.name.lower()}_file(**kwargs)")
1310

1411
exec(f"c.write_{file_type.name.lower()}_file = write")
1512
return c
@@ -21,11 +18,8 @@ def add_run_method(file_type: DnoraFileType):
2118
def wrapper(c):
2219
def run(self, **kwargs) -> None:
2320
self._run(file_type=file_type, **kwargs)
24-
nest = self._nest
25-
26-
while nest is not None:
27-
nest._run(file_type=file_type, **kwargs)
28-
nest = nest._nest
21+
for __, single_nest in self._nest.items():
22+
exec(f"single_nest.run_{file_type.name.lower()}(**kwargs)")
2923

3024
exec(f"c.run_{file_type.name.lower()} = run")
3125
return c

dnora/executer/executer.py

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from typing import Union, Optional
1414

1515

16+
@add_run_method(DnoraFileType.INPUT)
1617
@add_run_method(DnoraFileType.SPECTRA)
1718
@add_run_method(DnoraFileType.ICE)
1819
@add_run_method(DnoraFileType.WATERLEVEL)
@@ -38,10 +39,14 @@ def _get_default_format(self) -> str:
3839

3940
def __init__(self, model, include_nest: bool = True):
4041
self.model = model
41-
if include_nest and model.nest() is not None:
42-
self._nest = self.__class__(model.nest())
43-
else:
44-
self._nest = None
42+
self._nest = {}
43+
if not self.model.parent():
44+
msg.header(self, "Initializing model executer...")
45+
msg.plain(f"Will execute '{model.grid().name}'")
46+
if include_nest and model.nest():
47+
for name, nest in self.model.nest(get_dict=True).items():
48+
msg.plain(f"Will execute '{name}' inside '{model.grid().name}'")
49+
self._nest[name] = self.__class__(nest)
4550

4651
def dry_run(self) -> bool:
4752
return self._dry_run or self.model.dry_run()
@@ -118,28 +123,16 @@ def run_model(
118123
**kwargs,
119124
):
120125
"""Run the main model. Set post_process=False to disable any post-processing that might be defined."""
121-
self._run(
122-
file_type=DnoraFileType.INPUT,
126+
127+
# Use the method generated by the decorateor, since that will automatically go through all nested grids if present
128+
self.run_input(
123129
model_runner=model_runner,
124130
model_folder=model_folder,
125131
post_process=post_process,
126132
dry_run=dry_run,
127133
**kwargs,
128134
)
129135

130-
nest = self._nest
131-
132-
while nest is not None:
133-
nest._run(
134-
file_type=DnoraFileType.INPUT,
135-
model_runner=model_runner,
136-
model_folder=model_folder,
137-
post_process=post_process,
138-
dry_run=dry_run,
139-
**kwargs,
140-
)
141-
nest = nest._nest
142-
143136
def _run(
144137
self,
145138
file_type: Union[DnoraFileType, str],

dnora/executer/inputfile/inputfile_writers.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -377,12 +377,13 @@ def __call__(
377377

378378
swan_spectral_output_points(file_out, model.grid(), STR_START, homog)
379379

380-
if model.nest() is not None:
381-
if not homog:
382-
nest_start_time = model.nest().start_time()
383-
else:
384-
nest_start_time = None
385-
swan_output_for_nest(file_out, model.nest().grid(), nest_start_time)
380+
if model.nest():
381+
for __, nest in model.nest(get_dict=True).items():
382+
if not homog:
383+
nest_start_time = nest.start_time()
384+
else:
385+
nest_start_time = None
386+
swan_output_for_nest(file_out, nest.grid(), nest_start_time)
386387

387388
file_out.write("COMPUTE")
388389
if not homog:

dnora/export/decorators.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,8 @@ def wrapper(c):
66
def export(self, *args, **kwargs) -> None:
77
self.export(obj_type, *args, **kwargs)
88

9-
nest = self._nest
10-
11-
while nest is not None:
12-
nest.export(obj_type, *args, **kwargs)
13-
nest = nest._nest
9+
for __, single_nest in self._nest.items():
10+
exec(f"single_nest.export_{obj_type.name.lower()}(*args, **kwargs)")
1411

1512
exec(f"c.export_{obj_type.name.lower()} = export")
1613
return c

dnora/export/exporter.py

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,11 @@ def _get_writer(
5252

5353
def __init__(self, model, include_nest: bool = True):
5454
self.model = model
55-
if include_nest and model.nest() is not None:
56-
msg.process(
57-
f"Including nested grid {model.nest().grid().name} inside {model.grid().name}"
58-
)
59-
self._nest = self.__class__(model.nest())
60-
else:
61-
self._nest = None
55+
self._nest = {}
56+
if include_nest and model.nest():
57+
for name, nest in self.model.nest(get_dict=True).items():
58+
msg.process(f"Including nested grid {name} inside {model.grid().name}")
59+
self._nest[name] = self.__class__(nest)
6260

6361
def export(
6462
self,
@@ -78,18 +76,22 @@ def export(
7876

7977
if not self.dry_run():
8078
if not self._silent:
81-
if self.model.get(obj_type) is not None:
82-
data_name = f" from {self.model[obj_type].name}"
83-
else:
84-
data_name = ""
79+
if self.model.get(obj_type) is None:
80+
return
81+
# if self.model.parent() is None or (
82+
# self.model.parent() is not None
83+
# and self.model.parent().get(obj_type) is not None
84+
# and self.model.parent().get(obj_type).name
85+
# == self.model[obj_type].name
86+
# ):
8587
msg.header(
8688
writer_function,
87-
f"Writing {obj_type.name} data" + data_name,
89+
f"Writing {obj_type.name} data from {self.model[obj_type].name}",
8890
)
8991

90-
if self.model.get(obj_type) is None:
91-
msg.info(f"No {obj_type.name} data exists. Won't export anything.")
92-
return
92+
# if self.model.get(obj_type) is None:
93+
# msg.info(f"No {obj_type.name} data exists. Won't export anything.")
94+
# return
9395

9496
if spectral_convention is None:
9597
try: # GeneralWritingFunction might not have this method defined

0 commit comments

Comments
 (0)