Skip to content

Commit cc6227c

Browse files
committed
Update to add discovery of CF standard names
1 parent 90ff039 commit cc6227c

File tree

2 files changed

+41
-2
lines changed

2 files changed

+41
-2
lines changed

parcels/fieldset.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from parcels._core.utils.time import is_compatible as datetime_is_compatible
1414
from parcels._typing import Mesh
1515
from parcels.field import Field, VectorField
16+
from parcels.tools.loggers import logger
1617
from parcels.xgrid import XGrid
1718

1819
if TYPE_CHECKING:
@@ -177,7 +178,7 @@ def gridset(self) -> list[BaseGrid]:
177178

178179
def from_copernicusmarine(ds: xr.Dataset):
179180
ds = ds.copy()
180-
181+
ds = _discover_copernicusmarine_U_and_V(ds)
181182
expected_axes = set("XYZT") # TODO: Update after we have support for 2D spatial fields
182183
if missing_axes := (expected_axes - set(ds.cf.axes)):
183184
raise ValueError(
@@ -265,3 +266,30 @@ def _rename_coords_copernicusmarine(ds):
265266
except ValueError as e:
266267
raise ValueError(f"Multiple coordinates found for Copernicus dataset on axis '{axis}'. Check your data.") from e
267268
return ds
269+
270+
271+
def _discover_copernicusmarine_U_and_V(ds: xr.Dataset) -> xr.Dataset:
272+
# Assumes that the dataset has U and V data
273+
274+
cf_standard_name_fallbacks = {
275+
"U": ["eastward_sea_water_velocity_due_to_ekman_drift"],
276+
"V": ["northward_sea_water_velocity_due_to_ekman_drift"],
277+
}
278+
279+
for parcels_varname, fallbacks in cf_standard_name_fallbacks.items():
280+
if parcels_varname in ds:
281+
continue
282+
283+
for cf_standard_name in fallbacks:
284+
if cf_standard_name in ds.cf.standard_names:
285+
name = ds.cf[cf_standard_name].name
286+
ds = ds.rename({name: parcels_varname})
287+
logger.info(
288+
f"Found variable {name!r} with CF standard name {cf_standard_name!r} in dataset, renamed it to {parcels_varname!r} for Parcels simulation."
289+
)
290+
break
291+
else:
292+
raise ValueError(
293+
f"Could not find variable {parcels_varname!r} in dataset, nor any of the fallback CF standard names {fallbacks}. Please rename the appropriate variables in your dataset to {parcels_varname!r} for Parcels simulation."
294+
)
295+
return ds

tests/v4/test_fieldset.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,9 +216,20 @@ def test_fieldset_add_field_after_pset():
216216
...
217217

218218

219-
def test_fieldset_from_copernicusmarine():
219+
def test_fieldset_from_copernicusmarine(caplog):
220+
ds = datasets_circulation_models["ds_copernicusmarine_globcurrent"]
221+
fieldset = FieldSet.from_copernicusmarine(ds)
222+
assert "U" in fieldset.fields
223+
assert "V" in fieldset.fields
224+
assert "UV" in fieldset.fields
225+
assert "renamed it to 'U'" in caplog.text
226+
assert "renamed it to 'V'" in caplog.text
227+
228+
229+
def test_fieldset_from_copernicusmarine_no_logs(caplog):
220230
ds = datasets_circulation_models["ds_copernicusmarine_globcurrent"]
221231
fieldset = FieldSet.from_copernicusmarine(ds.rename({"ve": "V", "ue": "U"}))
222232
assert "U" in fieldset.fields
223233
assert "V" in fieldset.fields
224234
assert "UV" in fieldset.fields
235+
assert caplog.text == ""

0 commit comments

Comments
 (0)