@@ -32,14 +32,6 @@ def raw_resample(datas, fixed_size):
3232 return interp (arange (fixed_size ), arange (nb_value ) * (fixed_size - 1 ) / (nb_value - 1 ) , datas )
3333
3434
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-
4335@property
4436def mean_coordinates (self ):
4537 return self .vertices .mean (axis = 0 )
@@ -100,8 +92,8 @@ def uniform_resample(x_val, y_val, num_fac=2, fixed_size=None):
10092 dist = empty (x_val .shape )
10193 dist [0 ] = 0
10294 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
10597 dist = dist .cumsum ()
10698 # Get uniform distances
10799 if fixed_size is None :
@@ -121,13 +113,21 @@ def uniform_resample_stack(vertices, num_fac=2, fixed_size=None):
121113 data [:, 1 ] = y_new
122114 return data
123115
116+
124117@njit (cache = True )
125118def value_on_regular_contour (x_g , y_g , z_g , m_g , vertices , num_fac = 2 , fixed_size = None ):
126119 x_val , y_val = vertices [:, 0 ], vertices [:, 1 ]
127120 x_new , y_new = uniform_resample (x_val , y_val , num_fac , fixed_size )
128121 return interp2d_geo (x_g , y_g , z_g , m_g , x_new [1 :], y_new [1 :])
129122
130123
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+
131131def fit_circle_path (self ):
132132 if not hasattr (self , '_circle_params' ):
133133 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
715715 c_x , c_y = proj (speed_contour .lon , speed_contour .lat )
716716 _ , _ , eddy_radius_s , aerr_s = fit_circle_c_numba (c_x , c_y )
717717
718- # Instantiate new EddyObservation object
718+ # Instantiate new EddyObservation object (high cost need to be review)
719719 properties = EddiesObservations (size = 1 , track_extra_variables = track_extra_variables ,
720720 track_array_variables = array_sampling ,
721721 array_variables = array_variables )
@@ -780,7 +780,7 @@ def get_uavg(self, all_contours, centlon_e, centlat_e, original_contour, anticyc
780780 Calculate geostrophic speed around successive contours
781781 Returns the average
782782 """
783- max_average_speed = self .speed_coef (original_contour ). mean ( )
783+ max_average_speed = self .speed_coef_mean (original_contour )
784784 speed_array = [max_average_speed ]
785785 pixel_min = 1
786786
@@ -808,7 +808,7 @@ def get_uavg(self, all_contours, centlon_e, centlat_e, original_contour, anticyc
808808 if pixel_min > level_contour .nb_pixel :
809809 break
810810 # 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 )
812812 speed_array .append (level_average_speed )
813813 if level_average_speed >= max_average_speed :
814814 max_average_speed = level_average_speed
@@ -944,12 +944,12 @@ def _low_filter(self, grid_name, x_cut, y_cut, factor=40.):
944944 z_interp = RectBivariateSpline (x_center , y_center , z_filtered , ** opts_interpolation ).ev (x , y )
945945 return ma .array (z_interp , mask = m_interp .ev (x , y ) > 0.00001 )
946946
947- def speed_coef (self , contour ):
947+ def speed_coef_mean (self , contour ):
948948 dist , idx = self .index_interp .query (uniform_resample_stack (contour .vertices )[1 :], k = 4 )
949949 i_y = idx % self .x_c .shape [1 ]
950950 i_x = int_ ((idx - i_y ) / self .x_c .shape [1 ])
951951 # 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 ()
953953
954954 def init_speed_coef (self , uname = 'u' , vname = 'v' ):
955955 self ._speed_norm = (self .grid (uname ) ** 2 + self .grid (vname ) ** 2 ) ** .5
@@ -1348,11 +1348,11 @@ def add_uv(self, grid_height):
13481348 d_x = self .EARTH_RADIUS * 2 * pi / 360 * d_x_degrees * cos (deg2rad (self .y_c ))
13491349 self .vars ['v' ] = d_hx / d_x * gof
13501350
1351- def speed_coef (self , contour ):
1351+ def speed_coef_mean (self , contour ):
13521352 """some nan can be compute over contour if we are near border,
13531353 something to explore
13541354 """
1355- return value_on_regular_contour (
1355+ return mean_on_regular_contour (
13561356 self .x_c , self .y_c ,
13571357 self ._speed_ev , self ._speed_ev .mask ,
13581358 contour .vertices )
@@ -1378,18 +1378,8 @@ def interp(self, grid_name, lons, lats):
13781378 Returns:
13791379 new z
13801380 """
1381- z = empty (lons .shape , dtype = 'f4' ).reshape (- 1 )
13821381 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 )
13931383
13941384
13951385@njit (cache = True , fastmath = True , parallel = True )
0 commit comments