Ejemplo n.º 1
0
def create_2D_input(cs_file, cosipy_file, static_file, start_date, end_date):
    """ This function creates an input dataset from an offered csv file with input point data
        Here you need to define how to interpolate the data.

        Please note, there should be only one header line in the file.

        Latest update: 
            Tobias Sauter 07.07.2019
    """

    print('-------------------------------------------')
    print('Create input \n')
    print('Read input file %s' % (cs_file))

    #-----------------------------------
    # Read data
    #-----------------------------------
    date_parser = lambda x: dateutil.parser.parse(x, ignoretz=True)
    df = pd.read_csv(cs_file,
       delimiter=',', index_col=['TIMESTAMP'],
        parse_dates=['TIMESTAMP'], na_values='NAN',date_parser=date_parser)

    #-----------------------------------
    # Select time slice
    #-----------------------------------
    if ((start_date != None) & (end_date !=None)): 
        df = df.loc[start_date:end_date]

    #-----------------------------------
    # Load static data
    #-----------------------------------
    print('Read static file %s \n' % (static_file))
    ds = xr.open_dataset(static_file)

    dso = xr.Dataset()

    x, y = np.meshgrid(ds.west_east, ds.south_north)
    dso.coords['time'] = (('time'), df.index.values)
    dso.coords['lat'] = (('south_north','west_east'), y)
    dso.coords['lon'] = (('south_north','west_east'), x)

    #-----------------------------------
    # Order variables
    #-----------------------------------
    df[T2_var] = df[T2_var].apply(pd.to_numeric, errors='coerce')
    df[RH2_var] = df[RH2_var].apply(pd.to_numeric, errors='coerce')
    df[U2_var] = df[U2_var].apply(pd.to_numeric, errors='coerce')
    df[G_var] = df[G_var].apply(pd.to_numeric, errors='coerce')
    df[PRES_var] = df[PRES_var].apply(pd.to_numeric, errors='coerce')
    
    if (RRR_var in df):
        df[RRR_var] = df[RRR_var].apply(pd.to_numeric, errors='coerce')

    if (PRES_var not in df):
        df[PRES_var] = 660.00

    if (LWin_var not in df and N_var not in df):
        print("ERROR no longwave incoming or cloud cover data")
        sys.exit()
    elif (LWin_var in df):
        df[LWin_var] = df[LWin_var].apply(pd.to_numeric, errors='coerce')
    elif (N_var in df):
        df[N_var] = df[N_var].apply(pd.to_numeric, errors='coerce')

    if (SNOWFALL_var in df):
        df[SNOWFALL_var] = df[SNOWFALL_var].apply(pd.to_numeric, errors='coerce')

    #-----------------------------------
    # Get values from file
    #-----------------------------------
    T2 = df[T2_var]         # Temperature
    RH2 = df[RH2_var]       # Relative humdity
    U2 = df[U2_var]         # Wind velocity
    G = df[G_var]           # Incoming shortwave radiation
    PRES = df[PRES_var]     # Pressure

    #-----------------------------------
    # Create numpy arrays for the 2D fields
    #-----------------------------------
    T_interp = np.zeros([len(dso.time), len(ds.south_north), len(ds.west_east)])
    RH_interp = np.zeros([len(dso.time), len(ds.south_north), len(ds.west_east)])
    U_interp = np.zeros([len(dso.time), len(ds.south_north), len(ds.west_east)])
    G_interp = np.zeros([len(dso.time), len(ds.south_north), len(ds.west_east)])
    P_interp = np.zeros([len(dso.time), len(ds.south_north), len(ds.west_east)])
    LWin_interp = np.zeros([len(dso.time), len(ds.south_north), len(ds.west_east)])
    N_interp = np.zeros([len(dso.time), len(ds.south_north), len(ds.west_east)])
    
    if (RRR_var in df):
        RRR = df[RRR_var]       # Precipitation
        RRR_interp = np.zeros([len(dso.time), len(ds.south_north), len(ds.west_east)])

    if(SNOWFALL_var in df):
        SNOWFALL = df[SNOWFALL_var]      # Incoming longwave radiation
        SNOWFALL_interp = np.zeros([len(dso.time), len(ds.south_north), len(ds.west_east)])

    if(LWin_var in df):
        LW = df[LWin_var]      # Incoming longwave radiation
        LW_interp = np.zeros([len(dso.time), len(ds.south_north), len(ds.west_east)])

    if(N_var in df):
        N = df[N_var]        # Cloud cover fraction
        N_interp = np.zeros([len(dso.time), len(ds.south_north), len(ds.west_east)])

    #-----------------------------------
    # Interpolate point data to grid 
    #-----------------------------------
    print('Interpolate CR file to grid')
   
    # Interpolate data (T, RH, RRR, U)  to grid using lapse rates
    for t in range(len(dso.time)):
        T_interp[t,:,:] = (T2[t]) + (ds.HGT.values-stationAlt)*lapse_T
        RH_interp[t,:,:] = RH2[t] + (ds.HGT.values-stationAlt)*lapse_RH
        U_interp[t,:,:] = U2[t]

        # Interpolate pressure using the barometric equation
        SLP = PRES[t]/np.power((1-(0.0065*stationAlt)/(288.15)), 5.255)
        P_interp[t,:,:] = SLP * np.power((1-(0.0065*ds.HGT.values)/(288.15)), 5.255)

        if (RRR_var in df):
            RRR_interp[t,:,:] = RRR[t] + (ds.HGT.values-stationAlt)*lapse_RRR
        
        if (SNOWFALL_var in df):
            SNOWFALL_interp[t, :, :] = SNOWFALL[t] + (ds.HGT.values-stationAlt)*lapse_SNOWFALL

        if(LWin_var in df):
            LW_interp[t,:,:] = LW[t]
        
        if(N_var in df):
            N_interp[t,:,:] = LW[t]

    # Change aspect to south==0, east==negative, west==positive
    ds['ASPECT'] = np.mod(ds['ASPECT']+180.0, 360.0)
    mask = ds['ASPECT'].where(ds['ASPECT']<=180.0)
    aspect = ds['ASPECT'].values
    aspect[aspect<180] = aspect[aspect<180]*-1.0
    aspect[aspect>=180] = 360.0 - aspect[aspect>=180]
    ds['ASPECT'] = (('south_north','west_east'),aspect)
    print(('Number of glacier cells: %i') % (np.count_nonzero(~np.isnan(ds['MASK'].values))))

    # Auxiliary variables
    mask = ds.MASK.values
    slope = ds.SLOPE.values
    aspect = ds.ASPECT.values
    south_norths = ds.south_north.values
    west_easts = ds.west_east.values
    sw = G.values

    #-----------------------------------
    # Run radiation module 
    #-----------------------------------
    if radiationModule:
        print('Run the radiation module')
    else:
        print('No radiation module used')

    for t in range(len(dso.time)):
        doy = df.index[t].dayofyear
        hour = df.index[t].hour
        for i in range(len(ds.south_north)):
            for j in range(len(ds.west_east)):
                if (mask[i,j]==1):
                    if radiationModule:
                        G_interp[t,i,j] = np.maximum(0.0, correctRadiation(south_norths[i],west_easts[j], timezone_lon, doy, hour, slope[i,j], aspect[i,j], sw[t], zeni_thld))
                    else:
                        G_interp[t,i,j] = sw[t]

    #-----------------------------------
    # Check bounds for relative humidity 
    #-----------------------------------
    RH_interp[RH_interp > 100.0] = 100.0
    RH_interp[RH_interp < 0.0] = 0.1

    #-----------------------------------
    # Add variables to file 
    #-----------------------------------
    add_variable_along_latlon(dso, ds.HGT.values, 'HGT', 'm', 'Elevation')
    add_variable_along_latlon(dso, ds.ASPECT.values, 'ASPECT', 'degrees', 'Aspect of slope')
    add_variable_along_latlon(dso, ds.SLOPE.values, 'SLOPE', 'degrees', 'Terrain slope')
    add_variable_along_latlon(dso, ds.MASK.values, 'MASK', 'boolean', 'Glacier mask')
    add_variable_along_timelatlon(dso, T_interp, 'T2', 'K', 'Temperature at 2 m')
    add_variable_along_timelatlon(dso, RH_interp, 'RH2', '%', 'Relative humidity at 2 m')
    add_variable_along_timelatlon(dso, U_interp, 'U2', 'm s\u207b\xb9', 'Wind velocity at 2 m')
    add_variable_along_timelatlon(dso, G_interp, 'G', 'W m\u207b\xb2', 'Incoming shortwave radiation')
    add_variable_along_timelatlon(dso, P_interp, 'PRES', 'hPa', 'Atmospheric Pressure')
    
    if (RRR_var in df):
        add_variable_along_timelatlon(dso, RRR_interp, 'RRR', 'mm', 'Total precipitation (liquid+solid)')
    
    if(SNOWFALL_var in df):
        add_variable_along_timelatlon(dso, SNOWFALL_interp, 'SNOWFALL', 'm', 'Snowfall')

    if(LWin_var in df):
        add_variable_along_timelatlon(dso, LW_interp, 'LWin', 'W m\u207b\xb2', 'Incoming longwave radiation')
    if(N_var in df):
        add_variable_along_timelatlon(dso, N_interp, 'N', '%', 'Cloud cover fraction')

    #-----------------------------------
    # Write file to disc 
    #-----------------------------------
    dso.to_netcdf(cosipy_file)


    print('Input file created \n')
    print('-------------------------------------------')

   
    #-----------------------------------
    # Do some checks
    #-----------------------------------
    check(dso.T2,316.16,223.16)
    check(dso.RH2,100.0,0.0)
    check(dso.U2, 50.0, 0.0)
    check(dso.RRR,20.0,0.0)
    check(dso.G,1600.0,0.0)
    check(dso.PRES,1080.0,200.0)

    if(SNOWFALL_var in df):
        check(ds.SNOWFALL,0.1,0.0)
Ejemplo n.º 2
0
def create_input(cs_file, cosipy_file, static_file, start_date, end_date):
    """ This function creates an input dataset from the Hintereisferner CR3000 Logger Dataset 
        Here you need to define how to interpolate the data.
    """

    print('-------------------------------------------')
    print('Create input \n')
    print('Read input file %s' % (cs_file))

    # Read data
    date_parser = lambda x: dateutil.parser.parse(x, ignoretz=True)
    df = pd.read_csv(cs_file,
                     delimiter=',',
                     index_col=['TIMESTAMP'],
                     parse_dates=['TIMESTAMP'],
                     na_values='NAN',
                     date_parser=date_parser)

    df[T2_var] = df[T2_var].apply(pd.to_numeric, errors='coerce')
    df[RH2_var] = df[RH2_var].apply(pd.to_numeric, errors='coerce')
    df[U2_var] = df[U2_var].apply(pd.to_numeric, errors='coerce')
    df[G_var] = df[G_var].apply(pd.to_numeric, errors='coerce')
    df[PRES_var] = df[PRES_var].apply(pd.to_numeric, errors='coerce')
    df[RRR_var] = df[RRR_var].apply(pd.to_numeric, errors='coerce')
    df[N_var] = df[N_var].apply(pd.to_numeric, errors='coerce')

    # Select time slice
    df = df.loc[start_date:end_date]

    if (SNOWFALL_var in df):
        # Make hourly data
        df = df.resample('H').agg({
            T2_var: 'mean',
            RH2_var: 'mean',
            U2_var: 'mean',
            RRR_var: 'sum',
            G_var: 'mean',
            PRES_var: 'mean',
            N_var: 'mean',
            SNOWFALL_var: 'sum'
        })

    else:
        df = df.resample('H').agg({
            T2_var: 'mean',
            RH2_var: 'mean',
            U2_var: 'mean',
            RRR_var: 'sum',
            G_var: 'mean',
            PRES_var: 'mean',
            N_var: 'mean'
        })

    # Load static data
    print('Read static file %s \n' % (static_file))
    ds = xr.open_dataset(static_file)
    ds.coords['time'] = df.index.values

    # Variable names in csv file
    T2 = df[T2_var]  # Temperature
    RH2 = df[RH2_var]  # Relative humdity
    U2 = df[U2_var]  # Wind velocity
    G = df[G_var]  # Incoming shortwave radiation
    PRES = df[PRES_var]  # Pressure
    RRR = df[RRR_var]  # Precipitation
    N = df[N_var]  # Cloud cover fraction

    # Create data arrays for the 2D fields
    T_interp = np.zeros([len(ds.time), len(ds.lat), len(ds.lon)])
    RH_interp = np.zeros([len(ds.time), len(ds.lat), len(ds.lon)])
    RRR_interp = np.zeros([len(ds.time), len(ds.lat), len(ds.lon)])
    U_interp = np.zeros([len(ds.time), len(ds.lat), len(ds.lon)])
    G_interp = np.zeros([len(ds.time), len(ds.lat), len(ds.lon)])
    P_interp = np.zeros([len(ds.time), len(ds.lat), len(ds.lon)])
    N_interp = np.zeros([len(ds.time), len(ds.lat), len(ds.lon)])

    if (SNOWFALL_var in df):
        SNOWFALL = df[SNOWFALL_var]  # Incoming longwave radiation
        SNOWFALL_interp = np.zeros([len(ds.time), len(ds.lat), len(ds.lon)])

    print('Interpolate CR file to grid')
    # Interpolate data (T, RH, RRR, U)  to grid using lapse rates
    for t in range(len(ds.time)):
        T_interp[t, :, :] = (T2[t]) + (ds.HGT.values - stationAlt) * lapse_T
        RH_interp[t, :, :] = RH2[t] + (ds.HGT.values - stationAlt) * lapse_RH
        RRR_interp[t, :, :] = RRR[t]
        U_interp[t, :, :] = U2[t]
        N_interp[t, :, :] = N[t]

        # Interpolate pressure using the barometric equation
        SLP = PRES[t] / np.power((1 - (0.0065 * stationAlt) / (288.15)), 5.255)
        P_interp[t, :, :] = SLP * np.power(
            (1 - (0.0065 * ds.HGT.values) / (288.15)), 5.255)

        if (SNOWFALL_var in df):
            SNOWFALL_interp[t, :, :] = SNOWFALL[t]

    print("T_inter after", np.min(T_interp))
    # Change aspect to south==0, east==negative, west==positive
    ds['ASPECT'] = np.mod(ds['ASPECT'] + 180.0, 360.0)
    mask = ds['ASPECT'].where(ds['ASPECT'] <= 180.0)
    aspect = ds['ASPECT'].values
    aspect[aspect < 180] = aspect[aspect < 180] * -1.0
    aspect[aspect >= 180] = 360.0 - aspect[aspect >= 180]
    ds['ASPECT'] = (('lat', 'lon'), aspect)
    print(np.count_nonzero(~np.isnan(ds['MASK'].values)))

    # Auxiliary variables
    mask = ds.MASK.values
    slope = ds.SLOPE.values
    aspect = ds.ASPECT.values
    lats = ds.lat.values
    lons = ds.lon.values
    sw = G.values

    if radiationModule:
        print('Run the radiation module')
    else:
        print('No radiation module used')

    for t in range(len(ds.time)):
        doy = df.index[t].dayofyear
        hour = df.index[t].hour
        for i in range(len(ds.lat)):
            for j in range(len(ds.lon)):
                if (mask[i, j] == 1):
                    if radiationModule:
                        G_interp[t, i, j] = np.maximum(
                            0.0,
                            correctRadiation(lats[i], lons[j], timezone_lon,
                                             doy, hour, slope[i, j],
                                             aspect[i, j], sw[t], zeni_thld))
                    else:
                        G_interp[t, i, j] = sw[t]

    # Check temperature, rh2, pressure,
    RH_interp[RH_interp > 100.0] = 100.0
    RH_interp[RH_interp < 0.0] = 0.1

    # Add arrays to dataset and write file
    add_variable_2D(ds, T_interp, 'T2', 'K', 'Temperature at 2 m')
    add_variable_2D(ds, RH_interp, 'RH2', '%', 'Relative humidity at 2 m')
    add_variable_2D(ds, RRR_interp, 'RRR', 'mm',
                    'Total precipitation (liquid+solid)')
    add_variable_2D(ds, U_interp, 'U2', 'm s\u207b\xb9',
                    'Wind velocity at 2 m')
    add_variable_2D(ds, G_interp, 'G', 'W m\u207b\xb2',
                    'Incoming shortwave radiation')
    add_variable_2D(ds, P_interp, 'PRES', 'hPa', 'Atmospheric Pressure')
    add_variable_2D(ds, N_interp, 'N', '%', 'Cloud cover fraction')

    if (SNOWFALL_var in df):
        add_variable_2D(ds, SNOWFALL_interp, 'SNOWFALL', 'm', 'Snowfall')

    ds.to_netcdf(cosipy_file)

    print('Input file created \n')
    print('-------------------------------------------')

    print(ds)

    check(ds.T2, 316.16, 223.16)
    check(ds.RH2, 100.0, 0.0)
    check(ds.U2, 50.0, 0.0)
    check(ds.RRR, 20.0, 0.0)
    check(ds.G, 1600.0, 0.0)
    check(ds.PRES, 1080.0, 200.0)
    check(ds.N, 1.0, 0.0)

    if (SNOWFALL_var in df):
        check(ds.SNOWFALL, 0.1, 0.0)