Skip to content

Commit c75fb3d

Browse files
erikvansebilleVeckoTheGecko
authored andcommitted
First attempt at implementing XGrid Interpolators
1 parent b510f11 commit c75fb3d

File tree

1 file changed

+46
-0
lines changed

1 file changed

+46
-0
lines changed

parcels/application_kernels/interpolation.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,59 @@
1010

1111
if TYPE_CHECKING:
1212
from parcels.uxgrid import _UXGRID_AXES
13+
from parcels.xgrid import _XGRID_AXES
1314

1415
__all__ = [
1516
"UXPiecewiseConstantFace",
1617
"UXPiecewiseLinearNode",
1718
]
1819

1920

21+
def XTriCurviLinear(
22+
field: Field,
23+
ti: int,
24+
position: dict[_XGRID_AXES, tuple[int, float | np.ndarray]],
25+
tau: np.float32 | np.float64,
26+
t: np.float32 | np.float64,
27+
z: np.float32 | np.float64,
28+
y: np.float32 | np.float64,
29+
x: np.float32 | np.float64,
30+
):
31+
"""Trilinear interpolation on a curvilinear grid."""
32+
xi, xsi = position["X"]
33+
yi, eta = position["Y"]
34+
zi, zeta = position["Z"]
35+
data = field.data
36+
37+
return (
38+
(
39+
(1 - xsi) * (1 - eta) * data.isel(YG=yi, XG=xi)
40+
+ xsi * (1 - eta) * data.isel(YG=yi, XG=xi + 1)
41+
+ xsi * eta * data.isel(YG=yi + 1, XG=xi + 1)
42+
+ (1 - xsi) * eta * data.isel(YG=yi + 1, XG=xi)
43+
)
44+
.interp(time=t, ZG=zi + zeta)
45+
.values
46+
)
47+
48+
49+
def XTriRectiLinear(
50+
field: Field,
51+
ti: int,
52+
position: dict[_XGRID_AXES, tuple[int, float | np.ndarray]],
53+
tau: np.float32 | np.float64,
54+
t: np.float32 | np.float64,
55+
z: np.float32 | np.float64,
56+
y: np.float32 | np.float64,
57+
x: np.float32 | np.float64,
58+
):
59+
"""Trilinear interpolation on a rectilinear grid."""
60+
xi, xsi = position["X"]
61+
yi, eta = position["Y"]
62+
zi, zeta = position["Z"]
63+
return field.data.interp(time=t, ZG=zi + zeta, YG=yi + eta, XG=xi + xsi).values
64+
65+
2066
def UXPiecewiseConstantFace(
2167
field: Field,
2268
ti: int,

0 commit comments

Comments
 (0)