Skip to content

Commit e5c3515

Browse files
Merge pull request #1992 from OceanParcels/add-uxdatasets
Add uxdatasets
2 parents afb4231 + c3f9f02 commit e5c3515

4 files changed

Lines changed: 92 additions & 6 deletions

File tree

File renamed without changes.
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import math
2+
3+
import numpy as np
4+
import pandas as pd
5+
import uxarray as ux
6+
7+
__all__ = ["Nx", "datasets"]
8+
9+
Nx = 20
10+
vmax = 1.0
11+
delta = 0.1
12+
13+
14+
def _stommel_gyre_delaunay():
15+
lon, lat = np.meshgrid(np.linspace(0, 60.0, Nx, dtype=np.float32), np.linspace(0, 60.0, Nx, dtype=np.float32))
16+
lon_flat = lon.ravel()
17+
lat_flat = lat.ravel()
18+
19+
# mask any point on one of the boundaries
20+
mask = (
21+
np.isclose(lon_flat, 0.0) | np.isclose(lon_flat, 60.0) | np.isclose(lat_flat, 0.0) | np.isclose(lat_flat, 60.0)
22+
)
23+
24+
boundary_points = np.flatnonzero(mask)
25+
26+
uxgrid = ux.Grid.from_points(
27+
(lon_flat, lat_flat),
28+
method="regional_delaunay",
29+
boundary_points=boundary_points,
30+
)
31+
32+
# Define arrays U (zonal), V (meridional) and P (sea surface height)
33+
U = np.zeros((1, 1, lat.size), dtype=np.float64)
34+
V = np.zeros((1, 1, lat.size), dtype=np.float64)
35+
P = np.zeros((1, 1, lat.size), dtype=np.float64)
36+
37+
for i, (x, y) in enumerate(zip(lon_flat, lat_flat, strict=False)):
38+
xi = x / 60.0
39+
yi = y / 60.0
40+
41+
P[0, 0, i] = -vmax * delta * (1 - xi) * (math.exp(-xi / delta) - 1) * np.sin(math.pi * yi)
42+
U[0, 0, i] = -vmax * (1 - math.exp(-xi / delta) - xi) * np.cos(math.pi * yi)
43+
V[0, 0, i] = vmax * ((2.0 - xi) * math.exp(-xi / delta) - 1) * np.sin(math.pi * yi)
44+
45+
u = ux.UxDataArray(
46+
data=U,
47+
name="U",
48+
uxgrid=uxgrid,
49+
dims=["time", "nz1", "n_node"],
50+
coords=dict(
51+
time=(["time"], pd.to_datetime(["2000-01-01"])),
52+
nz1=(["nz1"], [0]),
53+
),
54+
attrs=dict(
55+
description="zonal velocity", units="m/s", location="node", mesh="delaunay", Conventions="UGRID-1.0"
56+
),
57+
)
58+
v = ux.UxDataArray(
59+
data=V,
60+
name="V",
61+
uxgrid=uxgrid,
62+
dims=["time", "nz1", "n_node"],
63+
coords=dict(
64+
time=(["time"], pd.to_datetime(["2000-01-01"])),
65+
nz1=(["nz1"], [0]),
66+
),
67+
attrs=dict(
68+
description="meridional velocity", units="m/s", location="node", mesh="delaunay", Conventions="UGRID-1.0"
69+
),
70+
)
71+
p = ux.UxDataArray(
72+
data=P,
73+
name="p",
74+
uxgrid=uxgrid,
75+
dims=["time", "nz1", "n_node"],
76+
coords=dict(
77+
time=(["time"], pd.to_datetime(["2000-01-01"])),
78+
nz1=(["nz1"], [0]),
79+
),
80+
attrs=dict(description="pressure", units="N/m^2", location="node", mesh="delaunay", Conventions="UGRID-1.0"),
81+
)
82+
83+
return ux.UxDataset({"U": u, "V": v, "p": p}, uxgrid=uxgrid)
84+
85+
86+
datasets = {
87+
"stommel_gyre_delaunay": _stommel_gyre_delaunay(),
88+
}

tests/v4/test_field.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
import xarray as xr
44

55
from parcels import Field
6-
from parcels._datasets.structured.grid_datasets import datasets as structured_datasets
6+
from parcels._datasets.structured.generic import datasets as structured_datasets
7+
from parcels._datasets.unstructured.generic import datasets as unstructured_datasets
78
from parcels.v4.grid import Grid
89

910

@@ -34,11 +35,8 @@ def test_field_init_param_types():
3435
pytest.param(ux.UxDataArray(), Grid(xr.Dataset()), id="uxdata-grid"),
3536
pytest.param(
3637
xr.DataArray(),
37-
ux.UxDataArray().uxgrid,
38+
unstructured_datasets["stommel_gyre_delaunay"].uxgrid,
3839
id="xarray-uxgrid",
39-
marks=pytest.mark.xfail(
40-
reason="Replace uxDataArray object with one that actually has a grid (once unstructured example datasets are in the codebase)."
41-
),
4240
),
4341
],
4442
)

tests/v4/test_gridadapter.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import pytest
55
from numpy.testing import assert_allclose
66

7-
from parcels._datasets.structured.grid_datasets import N, T, datasets
7+
from parcels._datasets.structured.generic import N, T, datasets
88
from parcels.grid import Grid as OldGrid
99
from parcels.tools.converters import TimeConverter
1010
from parcels.v4.grid import Grid as NewGrid

0 commit comments

Comments
 (0)