Skip to content

Commit 10a44f8

Browse files
Copying #1834 changes into new _index_search functions
1 parent baaf04c commit 10a44f8

File tree

1 file changed

+31
-18
lines changed

1 file changed

+31
-18
lines changed

parcels/_index_search.py

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -35,23 +35,29 @@ def search_indices_vertical_z(grid: Grid, gridindexingtype: GridIndexingType, z:
3535
# In case of CROCO, allow particles in last (uppermost) layer using depth[-1]
3636
if gridindexingtype in ["croco"] and z < 0:
3737
return (-2, 1)
38-
_raise_field_out_of_bound_error(z, 0, 0)
39-
depth_indices = grid.depth <= z
38+
_raise_field_out_of_bound_error(z, None, None)
39+
depth_indices = grid.depth < z
4040
if z >= grid.depth[-1]:
4141
zi = len(grid.depth) - 2
4242
else:
43-
zi = depth_indices.argmin() - 1 if z >= grid.depth[0] else 0
43+
zi = depth_indices.argmin() - 1 if z > grid.depth[0] else 0
4444
else:
4545
if z > grid.depth[0]:
4646
_raise_field_out_of_bound_surface_error(z, None, None)
4747
elif z < grid.depth[-1]:
48-
_raise_field_out_of_bound_error(z, 0, 0)
49-
depth_indices = grid.depth >= z
48+
_raise_field_out_of_bound_error(z, None, None)
49+
depth_indices = grid.depth > z
5050
if z <= grid.depth[-1]:
5151
zi = len(grid.depth) - 2
5252
else:
53-
zi = depth_indices.argmin() - 1 if z <= grid.depth[0] else 0
53+
zi = depth_indices.argmin() - 1 if z < grid.depth[0] else 0
5454
zeta = (z - grid.depth[zi]) / (grid.depth[zi + 1] - grid.depth[zi])
55+
while zeta > 1:
56+
zi += 1
57+
zeta = (z - grid.depth[zi]) / (grid.depth[zi + 1] - grid.depth[zi])
58+
while zeta < 0:
59+
zi -= 1
60+
zeta = (z - grid.depth[zi]) / (grid.depth[zi + 1] - grid.depth[zi])
5561
return (zi, zeta)
5662

5763

@@ -98,28 +104,35 @@ def search_indices_vertical_s(
98104
+ xsi * eta * grid.depth[:, yi + 1, xi + 1]
99105
+ (1 - xsi) * eta * grid.depth[:, yi + 1, xi]
100106
)
107+
z = np.float32(z) # type: ignore # TODO: remove type ignore once we migrate to float64
101108

102109
if depth_vector[-1] > depth_vector[0]:
103-
depth_indices = depth_vector <= z
110+
if z < depth_vector[0]:
111+
_raise_field_out_of_bound_error(z, None, None)
112+
elif z > depth_vector[-1]:
113+
_raise_field_out_of_bound_error(z, None, None)
114+
depth_indices = depth_vector < z
104115
if z >= depth_vector[-1]:
105116
zi = len(depth_vector) - 2
106117
else:
107-
zi = depth_indices.argmin() - 1 if z >= depth_vector[0] else 0
108-
if z < depth_vector[zi]:
109-
_raise_field_out_of_bound_surface_error(z, None, None)
110-
elif z > depth_vector[zi + 1]:
111-
_raise_field_out_of_bound_error(z, y, x)
118+
zi = depth_indices.argmin() - 1 if z > depth_vector[0] else 0
112119
else:
113-
depth_indices = depth_vector >= z
120+
if z > depth_vector[0]:
121+
_raise_field_out_of_bound_error(z, None, None)
122+
elif z < depth_vector[-1]:
123+
_raise_field_out_of_bound_error(z, None, None)
124+
depth_indices = depth_vector > z
114125
if z <= depth_vector[-1]:
115126
zi = len(depth_vector) - 2
116127
else:
117-
zi = depth_indices.argmin() - 1 if z <= depth_vector[0] else 0
118-
if z > depth_vector[zi]:
119-
_raise_field_out_of_bound_surface_error(z, None, None)
120-
elif z < depth_vector[zi + 1]:
121-
_raise_field_out_of_bound_error(z, y, x)
128+
zi = depth_indices.argmin() - 1 if z < depth_vector[0] else 0
122129
zeta = (z - depth_vector[zi]) / (depth_vector[zi + 1] - depth_vector[zi])
130+
while zeta > 1:
131+
zi += 1
132+
zeta = (z - depth_vector[zi]) / (depth_vector[zi + 1] - depth_vector[zi])
133+
while zeta < 0:
134+
zi -= 1
135+
zeta = (z - depth_vector[zi]) / (depth_vector[zi + 1] - depth_vector[zi])
123136
return (zi, zeta)
124137

125138

0 commit comments

Comments
 (0)