@@ -1203,50 +1203,58 @@ def reshape_mask_eff(self, grd):
12031203
12041204class RossbyWaveSpeed (object ):
12051205
1206- def __init__ (self , domain , limits , rw_path = None ):
1206+ def __init__ (self , domain , grd , ZERO_CROSSING , limits , rw_path = None ):
12071207 """
12081208 Initialise the RossbyWaveSpeedsobject
12091209 """
12101210 self .domain = domain
1211+ self .M = grd .M
1212+ self .ZERO_CROSSING = ZERO_CROSSING
12111213 self .rw_path = rw_path
12121214 if self .domain in ('Global' , 'ROMS' ):
12131215 assert self .rw_path is not None , \
12141216 'Must supply a path for the Rossby deformation radius data'
12151217 data = np .loadtxt (rw_path )
12161218 self ._lon = data [:, 1 ] - 360.
12171219 self ._lat = data [:, 0 ]
1218- self ._defrad = data [:, 3 ]
1220+ self ._c = data [:, 2 ]
1221+ #self._defrad = data[:, 3]
12191222 self .limits = limits
1220- self ._make_subset ()
1223+ self ._make_subset (). _make_kdtree ()
12211224 self .vartype = 'variable'
12221225 else :
12231226 self .vartype = 'constant'
12241227 self .distance = np .empty (1 )
12251228 self .start = True
12261229
12271230
1228- def get_rwdistance (self , x , y , days_between_records ):
1231+ def get_rwdistance (self , xpt , ypt , DAYS_BTWN_RECORDS ):
12291232 """
12301233 """
12311234 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 )
12341237 self .distance *= 86400.
12351238 #if self.domain in 'ROMS':
12361239 #self.distance *= 1.5
12371240 elif 'BlackSea' in self .domain :
12381241 self .distance [:] = 15000. # e.g., Blokhina & Afanasyev, 2003
12391242 elif 'MedSea' in self .domain :
12401243 self .distance [:] = 20000.
1241- else : Exception # Unknown domain
1244+ else :
1245+ Exception # Unknown domain
12421246
12431247 if self .start :
12441248 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
12471254 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
12501258
12511259
12521260 def _make_subset (self ):
@@ -1260,77 +1268,91 @@ def _make_subset(self):
12601268 self ._lat <= LATMAX + pad )
12611269 self ._lon = self ._lon [lloi ]
12621270 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
12651274
12661275
12671276 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
12691279 self ._tree = spatial .cKDTree (points )
12701280
12711281
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 ):
12731294 """
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
12761296 """
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 )
12781298 weights /= weights .sum ()
12791299 self ._weights = weights
12801300 self .i = i
1281- return np .average (self ._defrad [i ], weights = weights )
1282-
1301+ return np .average (self ._c [i ], weights = weights )
12831302
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)
12981317
12991318
13001319
13011320
13021321class SearchEllipse (object ):
13031322
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 ):
13051325 """
13061326 Class to construct a search ellipse/circle around a specified point.
13071327
13081328 """
13091329 self .domain = domain
13101330 self .DAYS_BTWN_RECORDS = DAYS_BTWN_RECORDS
1331+ self .ZERO_CROSSING = ZERO_CROSSING
13111332 self .rw_path = rw_path
13121333 self .limits = limits
13131334 self .rw_d_fac = 1.75
13141335 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 )
13181340 self .rw_d = np .empty (1 )
13191341 self .rw_d_mod = np .empty (1 )
13201342
13211343
13221344 def _set_east_ellipse (self ):
13231345 """
13241346 """
1325- self .east_ellipse = patch .Ellipse ((self .x , self .y ),
1347+ self .east_ellipse = patch .Ellipse ((self .xpt , self .ypt ),
13261348 self .e_w_major , self .n_s_minor )
13271349 return self
13281350
13291351
13301352 def _set_west_ellipse (self ):
13311353 """
13321354 """
1333- self .west_ellipse = patch .Ellipse ((self .x , self .y ),
1355+ self .west_ellipse = patch .Ellipse ((self .xpt , self .ypt ),
13341356 self .rw_d_mod , self .n_s_minor )
13351357 return self
13361358
@@ -1362,27 +1384,35 @@ def _set_black_sea_ellipse(self):
13621384 return self
13631385
13641386
1365- def set_search_ellipse (self , x , y ):
1387+ def set_search_ellipse (self , xpt , ypt ):
13661388 """
13671389 """
1368- self .x = x
1369- self .y = y
1390+ self .xpt = xpt
1391+ self .ypt = ypt
13701392
13711393 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()
13741398 self .rw_d_mod [:] = 1.75
13751399 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+
13771405 self .rw_d_mod *= 2.
1406+ #print self.rw_d_mod,
13781407 self ._set_global_ellipse ()
13791408 elif 'BlackSea' in self .domain :
13801409 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 )
13831412 self .rw_d_mod *= self .rw_d
13841413 self ._set_black_sea_ellipse ()
1385- else : Exception
1414+ else :
1415+ Exception
13861416
13871417 return self
13881418
@@ -1392,12 +1422,18 @@ def view_search_ellipse(self, Eddy):
13921422 Input A_eddy or C_eddy
13931423 """
13941424 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' )
13981428 Eddy .M .plot (self .ellipse_path .vertices [:, 0 ],
13991429 self .ellipse_path .vertices [:, 1 ], 'r' )
14001430 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')
14011437 plt .show ()
14021438
14031439
0 commit comments