@@ -32,14 +32,6 @@ def raw_resample(datas, fixed_size):
32
32
return interp (arange (fixed_size ), arange (nb_value ) * (fixed_size - 1 ) / (nb_value - 1 ) , datas )
33
33
34
34
35
- def contour_iter (self , anticyclonic_search ):
36
- for coll in self .collections [::1 if anticyclonic_search else - 1 ]:
37
- yield coll
38
-
39
-
40
- BaseQuadContourSet .iter_ = contour_iter
41
-
42
-
43
35
@property
44
36
def mean_coordinates (self ):
45
37
return self .vertices .mean (axis = 0 )
@@ -100,8 +92,8 @@ def uniform_resample(x_val, y_val, num_fac=2, fixed_size=None):
100
92
dist = empty (x_val .shape )
101
93
dist [0 ] = 0
102
94
dist [1 :] = distance (x_val [:- 1 ], y_val [:- 1 ], x_val [1 :], y_val [1 :])
103
- # To be still monotonous
104
- dist [1 :][dist [1 :]< 1e-10 ] = 1e-10
95
+ # To be still monotonous (dist is store in m)
96
+ dist [1 :][dist [1 :]< 1e-3 ] = 1e-3
105
97
dist = dist .cumsum ()
106
98
# Get uniform distances
107
99
if fixed_size is None :
@@ -121,13 +113,21 @@ def uniform_resample_stack(vertices, num_fac=2, fixed_size=None):
121
113
data [:, 1 ] = y_new
122
114
return data
123
115
116
+
124
117
@njit (cache = True )
125
118
def value_on_regular_contour (x_g , y_g , z_g , m_g , vertices , num_fac = 2 , fixed_size = None ):
126
119
x_val , y_val = vertices [:, 0 ], vertices [:, 1 ]
127
120
x_new , y_new = uniform_resample (x_val , y_val , num_fac , fixed_size )
128
121
return interp2d_geo (x_g , y_g , z_g , m_g , x_new [1 :], y_new [1 :])
129
122
130
123
124
+ @njit (cache = True )
125
+ def mean_on_regular_contour (x_g , y_g , z_g , m_g , vertices , num_fac = 2 , fixed_size = None ):
126
+ x_val , y_val = vertices [:, 0 ], vertices [:, 1 ]
127
+ x_new , y_new = uniform_resample (x_val , y_val , num_fac , fixed_size )
128
+ return interp2d_geo (x_g , y_g , z_g , m_g , x_new [1 :], y_new [1 :]).mean ()
129
+
130
+
131
131
def fit_circle_path (self ):
132
132
if not hasattr (self , '_circle_params' ):
133
133
self ._circle_params = _fit_circle_path (self .vertices )
@@ -715,7 +715,7 @@ def eddy_identification(self, grid_height, uname, vname, date, step=0.005, shape
715
715
c_x , c_y = proj (speed_contour .lon , speed_contour .lat )
716
716
_ , _ , eddy_radius_s , aerr_s = fit_circle_c_numba (c_x , c_y )
717
717
718
- # Instantiate new EddyObservation object
718
+ # Instantiate new EddyObservation object (high cost need to be review)
719
719
properties = EddiesObservations (size = 1 , track_extra_variables = track_extra_variables ,
720
720
track_array_variables = array_sampling ,
721
721
array_variables = array_variables )
@@ -780,7 +780,7 @@ def get_uavg(self, all_contours, centlon_e, centlat_e, original_contour, anticyc
780
780
Calculate geostrophic speed around successive contours
781
781
Returns the average
782
782
"""
783
- max_average_speed = self .speed_coef (original_contour ). mean ( )
783
+ max_average_speed = self .speed_coef_mean (original_contour )
784
784
speed_array = [max_average_speed ]
785
785
pixel_min = 1
786
786
@@ -808,7 +808,7 @@ def get_uavg(self, all_contours, centlon_e, centlat_e, original_contour, anticyc
808
808
if pixel_min > level_contour .nb_pixel :
809
809
break
810
810
# Interpolate uspd to seglon, seglat, then get mean
811
- level_average_speed = self .speed_coef (level_contour ). mean ( )
811
+ level_average_speed = self .speed_coef_mean (level_contour )
812
812
speed_array .append (level_average_speed )
813
813
if level_average_speed >= max_average_speed :
814
814
max_average_speed = level_average_speed
@@ -944,12 +944,12 @@ def _low_filter(self, grid_name, x_cut, y_cut, factor=40.):
944
944
z_interp = RectBivariateSpline (x_center , y_center , z_filtered , ** opts_interpolation ).ev (x , y )
945
945
return ma .array (z_interp , mask = m_interp .ev (x , y ) > 0.00001 )
946
946
947
- def speed_coef (self , contour ):
947
+ def speed_coef_mean (self , contour ):
948
948
dist , idx = self .index_interp .query (uniform_resample_stack (contour .vertices )[1 :], k = 4 )
949
949
i_y = idx % self .x_c .shape [1 ]
950
950
i_x = int_ ((idx - i_y ) / self .x_c .shape [1 ])
951
951
# A simplified solution to be change by a weight mean
952
- return self ._speed_norm [i_x , i_y ].mean (axis = 1 )
952
+ return self ._speed_norm [i_x , i_y ].mean (axis = 1 ). mean ()
953
953
954
954
def init_speed_coef (self , uname = 'u' , vname = 'v' ):
955
955
self ._speed_norm = (self .grid (uname ) ** 2 + self .grid (vname ) ** 2 ) ** .5
@@ -1348,11 +1348,11 @@ def add_uv(self, grid_height):
1348
1348
d_x = self .EARTH_RADIUS * 2 * pi / 360 * d_x_degrees * cos (deg2rad (self .y_c ))
1349
1349
self .vars ['v' ] = d_hx / d_x * gof
1350
1350
1351
- def speed_coef (self , contour ):
1351
+ def speed_coef_mean (self , contour ):
1352
1352
"""some nan can be compute over contour if we are near border,
1353
1353
something to explore
1354
1354
"""
1355
- return value_on_regular_contour (
1355
+ return mean_on_regular_contour (
1356
1356
self .x_c , self .y_c ,
1357
1357
self ._speed_ev , self ._speed_ev .mask ,
1358
1358
contour .vertices )
@@ -1378,18 +1378,8 @@ def interp(self, grid_name, lons, lats):
1378
1378
Returns:
1379
1379
new z
1380
1380
"""
1381
- z = empty (lons .shape , dtype = 'f4' ).reshape (- 1 )
1382
1381
g = self .grid (grid_name )
1383
- interp_numba (
1384
- self .x_c ,
1385
- self .y_c ,
1386
- g ,
1387
- lons .reshape (- 1 ),
1388
- lats .reshape (- 1 ),
1389
- z ,
1390
- g .fill_value
1391
- )
1392
- return z
1382
+ return interp2d_geo (self .x_c , self .y_c , g , g .mask , lons , lats )
1393
1383
1394
1384
1395
1385
@njit (cache = True , fastmath = True , parallel = True )
0 commit comments