Skip to content

Commit 37d8818

Browse files
authored
Merge pull request #398 from xylar/fix-omega-pr-baseline-comparison
Translate variable names for Omega before baseline validation
2 parents 6393c92 + e221c6e commit 37d8818

File tree

4 files changed

+243
-117
lines changed

4 files changed

+243
-117
lines changed

docs/developers_guide/ocean/api.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@
77
:toctree: generated/
88
99
Ocean
10+
Ocean.map_to_native_model_vars
11+
Ocean.map_var_list_to_native_model
12+
Ocean.write_model_dataset
13+
Ocean.map_from_native_model_vars
14+
Ocean.map_var_list_from_native_model
15+
Ocean.open_model_dataset
1016
1117
add_tasks.add_ocean_tasks
1218
```
@@ -314,10 +320,10 @@
314320
315321
rpe.analysis.Analysis
316322
rpe.analysis.Analysis.run
317-
323+
318324
viz.Viz
319325
viz.Viz.run
320-
326+
321327
```
322328

323329
### single_column
Lines changed: 9 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,17 @@
1-
import importlib.resources as imp_res
2-
from typing import Dict, Union
3-
4-
import xarray as xr
5-
from mpas_tools.io import write_netcdf
6-
from ruamel.yaml import YAML
7-
81
from polaris import Step
2+
from polaris.tasks.ocean import Ocean
93

104

115
class OceanIOStep(Step):
126
"""
137
A step that writes input and/or output files for Omega or MPAS-Ocean
14-
15-
Attributes
16-
----------
17-
mpaso_to_omega_dim_map : dict
18-
A map from MPAS-Ocean dimension names to their Omega equivalents
19-
20-
omega_to_mpaso_dim_map : dict
21-
A map from Omega dimension names to their MPAS-Ocean equivalents, the
22-
inverse of ``mpaso_to_omega_dim_map``
23-
24-
mpaso_to_omega_var_map : dict
25-
A map from MPAS-Ocean variable names to their Omega equivalents
26-
27-
omega_to_mpaso_var_map : dict
28-
A map from Omega variable names to their MPAS-Ocean equivalents, the
29-
inverse of ``mpaso_to_omega_var_map``
308
"""
319

32-
def __init__(self, component, name, **kwargs):
33-
"""
34-
Create a new step
35-
36-
Parameters
37-
----------
38-
component : polaris.Component
39-
The component the step belongs to
40-
41-
name : str
42-
the name of the task
43-
44-
kwargs
45-
keyword arguments passed to `polaris.Step()`
46-
"""
47-
super().__init__(component=component, name=name, **kwargs)
48-
49-
self.mpaso_to_omega_dim_map: Union[None, Dict[str, str]] = None
50-
self.omega_to_mpaso_dim_map: Union[None, Dict[str, str]] = None
51-
self.mpaso_to_omega_var_map: Union[None, Dict[str, str]] = None
52-
self.omega_to_mpaso_var_map: Union[None, Dict[str, str]] = None
10+
# make sure component is of type Ocean
11+
component: Ocean
5312

54-
def setup(self):
55-
"""
56-
If the ocean model is Omega, set up maps between Omega and MPAS-Ocean
57-
variable names
58-
"""
59-
config = self.config
60-
model = config.get('ocean', 'model')
61-
if model == 'omega':
62-
self._read_var_map()
63-
elif model != 'mpas-ocean':
64-
raise ValueError(f'Unexpected ocean model: {model}')
65-
super().setup()
13+
def __init__(self, component: Ocean, **kwargs):
14+
super().__init__(component=component, **kwargs)
6615

6716
def map_to_native_model_vars(self, ds):
6817
"""
@@ -81,22 +30,7 @@ def map_to_native_model_vars(self, ds):
8130
The same dataset with variables renamed as appropriate for the
8231
ocean model being run
8332
"""
84-
config = self.config
85-
model = config.get('ocean', 'model')
86-
if model == 'omega':
87-
assert self.mpaso_to_omega_dim_map is not None
88-
rename = {
89-
k: v
90-
for k, v in self.mpaso_to_omega_dim_map.items()
91-
if k in ds.dims
92-
}
93-
assert self.mpaso_to_omega_var_map is not None
94-
rename_vars = {
95-
k: v for k, v in self.mpaso_to_omega_var_map.items() if k in ds
96-
}
97-
rename.update(rename_vars)
98-
ds = ds.rename(rename)
99-
return ds
33+
return self.component.map_to_native_model_vars(ds)
10034

10135
def write_model_dataset(self, ds, filename):
10236
"""
@@ -111,8 +45,7 @@ def write_model_dataset(self, ds, filename):
11145
filename : str
11246
The path for the NetCDF file to write
11347
"""
114-
ds = self.map_to_native_model_vars(ds)
115-
write_netcdf(ds=ds, fileName=filename)
48+
self.component.write_model_dataset(ds, filename)
11649

11750
def map_from_native_model_vars(self, ds):
11851
"""
@@ -130,22 +63,7 @@ def map_from_native_model_vars(self, ds):
13063
ds : xarray.Dataset
13164
The same dataset with variables named as expected in MPAS-Ocean
13265
"""
133-
config = self.config
134-
model = config.get('ocean', 'model')
135-
if model == 'omega':
136-
assert self.omega_to_mpaso_dim_map is not None
137-
rename = {
138-
k: v
139-
for k, v in self.omega_to_mpaso_dim_map.items()
140-
if k in ds.dims
141-
}
142-
assert self.omega_to_mpaso_var_map is not None
143-
rename_vars = {
144-
k: v for k, v in self.omega_to_mpaso_var_map.items() if k in ds
145-
}
146-
rename.update(rename_vars)
147-
ds = ds.rename(rename)
148-
return ds
66+
return self.component.map_from_native_model_vars(ds)
14967

15068
def open_model_dataset(self, filename, **kwargs):
15169
"""
@@ -165,27 +83,4 @@ def open_model_dataset(self, filename, **kwargs):
16583
ds : xarray.Dataset
16684
The dataset with variables named as expected in MPAS-Ocean
16785
"""
168-
ds = xr.open_dataset(filename, **kwargs)
169-
ds = self.map_from_native_model_vars(ds)
170-
return ds
171-
172-
def _read_var_map(self):
173-
"""
174-
Read the map from MPAS-Ocean to Omega dimension and variable names
175-
"""
176-
package = 'polaris.ocean.model'
177-
filename = 'mpaso_to_omega.yaml'
178-
text = imp_res.files(package).joinpath(filename).read_text()
179-
180-
yaml_data = YAML(typ='rt')
181-
nested_dict = yaml_data.load(text)
182-
self.mpaso_to_omega_dim_map = nested_dict['dimensions']
183-
self.mpaso_to_omega_var_map = nested_dict['variables']
184-
assert self.mpaso_to_omega_dim_map is not None
185-
self.omega_to_mpaso_dim_map = {
186-
v: k for k, v in self.mpaso_to_omega_dim_map.items()
187-
}
188-
assert self.mpaso_to_omega_var_map is not None
189-
self.omega_to_mpaso_var_map = {
190-
v: k for k, v in self.mpaso_to_omega_var_map.items()
191-
}
86+
return self.component.open_model_dataset(filename, **kwargs)

polaris/ocean/model/ocean_model_step.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from ruamel.yaml import YAML
55

66
from polaris.model_step import ModelStep
7+
from polaris.tasks.ocean import Ocean
78

89

910
class OceanModelStep(ModelStep):
@@ -26,9 +27,12 @@ class OceanModelStep(ModelStep):
2627
working directory)
2728
"""
2829

30+
# make sure component is of type Ocean
31+
component: Ocean
32+
2933
def __init__(
3034
self,
31-
component,
35+
component: Ocean,
3236
name,
3337
subdir=None,
3438
indir=None,
@@ -323,6 +327,28 @@ def update_namelist_eos(self):
323327

324328
self.add_model_config_options(options=replacements)
325329

330+
def validate_baselines(self):
331+
"""
332+
Compare variables between output files in this step and in the same
333+
step from a baseline run if one was provided.
334+
335+
Returns
336+
-------
337+
compared : bool
338+
Whether a baseline comparison was performed
339+
340+
success : bool
341+
Whether the outputs were successfully validated against a baseline
342+
"""
343+
# translate variable names to native model names
344+
validate_vars = {}
345+
for filename, vars in self.validate_vars.items():
346+
validate_vars[filename] = (
347+
self.component.map_var_list_to_native_model(vars)
348+
)
349+
self.validate_vars = validate_vars
350+
return super().validate_baselines()
351+
326352
def _update_ntasks(self):
327353
"""
328354
Update ``ntasks`` and ``min_tasks`` for the step based on the estimated

0 commit comments

Comments
 (0)