@@ -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