Skip to content

Commit c3444ce

Browse files
committed
Refactor level height transformation to use cli_level_to_height function and update calculation type in ACCESS-ESM1.6 mappings
1 parent 70b2366 commit c3444ce

File tree

4 files changed

+19
-57
lines changed

4 files changed

+19
-57
lines changed

src/access_moppy/atmosphere.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -152,18 +152,17 @@ def select_and_process_variables(self):
152152
],
153153
errors="ignore",
154154
)
155+
elif calc["type"] == "dataset_function":
156+
# Function that operates on the full dataset
157+
func_name = calc["function"]
158+
self.ds = self.ds.rename({required_vars[0]: self.cmor_name})
159+
self.ds = custom_functions[func_name](self.ds, **calc.get("kwargs", {}))
155160
else:
156161
raise ValueError(f"Unsupported calculation type: {calc['type']}")
157162

158-
# Handle level coordinate transformation
159-
if "theta_level_height" in self.ds:
160-
self.ds = (self.ds.assign_coords({"lev": self.ds["theta_level_height"]})
161-
.swap_dims({"model_theta_level_number": "lev"})
162-
.drop_vars(["theta_level_height", "model_theta_level_number"], errors="ignore"))
163-
axes_rename_map.pop("theta_level_height", None)
164-
165163
# Rename axes and bounds variables
166-
self.ds = self.ds.rename({**bounds_rename_map, **axes_rename_map})
164+
rename_map = {k: v for k, v in {**bounds_rename_map, **axes_rename_map}.items() if k in self.ds}
165+
self.ds = self.ds.rename(rename_map)
167166

168167
# Transpose the data variable according to the CMOR dimensions
169168
cmor_dims = re.sub(r'\w*level', 'lev', self.vocab.variable["dimensions"]).split()

src/access_moppy/derivations/__init__.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import operator
22
from functools import reduce
33

4-
from access_moppy.derivations.calc_atmos import level_to_height, swap_dimensions
4+
from access_moppy.derivations.calc_atmos import cli_level_to_height
55
from access_moppy.derivations.calc_land import (
66
average_tile,
77
calc_landcover,
@@ -19,12 +19,11 @@
1919
"mean": lambda *args: sum(args) / len(args),
2020
"kelvin_to_celsius": lambda x: x - 273.15,
2121
"celsius_to_kelvin": lambda x: x + 273.15,
22-
"level_to_height": level_to_height,
22+
"cli_level_to_height": cli_level_to_height,
2323
"calc_topsoil": calc_topsoil,
2424
"calc_landcover": calc_landcover,
2525
"extract_tilefrac": extract_tilefrac,
2626
"average_tile": average_tile,
27-
"swap_dimensions": swap_dimensions,
2827
}
2928

3029

src/access_moppy/derivations/calc_atmos.py

Lines changed: 7 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -247,48 +247,11 @@
247247
# ----------------------------------------------------------------------
248248

249249

250-
def level_to_height(var, levs=None):
251-
"""Returns model level variable with level height instead of
252-
number as dimension
250+
def cli_level_to_height(ds):
251+
# Handle level coordinate transformation
252+
if "theta_level_height" in ds:
253+
ds = (ds.assign_coords({"lev": ds["theta_level_height"]})
254+
.swap_dims({"model_theta_level_number": "lev"})
255+
.drop_vars(["theta_level_height", "model_theta_level_number"], errors="ignore"))
256+
return ds
253257

254-
Parameters
255-
----------
256-
var : Xarray DataArray
257-
Variable defined on model levels number
258-
levs : tuple(str,str)
259-
slice of levels to apply (optional, default is None)
260-
261-
Returns
262-
-------
263-
vout : Xarray DataArray
264-
Same variable defined on model levels height
265-
266-
"""
267-
zdim = var.dims
268-
zdim_height = zdim.replace("number", "height").replace("model_", "")
269-
var = var.swap_dims({zdim: zdim_height})
270-
if levs is not None:
271-
var = var.isel({zdim_height: slice(int(levs[0]), int(levs[1]))})
272-
return var
273-
274-
275-
def swap_dimensions(var, in_dim, out_dim):
276-
"""Swap dimensions of an xarray DataArray.
277-
278-
Parameters
279-
----------
280-
var : xarray.DataArray
281-
The input DataArray.
282-
in_dim : str
283-
The name of the dimension to be replaced.
284-
out_dim : str
285-
The name of the new dimension.
286-
287-
Returns
288-
-------
289-
xarray.DataArray
290-
The DataArray with swapped dimensions.
291-
"""
292-
var = var.swap_dims({in_dim: out_dim})
293-
294-
return var

src/access_moppy/mappings/ACCESS-ESM1.6_mappings.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,9 @@
115115
"formula": "z = a + b*orog"
116116
},
117117
"calculation": {
118-
"type": "direct"
119-
118+
"type": "dataset_function",
119+
"function": "cli_level_to_height",
120+
"kwargs": {}
120121
}
121122
},
122123
"clivi": {

0 commit comments

Comments
 (0)