From 261e29cc5da3414b96e89aa8bbf2034a162cf18c Mon Sep 17 00:00:00 2001 From: Baudouin Raoult Date: Sun, 15 Dec 2024 14:49:28 +0000 Subject: [PATCH] Add regrid filter --- src/anemoi/transform/fields.py | 1 - src/anemoi/transform/filters/regrid.py | 53 ++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 src/anemoi/transform/filters/regrid.py diff --git a/src/anemoi/transform/fields.py b/src/anemoi/transform/fields.py index d87c1b8..a64358d 100644 --- a/src/anemoi/transform/fields.py +++ b/src/anemoi/transform/fields.py @@ -71,7 +71,6 @@ def __init__(self, field, **kwargs): def metadata(self, *args, **kwargs): if kwargs.get("namespace"): - assert kwargs.get("namespace") == "mars", kwargs assert len(args) == 0, (args, kwargs) mars = self._field.metadata(**kwargs).copy() for k in list(mars.keys()): diff --git a/src/anemoi/transform/filters/regrid.py b/src/anemoi/transform/filters/regrid.py new file mode 100644 index 0000000..67ec5d2 --- /dev/null +++ b/src/anemoi/transform/filters/regrid.py @@ -0,0 +1,53 @@ +# (C) Copyright 2024 Anemoi contributors. +# +# This software is licensed under the terms of the Apache Licence Version 2.0 +# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. +# +# In applying this licence, ECMWF does not waive the privileges and immunities +# granted to it by virtue of its status as an intergovernmental organisation +# nor does it submit to any jurisdiction. + + +import logging + +from ..fields import new_field_from_numpy +from ..fields import new_fieldlist_from_list +from ..filter import Filter +from . import filter_registry + +LOG = logging.getLogger(__name__) + + +@filter_registry.register("regrid") +class RegridFilter(Filter): + """A filter to regrid fields using earthkit-regrid.""" + + def __init__(self, *, in_grid=None, out_grid=None, method="linear"): + self.in_grid = in_grid + self.out_grid = out_grid + self.method = method + + def forward(self, data): + return self._interpolate(data, self.in_grid, self.out_grid, self.method) + + def backward(self, data): + return self._interpolate(data, self.out_grid, self.in_grid, self.method) + + def _interpolate(self, data, in_grid, out_grid, method): + from earthkit.regrid import interpolate + + result = [] + for field in data: + result.append( + new_field_from_numpy( + interpolate( + field.to_numpy(flatten=True), + in_grid={"grid": in_grid}, + out_grid={"grid": out_grid}, + method=method, + ), + template=field, + ) + ) + + return new_fieldlist_from_list(result)