Skip to content

Commit 2fbdea4

Browse files
Cleaning up spatialslip
This also avoids the RuntimeWarning: divide by zero encountered in divide
1 parent b10725b commit 2fbdea4

1 file changed

Lines changed: 43 additions & 72 deletions

File tree

src/parcels/interpolators/_xinterpolators.py

Lines changed: 43 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -425,93 +425,64 @@ def is_land(ti: int, zi: int, yi: int, xi: int):
425425
vval = corner_dataV[ti, zi, yi, xi, :]
426426
return np.where(np.isclose(uval, 0.0) & np.isclose(vval, 0.0), True, False)
427427

428-
f_u = np.ones_like(xsi)
429-
f_v = np.ones_like(eta)
428+
if is_dask_collection(u):
429+
u = u.compute()
430+
v = v.compute()
431+
if vectorfield.W:
432+
w = w.compute()
430433

434+
f_u = np.ones_like(xsi)
431435
if lenZ == 1:
432-
f_u = np.where(is_land(0, 0, 0, 0) & is_land(0, 0, 0, 1) & (eta > 0), f_u * (a + b * eta) / eta, f_u)
433-
f_u = np.where(is_land(0, 0, 1, 0) & is_land(0, 0, 1, 1) & (eta < 1), f_u * (1 - b * eta) / (1 - eta), f_u)
434-
f_v = np.where(is_land(0, 0, 0, 0) & is_land(0, 0, 1, 0) & (xsi > 0), f_v * (a + b * xsi) / xsi, f_v)
435-
f_v = np.where(is_land(0, 0, 0, 1) & is_land(0, 0, 1, 1) & (xsi < 1), f_v * (1 - b * xsi) / (1 - xsi), f_v)
436+
land = is_land(0, 0, 0, 0) & is_land(0, 0, 0, 1) & (eta > 0)
436437
else:
437-
f_u = np.where(
438-
is_land(0, 0, 0, 0) & is_land(0, 0, 0, 1) & is_land(0, 1, 0, 0) & is_land(0, 1, 0, 1) & (eta > 0),
439-
f_u * (a + b * eta) / eta,
440-
f_u,
441-
)
442-
f_u = np.where(
443-
is_land(0, 0, 1, 0) & is_land(0, 0, 1, 1) & is_land(0, 1, 1, 0) & is_land(0, 1, 1, 1) & (eta < 1),
444-
f_u * (1 - b * eta) / (1 - eta),
445-
f_u,
446-
)
447-
f_v = np.where(
448-
is_land(0, 0, 0, 0) & is_land(0, 0, 1, 0) & is_land(0, 1, 0, 0) & is_land(0, 1, 1, 0) & (xsi > 0),
449-
f_v * (a + b * xsi) / xsi,
450-
f_v,
451-
)
452-
f_v = np.where(
453-
is_land(0, 0, 0, 1) & is_land(0, 0, 1, 1) & is_land(0, 1, 0, 1) & is_land(0, 1, 1, 1) & (xsi < 1),
454-
f_v * (1 - b * xsi) / (1 - xsi),
455-
f_v,
456-
)
457-
f_u = np.where(
458-
is_land(0, 0, 0, 0) & is_land(0, 0, 0, 1) & is_land(0, 0, 1, 0) & is_land(0, 0, 1, 1) & (zeta > 0),
459-
f_u * (a + b * zeta) / zeta,
460-
f_u,
461-
)
462-
f_u = np.where(
463-
is_land(0, 1, 0, 0) & is_land(0, 1, 0, 1) & is_land(0, 1, 1, 0) & is_land(0, 1, 1, 1) & (zeta < 1),
464-
f_u * (1 - b * zeta) / (1 - zeta),
465-
f_u,
466-
)
467-
f_v = np.where(
468-
is_land(0, 0, 0, 0) & is_land(0, 0, 0, 1) & is_land(0, 0, 1, 0) & is_land(0, 0, 1, 1) & (zeta > 0),
469-
f_v * (a + b * zeta) / zeta,
470-
f_v,
471-
)
472-
f_v = np.where(
473-
is_land(0, 1, 0, 0) & is_land(0, 1, 0, 1) & is_land(0, 1, 1, 0) & is_land(0, 1, 1, 1) & (zeta < 1),
474-
f_v * (1 - b * zeta) / (1 - zeta),
475-
f_v,
476-
)
438+
land = is_land(0, 0, 0, 0) & is_land(0, 0, 0, 1) & is_land(0, 1, 0, 0) & is_land(0, 1, 0, 1) & (eta > 0)
439+
f_u[land] = f_u[land] * (a + b * eta[land]) / eta[land]
477440

478-
if is_dask_collection(u):
479-
u = u.compute()
480-
v = v.compute()
441+
if lenZ == 1:
442+
land = is_land(0, 0, 1, 0) & is_land(0, 0, 1, 1) & (eta < 1)
443+
else:
444+
land = is_land(0, 0, 1, 0) & is_land(0, 0, 1, 1) & is_land(0, 1, 1, 0) & is_land(0, 1, 1, 1) & (eta < 1)
445+
f_u[land] = f_u[land] * (1 - b * eta[land]) / (1 - eta[land])
481446

482447
u = u * f_u
483-
v = v * f_v
484-
485448
if vectorfield.grid._mesh == "spherical":
486449
u /= 1852 * 60 * np.cos(np.deg2rad(particle_positions["y"]))
450+
451+
f_v = np.ones_like(eta)
452+
if lenZ == 1:
453+
land = is_land(0, 0, 0, 0) & is_land(0, 0, 1, 0) & (xsi > 0)
454+
else:
455+
land = is_land(0, 0, 0, 0) & is_land(0, 0, 1, 0) & is_land(0, 1, 0, 0) & is_land(0, 1, 1, 0) & (xsi > 0)
456+
f_v[land] = f_v[land] * (a + b * xsi[land]) / xsi[land]
457+
458+
if lenZ == 1:
459+
land = is_land(0, 0, 0, 1) & is_land(0, 0, 1, 1) & (xsi < 1)
460+
else:
461+
land = is_land(0, 0, 0, 1) & is_land(0, 0, 1, 1) & is_land(0, 1, 0, 1) & is_land(0, 1, 1, 1) & (xsi < 1)
462+
f_v[land] = f_v[land] * (1 - b * xsi[land]) / (1 - xsi[land])
463+
464+
v = v * f_v
465+
if vectorfield.grid._mesh == "spherical":
487466
v /= 1852 * 60
488467

489468
if vectorfield.W:
490469
f_w = np.ones_like(zeta)
491-
f_w = np.where(
492-
is_land(0, 0, 0, 0) & is_land(0, 0, 0, 1) & is_land(0, 1, 0, 0) & is_land(0, 1, 0, 1) & (eta > 0),
493-
f_w * (a + b * eta) / eta,
494-
f_w,
495-
)
496-
f_w = np.where(
497-
is_land(0, 0, 1, 0) & is_land(0, 0, 1, 1) & is_land(0, 1, 1, 0) & is_land(0, 1, 1, 1) & (eta < 1),
498-
f_w * (a - b * eta) / (1 - eta),
499-
f_w,
500-
)
501-
f_w = np.where(
502-
is_land(0, 0, 0, 0) & is_land(0, 0, 1, 0) & is_land(0, 1, 0, 0) & is_land(0, 1, 1, 0) & (xsi > 0),
503-
f_w * (a + b * xsi) / xsi,
504-
f_w,
505-
)
506-
f_w = np.where(
507-
is_land(0, 0, 0, 1) & is_land(0, 0, 1, 1) & is_land(0, 1, 0, 1) & is_land(0, 1, 1, 1) & (xsi < 1),
508-
f_w * (a - b * xsi) / (1 - xsi),
509-
f_w,
510-
)
470+
land = is_land(0, 0, 0, 0) & is_land(0, 0, 0, 1) & is_land(0, 1, 0, 0) & is_land(0, 1, 0, 1) & (eta > 0)
471+
f_w[land] = f_w[land] * (a + b * eta[land]) / eta[land]
472+
473+
land = is_land(0, 0, 1, 0) & is_land(0, 0, 1, 1) & is_land(0, 1, 1, 0) & is_land(0, 1, 1, 1) & (eta < 1)
474+
f_w[land] = f_w[land] * (1 - b * eta[land]) / (1 - eta[land])
475+
476+
land = is_land(0, 0, 0, 0) & is_land(0, 0, 1, 0) & is_land(0, 1, 0, 0) & is_land(0, 1, 1, 0) & (xsi > 0)
477+
f_w[land] = f_w[land] * (a + b * xsi[land]) / xsi[land]
478+
479+
land = is_land(0, 0, 0, 1) & is_land(0, 0, 1, 1) & is_land(0, 1, 0, 1) & is_land(0, 1, 1, 1) & (xsi < 1)
480+
f_w[land] = f_w[land] * (1 - b * xsi[land]) / (1 - xsi[land])
511481

512482
w = w * f_w
513483
else:
514484
w = np.zeros_like(u)
485+
515486
return u, v, w
516487

517488

@@ -657,7 +628,7 @@ def interp(
657628
values[some_land] = val[some_land] / w_sum[some_land]
658629

659630
# If a particle hits exactly one of the 8 corner points, extract it
660-
exact_mask = dist2 == 0 & valid_mask
631+
exact_mask = (dist2 == 0) & valid_mask
661632
exact_vals = np.sum(np.where(exact_mask, corner_data, 0.0), axis=(0, 1, 2, 3))
662633
has_exact = np.any(exact_mask, axis=(0, 1, 2, 3))
663634

0 commit comments

Comments
 (0)