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-
81from polaris import Step
2+ from polaris .tasks .ocean import Ocean
93
104
115class 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 )
0 commit comments