def froude(self): u = self.dataSet.readNCVariable('U') v = self.dataSet.readNCVariable('V') u_corr = wrf.unstaggerX(u) v_corr = wrf.unstaggerY(v) self.u10 = u_corr self.v10 = v_corr wind = (u_corr*u_corr + v_corr*v_corr)**(0.5) height = wrf.unstaggerZ(self.height) #compute the vertical gradient of theta dtheta = np.gradient(self.theta)[0] dz = np.gradient(height)[0] #calculate the Brunt-Vaisala Frequency dtheta_dz = dtheta/dz dims = dtheta_dz.shape N = np.zeros((dims[0],dims[1],dims[2])) #Account for statically unstable and neutral conditions N[dtheta_dz<=0] = 0.00001 N[dtheta_dz>0] = ((self.g/self.theta[dtheta_dz>0])*(dtheta_dz[dtheta_dz>0]))**(0.5) self.var = wind/(height*N) self.var2 = self.var self.varTitle = "Froude Number\n" + self.dataSet.getTime() #Set short variable title for time series self.sTitle = "Froude Number"
def readNCVariable(self, vname, barbs=None, vectors=None, contour2=None, varonly=False): variable = self.dsets[vname][self.currentTimeIndex] if varonly == False: if (hasattr(self.dsets[vname], 'description')): self.description = self.dsets[vname].description if (hasattr(self.dsets[vname], 'units')): self.units = self.dsets[vname].units if vname != 'Times': if len(self.dsets[vname].dimensions) == 4: if len(self.dsets[vname].shape) >= 3: tmp = np.arange(1, self.nz[self.currentGrid - 1] + 1, 1) self.levelList = ["%2d" % x for x in tmp] else: tmp = [1] self.levelList = ["%2d" % x for x in tmp] else: self.levelList = ['NA'] if barbs == True or vectors == True: if len(self.dsets[vname].shape) == 4: tmp = self.dsets['U'][self.currentTimeIndex] self.u10 = wrf.unstaggerX(tmp) tmp = self.dsets['V'][self.currentTimeIndex] self.v10 = wrf.unstaggerY(tmp) else: self.u10 = self.dsets['U10'][self.currentTimeIndex] self.v10 = self.dsets['V10'][self.currentTimeIndex] return variable
def bulk_rich(self): u = self.dataSet.readNCVariable('U') v = self.dataSet.readNCVariable('V') qv = self.dataSet.readNCVariable('QVAPOR') u_corr = wrf.unstaggerX(u) v_corr = wrf.unstaggerY(v) tv = self.temp*(1+0.611*qv) thetav = self.theta*(1+0.611*qv) height = wrf.unstaggerZ(self.height) #compute the vertical gradient of theta dtheta = np.gradient(thetav)[0] dz = np.gradient(height)[0] du = np.gradient(u_corr)[0] dv = np.gradient(v_corr)[0] print(np.min(dtheta),np.max(dtheta),np.min(dz),np.max(dz)) print(np.mean(du),np.mean(dv)) print(np.min(du),np.max(du),np.min(dv),np.max(dv)) #compute bulk richardson number self.u10 = u_corr self.v10 = v_corr self.var = ((self.g/tv)*(dtheta)*dz)/((du)**2+(dv)**2) self.var2 = self.var self.varTitle = 'Bulk Richardson number\n' + self.dataSet.getTime() #Set short variable title for time series self.sTitle = 'Bulk Richardson number'
def getVertVars(self): u = wrf.unstaggerX(np.squeeze(self.readNCVariable('UU'))) v = wrf.unstaggerY(np.squeeze(self.readNCVariable('VV'))) height = np.squeeze(self.readNCVariable('GHT')) / 1000. press = np.squeeze(self.readNCVariable('PRES')) / 100. w = None return u, v, w, press, height
def getVertVars(self): u = wrf.unstaggerX(np.squeeze(self.readNCVariable('U'))) v = wrf.unstaggerY(np.squeeze(self.readNCVariable('V'))) w = wrf.unstaggerZ(np.squeeze(self.readNCVariable('W'))) ph = np.squeeze(self.readNCVariable('PH')) phb = np.squeeze(self.readNCVariable('PHB')) p = np.squeeze(self.readNCVariable('P')) pb = np.squeeze(self.readNCVariable('PB')) press = (p + pb) / 100. height = wrf.unstaggerZ((ph + phb) / 9.81) / 1000. return u, v, w, press, height
def theta_e(self): u = self.dataSet.readNCVariable('U') v = self.dataSet.readNCVariable('V') u_corr = wrf.unstaggerX(u) v_corr = wrf.unstaggerY(v) self.u10 = u_corr self.v10 = v_corr self.var = wrf.get_thetae(self.temp,self.qvapor,self.press) self.var2 = self.var self.varTitle = "$\mathsf{\Theta_{e}\, (K)}$\n"+ self.dataSet.getTime() #Set short variable title for time series self.sTitle = "$\mathsf{\Theta_{e}\, (K)}$"
def temp_3d(self): u = self.dataSet.readNCVariable('U') v = self.dataSet.readNCVariable('V') u_corr = wrf.unstaggerX(u) v_corr = wrf.unstaggerY(v) self.u10 = u_corr self.v10 = v_corr self.var = self.temp self.var2 = self.var self.varTitle = "Temperature (K)\n"+ self.dataSet.getTime() #Set short variable title for time series self.sTitle = "Temperature (K)"
def cloud_water(self): #3D cloud water --> qcloud, qrain qcloud = self.dataSet.readNCVariable('QCLOUD') qrain = self.dataSet.readNCVariable('QRAIN') u = self.dataSet.readNCVariable('U') v = self.dataSet.readNCVariable('V') u_corr = wrf.unstaggerX(u) v_corr = wrf.unstaggerY(v) self.u10 = u_corr self.v10 = v_corr self.var = qcloud + qrain self.var2 = self.var self.varTitle = "Total Cloud Water Mixing Ratio (kg kg$^{-1}$)\n"+ self.dataSet.getTime() #Set short variable title for time series self.sTitle = "Total Cloud Water Mixing Ratio (kg kg$^{-1}$)"
def wind_3d(self): u = self.dataSet.readNCVariable('U') v = self.dataSet.readNCVariable('V') u_corr = wrf.unstaggerX(u) v_corr = wrf.unstaggerY(v) var1 = wrf.get_bulk_wind(u_corr,v_corr) #self.var = wrf.convertWind_MStoKT(var1) self.u10 = u_corr self.v10 = v_corr self.var = var1 self.var2 = self.var #self.varTitle = "Total Wind (knots)\n"+ self.dataSet.getTime() self.varTitle = "Total Wind (m s$^{-1}$)\n"+ self.dataSet.getTime() #Set short variable title for time series self.sTitle = "Total Wind (m s$^{-1}$)"
def ice_water(self): #3D ice water --> qice, qsnow, qgraup qice = self.dataSet.readNCVariable('QICE') qsnow = self.dataSet.readNCVariable('QSNOW') qgraup = self.dataSet.readNCVariable('QGRAUP') u = self.dataSet.readNCVariable('U') v = self.dataSet.readNCVariable('V') u_corr = wrf.unstaggerX(u) v_corr = wrf.unstaggerY(v) self.u10 = u_corr self.v10 = v_corr self.var = qice + qsnow + qgraup self.var2 = self.var self.varTitle = "Total Ice Mixing Ratio (kg kg$^{-1}$)\n"+ self.dataSet.getTime() #Set short variable title for time series self.sTitle = "Total Ice Mixing Ratio (kg kg$^{-1}$)"
def hgt_500mb(self): u = self.dataSet.readNCVariable('U') v = self.dataSet.readNCVariable('V') u_corr = wrf.unstaggerX(u) v_corr = wrf.unstaggerY(v) height = wrf.unstaggerZ(self.height) ref_val = 50000. #Switched to Cython #self.u10 = wrf.loglinear_interpolate(u_corr, self.press, ref_val) #self.v10 = wrf.loglinear_interpolate(v_corr, self.press, ref_val) self.u10 = np.array(wrf_cython.loglinear_interpolate(u_corr, self.press, ref_val)) self.v10 = np.array(wrf_cython.loglinear_interpolate(v_corr, self.press, ref_val)) #self.var = wrf.hypsometric(height,self.press, ref_val, self.temp) self.var = np.array(wrf_cython.hypsometric(height, self.press, ref_val, self.temp)) self.var2 = self.var self.varTitle = "500-mb Geopotential Height (m)\n" + self.dataSet.getTime() #Set short variable title for time series self.sTitle = "500-mb Geopotential Height (m)"
def total_water(self): #3D water --> qrain, qcloud, qice, qsnow, qgraup qcloud = self.dataSet.readNCVariable('QCLOUD') qrain = self.dataSet.readNCVariable('QRAIN') qice = self.dataSet.readNCVariable('QICE') qsnow = self.dataSet.readNCVariable('QSNOW') qgraup = self.dataSet.readNCVariable('QGRAUP') u = self.dataSet.readNCVariable('U') v = self.dataSet.readNCVariable('V') u_corr = wrf.unstaggerX(u) v_corr = wrf.unstaggerY(v) self.u10 = u_corr self.v10 = v_corr self.var = qice + qsnow + qgraup + qcloud + qrain self.var2 = self.var self.varTitle = "Total Water Mixing Ratio (kg kg$^{-1}$)\n"+ self.dataSet.getTime() #Set short variable title for time series self.sTitle = "Total Water Mixing Ratio (kg kg$^{-1}$)"
def temp_850mb(self): u = self.dataSet.readNCVariable('U') v = self.dataSet.readNCVariable('V') u_corr = wrf.unstaggerX(u) v_corr = wrf.unstaggerY(v) ref_val = 85000. #Switched to Cython #self.u10 = wrf.loglinear_interpolate(u_corr, self.press, ref_val) #self.v10 = wrf.loglinear_interpolate(v_corr, self.press, ref_val) self.u10 = np.array(wrf_cython.loglinear_interpolate(u_corr, self.press, ref_val)) self.v10 = np.array(wrf_cython.loglinear_interpolate(v_corr, self.press, ref_val)) #var1 = wrf.loglinear_interpolate(self.temp, self.press, ref_val) var1 = np.array(wrf_cython.loglinear_interpolate(self.temp, self.press, ref_val)) self.var = wrf.convertT_KtoC(var1) self.var2 = wrf.get_mslp(self.height, self.press, self.temp, self.qvapor) self.varTitle = "850-mb Temperature\n" + self.dataSet.getTime() #Set short variable title for time series self.sTitle = "850-mb Temperature"
def rh_700mb(self): u = self.dataSet.readNCVariable('U') v = self.dataSet.readNCVariable('V') u_corr = wrf.unstaggerX(u) v_corr = wrf.unstaggerY(v) ref_val = 70000. #Switched to Cython #self.u10 = wrf.loglinear_interpolate(u_corr, self.press, ref_val) #self.v10 = wrf.loglinear_interpolate(v_corr, self.press, ref_val) self.u10 = np.array(wrf_cython.loglinear_interpolate(u_corr, self.press, ref_val)) self.v10 = np.array(wrf_cython.loglinear_interpolate(v_corr, self.press, ref_val)) var1 = wrf.get_rh(self.temp, self.qvapor, self.press) # self.var = wrf.loglinear_interpolate(var1, self.press, ref_val) self.var = np.array(wrf_cython.loglinear_interpolate(var1, self.press, ref_val)) self.var2 = self.var self.varTitle = "700-mb Relative Humidity (%)\n" + self.dataSet.getTime() #Set short variable title for time series self.sTitle = "700-mb Relative Humidity (%)"
def PotentialVorticity(self): #Read in variables u = self.dataSet.readNCVariable('U') v = self.dataSet.readNCVariable('V') f = self.dataSet.readNCVariable('F') #Define grid spacing in meters dx = self.dataSet.dx[self.dataSet.currentGrid-1] dy = self.dataSet.dy[self.dataSet.currentGrid-1] u_corr = wrf.unstaggerX(u) v_corr = wrf.unstaggerY(v) self.u10 = u_corr self.v10 = v_corr self.var = wrf.pot_vort(u,v,f,dx,dy,self.press,self.theta) self.var2 = self.var self.varTitle = "Potential Voricity (PVU)\n"+ self.dataSet.getTime() #Set short variable title for time series self.sTitle = "Potential Voricity (PVU)"
def winds_300mb(self): u = self.dataSet.readNCVariable('U') v = self.dataSet.readNCVariable('V') u_corr = wrf.unstaggerX(u) v_corr = wrf.unstaggerY(v) height = wrf.unstaggerZ(self.height) ref_val = 30000. #Switched to Cython #self.u10 = wrf.loglinear_interpolate(u_corr, self.press, ref_val) #self.v10 = wrf.loglinear_interpolate(v_corr, self.press, ref_val) self.u10 = np.array(wrf_cython.loglinear_interpolate(u_corr, self.press, ref_val)) self.v10 = np.array(wrf_cython.loglinear_interpolate(v_corr, self.press, ref_val)) var1 = wrf.get_bulk_wind(self.u10,self.v10) self.var = wrf.convertWind_MStoKT(var1) #self.var2 = wrf.hypsometric(height, self.press, ref_val, self.temp) self.var2 = np.array(wrf_cython.hypsometric(height, self.press, ref_val, self.temp)) self.varTitle = "300-mb Wind\n" + self.dataSet.getTime() #Set short variable title for time series self.sTitle = "300-mb Wind"
def vort_850mb(self): u = self.dataSet.readNCVariable('U') v = self.dataSet.readNCVariable('V') u_corr = wrf.unstaggerX(u) v_corr = wrf.unstaggerY(v) ref_val = 85000. #Switched to Cython #self.u10 = wrf.loglinear_interpolate(u_corr, self.press, ref_val) #self.v10 = wrf.loglinear_interpolate(v_corr, self.press, ref_val) self.u10 = np.array(wrf_cython.loglinear_interpolate(u_corr, self.press, ref_val)) self.v10 = np.array(wrf_cython.loglinear_interpolate(v_corr, self.press, ref_val)) self.var = wrf.rel_vort(self.u10,self.v10, self.dataSet.dx[self.dataSet.currentGrid-1], self.dataSet.dy[self.dataSet.currentGrid-1]) self.var2 = wrf.get_mslp(self.height, self.press, self.temp, self.qvapor) self.varTitle = "850-mb Relative Voriticity ($10^{-5}$ $s^{-1}$)\n" +\ self.dataSet.getTime() #Set short variable title for time series self.sTitle = "850-mb Relative Voriticity ($10^{-5}$ $s^{-1}$)"
def richardson(self): u = self.dataSet.readNCVariable('U') v = self.dataSet.readNCVariable('V') u_corr = wrf.unstaggerX(u) v_corr = wrf.unstaggerY(v) wind = (u_corr*u_corr + v_corr*v_corr)**(0.5) height = wrf.unstaggerZ(self.height) #compute the vertical gradient of theta dtheta = np.gradient(self.theta)[0] du = np.gradient(wind)[0] dz = np.gradient(height)[0] #compute the richardson number self.u10 = u_corr self.v10 = v_corr self.var = ((self.g/self.theta)*(dtheta/dz))/(du/dz)**(2) self.var2 = self.var self.varTitle = "Richardson Number\n" + self.dataSet.getTime() #Set short variable title for time series self.sTitle = "Richardson Number"
def temp_500mb(self): u = self.dataSet.readNCVariable('U') v = self.dataSet.readNCVariable('V') u_corr = wrf.unstaggerX(u) v_corr = wrf.unstaggerY(v) height = wrf.unstaggerZ(self.height) ref_val = 50000. #Switched to Cython #var1 = wrf.loglinear_interpolate(self.temp, self.press, ref_val) #self.u10 = wrf.loglinear_interpolate(u_corr, self.press, ref_val) #self.v10 = wrf.loglinear_interpolate(v_corr, self.press, ref_val) var1 = np.array(wrf_cython.loglinear_interpolate(self.temp, self.press, ref_val)) self.u10 = np.array(wrf_cython.loglinear_interpolate(u_corr, self.press, ref_val)) self.v10 = np.array(wrf_cython.loglinear_interpolate(v_corr, self.press, ref_val)) self.var = wrf.convertT_KtoC(var1) #self.var2 = wrf.hypsometric(height, self.press, ref_val, self.temp) self.var2 = np.array(wrf_cython.hypsometric(height, self.press, ref_val, self.temp)) self.varTitle = "500-mb Temperature ($^{\circ}$C)\n" + self.dataSet.getTime() #Set short variable title for time series self.sTitle = "500-mb Temperature ($^{\circ}$C)"
def divergence(self): u = self.dataSet.readNCVariable('U') v = self.dataSet.readNCVariable('V') u_corr = wrf.unstaggerX(u) v_corr = wrf.unstaggerY(v) #For the WRF-ARW Arakawa C grid we don't need to use the unstagger winds # to calculate the gradient at the mass points #du = np.gradient(u_corr)[2] #dv = np.gradient(v_corr)[1] #Get dimensions dimsu = u.shape dimsv = v.shape du = u[:,:,1:dimsu[2]] - u[:,:,0:dimsu[2]-1] dv = v[:,1:dimsv[1],:] - v[:,0:dimsv[1]-1,:] dx = self.dataSet.dx[self.dataSet.currentGrid-1] dy = self.dataSet.dy[self.dataSet.currentGrid-1] self.u10 = u_corr self.v10 = v_corr self.var = (du/dx + dv/dy)*pow(10,5) self.var2 = self.var self.varTitle = "Divergence (10$^{-5}$ s$^{-1}$)\n" + self.dataSet.getTime() #Set short variable title for time series self.sTitle = "Divergence (10$^{-5}$ s$^{-1}$)"