Skip to content

Commit d5009e1

Browse files
Merge pull request #2455 from Parcels-code/unitconversion_for_cgridvelocity
Fixing unit conversion for C-grid velocity interpolation
2 parents dafe9f3 + 5436136 commit d5009e1

File tree

3 files changed

+29
-4
lines changed

3 files changed

+29
-4
lines changed

src/parcels/_core/field.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -311,8 +311,10 @@ def eval(self, time: datetime, z, y, x, particles=None, applyConversion=True):
311311
(u, v, w) = self._vector_interp_method(particle_positions, grid_positions, self)
312312

313313
if applyConversion:
314-
u = self.U.units.to_target(u, z, y, x)
315-
v = self.V.units.to_target(v, z, y, x)
314+
if self.U.grid._mesh == "spherical":
315+
meshJac = 1852 * 60.0 * np.cos(np.deg2rad(y))
316+
u = u / meshJac
317+
v = v / meshJac
316318
if "3D" in self.vector_type:
317319
w = self.W.units.to_target(w, z, y, x)
318320

src/parcels/_core/fieldset.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import xarray as xr
1111
import xgcm
1212

13-
from parcels._core.converters import GeographicPolar
1413
from parcels._core.field import Field, VectorField
1514
from parcels._core.utils import sgrid
1615
from parcels._core.utils.string import _assert_str_and_python_varname
@@ -309,7 +308,6 @@ def from_nemo(ds: xr.Dataset):
309308
).to_attrs(),
310309
)
311310
fieldset = FieldSet.from_sgrid_conventions(ds, mesh="spherical")
312-
fieldset.V.units = GeographicPolar()
313311
if "UV" in fieldset.fields:
314312
fieldset.UV.vector_interp_method = CGrid_Velocity
315313
if "UVW" in fieldset.fields:

tests/test_advection.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,31 @@ def test_nemo_curvilinear_fieldset():
456456
np.testing.assert_allclose(pset.lat, latp, atol=1e-1)
457457

458458

459+
def test_nemo_curvilinear_with_vvel():
460+
"""Testing that a constant meridional velocity field in a NEMO curvilinear grid
461+
results in correct particle movement.
462+
Only works in Southern hemisphere (away from the tripolar rotated grid).
463+
"""
464+
data_folder = parcels.download_example_dataset("NemoCurvilinear_data")
465+
ds_fields = xr.open_mfdataset(
466+
data_folder.glob("*.nc4"),
467+
data_vars="minimal",
468+
coords="minimal",
469+
compat="override",
470+
)
471+
ds_fields = ds_fields.isel(time=0, z_a=0, z=0, drop=True)
472+
vvel = 0.5 # m/s
473+
ds_fields["V"].data[:] = vvel # set a constant meridional velocity
474+
fieldset = parcels.FieldSet.from_nemo(ds_fields)
475+
476+
lonp, latp = 30, -70
477+
pset = parcels.ParticleSet(fieldset, lon=lonp, lat=latp)
478+
pset.execute(AdvectionEE, runtime=np.timedelta64(10, "D"), dt=np.timedelta64(1, "D"))
479+
480+
v = (pset.lat - latp) / pset.time * 1852 * 60
481+
np.testing.assert_allclose(v, vvel, atol=1e-5)
482+
483+
459484
@pytest.mark.parametrize("kernel", [AdvectionRK4, AdvectionRK4_3D])
460485
def test_nemo_3D_curvilinear_fieldset(kernel):
461486
data_folder = parcels.download_example_dataset("NemoNorthSeaORCA025-N006_data")

0 commit comments

Comments
 (0)