Skip to content

Commit 02eb9a7

Browse files
Merge pull request #1821 from OceanParcels/v/test-suite
Move Field tests to separate file
2 parents 7586d7d + 3dcdf53 commit 02eb9a7

File tree

4 files changed

+71
-64
lines changed

4 files changed

+71
-64
lines changed

parcels/_typing.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ class ParcelsAST(ast.AST):
2626
"bgrid_w_velocity",
2727
"cgrid_velocity",
2828
"linear_invdist_land_tracer",
29-
"nearest",
3029
"bgrid_tracer",
3130
"cgrid_tracer",
3231
] # corresponds with `tracer_interp_method`

tests/test_advection.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@ def test_advection_zonal(lon, lat, depth, mode):
7373
}
7474
dimensions = {"lon": lon, "lat": lat}
7575
fieldset2D = FieldSet.from_data(data2D, dimensions, mesh="spherical", transpose=True)
76-
assert fieldset2D.U._creation_log == "from_data"
7776

7877
pset2D = ParticleSet(fieldset2D, pclass=ptype[mode], lon=np.zeros(npart) + 20.0, lat=np.linspace(0, 80, npart))
7978
pset2D.execute(AdvectionRK4, runtime=timedelta(hours=2), dt=timedelta(seconds=30))

tests/test_field.py

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import cftime
2+
import numpy as np
3+
import pytest
4+
import xarray as xr
5+
6+
from parcels import Field
7+
from parcels.tools.converters import (
8+
_get_cftime_calendars,
9+
_get_cftime_datetimes,
10+
)
11+
from tests.utils import TEST_DATA
12+
13+
14+
def test_field_from_netcdf_variables():
15+
filename = str(TEST_DATA / "perlinfieldsU.nc")
16+
dims = {"lon": "x", "lat": "y"}
17+
18+
variable = "vozocrtx"
19+
f1 = Field.from_netcdf(filename, variable, dims)
20+
variable = ("U", "vozocrtx")
21+
f2 = Field.from_netcdf(filename, variable, dims)
22+
variable = {"U": "vozocrtx"}
23+
f3 = Field.from_netcdf(filename, variable, dims)
24+
25+
assert np.allclose(f1.data, f2.data, atol=1e-12)
26+
assert np.allclose(f1.data, f3.data, atol=1e-12)
27+
28+
with pytest.raises(AssertionError):
29+
variable = {"U": "vozocrtx", "nav_lat": "nav_lat"} # multiple variables will fail
30+
f3 = Field.from_netcdf(filename, variable, dims)
31+
32+
33+
@pytest.mark.parametrize("with_timestamps", [True, False])
34+
def test_field_from_netcdf(with_timestamps):
35+
filenames = {
36+
"lon": str(TEST_DATA / "mask_nemo_cross_180lon.nc"),
37+
"lat": str(TEST_DATA / "mask_nemo_cross_180lon.nc"),
38+
"data": str(TEST_DATA / "Uu_eastward_nemo_cross_180lon.nc"),
39+
}
40+
variable = "U"
41+
dimensions = {"lon": "glamf", "lat": "gphif"}
42+
if with_timestamps:
43+
timestamp_types = [[[2]], [[np.datetime64("2000-01-01")]]]
44+
for timestamps in timestamp_types:
45+
Field.from_netcdf(filenames, variable, dimensions, interp_method="cgrid_velocity", timestamps=timestamps)
46+
else:
47+
Field.from_netcdf(filenames, variable, dimensions, interp_method="cgrid_velocity")
48+
49+
50+
@pytest.mark.parametrize(
51+
"calendar, cftime_datetime", zip(_get_cftime_calendars(), _get_cftime_datetimes(), strict=True)
52+
)
53+
def test_field_nonstandardtime(calendar, cftime_datetime, tmpdir):
54+
xdim = 4
55+
ydim = 6
56+
filepath = tmpdir.join("test_nonstandardtime.nc")
57+
dates = [getattr(cftime, cftime_datetime)(1, m, 1) for m in range(1, 13)]
58+
da = xr.DataArray(
59+
np.random.rand(12, xdim, ydim), coords=[dates, range(xdim), range(ydim)], dims=["time", "lon", "lat"], name="U"
60+
)
61+
da.to_netcdf(str(filepath))
62+
63+
dims = {"lon": "lon", "lat": "lat", "time": "time"}
64+
try:
65+
field = Field.from_netcdf(filepath, "U", dims)
66+
except NotImplementedError:
67+
field = None
68+
69+
if field is not None:
70+
assert field.grid.time_origin.calendar == calendar

tests/test_fieldset.py

Lines changed: 1 addition & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import sys
55
from datetime import timedelta
66

7-
import cftime
87
import dask
98
import dask.array as da
109
import numpy as np
@@ -29,8 +28,6 @@
2928
GeographicPolar,
3029
TimeConverter,
3130
UnitConverter,
32-
_get_cftime_calendars,
33-
_get_cftime_datetimes,
3431
)
3532
from tests.common_kernels import DoNothing
3633
from tests.utils import TEST_DATA
@@ -61,6 +58,7 @@ def test_fieldset_from_data(xdim, ydim):
6158
"""Simple test for fieldset initialisation from data."""
6259
data, dimensions = generate_fieldset_data(xdim, ydim)
6360
fieldset = FieldSet.from_data(data, dimensions)
61+
assert fieldset.U._creation_log == "from_data"
6462
assert len(fieldset.U.data.shape) == 3
6563
assert len(fieldset.V.data.shape) == 3
6664
assert np.allclose(fieldset.U.data[0, :], data["U"], rtol=1e-12)
@@ -139,65 +137,6 @@ def test_fieldset_from_parcels(xdim, ydim, tmpdir):
139137
assert np.allclose(fieldset.V.data[0, :], data["V"], rtol=1e-12)
140138

141139

142-
def test_field_from_netcdf_variables():
143-
filename = str(TEST_DATA / "perlinfieldsU.nc")
144-
dims = {"lon": "x", "lat": "y"}
145-
146-
variable = "vozocrtx"
147-
f1 = Field.from_netcdf(filename, variable, dims)
148-
variable = ("U", "vozocrtx")
149-
f2 = Field.from_netcdf(filename, variable, dims)
150-
variable = {"U": "vozocrtx"}
151-
f3 = Field.from_netcdf(filename, variable, dims)
152-
153-
assert np.allclose(f1.data, f2.data, atol=1e-12)
154-
assert np.allclose(f1.data, f3.data, atol=1e-12)
155-
156-
with pytest.raises(AssertionError):
157-
variable = {"U": "vozocrtx", "nav_lat": "nav_lat"} # multiple variables will fail
158-
f3 = Field.from_netcdf(filename, variable, dims)
159-
160-
161-
@pytest.mark.parametrize(
162-
"calendar, cftime_datetime", zip(_get_cftime_calendars(), _get_cftime_datetimes(), strict=True)
163-
)
164-
def test_fieldset_nonstandardtime(
165-
calendar, cftime_datetime, tmpdir, filename="test_nonstandardtime.nc", xdim=4, ydim=6
166-
):
167-
filepath = tmpdir.join(filename)
168-
dates = [getattr(cftime, cftime_datetime)(1, m, 1) for m in range(1, 13)]
169-
da = xr.DataArray(
170-
np.random.rand(12, xdim, ydim), coords=[dates, range(xdim), range(ydim)], dims=["time", "lon", "lat"], name="U"
171-
)
172-
da.to_netcdf(str(filepath))
173-
174-
dims = {"lon": "lon", "lat": "lat", "time": "time"}
175-
try:
176-
field = Field.from_netcdf(filepath, "U", dims)
177-
except NotImplementedError:
178-
field = None
179-
180-
if field is not None:
181-
assert field.grid.time_origin.calendar == calendar
182-
183-
184-
@pytest.mark.parametrize("with_timestamps", [True, False])
185-
def test_field_from_netcdf(with_timestamps):
186-
filenames = {
187-
"lon": str(TEST_DATA / "mask_nemo_cross_180lon.nc"),
188-
"lat": str(TEST_DATA / "mask_nemo_cross_180lon.nc"),
189-
"data": str(TEST_DATA / "Uu_eastward_nemo_cross_180lon.nc"),
190-
}
191-
variable = "U"
192-
dimensions = {"lon": "glamf", "lat": "gphif"}
193-
if with_timestamps:
194-
timestamp_types = [[[2]], [[np.datetime64("2000-01-01")]]]
195-
for timestamps in timestamp_types:
196-
Field.from_netcdf(filenames, variable, dimensions, interp_method="cgrid_velocity", timestamps=timestamps)
197-
else:
198-
Field.from_netcdf(filenames, variable, dimensions, interp_method="cgrid_velocity")
199-
200-
201140
def test_fieldset_from_modulefile():
202141
nemo_fname = str(TEST_DATA / "fieldset_nemo.py")
203142
nemo_error_fname = str(TEST_DATA / "fieldset_nemo_error.py")

0 commit comments

Comments
 (0)