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