Esempio n. 1
0
def Time_Crossection_rh_uv_Temp(
        initTime=None,
        model='ECMWF',
        points={
            'lon': [116.3833],
            'lat': [39.9]
        },
        levels=[1000, 950, 925, 900, 850, 800, 700, 600, 500, 400, 300, 200],
        t_gap=3,
        t_range=[0, 48],
        output_dir=None):

    fhours = np.arange(t_range[0], t_range[1], t_gap)

    # 读数据

    try:
        data_dir = [
            utl.Cassandra_dir(data_type='high',
                              data_source=model,
                              var_name='TMP',
                              lvl=''),
            utl.Cassandra_dir(data_type='high',
                              data_source=model,
                              var_name='UGRD',
                              lvl=''),
            utl.Cassandra_dir(data_type='high',
                              data_source=model,
                              var_name='VGRD',
                              lvl=''),
            utl.Cassandra_dir(data_type='high',
                              data_source=model,
                              var_name='RH',
                              lvl=''),
            utl.Cassandra_dir(data_type='surface',
                              data_source=model,
                              var_name='PSFC')
        ]
    except KeyError:
        raise ValueError('Can not find all directories needed')

    if (initTime == None):
        initTime = get_latest_initTime(data_dir[0][0:-1] + "850")
    filenames = [initTime + '.' + str(fhour).zfill(3) for fhour in fhours]
    TMP_4D = get_model_3D_grids(directory=data_dir[0][0:-1],
                                filenames=filenames,
                                levels=levels,
                                allExists=False)
    TMP_2D = TMP_4D.interp(lon=('points', points['lon']),
                           lat=('points', points['lat']))

    u_4D = get_model_3D_grids(directory=data_dir[1][0:-1],
                              filenames=filenames,
                              levels=levels,
                              allExists=False)
    u_2D = u_4D.interp(lon=('points', points['lon']),
                       lat=('points', points['lat']))

    v_4D = get_model_3D_grids(directory=data_dir[2][0:-1],
                              filenames=filenames,
                              levels=levels,
                              allExists=False)
    v_2D = v_4D.interp(lon=('points', points['lon']),
                       lat=('points', points['lat']))

    rh_4D = get_model_3D_grids(directory=data_dir[3][0:-1],
                               filenames=filenames,
                               levels=levels,
                               allExists=False)
    rh_2D = rh_4D.interp(lon=('points', points['lon']),
                         lat=('points', points['lat']))
    rh_2D.attrs['model'] = model
    rh_2D.attrs['points'] = points

    Psfc_3D = get_model_grids(directory=data_dir[4][0:-1],
                              filenames=filenames,
                              allExists=False)
    Psfc_1D = Psfc_3D.interp(lon=('points', points['lon']),
                             lat=('points', points['lat']))
    v_2D2, pressure_2D = xr.broadcast(v_2D['data'], v_2D['level'])
    v_2D2, Psfc_2D = xr.broadcast(v_2D['data'], Psfc_1D['data'])
    terrain_2D = pressure_2D - Psfc_2D

    crossection_graphics.draw_Time_Crossection_rh_uv_Temp(
        rh_2D=rh_2D,
        u_2D=u_2D,
        v_2D=v_2D,
        TMP_2D=TMP_2D,
        terrain_2D=terrain_2D,
        t_range=t_range,
        model=model,
        output_dir=output_dir)
Esempio n. 2
0
def dT2m_mean24(initTime=None,
                fhour=48,
                day_back=0,
                map_ratio=19 / 9,
                zoom_ratio=20,
                cntr_pnt=[102, 34],
                south_China_sea=True,
                area='全国',
                city=False,
                output_dir=None,
                Global=False):

    data_dir = [
        utl.Cassandra_dir(data_type='surface',
                          data_source='ECMWF',
                          var_name='T2m')
    ]
    fhours1 = np.arange(fhour - 21, fhour + 1, 3)
    if (initTime is None):
        initTime = utl.filename_day_back_model(day_back=day_back,
                                               fhour=fhour)[0:8]
    filenames1 = [initTime + '.' + str(fhour).zfill(3) for fhour in fhours1]

    if (fhour >= 48):
        fhours2 = np.arange(fhour - 21 - 24, fhour + 1 - 24, 3)
        filenames2 = [
            initTime + '.' + str(fhour).zfill(3) for fhour in fhours2
        ]
    if (fhour >= 36 and fhour < 48):
        fhours2 = np.arange(fhour - 21 + 12 - 24, fhour + 1 + 12 - 24, 3)
        initTime2 = (datetime.strptime('20' + initTime, '%Y%m%d%H') -
                     timedelta(hours=12)).strftime('%Y%m%d%H')[2:10]
        filenames2 = [
            initTime2 + '.' + str(fhour).zfill(3) for fhour in fhours2
        ]
    if (fhour >= 24 and fhour < 36):
        fhours2 = np.arange(fhour - 21 + 24 - 24, fhour + 1 + 24 - 24, 3)
        initTime2 = (datetime.strptime('20' + initTime, '%Y%m%d%H') -
                     timedelta(hours=24)).strftime('%Y%m%d%H')[2:10]
        filenames2 = [
            initTime2 + '.' + str(fhour).zfill(3) for fhour in fhours2
        ]
    if (fhour < 24):
        print('fhour should > 24')
        return

# prepare data
    T_2m1 = MICAPS_IO.get_model_grids(data_dir[0], filenames=filenames1)
    Tmn_2m1 = T_2m1.isel(time=[-1]).copy()
    Tmn_2m1['data'].values[0, :, :] = np.mean(T_2m1['data'].values, axis=0)

    T_2m2 = MICAPS_IO.get_model_grids(data_dir[0], filenames=filenames2)
    Tmn_2m2 = T_2m2.isel(time=[-1]).copy()
    Tmn_2m2['data'].values[0, :, :] = np.mean(T_2m2['data'].values, axis=0)

    dTmn_2m = Tmn_2m1.copy()
    dTmn_2m['data'].values = Tmn_2m1['data'].values - Tmn_2m2['data'].values
    # set map extent
    if (area != '全国'):
        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

    #+ to solve the problem of labels on all the contours
    mask1 = (dTmn_2m['lon'] > map_extent[0] - delt_x) & (
        dTmn_2m['lon'] < map_extent[1] + delt_x) & (
            dTmn_2m['lat'] > map_extent[2] - delt_y) & (dTmn_2m['lat'] <
                                                        map_extent[3] + delt_y)
    dTmn_2m = dTmn_2m.where(mask1, drop=True)

    #- to solve the problem of labels on all the contours

    dTmn_2m.attrs['model'] = 'ECMWF'
    dTmn_2m.attrs['title'] = '2米最低温度24小时变温'

    elements_graphics.draw_dT_2m(dT_2m=dTmn_2m,
                                 T_type='dT2m_meann',
                                 map_extent=map_extent,
                                 regrid_shape=20,
                                 city=city,
                                 south_China_sea=south_China_sea,
                                 output_dir=output_dir,
                                 Global=Global)
Esempio n. 3
0
def cumulated_precip(initTime=None,
                     t_gap=6,
                     t_range=[6, 36],
                     day_back=0,
                     model='ECMWF',
                     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):
    fhours = np.arange(t_range[0], t_range[1] + 1, t_gap)
    # prepare data
    if (data_source == 'MICAPS'):
        try:
            data_dir = [
                utl.Cassandra_dir(data_type='surface',
                                  data_source=model,
                                  var_name='RAIN' + '%02d' % t_gap)
            ]
        except KeyError:
            raise ValueError('Can not find all directories needed')
        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
        rain = MICAPS_IO.get_model_grids(data_dir[0], filenames=filenames)
        rain2 = rain.sum('time')

    if (data_source == 'CIMISS'):
        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:
            TPE1 = CMISS_IO.cimiss_model_by_time('20' + filename[0:8],
                                                 valid_time=fhours[0],
                                                 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=fhours[-1],
                                                 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

        except KeyError:
            raise ValueError('Can not find all data needed')
        rain = TPE1.copy(deep=True)
        rain['data'].values = (TPE2['data'].values - TPE1['data'].values)
        rain2 = rain.sum('time')
# set map extent
    if (area != None):
        south_China_sea = False

    if (area != None):
        cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area)
    else:
        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
    rain = utl.cut_xrdata(map_extent=map_extent,
                          xr_input=rain,
                          delt_y=delt_y,
                          delt_x=delt_x)
    rain2.attrs['model'] = model
    rain2.attrs['t_gap'] = t_gap
    rain2.attrs['initTime'] = datetime.strptime(initTime, '%y%m%d%H')
    rain2.attrs['fhour1'] = fhours[0]
    rain2.attrs['fhour2'] = fhours[-1]
    # draw
    QPF_graphics.draw_cumulated_precip(rain=rain2,
                                       map_extent=map_extent,
                                       city=city,
                                       south_China_sea=south_China_sea,
                                       output_dir=output_dir,
                                       Global=Global)
Esempio n. 4
0
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)
Esempio n. 5
0
def get_model_points_gy(directory,
                        filenames,
                        points,
                        allExists=True,
                        fill_null=False,
                        Null_value=0):
    """
    Retrieve point time series from MICAPS cassandra service.
    
    Args:
        directory (string): the data directory on the service.
        filenames (list): the list of filenames.
        points (dict): dictionary, {'lon':[...], 'lat':[...]}.

    Examples:
    >>> directory = "NWFD_SCMOC/TMP/2M_ABOVE_GROUND"
    >>> fhours = np.arange(3, 75, 3)
    >>> filenames = ["19083008."+str(fhour).zfill(3) for fhour in fhours]
    >>> points = {'lon':[116.3833, 110.0], 'lat':[39.9, 32]}
    >>> data = get_model_points(dataDir, filenames, points)
    >>> allExists (boolean): all files should exist, or return None.
    """

    data = get_model_grids(directory, filenames, allExists=allExists)

    #if(fill_null is True):
    #    temp=np.array(data['data'].values)
    #    idx_null=np.where(temp == Null_value)
    #    #temp[idx_null]=np.nan
    #    temp2=gaussian_filter(temp,5)
    #    temp[idx_null]=temp2[idx_null]
    #    data['data'].values=temp

    if (fill_null is True):
        temp = np.array(data['data'].values)
        dims = np.shape(temp)
        grid_x = np.array(data['lon'].values)
        grid_y = np.array(data['lat'].values)
        x, y = np.meshgrid(data['lon'].values, data['lat'].values)
        idx_x = np.squeeze(
            np.where((grid_x > points['lon'][0] - 6)
                     & (grid_x < points['lon'][0] + 6)))
        idx_y = np.squeeze(
            np.where((grid_y > points['lat'][0] - 5)
                     & (grid_y < points['lat'][0] + 5)))
        x2, y2 = np.meshgrid(grid_x[idx_x[0]:idx_x[-1]],
                             grid_y[idx_y[0]:idx_y[-1]])
        nx2 = len(idx_x)
        ny2 = len(idx_y)
        x = x.reshape(dims[1] * dims[2])
        y = y.reshape(dims[1] * dims[2])
        nt = dims[0]
        for it in range(0, nt):
            temp2 = np.squeeze(temp[it, :, :])
            temp2 = temp2.reshape(dims[1] * dims[2])
            idx_ok = np.squeeze(
                np.where((temp2 != Null_value) & (x < points['lon'][0] + 6)
                         & (x > points['lon'][0] - 6)
                         & (y < points['lat'][0] + 5)
                         & (y > points['lat'][0] - 5)))

            n_ok = len(idx_ok)
            data_new = griddata(
                np.squeeze(np.dstack(([y[idx_ok], x[idx_ok]]))), temp2[idx_ok],
                (y2, x2))
            temp[it, idx_y[0]:idx_y[-1],
                 idx_x[0]:idx_x[-1]] = data_new.reshape(1, ny2 - 1, nx2 - 1)

        data['data'].values = temp

    if data:
        return data.interp(lon=('points', points['lon']),
                           lat=('points', points['lat']))
    else:
        return None
Esempio n. 6
0
def cumulated_precip_evo(initTime=None,
                         t_gap=6,
                         t_range=[6, 36],
                         day_back=0,
                         model='ECMWF',
                         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):
    fhours = np.arange(t_range[0], t_range[1] + 1, t_gap)
    # prepare data
    if (data_source == 'MICAPS'):
        try:
            data_dir = [
                utl.Cassandra_dir(data_type='surface',
                                  data_source=model,
                                  var_name='RAIN' + '%02d' % t_gap)
            ]
        except KeyError:
            raise ValueError('Can not find all directories needed')
        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
        rain = MICAPS_IO.get_model_grids(data_dir[0], filenames=filenames)
        rain2 = rain.copy(deep=True)
        for itime in range(1, len(rain['forecast_period'].values)):
            rain2['data'].values[itime, :, :] = np.sum(
                rain['data'].values[0:itime + 1, :, :], axis=0)

    if (data_source == 'CIMISS'):
        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:
            TPE1 = CMISS_IO.cimiss_model_by_times(
                '20' + filename[0:8],
                valid_times=fhours,
                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')
        except KeyError:
            raise ValueError('Can not find all data needed')
        rain = TPE1.copy(deep=True)
        rain['data'].values = (TPE1['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)
    else:
        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
    mask1 = (rain['lon'] > map_extent[0] - delt_x) & (
        rain['lon'] < map_extent[1] + delt_x) & (
            rain['lat'] > map_extent[2] - delt_y) & (rain['lat'] <
                                                     map_extent[3] + delt_y)
    rain2 = rain2.where(mask1, drop=True)
    rain2.attrs['model'] = model
    rain2.attrs['t_gap'] = t_gap
    # draw
    QPF_graphics.draw_cumulated_precip_evo(rain=rain2,
                                           map_extent=map_extent,
                                           regrid_shape=20,
                                           city=city,
                                           south_China_sea=south_China_sea,
                                           output_dir=output_dir,
                                           Global=Global)
Esempio n. 7
0
def cu_rain(initTime=None,
            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,
            **kwargs):

    # prepare data
    if (data_source == 'MICAPS'):
        try:
            data_dir = [
                utl.Cassandra_dir(data_type='surface',
                                  data_source='CLDAS',
                                  var_name='RAIN01')
            ]
        except KeyError:
            raise ValueError('Can not find all directories needed')

        # get filename
        if (initTime == None):
            initTime = (datetime.now() -
                        timedelta(hours=2)).strftime('%y%m%d%H')
        filenames = []
        for ihour in range(0, atime):
            filenames.append((datetime.strptime(initTime, '%y%m%d%H') -
                              timedelta(hours=ihour)).strftime('%y%m%d%H') +
                             '.000')

        # retrieve data from micaps server
        rain = MICAPS_IO.get_model_grids(data_dir[0], filenames=filenames)
        if rain is None:
            return

    if (data_source == 'CIMISS'):
        # get filename
        if (initTime == None):
            initTime = (datetime.now() -
                        timedelta(hours=2 + 8)).strftime('%y%m%d%H')
        filenames = []
        for ihour in range(0, atime):
            filenames.append((datetime.strptime(initTime, '%y%m%d%H') -
                              timedelta(hours=ihour)).strftime('%Y%m%d%H') +
                             '0000')
        try:
            # retrieve data from CIMISS server
            rain = CIMISS_IO.cimiss_analysis_by_times(
                times_str=filenames,
                fcst_ele='PRE',
                data_code=utl.CMISS_data_code(data_source='CLDAS',
                                              var_name='PRE'),
            )
            if rain is None:
                return
            rain = rain.rename({'PRE': 'data'})
        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)
    rain = utl.cut_xrdata(map_extent, rain, delt_x=delt_x, delt_y=delt_y)
    rain['data'].values[rain['data'].values == 9999.] = np.nan
    cu_rain = rain.sum('time')
    cu_rain.attrs['obs_time'] = datetime.strptime(initTime, '%y%m%d%H')
    cu_rain.attrs['model'] = 'CLDAS'
    cu_rain.attrs['atime'] = atime
    cu_rain.attrs['var_name'] = '累积降水'
    # draw
    QPF_graphics.draw_obs_cu_rain(rain=cu_rain,
                                  map_extent=map_extent,
                                  regrid_shape=20,
                                  city=city,
                                  south_China_sea=south_China_sea,
                                  output_dir=output_dir)
Esempio n. 8
0
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)
Esempio n. 9
0
def cumulative_precip_and_rain_days(endtime=None,
                                    cu_ndays=5,
                                    rn_ndays=7,
                                    map_ratio=19 / 11,
                                    zoom_ratio=20,
                                    cntr_pnt=[102, 34],
                                    south_China_sea=True,
                                    area=None,
                                    city=False,
                                    output_dir=None,
                                    Global=False,
                                    **kwargs):

    # prepare data
    data_dir = [
        utl.Cassandra_dir(data_type='surface',
                          data_source='CLDAS',
                          var_name='RAIN24')
    ]

    # get filename
    cu_days = np.arange(0, cu_ndays)
    filenames_cu = [
        (datetime.strptime('20' + endtime, '%Y%m%d%H') -
         timedelta(days=int(icu_days))).strftime('%Y%m%d%H')[2:] + '.000'
        for icu_days in cu_days
    ]

    rn_days = np.arange(0, rn_ndays)
    filenames_days = [
        (datetime.strptime('20' + endtime, '%Y%m%d%H') -
         timedelta(days=int(irn_days))).strftime('%Y%m%d%H')[2:] + '.000'
        for irn_days in rn_days
    ]

    # retrieve data from micaps server
    cu_rain_all = MICAPS_IO.get_model_grids(data_dir[0],
                                            filenames=filenames_cu)

    cu_days_rain = MICAPS_IO.get_model_grids(data_dir[0],
                                             filenames=filenames_days)

    coords = MICAPS_IO.get_model_grid(data_dir[0], filename=filenames_days[0])

    # set map extent
    if (area != None):
        if (area != None):
            south_China_sea = False
        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

    mask1 = (cu_rain_all['lon'] > map_extent[0] - delt_x) & (
        cu_rain_all['lon'] < map_extent[1] + delt_x) & (
            cu_rain_all['lat'] > map_extent[2] - delt_y) & (
                cu_rain_all['lat'] < map_extent[3] + delt_y)
    mask2 = (cu_days_rain['lon'] > map_extent[0] - delt_x) & (
        cu_days_rain['lon'] < map_extent[1] + delt_x) & (
            cu_days_rain['lat'] > map_extent[2] - delt_y) & (
                cu_days_rain['lat'] < map_extent[3] + delt_y)

    coords = coords.where(mask1, drop=True)
    cu_rain_all = cu_rain_all.where(mask1, drop=True)
    mask11 = (cu_rain_all['data'] == 9999.)
    cu_rain_all['data'].values[mask11.values] = np.nan
    cu_days_rain = cu_days_rain.where(mask2, drop=True)
    mask22 = (cu_days_rain['data'] == 9999.)
    cu_days_rain['data'].values[mask22.values] = 0

    cu_rain = xr.DataArray([np.sum(cu_rain_all['data'].values, axis=0)],
                           coords=coords['data'].coords,
                           dims=coords['data'].dims)
    mask3 = (cu_days_rain['data'] > 0)
    cu_days_rain['data'].values[mask3.values] = 1
    days_rain = xr.DataArray([np.sum(cu_days_rain['data'].values, axis=0)],
                             coords=coords['data'].coords,
                             dims=coords['data'].dims)
    days_rain.attrs['rn_ndays'] = rn_ndays
    cu_rain.attrs['cu_ndays'] = cu_ndays
    # draw
    observation_graphics.draw_cumulative_precip_and_rain_days(
        cu_rain=cu_rain,
        days_rain=days_rain,
        map_extent=map_extent,
        regrid_shape=20,
        city=city,
        south_China_sea=south_China_sea,
        output_dir=output_dir,
        Global=Global)
Esempio n. 10
0
def cu_Tmn2(endtime,
            cu_ndays=1,
            map_ratio=14 / 9,
            zoom_ratio=20,
            cntr_pnt=[104, 34],
            area=None,
            **kargws):

    # prepare data
    data_dir = [
        utl.Cassandra_dir(data_type='surface',
                          data_source='CLDAS',
                          var_name='Tmn_2m')
    ]

    # get filename
    cu_days = np.arange(0, cu_ndays)
    filenames_cu = [
        (datetime.strptime('20' + endtime, '%Y%m%d%H') -
         timedelta(days=int(icu_days))).strftime('%Y%m%d%H')[2:] + '.000'
        for icu_days in cu_days
    ]

    # retrieve data from micaps server
    Tmn2m_all = MICAPS_IO.get_model_grids(data_dir[0], filenames=filenames_cu)

    coords = MICAPS_IO.get_model_grid(data_dir[0], filename=filenames_cu[0])

    # set map extent
    if (area != None):
        if (area != None):
            south_China_sea = False
        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

    mask1 = ((Tmn2m_all['lon'] > map_extent[0] - delt_x) &
             (Tmn2m_all['lon'] < map_extent[1] + delt_x) &
             (Tmn2m_all['lat'] > map_extent[2] - delt_y) &
             (Tmn2m_all['lat'] < map_extent[3] + delt_y))

    coords = coords.where(mask1, drop=True)
    Tmn2m_all = Tmn2m_all.where(mask1, drop=True)
    mask11 = (Tmn2m_all['data'] == 9999.)
    Tmn2m_all['data'].values[mask11.values] = np.nan

    Tmn2 = xr.DataArray(np.max(Tmn2m_all['data'].values, axis=0),
                        name='data',
                        coords={
                            'time': ('time', [Tmn2m_all['time'].values[0]]),
                            'lat': ('lat', Tmn2m_all['lat'].values),
                            'lon': ('lon', Tmn2m_all['lon'].values)
                        },
                        dims=('time', 'lat', 'lon'),
                        attrs={
                            'model_name': 'CLDAS',
                            'var_name': '最低温度',
                            'vhours': cu_ndays * 24
                        })
    # draw

    draw_TMP2(TMP2=Tmn2, map_extent=map_extent, **kargws)
Esempio n. 11
0
def T2m_mean24(initTime=None,
               fhour=24,
               day_back=0,
               model='中央气象台中短期指导',
               map_ratio=19 / 9,
               zoom_ratio=20,
               cntr_pnt=[102, 34],
               data_source='MICAPS',
               south_China_sea=True,
               area='全国',
               city=False,
               output_dir=None,
               Global=False):

    # prepare data
    if (data_source == 'MICAPS'):
        data_dir = [
            utl.Cassandra_dir(data_type='surface',
                              data_source=model,
                              var_name='T2m')
        ]
        fhours = np.arange(fhour - 21, fhour + 1, 3)
        if (initTime is None):
            initTime = utl.filename_day_back_model(day_back=day_back,
                                                   fhour=fhour)[0:8]
        filenames = [initTime + '.' + str(fhour).zfill(3) for fhour in fhours]
        T_2m = MICAPS_IO.get_model_grids(data_dir[0], filenames=filenames)

        Tmean_2m = T_2m.isel(time=[-1]).copy()
        Tmean_2m['data'].values[0, :, :] = np.mean(T_2m['data'].values, axis=0)

    if (data_source == 'CIMISS'):
        # get filename
        fhours = np.arange(fhour - 18, fhour + 1, 3)
        if (initTime is None):
            initTime = utl.filename_day_back_model(day_back=day_back,
                                                   fhour=fhour,
                                                   UTC=True)[0:8]
        T_2m = CMISS_IO.cimiss_model_by_times('20' + initTime,
                                              valid_times=fhours,
                                              data_code=utl.CMISS_data_code(
                                                  data_source=model,
                                                  var_name='TEF2'),
                                              fcst_level=0,
                                              fcst_ele='TEF2',
                                              units='K',
                                              allExists=False)
        T_2m['data'].values = T_2m['data'].values - 273.15
        Tmean_2m = T_2m.isel(time=[-1]).copy()
        Tmean_2m['data'].values[0, :, :] = np.min(T_2m['data'].values, axis=0)


# set map extent
    if (area != '全国'):
        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

    #+ to solve the problem of labels on all the contours
    mask1 = (Tmean_2m['lon'] > map_extent[0] - delt_x) & (
        Tmean_2m['lon'] < map_extent[1] + delt_x) & (
            Tmean_2m['lat'] > map_extent[2] - delt_y) & (
                Tmean_2m['lat'] < map_extent[3] + delt_y)
    Tmean_2m = Tmean_2m.where(mask1, drop=True)

    #- to solve the problem of labels on all the contours

    Tmean_2m.attrs['model'] = model
    Tmean_2m.attrs['title'] = '2米平均温度'

    elements_graphics.draw_T_2m(T_2m=Tmean_2m,
                                T_type='T_mean',
                                map_extent=map_extent,
                                regrid_shape=20,
                                city=city,
                                south_China_sea=south_China_sea,
                                output_dir=output_dir,
                                Global=Global)
Esempio n. 12
0
def T2m_mx24(initTime=None,
             fhour=24,
             day_back=0,
             model='中央气象台中短期指导',
             map_ratio=19 / 9,
             zoom_ratio=20,
             cntr_pnt=[102, 34],
             data_source='MICAPS',
             area=None,
             **kargws):

    # prepare data
    if (data_source == 'MICAPS'):
        try:
            data_dir = [
                utl.Cassandra_dir(data_type='surface',
                                  data_source=model,
                                  var_name='Tmx_2m')
            ]

            if (initTime != None):
                filename = utl.model_filename(initTime, fhour)
            else:
                filename = utl.filename_day_back_model(day_back=day_back,
                                                       fhour=fhour)

            Tmx_2m = MICAPS_IO.get_model_grid(data_dir[0], filename=filename)

        except:
            try:
                data_dir = [
                    utl.Cassandra_dir(data_type='surface',
                                      data_source=model,
                                      var_name='Tmx3_2m')
                ]
            except:
                data_dir = [
                    utl.Cassandra_dir(data_type='surface',
                                      data_source=model,
                                      var_name='T2m')
                ]
            fhours = np.arange(fhour - 21, fhour + 1, 3)
            if (initTime is None):
                initTime = utl.filename_day_back_model(day_back=day_back,
                                                       fhour=fhour)[0:8]
            filenames = [
                initTime + '.' + str(fhour).zfill(3) for fhour in fhours
            ]
            T_2m = MICAPS_IO.get_model_grids(data_dir[0], filenames=filenames)

            Tmx_2m = T_2m.isel(time=[-1]).copy()
            Tmx_2m['data'].values[0, :, :] = np.max(T_2m['data'].values,
                                                    axis=0)

    if (data_source == 'CIMISS'):
        # get filename
        fhours = np.arange(fhour - 18, fhour + 1, 3)
        if (initTime is None):
            initTime = utl.filename_day_back_model(day_back=day_back,
                                                   fhour=fhour,
                                                   UTC=True)[0:8]
        try:
            # retrieve data from CMISS server
            T_2m = CMISS_IO.cimiss_model_by_times(
                '20' + initTime,
                valid_times=fhours,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='MX2T6'),
                fcst_level=0,
                fcst_ele='MX2T6',
                units='K',
                allExists=False)
        except:
            T_2m = CMISS_IO.cimiss_model_by_times(
                '20' + initTime,
                valid_times=fhours,
                data_code=utl.CMISS_data_code(data_source=model,
                                              var_name='TEF2'),
                fcst_level=0,
                fcst_ele='TEF2',
                units='K',
                allExists=False)
            if T_2m is None:
                return
        T_2m['data'].values = T_2m['data'].values - 273.15
        Tmx_2m = T_2m.isel(time=[-1]).copy()
        Tmx_2m['data'].values[0, :, :] = np.max(T_2m['data'].values, axis=0)


# set map extent
    if (area != '全国'):
        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

    #+ to solve the problem of labels on all the contours
    mask1 = (Tmx_2m['lon'] > map_extent[0] - delt_x) & (
        Tmx_2m['lon'] < map_extent[1] + delt_x) & (
            Tmx_2m['lat'] > map_extent[2] - delt_y) & (Tmx_2m['lat'] <
                                                       map_extent[3] + delt_y)
    Tmx_2m = Tmx_2m.where(mask1, drop=True)

    #- to solve the problem of labels on all the contours
    Tmx2 = xr.DataArray(np.squeeze(Tmx_2m['data'].values, axis=0),
                        name='data',
                        coords={
                            'time': ('time', [Tmx_2m['time'].values[0]]),
                            'fhour': ('time', [fhour]),
                            'lat': ('lat', Tmx_2m['lat'].values),
                            'lon': ('lon', Tmx_2m['lon'].values)
                        },
                        dims=('time', 'lat', 'lon'),
                        attrs={
                            'model_name': '中央气象台中短期指导',
                            'var_name': '2米最高温度',
                            'vhours': 24
                        })

    draw_SCMOC.draw_TMP2(TMP2=Tmx2, map_extent=map_extent, **kargws)
Esempio n. 13
0
def Time_Crossection_rh_uv_Temp(initTime=None,model='ECMWF',points={'lon':[116.3833], 'lat':[39.9]},
    levels=[1000, 950, 925, 900, 850, 800, 700,600,500,400,300,200],data_source='MICAPS',
    t_gap=3,t_range=[0,48],lw_ratio=[16,9],output_dir=None,**kwargs):
  
    fhours = np.arange(t_range[0], t_range[1], t_gap)

    # 读数据
    if(data_source == 'MICAPS'):
        try:
            data_dir = [utl.Cassandra_dir(data_type='high',data_source=model,var_name='TMP',lvl=''),
                        utl.Cassandra_dir(data_type='high',data_source=model,var_name='UGRD',lvl=''),
                        utl.Cassandra_dir(data_type='high',data_source=model,var_name='VGRD',lvl=''),
                        utl.Cassandra_dir(data_type='high',data_source=model,var_name='RH',lvl=''),
                        utl.Cassandra_dir(data_type='surface',data_source=model,var_name='PSFC')]
        except KeyError:
            raise ValueError('Can not find all directories needed')
        
        if(initTime==None):
            initTime = get_latest_initTime(data_dir[0][0:-1]+"850")
        filenames = [initTime+'.'+str(fhour).zfill(3) for fhour in fhours]
        TMP_4D=get_model_3D_grids(directory=data_dir[0][0:-1],filenames=filenames,levels=levels, allExists=False)
        u_4D=get_model_3D_grids(directory=data_dir[1][0:-1],filenames=filenames,levels=levels, allExists=False)
        v_4D=get_model_3D_grids(directory=data_dir[2][0:-1],filenames=filenames,levels=levels, allExists=False)
        rh_4D=get_model_3D_grids(directory=data_dir[3][0:-1],filenames=filenames,levels=levels, allExists=False)
        Psfc_3D=get_model_grids(directory=data_dir[4][0:-1],filenames=filenames,allExists=False)

    if(data_source == 'CIMISS'):
        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:
            rh_4D=CMISS_IO.cimiss_model_3D_grids(init_time_str='20'+filename[0:8],valid_times=fhours,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='RHU'),
                        fcst_levels=levels, fcst_ele="RHU", units='%',pbar=True)

            u_4D=CMISS_IO.cimiss_model_3D_grids(init_time_str='20'+filename[0:8],valid_times=fhours,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='WIU'),
                        fcst_levels=levels, fcst_ele="WIU", units='m/s',pbar=True)
                
            v_4D=CMISS_IO.cimiss_model_3D_grids(init_time_str='20'+filename[0:8],valid_times=fhours,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='WIV'),
                        fcst_levels=levels, fcst_ele="WIV", units='m/s',pbar=True)

            TMP_4D=CMISS_IO.cimiss_model_3D_grids(init_time_str='20'+filename[0:8],valid_times=fhours,
                        data_code=utl.CMISS_data_code(data_source=model,var_name='TEM'),
                        fcst_levels=levels, fcst_ele="TEM", units='K',pbar=True)
            TMP_4D['data'].values=TMP_4D['data'].values-273.15

            Psfc_3D=CMISS_IO.cimiss_model_grids(init_time_str='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',pbar=True)

        except KeyError:
            raise ValueError('Can not find all data needed')

    TMP_2D=TMP_4D.interp(lon=('points', points['lon']), lat=('points', points['lat']))
    u_2D=u_4D.interp(lon=('points', points['lon']), lat=('points', points['lat']))
    v_2D=v_4D.interp(lon=('points', points['lon']), lat=('points', points['lat']))
    rh_2D=rh_4D.interp(lon=('points', points['lon']), lat=('points', points['lat']))
    rh_2D.attrs['model']=model
    rh_2D.attrs['points']=points
    Psfc_1D=Psfc_3D.interp(lon=('points', points['lon']), lat=('points', points['lat']))
    v_2D2,pressure_2D = xr.broadcast(v_2D['data'],v_2D['level'])
    v_2D2,Psfc_2D = xr.broadcast(v_2D['data'],Psfc_1D['data'])
    terrain_2D=pressure_2D-Psfc_2D

    crossection_graphics.draw_Time_Crossection_rh_uv_Temp(
                    rh_2D=rh_2D, u_2D=u_2D, v_2D=v_2D,TMP_2D=TMP_2D,terrain_2D=terrain_2D,
                    t_range=t_range,model=model,lw_ratio=lw_ratio,output_dir=output_dir)