@@ -1203,50 +1203,58 @@ def reshape_mask_eff(self, grd):
1203
1203
1204
1204
class RossbyWaveSpeed (object ):
1205
1205
1206
- def __init__ (self , domain , limits , rw_path = None ):
1206
+ def __init__ (self , domain , grd , ZERO_CROSSING , limits , rw_path = None ):
1207
1207
"""
1208
1208
Initialise the RossbyWaveSpeedsobject
1209
1209
"""
1210
1210
self .domain = domain
1211
+ self .M = grd .M
1212
+ self .ZERO_CROSSING = ZERO_CROSSING
1211
1213
self .rw_path = rw_path
1212
1214
if self .domain in ('Global' , 'ROMS' ):
1213
1215
assert self .rw_path is not None , \
1214
1216
'Must supply a path for the Rossby deformation radius data'
1215
1217
data = np .loadtxt (rw_path )
1216
1218
self ._lon = data [:, 1 ] - 360.
1217
1219
self ._lat = data [:, 0 ]
1218
- self ._defrad = data [:, 3 ]
1220
+ self ._c = data [:, 2 ]
1221
+ #self._defrad = data[:, 3]
1219
1222
self .limits = limits
1220
- self ._make_subset ()
1223
+ self ._make_subset (). _make_kdtree ()
1221
1224
self .vartype = 'variable'
1222
1225
else :
1223
1226
self .vartype = 'constant'
1224
1227
self .distance = np .empty (1 )
1225
1228
self .start = True
1226
1229
1227
1230
1228
- def get_rwdistance (self , x , y , days_between_records ):
1231
+ def get_rwdistance (self , xpt , ypt , DAYS_BTWN_RECORDS ):
1229
1232
"""
1230
1233
"""
1231
1234
if self .domain in ('Global' , 'ROMS' ):
1232
- #print 'x,y ', x,y
1233
- self .distance [:] = self ._get_rlongwave_spd ( x , y )
1235
+ #print 'xpt, ypt ', xpt, ypt
1236
+ self .distance [:] = self ._get_c ( xpt , ypt )
1234
1237
self .distance *= 86400.
1235
1238
#if self.domain in 'ROMS':
1236
1239
#self.distance *= 1.5
1237
1240
elif 'BlackSea' in self .domain :
1238
1241
self .distance [:] = 15000. # e.g., Blokhina & Afanasyev, 2003
1239
1242
elif 'MedSea' in self .domain :
1240
1243
self .distance [:] = 20000.
1241
- else : Exception # Unknown domain
1244
+ else :
1245
+ Exception # Unknown domain
1242
1246
1243
1247
if self .start :
1244
1248
print '--------- setting ellipse for %s domain' % self .domain
1245
- print '--------- using %s Rossby deformation radius of %s m' \
1246
- % (self .vartype , np .abs (self .distance [0 ]))
1249
+ #print '--------- using %s Rossby deformation radius of %s m' \
1250
+ #%(self.vartype, np.abs(self.distance[0]))
1251
+ print '--------- using %s baroclinic gravity wave phase speed of %s m/s' \
1252
+ % (self .vartype , self .distance [0 ] / 86400. )
1253
+ print '--------- ' , xpt , ypt
1247
1254
self .start = False
1248
- self .distance *= days_between_records
1249
- return np .abs (self .distance )
1255
+ self .distance *= DAYS_BTWN_RECORDS
1256
+ #print 'aaaa', self.distance
1257
+ return self .distance
1250
1258
1251
1259
1252
1260
def _make_subset (self ):
@@ -1260,77 +1268,91 @@ def _make_subset(self):
1260
1268
self ._lat <= LATMAX + pad )
1261
1269
self ._lon = self ._lon [lloi ]
1262
1270
self ._lat = self ._lat [lloi ]
1263
- self ._defrad = self ._defrad [lloi ]
1264
- self ._make_kdtree ()
1271
+ self ._c = self ._c [lloi ]
1272
+ self .x , self .y = self .M (self ._lon , self ._lat )
1273
+ return self
1265
1274
1266
1275
1267
1276
def _make_kdtree (self ):
1268
- points = np .vstack ([self ._lon , self ._lat ]).T
1277
+ #points = np.vstack([self._lon, self._lat]).T
1278
+ points = np .vstack ([self .x , self .y ]).T
1269
1279
self ._tree = spatial .cKDTree (points )
1270
1280
1271
1281
1272
- def _get_defrad (self , x , y ):
1282
+ #def _get_defrad(self, x, y):
1283
+ #"""
1284
+ #Get a point average of the deformation radius
1285
+ #at x, y
1286
+ #"""
1287
+ #weights, i = self._tree.query(np.array([x, y]), k=4, p=2)
1288
+ #weights /= weights.sum()
1289
+ #self._weights = weights
1290
+ #self.i = i
1291
+ #return np.average(self._defrad[i], weights=weights)
1292
+
1293
+ def _get_c (self , xpt , ypt ):
1273
1294
"""
1274
- Get a point average of the deformation radius
1275
- at x, y
1295
+ Get a point average of c, the phase speed, at x, y
1276
1296
"""
1277
- weights , i = self ._tree .query (np .array ([x , y ]), k = 4 , p = 2 )
1297
+ weights , i = self ._tree .query (np .array ([xpt , ypt ]), k = 4 , p = 2 )
1278
1298
weights /= weights .sum ()
1279
1299
self ._weights = weights
1280
1300
self .i = i
1281
- return np .average (self ._defrad [i ], weights = weights )
1282
-
1301
+ return np .average (self ._c [i ], weights = weights )
1283
1302
1284
- def _get_rlongwave_spd (self , x , y ):
1285
- """
1286
- Get the longwave phase speed, see Chelton etal (2008) pg 446:
1287
- c = -beta * defrad**2 (this only for extratropical waves...)
1288
- """
1289
- r_spd_long = self ._get_defrad (x , y )
1290
- r_spd_long *= 1000. # km to m
1291
- r_spd_long **= 2
1292
- lat = np .average (self ._lat [self .i ], weights = self ._weights )
1293
- beta = np .cos (np .deg2rad (lat ))
1294
- beta *= 1458e-7 # 1458e-7 ~ (2 * 7.29*10**-5)
1295
- beta /= 6371315.0
1296
- r_spd_long *= - beta
1297
- return r_spd_long
1303
+ # def _get_rlongwave_spd(self, x, y):
1304
+ # """
1305
+ # Get the longwave phase speed, see Chelton etal (2008) pg 446:
1306
+ # c = -beta * defrad**2 (this only for extratropical waves...)
1307
+ # """
1308
+ ## r_spd_long = self._get_c (x, y)
1309
+ ## r_spd_long *= 1000. # km to m
1310
+ ## r_spd_long **= 2
1311
+ ## lat = np.average(self._lat[self.i], weights=self._weights)
1312
+ ## beta = np.cos(np.deg2rad(lat))
1313
+ ## beta *= 1458e-7 # 1458e-7 ~ (2 * 7.29*10**-5)
1314
+ ## beta /= 6371315.0
1315
+ ## r_spd_long *= -beta
1316
+ # return self._get_c(x, y)
1298
1317
1299
1318
1300
1319
1301
1320
1302
1321
class SearchEllipse (object ):
1303
1322
1304
- def __init__ (self , domain , DAYS_BTWN_RECORDS , rw_path , limits ):
1323
+ def __init__ (self , domain , grd , DAYS_BTWN_RECORDS , ZERO_CROSSING ,
1324
+ rw_path , limits ):
1305
1325
"""
1306
1326
Class to construct a search ellipse/circle around a specified point.
1307
1327
1308
1328
"""
1309
1329
self .domain = domain
1310
1330
self .DAYS_BTWN_RECORDS = DAYS_BTWN_RECORDS
1331
+ self .ZERO_CROSSING = ZERO_CROSSING
1311
1332
self .rw_path = rw_path
1312
1333
self .limits = limits
1313
1334
self .rw_d_fac = 1.75
1314
1335
self .e_w_major = self .DAYS_BTWN_RECORDS * 3e5 / 7.
1315
- self .n_s_minor = self .DAYS_BTWN_RECORDS * 15e4 / 7.
1316
- self .rwv = RossbyWaveSpeed (self .domain ,
1317
- self .limits , rw_path = self .rw_path )
1336
+ self .n_s_minor = self .DAYS_BTWN_RECORDS * 2 * 15e4 / 7.
1337
+ self .semi_n_s_minor = 0.5 * self .n_s_minor
1338
+ self .rwv = RossbyWaveSpeed (domain , grd , ZERO_CROSSING ,
1339
+ limits , rw_path = rw_path )
1318
1340
self .rw_d = np .empty (1 )
1319
1341
self .rw_d_mod = np .empty (1 )
1320
1342
1321
1343
1322
1344
def _set_east_ellipse (self ):
1323
1345
"""
1324
1346
"""
1325
- self .east_ellipse = patch .Ellipse ((self .x , self .y ),
1347
+ self .east_ellipse = patch .Ellipse ((self .xpt , self .ypt ),
1326
1348
self .e_w_major , self .n_s_minor )
1327
1349
return self
1328
1350
1329
1351
1330
1352
def _set_west_ellipse (self ):
1331
1353
"""
1332
1354
"""
1333
- self .west_ellipse = patch .Ellipse ((self .x , self .y ),
1355
+ self .west_ellipse = patch .Ellipse ((self .xpt , self .ypt ),
1334
1356
self .rw_d_mod , self .n_s_minor )
1335
1357
return self
1336
1358
@@ -1362,27 +1384,35 @@ def _set_black_sea_ellipse(self):
1362
1384
return self
1363
1385
1364
1386
1365
- def set_search_ellipse (self , x , y ):
1387
+ def set_search_ellipse (self , xpt , ypt ):
1366
1388
"""
1367
1389
"""
1368
- self .x = x
1369
- self .y = y
1390
+ self .xpt = xpt
1391
+ self .ypt = ypt
1370
1392
1371
1393
if self .domain in ('Global' , 'ROMS' ):
1372
- self .rw_d [:] = self .rwv .get_rwdistance (x , y ,
1373
- self .DAYS_BTWN_RECORDS )
1394
+ self .rw_d [:] = self .rwv .get_rwdistance (xpt , ypt ,
1395
+ self .DAYS_BTWN_RECORDS )
1396
+ #print self.rw_d
1397
+ #exit()
1374
1398
self .rw_d_mod [:] = 1.75
1375
1399
self .rw_d_mod *= self .rw_d
1376
- self .rw_d_mod [:] = np .maximum (self .rw_d_mod , self .n_s_minor )
1400
+ self .rw_d_mod [:] = np .array ([self .rw_d_mod ,
1401
+ self .semi_n_s_minor ]).max ()
1402
+
1403
+ #print self.rw_d_mod, self.semi_n_s_minor
1404
+
1377
1405
self .rw_d_mod *= 2.
1406
+ #print self.rw_d_mod,
1378
1407
self ._set_global_ellipse ()
1379
1408
elif 'BlackSea' in self .domain :
1380
1409
self .rw_d_mod [:] = 1.75
1381
- self .rw_d [:] = self .rwv .get_rwdistance (x , y ,
1382
- self .DAYS_BTWN_RECORDS )
1410
+ self .rw_d [:] = self .rwv .get_rwdistance (xpt , ypt ,
1411
+ self .DAYS_BTWN_RECORDS )
1383
1412
self .rw_d_mod *= self .rw_d
1384
1413
self ._set_black_sea_ellipse ()
1385
- else : Exception
1414
+ else :
1415
+ Exception
1386
1416
1387
1417
return self
1388
1418
@@ -1392,12 +1422,18 @@ def view_search_ellipse(self, Eddy):
1392
1422
Input A_eddy or C_eddy
1393
1423
"""
1394
1424
plt .figure ()
1395
- ax = plt .subplot (111 )
1396
- ax .set_title ('Rossby def. rad %s m' % self .rw_d [0 ])
1397
- Eddy .M .scatter (self .x , self .y , c = 'b' )
1425
+ ax = plt .subplot ()
1426
+ # ax.set_title('Rossby def. rad %s m' %self.rw_d[0])
1427
+ Eddy .M .scatter (self .xpt , self .ypt , c = 'b' )
1398
1428
Eddy .M .plot (self .ellipse_path .vertices [:, 0 ],
1399
1429
self .ellipse_path .vertices [:, 1 ], 'r' )
1400
1430
Eddy .M .drawcoastlines ()
1431
+ stride = .5
1432
+ Eddy .M .drawparallels (np .arange (- 90 , 90. + stride , stride ),
1433
+ labels = [1 , 0 , 0 , 0 ], ax = ax )
1434
+ Eddy .M .drawmeridians (np .arange (- 360 , 360. + stride , stride ),
1435
+ labels = [0 , 0 , 0 , 1 ], ax = ax )
1436
+ #plt.axis('image')
1401
1437
plt .show ()
1402
1438
1403
1439
0 commit comments