@@ -287,7 +287,7 @@ def __init__(self, DATATYPE, SIGN_TYPE, SAVE_DIR, grd, search_ellipse,
287287
288288        self .DIAGNOSTIC_TYPE  =  kwargs .get ('DIAGNOSTIC_TYPE' , 'SLA' )
289289
290-         self .THE_DOMAIN  =  kwargs .get ('THE_DOMAIN' , 'Global ' )
290+         self .THE_DOMAIN  =  kwargs .get ('THE_DOMAIN' , 'Regional ' )
291291        self .LONMIN  =  np .float64 (kwargs .get ('LONMIN' , - 40 ))
292292        self .LONMAX  =  np .float64 (kwargs .get ('LONMAX' , - 30 ))
293293        self .LATMIN  =  np .float64 (kwargs .get ('LATMIN' , 20 ))
@@ -304,10 +304,13 @@ def __init__(self, DATATYPE, SIGN_TYPE, SAVE_DIR, grd, search_ellipse,
304304
305305        self .INTERP_METHOD  =  kwargs .get ('INTERP_METHOD' , 'RectBivariate' )
306306        self .JDAY_REFERENCE  =  kwargs .get ('JDAY_REFERENCE' , 2448623.0 )
307+         
308+         # NOTE: '.copy()' suffix is essential here 
307309        self .CONTOUR_PARAMETER  =  kwargs .get ('CONTOUR_PARAMETER' ,
308-                                    np .linspace (- 100. , 101 , 1 ))
310+                                    np .arange (- 100. , 101 , 1 )). copy ( )
309311        if  'Cyclonic'  in  SIGN_TYPE :
310-             self .CONTOUR_PARAMETER  =  self .CONTOUR_PARAMETER [::- 1 ]
312+             self .CONTOUR_PARAMETER  *=  - 1 
313+         
311314        self .SHAPE_ERROR  =  kwargs .get ('SHAPE_ERROR' ,
312315                              np .full (self .CONTOUR_PARAMETER .size , 55. ))
313316
@@ -514,7 +517,7 @@ def get_inactive_tracks(self, rtime):
514517
515518
516519
517-     def  create_netcdf (self , directory , savedir ,  title , 
520+     def  create_netcdf (self , directory , savedir ,
518521                      grd = None , Ymin = None , Ymax = None ,
519522                      Mmin = None , Mmax = None , model = None ,
520523                      sigma_lev = None , rho_ntr = None ):
@@ -526,7 +529,7 @@ def create_netcdf(self, directory, savedir, title,
526529        else :
527530           self .savedir  =  savedir .replace ('.nc' , '_ARGO_enabled.nc' )
528531        nc  =  Dataset (self .savedir , 'w' , format = 'NETCDF4' )
529-         nc .title  =  '' .join ((title , ' eddy tracks' ))
532+         nc .title  =  '' .join ((self . SIGN_TYPE , ' eddy tracks' ))
530533        nc .directory  =  directory 
531534        nc .DAYS_BTWN_RECORDS  =  np .float64 (self .DAYS_BTWN_RECORDS )
532535        nc .TRACK_DURATION_MIN  =  np .float64 (self .TRACK_DURATION_MIN )
@@ -1074,7 +1077,7 @@ def __init__(self, THE_DOMAIN, grd, RW_PATH=None):
10741077        self .ZERO_CROSSING  =  grd .ZERO_CROSSING 
10751078        self .RW_PATH  =  RW_PATH 
10761079        self ._tree  =  None 
1077-         if  self .THE_DOMAIN  in  ('Global' , 'ROMS' ):
1080+         if  self .THE_DOMAIN  in  ('Global' , 'Regional'  ,  ' ROMS'
10781081            assert  self .RW_PATH  is  not None , \
10791082                'Must supply a path for the Rossby deformation radius data' 
10801083            data  =  np .loadtxt (RW_PATH )
@@ -1094,6 +1097,7 @@ def __init__(self, THE_DOMAIN, grd, RW_PATH=None):
10941097
10951098    def  __getstate__ (self ):
10961099        """ 
1100+         Needed for Pickle 
10971101        """ 
10981102        result  =  self .__dict__ .copy ()
10991103        result .pop ('_tree' )
@@ -1102,15 +1106,18 @@ def __getstate__(self):
11021106
11031107    def  __setstate__ (self , thedict ):
11041108        """ 
1109+         Needed for Pickle 
11051110        """ 
11061111        self .__dict__  =  thedict 
11071112        self ._make_kdtree ()
11081113
11091114
11101115    def  get_rwdistance (self , xpt , ypt , DAYS_BTWN_RECORDS ):
11111116        """ 
1117+         Return the distance required by SearchEllipse 
1118+         to construct a search ellipse for eddy tracking. 
11121119        """ 
1113-         if  self .THE_DOMAIN  in  ('Global' , 'ROMS' ):
1120+         if  self .THE_DOMAIN  in  ('Global' , 'Regional'  ,  ' ROMS'
11141121	    #print 'xpt, ypt', xpt, ypt 
11151122            self .distance [:] =  self ._get_rlongwave_spd (xpt , ypt )
11161123            self .distance  *=  86400. 
@@ -1152,6 +1159,8 @@ def get_rwdistance(self, xpt, ypt, DAYS_BTWN_RECORDS):
11521159
11531160    def  _make_subset (self ):
11541161        """ 
1162+         Make a subset of _defrad data over the domain. 
1163+         If 'Global' is defined then widen the domain. 
11551164        """ 
11561165        pad  =  1.5  # degrees 
11571166        LONMIN , LONMAX , LATMIN , LATMAX  =  self .limits 
@@ -1168,11 +1177,21 @@ def _make_subset(self):
11681177        self ._lon  =  self ._lon [lloi ]
11691178        self ._lat  =  self ._lat [lloi ]
11701179        self ._defrad  =  self ._defrad [lloi ]
1180+         
1181+         if  'Global'  in  self .THE_DOMAIN :
1182+             lloi  =  self ._lon  >  260. 
1183+             self ._lon  =  np .append (self ._lon , self ._lon [lloi ] -  360. )
1184+             self ._lat  =  np .append (self ._lat , self ._lat [lloi ])
1185+             self ._defrad  =  np .append (self ._defrad , self ._defrad [lloi ])
1186+         
11711187        self .x , self .y  =  self .M (self ._lon , self ._lat )
11721188        return  self 
11731189
11741190
11751191    def  _make_kdtree (self ):
1192+         """ 
1193+         Compute KDE tree for nearest indices. 
1194+         """ 
11761195        points  =  np .vstack ([self .x , self .y ]).T 
11771196        self ._tree  =  spatial .cKDTree (points )
11781197        return  self 
@@ -1207,8 +1226,25 @@ def _get_rlongwave_spd(self, xpt, ypt):
12071226        return  self .r_spd_long 
12081227
12091228
1210-     
1211-     
1229+     def  view_grid_subset (self ):
1230+         """ 
1231+         Figure to check RossbyWaveSpeed grid after call to 
1232+         self._make_subset() 
1233+         To use, uncomment in SearchEllipse __init__ method 
1234+         """ 
1235+         stride  =  30 
1236+         plt .figure ()
1237+         ax  =  plt .subplot ()
1238+         self .M .scatter (self .x , self .y , c = 'b' )
1239+         self .M .drawcoastlines ()
1240+         self .M .fillcontinents ()
1241+         self .M .drawparallels (np .arange (- 90 , 90.  +  stride , stride ),
1242+                              labels = [1 , 0 , 0 , 0 ], ax = ax )
1243+         self .M .drawmeridians (np .arange (- 360 , 360.  +  stride , stride ),
1244+                              labels = [0 , 0 , 0 , 1 ], ax = ax )
1245+         plt .show ()
1246+ 
1247+ 
12121248class  SearchEllipse  (object ):
12131249    """ 
12141250    Class to construct a search ellipse/circle around a specified point. 
@@ -1238,6 +1274,7 @@ def __init__(self, THE_DOMAIN, grd, DAYS_BTWN_RECORDS, RW_PATH=None):
12381274        self .n_s_minor  =  self .DAYS_BTWN_RECORDS  *  15e4  /  7. 
12391275        self .semi_n_s_minor  =  0.5  *  self .n_s_minor 
12401276        self .rwv  =  RossbyWaveSpeed (THE_DOMAIN , grd , RW_PATH = RW_PATH )
1277+         #self.rwv.view_grid_subset() 
12411278        self .rw_c  =  np .empty (1 )
12421279        self .rw_c_mod  =  np .empty (1 )
12431280        self .rw_c_fac  =  1.75 
@@ -1306,7 +1343,7 @@ def set_search_ellipse(self, xpt, ypt):
13061343        self .xpt  =  xpt 
13071344        self .ypt  =  ypt 
13081345
1309-         if  self .THE_DOMAIN  in  ('Global' , 'ROMS' ):
1346+         if  self .THE_DOMAIN  in  ('Global' , 'Regional'  ,  ' ROMS'
13101347            self .rw_c [:] =  self .rwv .get_rwdistance (xpt , ypt ,
13111348                                  self .DAYS_BTWN_RECORDS )
13121349            self .rw_c_mod [:] =  1.75 
0 commit comments