Skip to content

Commit 0bce72e

Browse files
Removing while-loop in _search_indices_curvilinear_2d
Note that this breaks some of the unit tests
1 parent b428cd2 commit 0bce72e

File tree

1 file changed

+10
-31
lines changed

1 file changed

+10
-31
lines changed

parcels/_index_search.py

Lines changed: 10 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -56,33 +56,17 @@ def _search_indices_curvilinear_2d(
5656
[1, -1, 1, -1],
5757
]
5858
)
59-
maxIterSearch = 1e6
60-
it = 0
61-
tol = 1.0e-10
6259

63-
# # ! Error handling for out of bounds
64-
# TODO: Re-enable in some capacity
65-
# if x < field.lonlat_minmax[0] or x > field.lonlat_minmax[1]:
66-
# if grid.lon[0, 0] < grid.lon[0, -1]:
67-
# _raise_grid_searching_error(y, x)
68-
# elif x < grid.lon[0, 0] and x > grid.lon[0, -1]: # This prevents from crashing in [160, -160]
69-
# _raise_grid_searching_error(z, y, x)
60+
px = np.array([grid.lon[yi, xi], grid.lon[yi, xi + 1], grid.lon[yi + 1, xi + 1], grid.lon[yi + 1, xi]])
61+
py = np.array([grid.lat[yi, xi], grid.lat[yi, xi + 1], grid.lat[yi + 1, xi + 1], grid.lat[yi + 1, xi]])
7062

71-
# if y < field.lonlat_minmax[2] or y > field.lonlat_minmax[3]:
72-
# _raise_grid_searching_error(z, y, x)
63+
a, b = np.dot(invA, px), np.dot(invA, py)
64+
aa = a[3] * b[2] - a[2] * b[3]
65+
bb = a[3] * b[0] - a[0] * b[3] + a[1] * b[2] - a[2] * b[1] + x * b[3] - y * a[3]
66+
cc = a[1] * b[0] - a[0] * b[1] + x * b[1] - y * a[1]
67+
det2 = bb * bb - 4 * aa * cc
7368

74-
while np.any(xsi < -tol) or np.any(xsi > 1 + tol) or np.any(eta < -tol) or np.any(eta > 1 + tol):
75-
px = np.array([grid.lon[yi, xi], grid.lon[yi, xi + 1], grid.lon[yi + 1, xi + 1], grid.lon[yi + 1, xi]])
76-
77-
py = np.array([grid.lat[yi, xi], grid.lat[yi, xi + 1], grid.lat[yi + 1, xi + 1], grid.lat[yi + 1, xi]])
78-
a = np.dot(invA, px)
79-
b = np.dot(invA, py)
80-
81-
aa = a[3] * b[2] - a[2] * b[3]
82-
bb = a[3] * b[0] - a[0] * b[3] + a[1] * b[2] - a[2] * b[1] + x * b[3] - y * a[3]
83-
cc = a[1] * b[0] - a[0] * b[1] + x * b[1] - y * a[1]
84-
85-
det2 = bb * bb - 4 * aa * cc
69+
with np.errstate(divide="ignore", invalid="ignore"):
8670
det = np.where(det2 > 0, np.sqrt(det2), eta)
8771
eta = np.where(abs(aa) < 1e-12, -cc / bb, np.where(det2 > 0, (-bb + det) / (2 * aa), eta))
8872

@@ -92,17 +76,12 @@ def _search_indices_curvilinear_2d(
9276
(x - a[0] - a[2] * eta) / (a[1] + a[3] * eta),
9377
)
9478

95-
xi = np.where(xsi < -tol, xi - 1, np.where(xsi > 1 + tol, xi + 1, xi))
96-
yi = np.where(eta < -tol, yi - 1, np.where(eta > 1 + tol, yi + 1, yi))
97-
98-
(yi, xi) = _reconnect_bnd_indices(yi, xi, grid.ydim, grid.xdim, grid._mesh)
99-
it += 1
100-
if it > maxIterSearch:
101-
print(f"Correct cell not found after {maxIterSearch} iterations")
79+
(yi, xi) = _reconnect_bnd_indices(yi, xi, grid.ydim, grid.xdim, grid._mesh)
10280

10381
# checking if xsi or eta is outside [0, 1]
10482
xi = np.where(xsi < 0, GRID_SEARCH_ERROR, np.where(xsi > 1, GRID_SEARCH_ERROR, xi))
10583
yi = np.where(eta < 0, GRID_SEARCH_ERROR, np.where(eta > 1, GRID_SEARCH_ERROR, yi))
84+
10685
return (yi, eta, xi, xsi)
10786

10887

0 commit comments

Comments
 (0)