diff --git a/src/parcels/interpolators/_xinterpolators.py b/src/parcels/interpolators/_xinterpolators.py index d7cf24961..0e85b07dd 100644 --- a/src/parcels/interpolators/_xinterpolators.py +++ b/src/parcels/interpolators/_xinterpolators.py @@ -100,10 +100,10 @@ def _get_offsets_dictionary(grid: XGrid) -> dict[ptyping.CfAxisSpatial, Literal[ offsets = {} metadata = grid.sgrid_metadata for fnp, axis in zip(metadata.face_dimensions, ["X", "Y"], strict=False): - offsets[axis] = 1 if fnp.padding == sgrid.Padding.LOW else 0 + offsets[axis] = 1 if (fnp.padding == sgrid.Padding.LOW or fnp.padding == sgrid.Padding.BOTH) else 0 if metadata.vertical_dimensions is not None: fnp_z = metadata.vertical_dimensions[0] - offsets["Z"] = 1 if fnp_z.padding == sgrid.Padding.LOW else 0 + offsets["Z"] = 1 if (fnp_z.padding == sgrid.Padding.LOW or fnp_z.padding == sgrid.Padding.BOTH) else 0 else: offsets["Z"] = 0 return offsets diff --git a/tests/test_interpolation.py b/tests/test_interpolation.py index 132548dc5..5c409c7f6 100644 --- a/tests/test_interpolation.py +++ b/tests/test_interpolation.py @@ -11,11 +11,13 @@ StatusCode, Variable, VectorField, + XGrid, particlefile_to_v3_zarr, ) from parcels._core.index_search import _search_time_index from parcels._core.mesh import FlatMesh, SphericalMesh from parcels._datasets.structured.generated import simple_UV_dataset +from parcels._sgrid.core import Padding from parcels.interpolators import ( CGrid_Velocity, XFreeslip, @@ -25,7 +27,7 @@ XPartialslip, ) from parcels.interpolators._base import VectorInterpolator -from parcels.interpolators._xinterpolators import _get_corner_data_Agrid +from parcels.interpolators._xinterpolators import _get_corner_data_Agrid, _get_offsets_dictionary from parcels.kernels import AdvectionRK4_3D from tests.utils import TEST_DATA @@ -278,6 +280,29 @@ def test_corner_gather_keeps_axes_missing_from_the_mapping(): assert out[0, 0, 0, 0, p] == data.values[ti[p], 0, yi[p], xi[p]] +def test_get_offsets_dictionary(): + ds = simple_UV_dataset() + xgrid = XGrid(ds, mesh=FlatMesh()) + + # verify simple_UV_dataset padding + assert xgrid.sgrid_metadata.face_dimensions[0].padding == Padding.LOW + assert xgrid.sgrid_metadata.vertical_dimensions[0].padding == Padding.BOTH + + offsets = _get_offsets_dictionary(xgrid) + + assert offsets["X"] == 1 + assert offsets["Z"] == 1 + + xgrid.sgrid_metadata.face_dimensions[0].padding = Padding.HIGH + xgrid.sgrid_metadata.face_dimensions[1].padding = Padding.HIGH + xgrid.sgrid_metadata.vertical_dimensions[0].padding = Padding.NONE + + offsets = _get_offsets_dictionary(xgrid) + + assert offsets["X"] == 0 + assert offsets["Z"] == 0 + + class XNearest_Velocity(VectorInterpolator): # noqa: N801 """Nearest-Neighbour interpolation on a regular grid for VectorFields of velocity."""