@@ -353,6 +353,9 @@ def is_circular(self):
353353 return False
354354
355355 def units (self , varname ):
356+ stored_units = self .variables_description [varname ]['attrs' ].get ('units' , None )
357+ if stored_units is not None :
358+ return stored_units
356359 with Dataset (self .filename ) as h :
357360 var = h .variables [varname ]
358361 if hasattr (var , 'units' ):
@@ -437,7 +440,7 @@ def bounds(self):
437440 return self .x_bounds .min (), self .x_bounds .max (), self .y_bounds .min (), self .y_bounds .max ()
438441
439442 def eddy_identification (self , grid_height , uname , vname , date , step = 0.005 , shape_error = 55 ,
440- array_sampling = 50 , pixel_limit = None ):
443+ array_sampling = 50 , pixel_limit = None , precision = None ):
441444 """
442445
443446 Args:
@@ -449,6 +452,7 @@ def eddy_identification(self, grid_height, uname, vname, date, step=0.005, shape
449452 shape_error: must be in percent (%)
450453 array_sampling:
451454 pixel_limit:
455+ precision: must be in meter(m)
452456
453457 Returns:
454458
@@ -468,11 +472,15 @@ def eddy_identification(self, grid_height, uname, vname, date, step=0.005, shape
468472 in_h_unit = units .parse_expression (h_units )
469473 if in_h_unit is not None :
470474 factor , _ = in_h_unit .to ('m' ).to_tuple ()
475+ logging .info ('We will apply on step a factor to be coherent with grid : %f' , 1 / factor )
471476 step /= factor
477+ if precision is not None :
478+ precision /= factor
472479
473480 # Get h grid
474- data = self .grid (grid_height )
475-
481+ data = self .grid (grid_height ).astype ('f8' )
482+ if precision is not None :
483+ data = (data / precision ).round () * precision
476484 # Compute levels for ssh
477485 z_min , z_max = data .min (), data .max ()
478486 d_z = z_max - z_min
@@ -599,10 +607,10 @@ def eddy_identification(self, grid_height, uname, vname, date, step=0.005, shape
599607 if speed_array .shape [0 ] == 1 :
600608 properties .obs ['uavg_profile' ][:] = speed_array [0 ]
601609 else :
602- properties .obs ['uavg_profile' ] = raw_resample (speed_array , array_sampling ) * .01
610+ properties .obs ['uavg_profile' ] = raw_resample (speed_array , array_sampling )
603611 properties .obs ['amplitude' ] = amp .amplitude
604612 properties .obs ['radius_s' ] = eddy_radius_s
605- properties .obs ['speed_radius' ] = max_average_speed * .01
613+ properties .obs ['speed_radius' ] = max_average_speed
606614 properties .obs ['radius_e' ] = eddy_radius_e
607615 properties .obs ['shape_error_e' ] = aerr
608616 properties .obs ['shape_error_s' ] = aerr_s
@@ -644,6 +652,13 @@ def eddy_identification(self, grid_height, uname, vname, date, step=0.005, shape
644652 factor , _ = in_h_unit .to (out_unit ).to_tuple ()
645653 a_and_c [0 ].obs [name ] *= factor
646654 a_and_c [1 ].obs [name ] *= factor
655+ in_u_units = units .parse_expression (self .units (uname ))
656+ if in_u_units is not None :
657+ for name in ['speed_radius' , 'uavg_profile' ]:
658+ out_unit = units .parse_expression (VAR_DESCR [name ]['nc_attr' ]['units' ])
659+ factor , _ = in_u_units .to (out_unit ).to_tuple ()
660+ a_and_c [0 ].obs [name ] *= factor
661+ a_and_c [1 ].obs [name ] *= factor
647662 return a_and_c
648663
649664 def get_uavg (self , all_contours , centlon_e , centlat_e , original_contour , anticyclonic_search , level_start ,
@@ -652,6 +667,7 @@ def get_uavg(self, all_contours, centlon_e, centlat_e, original_contour, anticyc
652667 Calculate geostrophic speed around successive contours
653668 Returns the average
654669 """
670+ # Init max speed to search maximum
655671 max_average_speed = self .speed_coef_mean (original_contour )
656672 speed_array = [max_average_speed ]
657673
0 commit comments