@@ -287,7 +287,7 @@ def __init__(self, DATATYPE, SIGN_TYPE, SAVE_DIR, grd, search_ellipse,
287
287
288
288
self .DIAGNOSTIC_TYPE = kwargs .get ('DIAGNOSTIC_TYPE' , 'SLA' )
289
289
290
- self .THE_DOMAIN = kwargs .get ('THE_DOMAIN' , 'Global ' )
290
+ self .THE_DOMAIN = kwargs .get ('THE_DOMAIN' , 'Regional ' )
291
291
self .LONMIN = np .float64 (kwargs .get ('LONMIN' , - 40 ))
292
292
self .LONMAX = np .float64 (kwargs .get ('LONMAX' , - 30 ))
293
293
self .LATMIN = np .float64 (kwargs .get ('LATMIN' , 20 ))
@@ -304,10 +304,13 @@ def __init__(self, DATATYPE, SIGN_TYPE, SAVE_DIR, grd, search_ellipse,
304
304
305
305
self .INTERP_METHOD = kwargs .get ('INTERP_METHOD' , 'RectBivariate' )
306
306
self .JDAY_REFERENCE = kwargs .get ('JDAY_REFERENCE' , 2448623.0 )
307
+
308
+ # NOTE: '.copy()' suffix is essential here
307
309
self .CONTOUR_PARAMETER = kwargs .get ('CONTOUR_PARAMETER' ,
308
- np .linspace (- 100. , 101 , 1 ))
310
+ np .arange (- 100. , 101 , 1 )). copy ( )
309
311
if 'Cyclonic' in SIGN_TYPE :
310
- self .CONTOUR_PARAMETER = self .CONTOUR_PARAMETER [::- 1 ]
312
+ self .CONTOUR_PARAMETER *= - 1
313
+
311
314
self .SHAPE_ERROR = kwargs .get ('SHAPE_ERROR' ,
312
315
np .full (self .CONTOUR_PARAMETER .size , 55. ))
313
316
@@ -514,7 +517,7 @@ def get_inactive_tracks(self, rtime):
514
517
515
518
516
519
517
- def create_netcdf (self , directory , savedir , title ,
520
+ def create_netcdf (self , directory , savedir ,
518
521
grd = None , Ymin = None , Ymax = None ,
519
522
Mmin = None , Mmax = None , model = None ,
520
523
sigma_lev = None , rho_ntr = None ):
@@ -526,7 +529,7 @@ def create_netcdf(self, directory, savedir, title,
526
529
else :
527
530
self .savedir = savedir .replace ('.nc' , '_ARGO_enabled.nc' )
528
531
nc = Dataset (self .savedir , 'w' , format = 'NETCDF4' )
529
- nc .title = '' .join ((title , ' eddy tracks' ))
532
+ nc .title = '' .join ((self . SIGN_TYPE , ' eddy tracks' ))
530
533
nc .directory = directory
531
534
nc .DAYS_BTWN_RECORDS = np .float64 (self .DAYS_BTWN_RECORDS )
532
535
nc .TRACK_DURATION_MIN = np .float64 (self .TRACK_DURATION_MIN )
@@ -1074,7 +1077,7 @@ def __init__(self, THE_DOMAIN, grd, RW_PATH=None):
1074
1077
self .ZERO_CROSSING = grd .ZERO_CROSSING
1075
1078
self .RW_PATH = RW_PATH
1076
1079
self ._tree = None
1077
- if self .THE_DOMAIN in ('Global' , 'ROMS' ):
1080
+ if self .THE_DOMAIN in ('Global' , 'Regional' , ' ROMS' ):
1078
1081
assert self .RW_PATH is not None , \
1079
1082
'Must supply a path for the Rossby deformation radius data'
1080
1083
data = np .loadtxt (RW_PATH )
@@ -1094,6 +1097,7 @@ def __init__(self, THE_DOMAIN, grd, RW_PATH=None):
1094
1097
1095
1098
def __getstate__ (self ):
1096
1099
"""
1100
+ Needed for Pickle
1097
1101
"""
1098
1102
result = self .__dict__ .copy ()
1099
1103
result .pop ('_tree' )
@@ -1102,15 +1106,18 @@ def __getstate__(self):
1102
1106
1103
1107
def __setstate__ (self , thedict ):
1104
1108
"""
1109
+ Needed for Pickle
1105
1110
"""
1106
1111
self .__dict__ = thedict
1107
1112
self ._make_kdtree ()
1108
1113
1109
1114
1110
1115
def get_rwdistance (self , xpt , ypt , DAYS_BTWN_RECORDS ):
1111
1116
"""
1117
+ Return the distance required by SearchEllipse
1118
+ to construct a search ellipse for eddy tracking.
1112
1119
"""
1113
- if self .THE_DOMAIN in ('Global' , 'ROMS' ):
1120
+ if self .THE_DOMAIN in ('Global' , 'Regional' , ' ROMS' ):
1114
1121
#print 'xpt, ypt', xpt, ypt
1115
1122
self .distance [:] = self ._get_rlongwave_spd (xpt , ypt )
1116
1123
self .distance *= 86400.
@@ -1152,6 +1159,8 @@ def get_rwdistance(self, xpt, ypt, DAYS_BTWN_RECORDS):
1152
1159
1153
1160
def _make_subset (self ):
1154
1161
"""
1162
+ Make a subset of _defrad data over the domain.
1163
+ If 'Global' is defined then widen the domain.
1155
1164
"""
1156
1165
pad = 1.5 # degrees
1157
1166
LONMIN , LONMAX , LATMIN , LATMAX = self .limits
@@ -1168,11 +1177,21 @@ def _make_subset(self):
1168
1177
self ._lon = self ._lon [lloi ]
1169
1178
self ._lat = self ._lat [lloi ]
1170
1179
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
+
1171
1187
self .x , self .y = self .M (self ._lon , self ._lat )
1172
1188
return self
1173
1189
1174
1190
1175
1191
def _make_kdtree (self ):
1192
+ """
1193
+ Compute KDE tree for nearest indices.
1194
+ """
1176
1195
points = np .vstack ([self .x , self .y ]).T
1177
1196
self ._tree = spatial .cKDTree (points )
1178
1197
return self
@@ -1207,8 +1226,25 @@ def _get_rlongwave_spd(self, xpt, ypt):
1207
1226
return self .r_spd_long
1208
1227
1209
1228
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
+
1212
1248
class SearchEllipse (object ):
1213
1249
"""
1214
1250
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):
1238
1274
self .n_s_minor = self .DAYS_BTWN_RECORDS * 15e4 / 7.
1239
1275
self .semi_n_s_minor = 0.5 * self .n_s_minor
1240
1276
self .rwv = RossbyWaveSpeed (THE_DOMAIN , grd , RW_PATH = RW_PATH )
1277
+ #self.rwv.view_grid_subset()
1241
1278
self .rw_c = np .empty (1 )
1242
1279
self .rw_c_mod = np .empty (1 )
1243
1280
self .rw_c_fac = 1.75
@@ -1306,7 +1343,7 @@ def set_search_ellipse(self, xpt, ypt):
1306
1343
self .xpt = xpt
1307
1344
self .ypt = ypt
1308
1345
1309
- if self .THE_DOMAIN in ('Global' , 'ROMS' ):
1346
+ if self .THE_DOMAIN in ('Global' , 'Regional' , ' ROMS' ):
1310
1347
self .rw_c [:] = self .rwv .get_rwdistance (xpt , ypt ,
1311
1348
self .DAYS_BTWN_RECORDS )
1312
1349
self .rw_c_mod [:] = 1.75
0 commit comments