Skip to content

Commit ef938db

Browse files
committed
Fix renaming of dimension in the Atmosphere CMORiser
1 parent 2f2be85 commit ef938db

File tree

3 files changed

+78
-33
lines changed

3 files changed

+78
-33
lines changed

src/access_mopper/cmip6_cmoriser.py

Lines changed: 52 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -232,25 +232,71 @@ class CMIP6_Atmosphere_CMORiser(CMIP6_CMORiser):
232232
"""
233233

234234
def select_and_process_variables(self):
235-
bnds_required = [
236-
v["out_name"] + "_bnds"
237-
for v in self.vocab.axes.values()
238-
if v.get("must_have_bounds") == "yes"
239-
]
235+
# Find all required bounds variables
236+
bnds_required = []
237+
bounds_rename_map = {}
238+
for dim, v in self.vocab.axes.items():
239+
if v.get("must_have_bounds") == "yes":
240+
# Find the input dimension name that maps to this output name
241+
input_dim = None
242+
for k, val in self.mapping[self.cmor_name]["dimensions"].items():
243+
if val == v["out_name"]:
244+
input_dim = k
245+
break
246+
if input_dim is None:
247+
raise KeyError(
248+
f"Can't find input dimension mapping for output dimension '{v['out_name']}'."
249+
)
250+
bnds_var = input_dim + "_bnds"
251+
if bnds_var in self.ds.variables or bnds_var in self.ds.coords:
252+
bnds_required.append(bnds_var)
253+
# Store mapping for later renaming after calculation
254+
bounds_rename_map[bnds_var] = v["out_name"] + "_bnds"
240255

256+
# Select input variables
241257
input_vars = self.mapping[self.cmor_name]["model_variables"]
242258
calc = self.mapping[self.cmor_name]["calculation"]
243259
self.ds = self.ds[input_vars + bnds_required]
244260

261+
# Handle the calculation type
245262
if calc["type"] == "direct":
263+
# If the calculation is direct, just rename the variable
246264
self.ds = self.ds.rename({input_vars[0]: self.cmor_name})
247265
elif calc["type"] == "formula":
266+
# If the calculation is a formula, evaluate it
248267
context = {var: self.ds[var] for var in input_vars}
249268
context.update(custom_functions)
250269
self.ds[self.cmor_name] = evaluate_expression(calc, context)
270+
# Drop the original input variables, except the CMOR variable and keep bounds
271+
self.ds = self.ds.drop_vars(
272+
[
273+
var
274+
for var in input_vars
275+
if var != self.cmor_name and var not in bnds_required
276+
],
277+
errors="ignore",
278+
)
251279
else:
252280
raise ValueError(f"Unsupported calculation type: {calc['type']}")
253281

282+
# Rename dimensions according to the CMOR vocabulary
283+
dim_rename = self.mapping[self.cmor_name]["dimensions"]
284+
dims_to_rename = {k: v for k, v in dim_rename.items() if k in self.ds.dims}
285+
self.ds = self.ds.rename(dims_to_rename)
286+
287+
# Also rename coordinates if needed
288+
coords_to_rename = {k: v for k, v in dim_rename.items() if k in self.ds.coords}
289+
if coords_to_rename:
290+
self.ds = self.ds.rename(coords_to_rename)
291+
292+
# Rename bounds variables
293+
for bnds_var, out_bnds_name in bounds_rename_map.items():
294+
if bnds_var in self.ds:
295+
self.ds = self.ds.rename({bnds_var: out_bnds_name})
296+
elif bnds_var in self.ds.coords:
297+
self.ds = self.ds.rename({bnds_var: out_bnds_name})
298+
299+
# Transpose the data variable according to the CMOR dimensions
254300
cmor_dims = self.vocab.variable["dimensions"].split()
255301
transpose_order = [
256302
self.vocab.axes[dim]["out_name"]
@@ -261,6 +307,7 @@ def select_and_process_variables(self):
261307
for dim in self.ds[self.cmor_name].dims:
262308
if dim not in transpose_order and self.ds[self.cmor_name][dim].size == 1:
263309
self.ds[self.cmor_name] = self.ds[self.cmor_name].squeeze(dim)
310+
264311
self.ds[self.cmor_name] = self.ds[self.cmor_name].transpose(*transpose_order)
265312

266313
def update_attributes(self):
@@ -270,8 +317,6 @@ def update_attributes(self):
270317
if v not in (None, "")
271318
}
272319

273-
self.ds = self.ds.rename(self.mapping[self.cmor_name]["dimensions"])
274-
275320
required_coords = {
276321
v["out_name"] for v in self.vocab.axes.values() if "value" in v
277322
}.union({v["out_name"] for v in self.vocab.axes.values()})

src/access_mopper/mappings/Mappings_CMIP6_Amon.json

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -172,9 +172,9 @@
172172
"CF standard Name": "relative_humidity",
173173
"dimensions": {
174174
"time": "time",
175-
"pressure": "plev19",
176-
"lat_v": "latitude",
177-
"lon_u": "longitude"
175+
"pressure": "plev",
176+
"lat_v": "lat",
177+
"lon_u": "lon"
178178
},
179179
"units": "%",
180180
"positive": null,
@@ -190,9 +190,9 @@
190190
"CF standard Name": "specific_humidity",
191191
"dimensions": {
192192
"time": "time",
193-
"pressure": "plev19",
194-
"lat_v": "latitude",
195-
"lon_u": "longitude"
193+
"pressure": "plev",
194+
"lat_v": "lat",
195+
"lon_u": "lon"
196196
},
197197
"units": "1",
198198
"positive": null,
@@ -634,9 +634,9 @@
634634
"CF standard Name": "air_temperature",
635635
"dimensions": {
636636
"time": "time",
637-
"pressure": "plev19",
638-
"lat_v": "latitude",
639-
"lon_u": "longitude"
637+
"pressure": "plev",
638+
"lat_v": "lat",
639+
"lon_u": "lon"
640640
},
641641
"units": "K",
642642
"positive": null,
@@ -670,7 +670,7 @@
670670
"dimensions": {
671671
"time": "time",
672672
"lat": "lat",
673-
"lon_u": "longitude"
673+
"lon_u": "lon"
674674
},
675675
"units": "Pa",
676676
"positive": "down",
@@ -686,7 +686,7 @@
686686
"CF standard Name": "surface_downward_northward_stress",
687687
"dimensions": {
688688
"time": "time",
689-
"lat_v": "latitude",
689+
"lat_v": "lat",
690690
"lon": "lon"
691691
},
692692
"units": "Pa",
@@ -720,9 +720,9 @@
720720
"CF standard Name": "eastward_wind",
721721
"dimensions": {
722722
"time": "time",
723-
"pressure": "plev19",
724-
"lat_v": "latitude",
725-
"lon_u": "longitude"
723+
"pressure": "plev",
724+
"lat_v": "lat",
725+
"lon_u": "lon"
726726
},
727727
"units": "m s-1",
728728
"positive": null,
@@ -739,7 +739,7 @@
739739
"dimensions": {
740740
"time": "time",
741741
"lat": "lat",
742-
"lon_u": "longitude"
742+
"lon_u": "lon"
743743
},
744744
"units": "m s-1",
745745
"positive": null,
@@ -755,9 +755,9 @@
755755
"CF standard Name": "northward_wind",
756756
"dimensions": {
757757
"time": "time",
758-
"pressure": "plev19",
759-
"lat_v": "latitude",
760-
"lon_u": "longitude"
758+
"pressure": "plev",
759+
"lat_v": "lat",
760+
"lon_u": "lon"
761761
},
762762
"units": "m s-1",
763763
"positive": null,
@@ -773,7 +773,7 @@
773773
"CF standard Name": "northward_wind",
774774
"dimensions": {
775775
"time": "time",
776-
"lat_v": "latitude",
776+
"lat_v": "lat",
777777
"lon": "lon"
778778
},
779779
"units": "m s-1",
@@ -790,9 +790,9 @@
790790
"CF standard Name": "lagrangian_tendency_of_air_pressure",
791791
"dimensions": {
792792
"time": "time",
793-
"pressure": "plev19",
794-
"lat_v": "latitude",
795-
"lon_u": "longitude"
793+
"pressure": "plev",
794+
"lat_v": "lat",
795+
"lon_u": "lon"
796796
},
797797
"units": "Pa s-1",
798798
"positive": null,
@@ -808,9 +808,9 @@
808808
"CF standard Name": "geopotential_height",
809809
"dimensions": {
810810
"time": "time",
811-
"pressure": "plev19",
812-
"lat_v": "latitude",
813-
"lon_u": "longitude"
811+
"pressure": "plev",
812+
"lat_v": "lat",
813+
"lon_u": "lon"
814814
},
815815
"units": "m",
816816
"positive": null,

src/access_mopper/mappings/Mappings_CMIP6_Lmon.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454
"dimensions": {
5555
"time": "time",
5656
"lat": "lat",
57-
"lon":"longitude"
57+
"lon":"lon"
5858
},
5959
"units": "1",
6060
"positive": null,

0 commit comments

Comments
 (0)