def gh_uv_r6(initTime=None, fhour=6, day_back=0, model='ECMWF', gh_lev=500, uv_lev=850, map_ratio=14 / 9, zoom_ratio=20, cntr_pnt=[104, 34], south_China_sea=True, area=None, city=False, output_dir=None, data_source='MICAPS', Global=False, **kwargs): if (area != None): south_China_sea = False # micaps data directory if (data_source == 'MICAPS'): try: data_dir = [ utl.Cassandra_dir(data_type='high', data_source=model, var_name='HGT', lvl=gh_lev), utl.Cassandra_dir(data_type='high', data_source=model, var_name='UGRD', lvl=uv_lev), utl.Cassandra_dir(data_type='high', data_source=model, var_name='VGRD', lvl=uv_lev), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='RAIN06'), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='PSFC') ] except KeyError: raise ValueError('Can not find all directories needed') # get filename if (initTime != None): filename = utl.model_filename(initTime, fhour) else: filename = utl.filename_day_back_model(day_back=day_back, fhour=fhour) # retrieve data from micaps server gh = MICAPS_IO.get_model_grid(data_dir[0], filename=filename) if gh is None: return u = MICAPS_IO.get_model_grid(data_dir[1], filename=filename) if u is None: return v = MICAPS_IO.get_model_grid(data_dir[2], filename=filename) if v is None: return r6 = MICAPS_IO.get_model_grid(data_dir[3], filename=filename) if r6 is None: return psfc = MICAPS_IO.get_model_grid(data_dir[4], filename=filename) if (data_source == 'CIMISS'): # get filename if (initTime != None): filename = utl.model_filename(initTime, fhour, UTC=True) else: filename = utl.filename_day_back_model(day_back=day_back, fhour=fhour, UTC=True) try: # retrieve data from CIMISS server gh = CMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='GPH'), levattrs={ 'long_name': 'pressure_level', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_level=gh_lev, fcst_ele="GPH", units='gpm') if gh is None: return gh['data'].values = gh['data'].values / 10. u = CMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='WIU'), levattrs={ 'long_name': 'pressure_level', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_level=uv_lev, fcst_ele="WIU", units='m/s') if u is None: return v = CMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='WIV'), levattrs={ 'long_name': 'pressure_level', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_level=uv_lev, fcst_ele="WIV", units='m/s') if v is None: return TPE1 = CMISS_IO.cimiss_model_by_time('20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code( data_source=model, var_name='TPE'), fcst_level=0, fcst_ele="TPE", units='kg*m^-2') if TPE1 is None: return TPE2 = CMISS_IO.cimiss_model_by_time('20' + filename[0:8], valid_time=fhour - 6, data_code=utl.CMISS_data_code( data_source=model, var_name='TPE'), fcst_level=0, fcst_ele="TPE", units='kg*m^-2') if TPE2 is None: return psfc = CMISS_IO.cimiss_model_by_time('20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code( data_source=model, var_name='PRS'), fcst_level=0, fcst_ele="PRS", units='Pa') psfc['data'] = psfc['data'] / 100. except KeyError: raise ValueError('Can not find all data needed') r6 = TPE1.copy(deep=True) r6['data'].values = TPE1['data'].values - TPE2['data'].values # prepare data if (area != None): cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area) map_extent = [0, 0, 0, 0] map_extent[0] = cntr_pnt[0] - zoom_ratio * 1 * map_ratio map_extent[1] = cntr_pnt[0] + zoom_ratio * 1 * map_ratio map_extent[2] = cntr_pnt[1] - zoom_ratio * 1 map_extent[3] = cntr_pnt[1] + zoom_ratio * 1 delt_x = (map_extent[1] - map_extent[0]) * 0.2 delt_y = (map_extent[3] - map_extent[2]) * 0.1 gh = utl.cut_xrdata(map_extent, gh, delt_x=delt_x, delt_y=delt_y) u = utl.cut_xrdata(map_extent, u, delt_x=delt_x, delt_y=delt_y) v = utl.cut_xrdata(map_extent, v, delt_x=delt_x, delt_y=delt_y) r6 = utl.cut_xrdata(map_extent, r6, delt_x=delt_x, delt_y=delt_y) gh = utl.mask_terrian(gh_lev, psfc, gh) u = utl.mask_terrian(uv_lev, psfc, u) v = utl.mask_terrian(uv_lev, psfc, v) gh.attrs['model'] = model uv = xr.merge([u.rename({'data': 'u'}), v.rename({'data': 'v'})]) synoptic_graphics.draw_gh_uv_r6(r6=r6, gh=gh, uv=uv, map_extent=map_extent, regrid_shape=20, city=city, south_China_sea=south_China_sea, output_dir=output_dir, Global=Global)
def periodmean_gh_uv_pwat_ulj(initTimes=None, fhours=[0], day_back=0, model='ECMWF', gh_lev=500, uv_lev=850, ulj_lev=200, map_ratio=14 / 9, zoom_ratio=20, cntr_pnt=[104, 34], south_China_sea=True, area=None, city=False, output_dir=None, data_source='MICAPS', Global=False, **kwargs): if (area != None): south_China_sea = False # micaps data directory if (data_source == 'MICAPS'): try: data_dir = [ utl.Cassandra_dir(data_type='high', data_source=model, var_name='HGT', lvl=gh_lev), utl.Cassandra_dir(data_type='high', data_source=model, var_name='UGRD', lvl=uv_lev), utl.Cassandra_dir(data_type='high', data_source=model, var_name='VGRD', lvl=uv_lev), utl.Cassandra_dir(data_type='high', data_source=model, var_name='UGRD', lvl=ulj_lev), utl.Cassandra_dir(data_type='high', data_source=model, var_name='VGRD', lvl=ulj_lev), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='TCWV'), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='PSFC') ] except KeyError: raise ValueError('Can not find all directories needed') filenames = [] # get filename if (initTimes != None): for initTime in initTimes: for fhour in fhours: filenames.append(utl.model_filename(initTime, fhour)) else: filenames = utl.filename_day_back_model(day_back=day_back, fhour=fhour) # retrieve data from micaps server gh = MICAPS_IO.get_model_grids(data_dir[0], filenames=filenames) u = MICAPS_IO.get_model_grids(data_dir[1], filenames=filenames) v = MICAPS_IO.get_model_grids(data_dir[2], filenames=filenames) u2 = MICAPS_IO.get_model_grids(data_dir[3], filenames=filenames) v2 = MICAPS_IO.get_model_grids(data_dir[4], filenames=filenames) pwat = MICAPS_IO.get_model_grids(data_dir[5], filenames=filenames) psfc = MICAPS_IO.get_model_grids(data_dir[6], filenames=filenames) if (data_source == 'CIMISS'): # get filename filenames = [] if (initTimes != None): for initTime in initTimes: for fhour in fhours: filenames.append( '20' + utl.model_filename(initTime, fhour, UTC=True)) else: filenames = utl.filename_day_back_model(day_back=day_back, fhour=fhour, UTC=True) try: # retrieve data from CIMISS server gh = utl.cimiss_model_ana_grids(data_code=utl.CMISS_data_code( data_source=model, var_name='GPH'), filenames=filenames, fcst_level=gh_lev, fcst_ele="GPH", units='gpm') gh['data'].values = gh['data'].values / 10. u = utl.cimiss_model_ana_grids(data_code=utl.CMISS_data_code( data_source=model, var_name='WIU'), filenames=filenames, fcst_level=uv_lev, fcst_ele="WIU", units='m/s') v = utl.cimiss_model_ana_grids(data_code=utl.CMISS_data_code( data_source=model, var_name='WIV'), filenames=filenames, fcst_level=uv_lev, fcst_ele="WIV", units='m/s') u2 = utl.cimiss_model_ana_grids(data_code=utl.CMISS_data_code( data_source=model, var_name='WIU'), filenames=filenames, fcst_level=ulj_lev, fcst_ele="WIU", units='m/s') v2 = utl.cimiss_model_ana_grids(data_code=utl.CMISS_data_code( data_source=model, var_name='WIV'), filenames=filenames, fcst_level=ulj_lev, fcst_ele="WIV", units='m/s') if (model == 'ECMWF'): pwat = utl.cimiss_model_ana_grids( data_code=utl.CMISS_data_code(data_source=model, var_name='TCWV'), filenames=filenames, fcst_level=0, fcst_ele="TCWV", units='kg m-2') else: pwat = utl.cimiss_model_ana_grids( data_code=utl.CMISS_data_code(data_source=model, var_name='TIWV'), filenames=filenames, fcst_level=0, fcst_ele="TIWV", units='kg m-2') psfc = utl.cimiss_model_ana_grids(data_code=utl.CMISS_data_code( data_source=model, var_name='PRS'), filenames=filenames, fcst_level=0, fcst_ele="PRS", units='Pa') psfc['data'] = psfc['data'] / 100. except KeyError: raise ValueError('Can not find all data needed') # prepare data if (area != None): cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area) map_extent, delt_x, delt_y = utl.get_map_extent(cntr_pnt=cntr_pnt, zoom_ratio=zoom_ratio, map_ratio=map_ratio) gh = utl.cut_xrdata(map_extent, gh, delt_x=delt_x, delt_y=delt_y) u = utl.cut_xrdata(map_extent, u, delt_x=delt_x, delt_y=delt_y) v = utl.cut_xrdata(map_extent, v, delt_x=delt_x, delt_y=delt_y) u2 = utl.cut_xrdata(map_extent, u2, delt_x=delt_x, delt_y=delt_y) v2 = utl.cut_xrdata(map_extent, v2, delt_x=delt_x, delt_y=delt_y) pwat = utl.cut_xrdata(map_extent, pwat, delt_x=delt_x, delt_y=delt_y) gh = utl.mask_terrian(gh_lev, psfc, gh) u = utl.mask_terrian(uv_lev, psfc, u) v = utl.mask_terrian(uv_lev, psfc, v) u2 = utl.mask_terrian(ulj_lev, psfc, u2) v2 = utl.mask_terrian(ulj_lev, psfc, v2) uv = xr.merge([u.rename({'data': 'u'}), v.rename({'data': 'v'})]) ulj = mpcalc.wind_speed(u2['data'].values * units('m/s'), v2['data'].values * units('m/s')) ulj_xr = u2.copy(deep=True) ulj_xr['data'].values = ulj.magnitude pwat_mean = pwat.mean('time') gh_mean = gh.mean('time') ulj_mean = ulj_xr.mean('time') uv_mean = uv.mean('time') gh_mean.attrs['model'] = model gh_mean.attrs['st_time'] = gh['time'].values[0] gh_mean.attrs['ed_time'] = gh['time'].values[-1] synoptic_graphics.draw_gh_uv_pwat_ulj(pwat=pwat_mean, gh=gh_mean, uv=uv_mean, ulj=ulj_mean, map_extent=map_extent, regrid_shape=20, city=city, south_China_sea=south_China_sea, output_dir=output_dir)
def gh_uv_wsp(initTime=None, fhour=6, day_back=0, model='ECMWF', gh_lev=500, uv_lev=850, map_ratio=14 / 9, zoom_ratio=20, cntr_pnt=[104, 34], south_China_sea=True, area=None, city=False, output_dir=None, data_source='MICAPS', Global=False, **kwargs): if (area != None): south_China_sea = False # micaps data directory if (data_source == 'MICAPS'): try: data_dir = [ utl.Cassandra_dir(data_type='high', data_source=model, var_name='HGT', lvl=gh_lev), utl.Cassandra_dir(data_type='high', data_source=model, var_name='UGRD', lvl=uv_lev), utl.Cassandra_dir(data_type='high', data_source=model, var_name='VGRD', lvl=uv_lev), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='PSFC') ] except KeyError: raise ValueError('Can not find all directories needed') # get filename print(initTime) if (initTime != None): filename = utl.model_filename(initTime, fhour) else: filename = utl.filename_day_back_model(day_back=day_back, fhour=fhour) # retrieve data from micaps server gh = MICAPS_IO.get_model_grid(data_dir[0], filename=filename) if gh is None: return u = MICAPS_IO.get_model_grid(data_dir[1], filename=filename) if u is None: return v = MICAPS_IO.get_model_grid(data_dir[2], filename=filename) if v is None: return psfc = MICAPS_IO.get_model_grid(data_dir[3], filename=filename) if (data_source == 'CIMISS'): # get filename if (initTime != None): filename = utl.model_filename(initTime, fhour, UTC=True) else: filename = utl.filename_day_back_model(day_back=day_back, fhour=fhour, UTC=True) try: # retrieve data from CIMISS server gh = CMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='GPH'), levattrs={ 'long_name': 'pressure_level', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_level=gh_lev, fcst_ele="GPH", units='gpm') if gh is None: return gh['data'].values = gh['data'].values / 10. u = CMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='WIU'), levattrs={ 'long_name': 'pressure_level', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_level=uv_lev, fcst_ele="WIU", units='m/s') if u is None: return v = CMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='WIV'), levattrs={ 'long_name': 'pressure_level', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_level=uv_lev, fcst_ele="WIV", units='m/s') if v is None: return psfc = CMISS_IO.cimiss_model_by_time('20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code( data_source=model, var_name='PRS'), fcst_level=0, fcst_ele="PRS", units='Pa') psfc['data'] = psfc['data'] / 100. except KeyError: raise ValueError('Can not find all data needed') # prepare data if (area != None): cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area) map_extent, delt_x, delt_y = utl.get_map_extent(cntr_pnt, zoom_ratio, map_ratio) gh = utl.mask_terrian(gh_lev, psfc, gh) u = utl.mask_terrian(uv_lev, psfc, u) v = utl.mask_terrian(uv_lev, psfc, v) #+ to solve the problem of labels on all the contours gh = utl.cut_xrdata(map_extent, gh, delt_x=delt_x, delt_y=delt_y) u = utl.cut_xrdata(map_extent, u, delt_x=delt_x, delt_y=delt_y) v = utl.cut_xrdata(map_extent, v, delt_x=delt_x, delt_y=delt_y) #- to solve the problem of labels on all the contours uv = xr.merge([u.rename({'data': 'u'}), v.rename({'data': 'v'})]) wsp = (u['data']**2 + v['data']**2)**0.5 gh.attrs['model'] = model synoptic_graphics.draw_gh_uv_wsp(wsp=wsp, gh=gh, uv=uv, map_extent=map_extent, regrid_shape=20, city=city, south_China_sea=south_China_sea, output_dir=output_dir, Global=Global)
def gh_uv_spfh(initTime=None, fhour=6, day_back=0,model='ECMWF', gh_lev=500,uv_lev=850,spfh_lev=850, map_ratio=14/9,zoom_ratio=20,cntr_pnt=[104,34], south_China_sea=True,area =None,city=False,output_dir=None,data_source='MICAPS', Global=False,**kwargs): if(area != None): south_China_sea=False if(data_source=='MICAPS'): # micaps data directory try: data_dir = [utl.Cassandra_dir(data_type='high',data_source=model,var_name='HGT',lvl=gh_lev), utl.Cassandra_dir(data_type='high',data_source=model,var_name='UGRD',lvl=uv_lev), utl.Cassandra_dir(data_type='high',data_source=model,var_name='VGRD',lvl=uv_lev), utl.Cassandra_dir(data_type='high',data_source=model,var_name='SPFH',lvl=spfh_lev), utl.Cassandra_dir(data_type='surface',data_source=model,var_name='PSFC')] except KeyError: raise ValueError('Can not find all directories needed') # get filename if(initTime != None): filename = utl.model_filename(initTime, fhour) else: filename=utl.filename_day_back_model(day_back=day_back,fhour=fhour) # retrieve data from micaps server gh = MICAPS_IO.get_model_grid(data_dir[0], filename=filename) if gh is None: return u = MICAPS_IO.get_model_grid(data_dir[1], filename=filename) if u is None: return v = MICAPS_IO.get_model_grid(data_dir[2], filename=filename) if v is None: return spfh = MICAPS_IO.get_model_grid(data_dir[3], filename=filename) if spfh is None: return psfc = MICAPS_IO.get_model_grid(data_dir[4], filename=filename) if(data_source == 'CIMISS'): # get filename if(initTime != None): filename = utl.model_filename(initTime, fhour,UTC=True) else: filename=utl.filename_day_back_model(day_back=day_back,fhour=fhour,UTC=True) try: # retrieve data from CIMISS server gh=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model,var_name='GPH'), fcst_level=gh_lev, fcst_ele="GPH", units='gpm') if gh is None: return gh['data'].values=gh['data'].values/10. u=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model,var_name='WIU'), fcst_level=uv_lev, fcst_ele="WIU", units='m/s') if u is None: return v=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model,var_name='WIV'), fcst_level=uv_lev, fcst_ele="WIV", units='m/s') if v is None: return spfh=CMISS_IO.cimiss_model_by_time('20'+filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model,var_name='SHU'), fcst_level=spfh_lev, fcst_ele="SHU", units='kg.kg-1') if spfh is None: return spfh['data'].values=spfh['data'].values*1000 psfc=CMISS_IO.cimiss_model_by_time('20'+filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model,var_name='PRS'), fcst_level=0, fcst_ele="PRS", units='Pa') psfc['data']=psfc['data']/100. except KeyError: raise ValueError('Can not find all data needed') # prepare data if(area != None): cntr_pnt,zoom_ratio=utl.get_map_area(area_name=area) map_extent=[0,0,0,0] map_extent[0]=cntr_pnt[0]-zoom_ratio*1*map_ratio map_extent[1]=cntr_pnt[0]+zoom_ratio*1*map_ratio map_extent[2]=cntr_pnt[1]-zoom_ratio*1 map_extent[3]=cntr_pnt[1]+zoom_ratio*1 delt_x=(map_extent[1]-map_extent[0])*0.2 delt_y=(map_extent[3]-map_extent[2])*0.1 #+ to solve the problem of labels on all the contours mask1 = (gh['lon'] > map_extent[0]-delt_x) & (gh['lon'] < map_extent[1]+delt_x) & (gh['lat'] > map_extent[2]-delt_y) & (gh['lat'] < map_extent[3]+delt_y) mask2 = (u['lon'] > map_extent[0]-delt_x) & (u['lon'] < map_extent[1]+delt_x) & (u['lat'] > map_extent[2]-delt_y) & (u['lat'] < map_extent[3]+delt_y) mask3 = (spfh['lon'] > map_extent[0]-delt_x) & (spfh['lon'] < map_extent[1]+delt_x) & (spfh['lat'] > map_extent[2]-delt_y) & (spfh['lat'] < map_extent[3]+delt_y) gh=utl.cut_xrdata(map_extent,gh,delt_x=delt_x,delt_y=delt_y) u=utl.cut_xrdata(map_extent, u, delt_x=delt_x, delt_y=delt_y) v=utl.cut_xrdata(map_extent, v, delt_x=delt_x, delt_y=delt_y) spfh=utl.cut_xrdata(map_extent, spfh, delt_x=delt_x, delt_y=delt_y) gh=utl.mask_terrian(gh_lev,psfc,gh) u=utl.mask_terrian(uv_lev,psfc,u) v=utl.mask_terrian(uv_lev,psfc,v) spfh=utl.mask_terrian(spfh_lev,psfc,spfh) #- to solve the problem of labels on all the contours gh=gh.where(mask1,drop=True) gh.attrs['model']=model u=u.where(mask2,drop=True) v=v.where(mask2,drop=True) spfh=spfh.where(mask3,drop=True) uv=xr.merge([u.rename({'data': 'u'}),v.rename({'data': 'v'})]) moisture_graphics.draw_gh_uv_spfh( spfh=spfh, gh=gh, uv=uv, map_extent=map_extent, regrid_shape=20, city=city,south_China_sea=south_China_sea, output_dir=output_dir,Global=Global)
def gh_rain(initTime=None, fhour=24, day_back=0, model='ECMWF', gh_lev=500, atime=6, data_source='MICAPS', map_ratio=14 / 9, zoom_ratio=20, cntr_pnt=[104, 34], south_China_sea=True, area=None, city=False, output_dir=None, Global=False, **kwargs): # prepare data if (data_source == 'MICAPS'): try: data_dir = [ utl.Cassandra_dir(data_type='high', data_source=model, var_name='HGT', lvl=str(gh_lev)), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='RAIN' + '%02d' % atime), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='PSFC') ] except KeyError: raise ValueError('Can not find all directories needed') # get filename if (initTime != None): filename = utl.model_filename(initTime, fhour) if (atime > 3): filename_gh = utl.model_filename(initTime, int(fhour - atime / 2)) else: filename = utl.filename_day_back_model(day_back=day_back, fhour=fhour) if (atime > 3): filename_gh = utl.filename_day_back_model(day_back=day_back, fhour=int(fhour - atime / 2)) # retrieve data from micaps server gh = MICAPS_IO.get_model_grid(data_dir[0], filename=filename_gh) if gh is None: return rain = MICAPS_IO.get_model_grid(data_dir[1], filename=filename) if rain is None: return psfc = MICAPS_IO.get_model_grid(data_dir[2], filename=filename) if (data_source == 'CIMISS'): # get filename if (initTime != None): filename = utl.model_filename(initTime, fhour, UTC=True) if (atime > 3): filename_gh = utl.model_filename(initTime, fhour=int(fhour - atime / 2), UTC=True) else: filename = utl.filename_day_back_model(day_back=day_back, fhour=fhour, UTC=True) if (atime > 3): filename_gh = utl.filename_day_back_model(day_back=day_back, fhour=int(fhour - atime / 2), UTC=True) try: # retrieve data from CIMISS server gh = CMISS_IO.cimiss_model_by_time( '20' + filename_gh[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='GPH'), levattrs={ 'long_name': 'pressure_level', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_level=gh_lev, fcst_ele="GPH", units='gpm') if gh is None: return gh['data'].values = gh['data'].values / 10. TPE1 = CMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='TPE'), levattrs={ 'long_name': 'Height above Ground', 'units': 'm', '_CoordinateAxisType': '-' }, fcst_level=0, fcst_ele="TPE", units='kg*m^-2') if TPE1 is None: return TPE2 = CMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour - atime, data_code=utl.CMISS_data_code(data_source=model, var_name='TPE'), levattrs={ 'long_name': 'Height above Ground', 'units': 'm', '_CoordinateAxisType': '-' }, fcst_level=0, fcst_ele="TPE", units='kg*m^-2') if TPE2 is None: return psfc = CMISS_IO.cimiss_model_by_time('20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code( data_source=model, var_name='PRS'), fcst_level=0, fcst_ele="PRS", units='Pa') psfc['data'] = psfc['data'] / 100. except KeyError: raise ValueError('Can not find all data needed') rain = TPE1.copy(deep=True) rain['data'].values = TPE1['data'].values - TPE2['data'].values # set map extent if (area != None): south_China_sea = False if (area != None): cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area) map_extent = [0, 0, 0, 0] map_extent[0] = cntr_pnt[0] - zoom_ratio * 1 * map_ratio map_extent[1] = cntr_pnt[0] + zoom_ratio * 1 * map_ratio map_extent[2] = cntr_pnt[1] - zoom_ratio * 1 map_extent[3] = cntr_pnt[1] + zoom_ratio * 1 delt_x = (map_extent[1] - map_extent[0]) * 0.2 delt_y = (map_extent[3] - map_extent[2]) * 0.1 gh = utl.cut_xrdata(map_extent, gh, delt_x=delt_x, delt_y=delt_y) rain = utl.cut_xrdata(map_extent, rain, delt_x=delt_x, delt_y=delt_y) gh = utl.mask_terrian(gh_lev, psfc, gh) gh.attrs['model'] = model gh.attrs['lev'] = gh_lev rain.attrs['atime'] = atime # draw QPF_graphics.draw_gh_rain(rain=rain, gh=gh, map_extent=map_extent, regrid_shape=20, city=city, south_China_sea=south_China_sea, output_dir=output_dir, Global=Global)
def TMP850_extreme_uv(initTime=None, fhour=6, day_back=0,model='ECMWF', uv_lev=850,tmp_lev=850, map_ratio=13/9,zoom_ratio=20,cntr_pnt=[102,34], south_China_sea=True,area =None,city=False,output_dir=None,data_source='MICAPS', Global=False,**kwargs): #prepare data if(data_source =='MICAPS'): try: data_dir = [utl.Cassandra_dir(data_type='high',data_source=model,var_name='UGRD',lvl=uv_lev), utl.Cassandra_dir(data_type='high',data_source=model,var_name='VGRD',lvl=uv_lev), utl.Cassandra_dir(data_type='high',data_source=model,var_name='TMP',lvl=tmp_lev), utl.Cassandra_dir(data_type='surface',data_source=model,var_name='PSFC')] except KeyError: raise ValueError('Can not find all directories needed') # get filename if(initTime != None): filename = utl.model_filename(initTime, fhour) else: filename=utl.filename_day_back_model(day_back=day_back,fhour=fhour) # retrieve data from micaps server u = MICAPS_IO.get_model_grid(data_dir[0], filename=filename) if u is None: return v = MICAPS_IO.get_model_grid(data_dir[1], filename=filename) if v is None: return tmp = MICAPS_IO.get_model_grid(data_dir[2], filename=filename) if tmp is None: return psfc = MICAPS_IO.get_model_grid(data_dir[3], filename=filename) if(data_source=='CIMISS'): # get filename if(initTime != None): filename = utl.model_filename(initTime, fhour,UTC=True) else: filename=utl.filename_day_back_model(day_back=day_back,fhour=fhour,UTC=True) try: u=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model,var_name='WIU'), levattrs={'long_name':'pressure_level', 'units':'hPa', '_CoordinateAxisType':'-'}, fcst_level=uv_lev, fcst_ele="WIU", units='m/s') if u is None: return v=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model,var_name='WIV'), levattrs={'long_name':'pressure_level', 'units':'hPa', '_CoordinateAxisType':'-'}, fcst_level=uv_lev, fcst_ele="WIV", units='m/s') if v is None: return tmp=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model,var_name='TEM'), levattrs={'long_name':'pressure_level', 'units':'hPa', '_CoordinateAxisType':'-'}, fcst_level=tmp_lev, fcst_ele="TEM", units='K') if tmp is None: return tmp['data'].values=tmp['data'].values-273.15 psfc=CMISS_IO.cimiss_model_by_time('20'+filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model,var_name='PRS'), fcst_level=0, fcst_ele="PRS", units='Pa') psfc['data']=psfc['data']/100. except KeyError: raise ValueError('Can not find all data needed') # set map extent tmp_extr=utl.get_var_extr(tmp+273.15,Var_name='t850') if(area != None): south_China_sea=False if(area != None): cntr_pnt,zoom_ratio=utl.get_map_area(area_name=area) map_extent,delt_x,delt_y=utl.get_map_extent(cntr_pnt,zoom_ratio,map_ratio) tmp['data'].values=gaussian_filter(tmp['data'].values,5) u=utl.mask_terrian(uv_lev,psfc,u) v=utl.mask_terrian(uv_lev,psfc,v) tmp=utl.mask_terrian(tmp_lev,psfc,tmp) tmp_extr=utl.mask_terrian(tmp_lev,psfc,tmp_extr) #to solve the problem of labels on all the contours tmp=utl.cut_xrdata(map_extent,tmp,delt_x=delt_x,delt_y=delt_y) u=utl.cut_xrdata(map_extent,u,delt_x=delt_x,delt_y=delt_y) v=utl.cut_xrdata(map_extent,v,delt_x=delt_x,delt_y=delt_y) tmp_extr=utl.cut_xrdata(map_extent,tmp_extr,delt_x=delt_x,delt_y=delt_y) tmp.attrs['model']=model uv=xr.merge([u.rename({'data': 'u'}),v.rename({'data': 'v'})]) #draw thermal_graphics.draw_gh_uv_tmp_extr( tmp=tmp, tmp_extr=tmp_extr, uv=uv, map_extent=map_extent, regrid_shape=20, city=city,south_China_sea=south_China_sea, output_dir=output_dir,Global=Global)
def compare_gh_uv(anaTime=None, anamodel='GRAPES_GFS', fhour=24, model='ECMWF', data_source='MICAPS', gh_lev=500, uv_lev=850, area=None, map_ratio=14 / 9, zoom_ratio=20, cntr_pnt=[104, 34], **products_kwargs): if (area != None): south_China_sea = False # micaps data directory if (data_source == 'MICAPS'): try: data_dir = [ utl.Cassandra_dir(data_type='high', data_source=model, var_name='HGT', lvl=gh_lev), utl.Cassandra_dir(data_type='high', data_source=model, var_name='UGRD', lvl=uv_lev), utl.Cassandra_dir(data_type='high', data_source=model, var_name='VGRD', lvl=uv_lev), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='PSFC') ] except KeyError: raise ValueError('Can not find all directories needed') # get filename if (anaTime == None): anaTime = MICAPS_IO.get_latest_initTime(data_dir[-1]) initTime = (datetime.strptime('20' + anaTime, '%Y%m%d%H') - timedelta(hours=fhour)).strftime("%Y%m%d%H")[2:10] if (anaTime != None): filename_ana = utl.model_filename(anaTime, 0) initTime = (datetime.strptime('20' + anaTime, '%Y%m%d%H') - timedelta(hours=fhour)).strftime("%Y%m%d%H")[2:10] filename_fcst = utl.model_filename(initTime, fhour) # retrieve data from micaps server gh_ana = MICAPS_IO.get_model_grid(data_dir[0], filename=filename_ana) u_ana = MICAPS_IO.get_model_grid(data_dir[1], filename=filename_ana) v_ana = MICAPS_IO.get_model_grid(data_dir[2], filename=filename_ana) psfc_ana = MICAPS_IO.get_model_grid(data_dir[3], filename=filename_ana) gh_fcst = MICAPS_IO.get_model_grid(data_dir[0], filename=filename_fcst) u_fcst = MICAPS_IO.get_model_grid(data_dir[1], filename=filename_fcst) v_fcst = MICAPS_IO.get_model_grid(data_dir[2], filename=filename_fcst) psfc_fcst = MICAPS_IO.get_model_grid(data_dir[3], filename=filename_fcst) if (data_source == 'CIMISS'): # get filename if (anaTime != None): anaTime = utl.model_filename(anaTime, fhour, UTC=True)[0:8] else: anaTime = utl.filename_day_back_model(fhour=fhour, UTC=True)[0:8] initTime = (datetime.strptime('20' + anaTime, '%Y%m%d%H') - timedelta(hours=fhour)).strftime("%Y%m%d%H")[2:10] try: # retrieve data from CIMISS server gh_ana = CMISS_IO.cimiss_model_by_time( '20' + anaTime, valid_time=0, data_code=utl.CMISS_data_code(data_source=model, var_name='GPH'), levattrs={ 'long_name': 'pressure_level', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_level=gh_lev, fcst_ele="GPH", units='gpm') gh_ana['data'].values = gh_ana['data'].values / 10. gh_fcst = CMISS_IO.cimiss_model_by_time( '20' + initTime, valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='GPH'), levattrs={ 'long_name': 'pressure_level', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_level=gh_lev, fcst_ele="GPH", units='gpm') gh_fcst['data'].values = gh_fcst['data'].values / 10. u_ana = CMISS_IO.cimiss_model_by_time( '20' + anaTime, valid_time=0, data_code=utl.CMISS_data_code(data_source=model, var_name='WIU'), levattrs={ 'long_name': 'pressure_level', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_level=uv_lev, fcst_ele="WIU", units='m/s') u_fcst = CMISS_IO.cimiss_model_by_time( '20' + initTime, valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='WIU'), levattrs={ 'long_name': 'pressure_level', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_level=uv_lev, fcst_ele="WIU", units='m/s') v_ana = CMISS_IO.cimiss_model_by_time( '20' + anaTime, valid_time=0, data_code=utl.CMISS_data_code(data_source=model, var_name='WIV'), levattrs={ 'long_name': 'pressure_level', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_level=uv_lev, fcst_ele="WIV", units='m/s') v_fcst = CMISS_IO.cimiss_model_by_time( '20' + initTime, valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='WIV'), levattrs={ 'long_name': 'pressure_level', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_level=uv_lev, fcst_ele="WIV", units='m/s') psfc_ana = CMISS_IO.cimiss_model_by_time( '20' + anaTime, valid_time=0, data_code=utl.CMISS_data_code(data_source=model, var_name='PRS'), levattrs={ 'long_name': 'sea_surface_pressure', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_level=0, fcst_ele="PRS", units='Pa') psfc_fcst = CMISS_IO.cimiss_model_by_time( '20' + initTime, valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='PRS'), levattrs={ 'long_name': 'sea_surface_pressure', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_level=0, fcst_ele="PRS", units='Pa') psfc_ana['data'] = psfc_ana['data'] / 100. psfc_fcst['data'] = psfc_fcst['data'] / 100. except KeyError: raise ValueError('Can not find all data needed') # prepare data if (all([ gh_ana, u_ana, v_ana, psfc_ana, gh_fcst, u_fcst, v_fcst, psfc_fcst ]) is False): print('some data is not avaliable') return if (area != None): cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area) map_extent = [0, 0, 0, 0] map_extent[0] = cntr_pnt[0] - zoom_ratio * 1 * map_ratio map_extent[1] = cntr_pnt[0] + zoom_ratio * 1 * map_ratio map_extent[2] = cntr_pnt[1] - zoom_ratio * 1 map_extent[3] = cntr_pnt[1] + zoom_ratio * 1 gh_ana = utl.cut_xrdata(map_extent, gh_ana) u_ana = utl.cut_xrdata(map_extent, u_ana) v_ana = utl.cut_xrdata(map_extent, v_ana) psfc_ana = utl.cut_xrdata(map_extent, psfc_ana) gh_fcst = utl.cut_xrdata(map_extent, gh_fcst) u_fcst = utl.cut_xrdata(map_extent, u_fcst) v_fcst = utl.cut_xrdata(map_extent, v_fcst) psfc_fcst = utl.cut_xrdata(map_extent, psfc_fcst) u_ana = utl.mask_terrian(uv_lev, psfc_ana, u_ana) v_ana = utl.mask_terrian(uv_lev, psfc_ana, v_ana) gh_ana = utl.mask_terrian(gh_lev, psfc_ana, gh_ana) u_fcst = utl.mask_terrian(uv_lev, psfc_fcst, u_fcst) v_fcst = utl.mask_terrian(uv_lev, psfc_fcst, v_fcst) gh_fcst = utl.mask_terrian(gh_lev, psfc_fcst, gh_fcst) uv_ana = xr.merge( [u_ana.rename({'data': 'u'}), v_ana.rename({'data': 'v'})]) uv_fcst = xr.merge( [u_fcst.rename({'data': 'u'}), v_fcst.rename({'data': 'v'})]) gh_ana.attrs = {'model_name': model} u_ana.attrs = {'model_name': model} v_ana.attrs = {'model_name': model} gh_fcst.attrs = {'model_name': model} u_fcst.attrs = {'model_name': model} v_fcst.attrs = {'model_name': model} vs_ana.draw_compare_gh_uv(gh_ana=gh_ana, uv_ana=uv_ana, gh_fcst=gh_fcst, uv_fcst=uv_fcst, map_extent=map_extent, **products_kwargs)
def gh_uv_tadv(initTime=None, fhour=6, day_back=0,model='ECMWF', gh_lev=500,uv_lev=850, map_ratio=14/9,zoom_ratio=20,cntr_pnt=[104,34], south_China_sea=True,area =None,city=False,output_dir=None,data_source='MICAPS', Global=False,**kwargs): #prepare data if(data_source =='MICAPS'): try: data_dir = [utl.Cassandra_dir(data_type='high',data_source=model,var_name='HGT',lvl=gh_lev), utl.Cassandra_dir(data_type='high',data_source=model,var_name='UGRD',lvl=uv_lev), utl.Cassandra_dir(data_type='high',data_source=model,var_name='VGRD',lvl=uv_lev), utl.Cassandra_dir(data_type='high',data_source=model,var_name='TMP',lvl=uv_lev), utl.Cassandra_dir(data_type='surface',data_source=model,var_name='PSFC')] except KeyError: raise ValueError('Can not find all directories needed') # get filename if(initTime != None): filename = utl.model_filename(initTime, fhour) else: filename=utl.filename_day_back_model(day_back=day_back,fhour=fhour) # retrieve data from micaps server gh = MICAPS_IO.get_model_grid(data_dir[0], filename=filename) if gh is None: return u = MICAPS_IO.get_model_grid(data_dir[1], filename=filename) if u is None: return v = MICAPS_IO.get_model_grid(data_dir[2], filename=filename) if v is None: return tmp = MICAPS_IO.get_model_grid(data_dir[3], filename=filename) if tmp is None: return psfc = MICAPS_IO.get_model_grid(data_dir[4], filename=filename) if(data_source=='CIMISS'): # get filename if(initTime != None): filename = utl.model_filename(initTime, fhour,UTC=True) else: filename=utl.filename_day_back_model(day_back=day_back,fhour=fhour,UTC=True) try: # retrieve data from CIMISS server gh=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model,var_name='GPH'), levattrs={'long_name':'pressure_level', 'units':'hPa', '_CoordinateAxisType':'-'}, fcst_level=gh_lev, fcst_ele="GPH", units='gpm') if gh is None: return gh['data'].values=gh['data'].values/10. u=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model,var_name='WIU'), levattrs={'long_name':'pressure_level', 'units':'hPa', '_CoordinateAxisType':'-'}, fcst_level=uv_lev, fcst_ele="WIU", units='m/s') if u is None: return v=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model,var_name='WIV'), levattrs={'long_name':'pressure_level', 'units':'hPa', '_CoordinateAxisType':'-'}, fcst_level=uv_lev, fcst_ele="WIV", units='m/s') if v is None: return tmp=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model,var_name='TEM'), levattrs={'long_name':'pressure_level', 'units':'hPa', '_CoordinateAxisType':'-'}, fcst_level=uv_lev, fcst_ele="TEM", units='K') if tmp is None: return tmp['data'].values=tmp['data'].values-273.15 psfc=CMISS_IO.cimiss_model_by_time('20'+filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model,var_name='PRS'), fcst_level=0, fcst_ele="PRS", units='Pa') psfc['data']=psfc['data']/100. except KeyError: raise ValueError('Can not find all data needed') # set map extent if(area != None): south_China_sea=False if(area != None): cntr_pnt,zoom_ratio=utl.get_map_area(area_name=area) map_extent,delt_x,delt_y=utl.get_map_extent(cntr_pnt=cntr_pnt,zoom_ratio=zoom_ratio,map_ratio=map_ratio) gh=utl.cut_xrdata(map_extent, gh, delt_x=delt_x, delt_y=delt_y) u=utl.cut_xrdata(map_extent, u, delt_x=delt_x, delt_y=delt_y) v=utl.cut_xrdata(map_extent, v, delt_x=delt_x, delt_y=delt_y) tmp=utl.cut_xrdata(map_extent, tmp, delt_x=delt_x, delt_y=delt_y) tadv_xr=tmp.copy(deep=True) tadv=-1*mbd.advection(tmp['data'].values.squeeze(),u['data'].values.squeeze(),v['data'].values.squeeze(),tmp['lat'].values,tmp['lon'].values) tadv_xr['data'].values=tadv[np.newaxis,np.newaxis,:,:] gh=utl.mask_terrian(gh_lev,psfc,gh) u=utl.mask_terrian(uv_lev,psfc,u) tadv_xr=utl.mask_terrian(uv_lev,psfc,tadv_xr) gh.attrs['model']=model uv=xr.merge([u.rename({'data': 'u'}),v.rename({'data': 'v'})]) #draw thermal_graphics.draw_gh_uv_tadv( tadv=tadv_xr, gh=gh, uv=uv, map_extent=map_extent, regrid_shape=20, city=city,south_China_sea=south_China_sea, output_dir=output_dir,Global=Global)
def tmp_evo(initTime=None, tmp_lev=850, t_gap=6, t_range=[6, 36], model='ECMWF', data_source='MICAPS', map_ratio=14 / 9, zoom_ratio=20, cntr_pnt=[104, 34], south_China_sea=True, area=None, **kwargs): fhours = np.arange(t_range[0], t_range[1], t_gap) #prepare data if (data_source == 'MICAPS'): try: data_dir = [ utl.Cassandra_dir(data_type='high', data_source=model, var_name='TMP', lvl=tmp_lev), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='PSFC') ] except KeyError: raise ValueError('Can not find all directories needed') # get filename if (initTime == None): initTime = MICAPS_IO.get_latest_initTime(data_dir[0]) filenames = [initTime + '.' + str(fhour).zfill(3) for fhour in fhours] # retrieve data from micaps server tmp = MICAPS_IO.get_model_grids(data_dir[0], filenames=filenames) psfc = MICAPS_IO.get_model_grids(data_dir[1], filenames=filenames) if (data_source == 'CIMISS'): # get filename if (initTime != None): filename = utl.model_filename(initTime, 0, UTC=True) else: filename = utl.filename_day_back_model(day_back=0, fhour=0, UTC=True) try: tmp = CMISS_IO.cimiss_model_by_times( '20' + filename[0:8], valid_times=fhours, data_code=utl.CMISS_data_code(data_source=model, var_name='TEM'), levattrs={ 'long_name': 'pressure_level', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_level=tmp_lev, fcst_ele="TEM", units='K') tmp['data'].values = tmp['data'].values - 273.15 psfc = CMISS_IO.cimiss_model_by_times( '20' + filename[0:8], valid_times=fhours, data_code=utl.CMISS_data_code(data_source=model, var_name='PRS'), fcst_level=0, fcst_ele="PRS", units='Pa') psfc['data'] = psfc['data'] / 100. except KeyError: raise ValueError('Can not find all data needed') # set map extent if (area != None): south_China_sea = False if (area != None): cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area) map_extent, delt_x, delt_y = utl.get_map_extent(cntr_pnt, zoom_ratio, map_ratio) tmp = utl.cut_xrdata(map_extent, tmp, delt_x=delt_x, delt_y=delt_y) tmp = tmp.rolling({'lon': 3, 'lat': 3}).mean() psfc = utl.cut_xrdata(map_extent, psfc, delt_x=delt_x, delt_y=delt_y) tmp = utl.mask_terrian(tmp_lev, psfc, tmp) tmp.attrs['model'] = model coldwave_graphics.draw_tmp_evo(tmp=tmp, map_extent=map_extent, south_China_sea=south_China_sea, **kwargs)
def gh_uv_VVEL(initTime=None, fhour=6, day_back=0, model='ECMWF', gh_lev=500, uvw_lev=850, map_ratio=19 / 9, zoom_ratio=20, cntr_pnt=[102, 34], south_China_sea=True, area='全国', city=False, output_dir=None, data_source='MICAPS', Global=False): if (area != '全国'): south_China_sea = False # micaps data directory if (data_source == 'MICAPS'): try: data_dir = [ utl.Cassandra_dir(data_type='high', data_source=model, var_name='HGT', lvl=gh_lev), utl.Cassandra_dir(data_type='high', data_source=model, var_name='UGRD', lvl=uvw_lev), utl.Cassandra_dir(data_type='high', data_source=model, var_name='VGRD', lvl=uvw_lev), utl.Cassandra_dir(data_type='high', data_source=model, var_name='VVEL', lvl=uvw_lev), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='PSFC') ] except KeyError: raise ValueError('Can not find all directories needed') # get filename if (initTime != None): filename = utl.model_filename(initTime, fhour) else: filename = utl.filename_day_back_model(day_back=day_back, fhour=fhour) # retrieve data from micaps server gh = MICAPS_IO.get_model_grid(data_dir[0], filename=filename) if gh is None: return u = MICAPS_IO.get_model_grid(data_dir[1], filename=filename) if u is None: return v = MICAPS_IO.get_model_grid(data_dir[2], filename=filename) if v is None: return w = MICAPS_IO.get_model_grid(data_dir[3], filename=filename) psfc = MICAPS_IO.get_model_grid(data_dir[4], filename=filename) if (model == 'GRAPES_GFS'): data_dir2 = utl.Cassandra_dir(data_type='high', data_source=model, var_name='SPFH', lvl=uvw_lev) data_dir3 = utl.Cassandra_dir(data_type='high', data_source=model, var_name='TMP', lvl=uvw_lev) SPFH = MICAPS_IO.get_model_grid(data_dir2, filename=filename) TMP = MICAPS_IO.get_model_grid(data_dir3, filename=filename) temp = mpcalc.vertical_velocity_pressure( (w['data'].values / 100) * units('m/s'), (np.zeros_like(w['data'].values) + uvw_lev) * units.hPa, TMP['data'].values * units.degC, mixing=SPFH['data'].values * units['g/kg']).magnitude * 100. w['data'].values = temp init_time = gh.coords['forecast_reference_time'].values if (data_source == 'CIMISS'): # get filename if (initTime != None): filename = utl.model_filename(initTime, fhour, UTC=True) else: filename = utl.filename_day_back_model(day_back=day_back, fhour=fhour, UTC=True) # retrieve data from CMISS server try: gh = CMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='GPH'), levattrs={ 'long_name': 'pressure_level', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_level=gh_lev, fcst_ele="GPH", units='gpm') if gh is None: return gh['data'].values = gh['data'].values / 10. u = CMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='WIU'), levattrs={ 'long_name': 'pressure_level', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_level=uvw_lev, fcst_ele="WIU", units='m/s') if u is None: return v = CMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='WIV'), levattrs={ 'long_name': 'pressure_level', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_level=uvw_lev, fcst_ele="WIV", units='m/s') if v is None: return w = CMISS_IO.cimiss_model_by_time( '20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model, var_name='VVP'), levattrs={ 'long_name': 'pressure_level', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_level=uvw_lev, fcst_ele="VVP", units='Pa.s-1') if w is None: return w['data'].values = w['data'].values * 100 psfc = CMISS_IO.cimiss_model_by_time('20' + filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code( data_source=model, var_name='PRS'), fcst_level=0, fcst_ele="PRS", units='Pa') psfc['data'] = psfc['data'] / 100. except KeyError: raise ValueError('Can not find all data needed') # prepare data if (area != None): cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area) map_extent = utl.get_map_extent(cntr_pnt, zoom_ratio, map_ratio) w['data'].values = gaussian_filter(w['data'].values, 5) #+ to solve the problem of labels on all the contours gh = utl.mask_terrian(gh_lev, psfc, gh) u = utl.mask_terrian(uvw_lev, psfc, u) v = utl.mask_terrian(uvw_lev, psfc, v) w = utl.mask_terrian(uvw_lev, psfc, w) delt_x = (map_extent[1] - map_extent[0]) * 0.2 delt_y = (map_extent[3] - map_extent[2]) * 0.1 gh = utl.cut_xrdata(map_extent, gh, delt_x=delt_x, delt_y=delt_y) u = utl.cut_xrdata(map_extent, u, delt_x=delt_x, delt_y=delt_y) v = utl.cut_xrdata(map_extent, v, delt_x=delt_x, delt_y=delt_y) VVEL = utl.cut_xrdata(map_extent, w, delt_x=delt_x, delt_y=delt_y) gh.attrs['model'] = model VVEL.attrs['units'] = '0.01Pa.s-1' uv = xr.merge([u.rename({'data': 'u'}), v.rename({'data': 'v'})]) #- to solve the problem of labels on all the contours dynamic_graphics.draw_gh_uv_VVEL(VVEL=VVEL, gh=gh, uv=uv, map_extent=map_extent, regrid_shape=20, city=city, south_China_sea=south_China_sea, output_dir=output_dir, Global=Global)
def fg_uv_tmp(initTime=None, fhour=6, day_back=0,model='ECMWF', fg_lev=500, map_ratio=16/9,zoom_ratio=20,cntr_pnt=[102,34], south_China_sea=True,area = None,city=False,output_dir=None,data_source='MICAPS', **kwargs): if(area != None): south_China_sea=False # micaps data directory if(data_source=='MICAPS'): try: data_dir = [utl.Cassandra_dir(data_type='high',data_source=model,var_name='HGT',lvl=fg_lev), utl.Cassandra_dir(data_type='high',data_source=model,var_name='UGRD',lvl=fg_lev), utl.Cassandra_dir(data_type='high',data_source=model,var_name='VGRD',lvl=fg_lev), utl.Cassandra_dir(data_type='high',data_source=model,var_name='TMP',lvl=fg_lev), utl.Cassandra_dir(data_type='surface',data_source=model,var_name='PSFC')] except KeyError: raise ValueError('Can not find all directories needed') # get filename if(initTime != None): filename = utl.model_filename(initTime, fhour) else: filename=utl.filename_day_back_model(day_back=day_back,fhour=fhour) # retrieve data from micaps server gh = MICAPS_IO.get_model_grid(data_dir[0], filename=filename) if gh is None: return u = MICAPS_IO.get_model_grid(data_dir[1], filename=filename) if u is None: return v = MICAPS_IO.get_model_grid(data_dir[2], filename=filename) if v is None: return tmp = MICAPS_IO.get_model_grid(data_dir[3], filename=filename) psfc = MICAPS_IO.get_model_grid(data_dir[4], filename=filename) if(data_source =='CIMISS'): # get filename if(initTime != None): filename = utl.model_filename(initTime, fhour,UTC=True) else: filename=utl.filename_day_back_model(day_back=day_back,fhour=fhour,UTC=True) # retrieve data from CIMISS server try: gh=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model,var_name='GPH'), levattrs={'long_name':'pressure_level', 'units':'hPa', '_CoordinateAxisType':'-'}, fcst_level=fg_lev, fcst_ele="GPH", units='gpm') if gh is None: return gh['data'].values=gh['data'].values/10. u=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model,var_name='WIU'), levattrs={'long_name':'pressure_level', 'units':'hPa', '_CoordinateAxisType':'-'}, fcst_level=fg_lev, fcst_ele="WIU", units='m/s') if u is None: return v=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model,var_name='WIV'), levattrs={'long_name':'pressure_level', 'units':'hPa', '_CoordinateAxisType':'-'}, fcst_level=fg_lev, fcst_ele="WIV", units='m/s') if v is None: return tmp=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model,var_name='TEM'), levattrs={'long_name':'pressure_level', 'units':'hPa', '_CoordinateAxisType':'-'}, fcst_level=fg_lev, fcst_ele="TEM", units='K') if tmp is None: return tmp['data'].values=tmp['data'].values-273.15 psfc=CMISS_IO.cimiss_model_by_time('20'+filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model,var_name='PRS'), fcst_level=0, fcst_ele="PRS", units='Pa') psfc['data']=psfc['data']/100. except KeyError: raise ValueError('Can not find all data needed') #caluculate_fg pressure=fg_lev*units('hPa') theta = mpcalc.potential_temperature(pressure, tmp['data'].values.squeeze()*units('degC')) dx,dy=mpcalc.lat_lon_grid_deltas(tmp['lon'].values.squeeze(),tmp['lat'].values.squeeze()) fg=mpcalc.frontogenesis(theta,u['data'].values.squeeze()*units('mps'),v['data'].values.squeeze()*units('mps'),dx,dy,dim_order='yx') if(area != None): cntr_pnt,zoom_ratio=utl.get_map_area(area_name=area) map_extent,delt_x,delt_y=utl.get_map_extent(cntr_pnt, zoom_ratio, map_ratio) #+ to solve the problem of labels on all the contours fg_xr=u.copy() fg_xr['data'].values=fg.magnitude[np.newaxis,np.newaxis,:,:] fg_xr=utl.cut_xrdata(map_extent, fg_xr, delt_x=delt_x, delt_y=delt_y) u=utl.cut_xrdata(map_extent, u, delt_x=delt_x, delt_y=delt_y) v=utl.cut_xrdata(map_extent, v, delt_x=delt_x, delt_y=delt_y) tmp=utl.cut_xrdata(map_extent, tmp, delt_x=delt_x, delt_y=delt_y) fg_xr=utl.mask_terrian(fg_lev,psfc,fg_xr) u=utl.mask_terrian(fg_lev,psfc,u) v=utl.mask_terrian(fg_lev,psfc,v) tmp=utl.mask_terrian(fg_lev,psfc,tmp) fg_xr.attrs['model']=model fg_xr.attrs['units']='K*s${^{-1}}$ m${^{-1}}$' uv=xr.merge([u.rename({'data': 'u'}),v.rename({'data': 'v'})]) #- to solve the problem of labels on all the contours dynamic_graphics.draw_fg_uv_tmp( fg=fg_xr, tmp=tmp, uv=uv, map_extent=map_extent, regrid_shape=20, city=city,south_China_sea=south_China_sea, output_dir=output_dir)
def gh_uv_div(initTime=None, fhour=6, day_back=0,model='GRAPES_GFS', gh_lev=500,uv_lev=850, map_ratio=14/9,zoom_ratio=20,cntr_pnt=[104,34], south_China_sea=True,area =None,city=False,output_dir=None,data_source='MICAPS',**kwargs): if(area != None): south_China_sea=False # micaps data directory if(data_source=='MICAPS'): try: data_dir = [utl.Cassandra_dir(data_type='high',data_source=model,var_name='HGT',lvl=gh_lev), utl.Cassandra_dir(data_type='high',data_source=model,var_name='UGRD',lvl=uv_lev), utl.Cassandra_dir(data_type='high',data_source=model,var_name='VGRD',lvl=uv_lev), utl.Cassandra_dir(data_type='surface',data_source=model,var_name='PSFC')] except KeyError: raise ValueError('Can not find all directories needed') # get filename if(initTime != None): filename = utl.model_filename(initTime, fhour) else: filename=utl.filename_day_back_model(day_back=day_back,fhour=fhour) # retrieve data from micaps server gh = MICAPS_IO.get_model_grid(data_dir[0], filename=filename) if gh is None: return u = MICAPS_IO.get_model_grid(data_dir[1], filename=filename) if u is None: return v = MICAPS_IO.get_model_grid(data_dir[2], filename=filename) if v is None: return psfc = MICAPS_IO.get_model_grid(data_dir[3], filename=filename) init_time = gh.coords['forecast_reference_time'].values if(data_source =='CIMISS'): # get filename if(initTime != None): filename = utl.model_filename(initTime, fhour,UTC=True) else: filename=utl.filename_day_back_model(day_back=day_back,fhour=fhour,UTC=True) # retrieve data from CIMISS server try: gh=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model,var_name='GPH'), levattrs={'long_name':'pressure_level', 'units':'hPa', '_CoordinateAxisType':'-'}, fcst_level=gh_lev, fcst_ele="GPH", units='gpm') if gh is None: return gh['data'].values=gh['data'].values/10. u=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model,var_name='WIU'), levattrs={'long_name':'pressure_level', 'units':'hPa', '_CoordinateAxisType':'-'}, fcst_level=uv_lev, fcst_ele="WIU", units='m/s') if u is None: return v=CMISS_IO.cimiss_model_by_time('20'+filename[0:8],valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model,var_name='WIV'), levattrs={'long_name':'pressure_level', 'units':'hPa', '_CoordinateAxisType':'-'}, fcst_level=uv_lev, fcst_ele="WIV", units='m/s') if v is None: return psfc=CMISS_IO.cimiss_model_by_time('20'+filename[0:8], valid_time=fhour, data_code=utl.CMISS_data_code(data_source=model,var_name='PRS'), fcst_level=0, fcst_ele="PRS", units='Pa') psfc['data']=psfc['data']/100. except KeyError: raise ValueError('Can not find all data needed') # prepare data if(area != None): cntr_pnt,zoom_ratio=utl.get_map_area(area_name=area) map_extent,delt_x,delt_y=utl.get_map_extent(cntr_pnt, zoom_ratio, map_ratio) #+ to solve the problem of labels on all the contours dx,dy=mpcalc.lat_lon_grid_deltas(u['lon'].values.squeeze(),u['lat'].values.squeeze()) div=mpcalc.divergence(u['data'].values.squeeze()*units('m/s'), v['data'].values.squeeze()*units('m/s'), dx, dy, dim_order='yx') div_xr=u.copy(deep=True) div_xr['data'].values=div.magnitude[np.newaxis,np.newaxis,:,:] div_xr['data'].values=gaussian_filter(div_xr['data'].values,1) gh=utl.mask_terrian(gh_lev,psfc,gh) u=utl.mask_terrian(uv_lev,psfc,u) v=utl.mask_terrian(uv_lev,psfc,v) div_xr=utl.mask_terrian(uv_lev,psfc,div_xr) gh=utl.cut_xrdata(map_extent, gh, delt_x=delt_x, delt_y=delt_y) u=utl.cut_xrdata(map_extent, u, delt_x=delt_x, delt_y=delt_y) v=utl.cut_xrdata(map_extent, v, delt_x=delt_x, delt_y=delt_y) div_xr=utl.cut_xrdata(map_extent, div_xr, delt_x=delt_x, delt_y=delt_y) gh.attrs['model']=model div_xr.attrs['units']='s$^{-1}$' uv=xr.merge([u.rename({'data': 'u'}),v.rename({'data': 'v'})]) #- to solve the problem of labels on all the contours dynamic_graphics.draw_gh_uv_div( div=div_xr, gh=gh, uv=uv, map_extent=map_extent, regrid_shape=20, city=city,south_China_sea=south_China_sea, output_dir=output_dir)