Esempio n. 1
0
def test_rh_mixing_ratio():
    """Tests relative humidity from mixing ratio."""
    p = 1013.25 * units.mbar
    temperature = 20. * units.degC
    w = 0.012
    rh = relative_humidity_from_mixing_ratio(w, temperature, p)
    assert_almost_equal(rh, 81.7219 * units.percent, 3)
Esempio n. 2
0
def test(type):
    """Run a single benchmark test for computation of meteorological fields
    across a forecast ensemble.

    Parameters
    ----------
    type : str
        The type of array to test; either 'numpy' or 'dask'.

    Returns
    -------
    tuple of floats
        The total wall and process times.
    """
    refpath = Path("/lustre/scratch/rmanser/wrfref/wrfoutREFd02")
    mempath = Path("/lustre/scratch/rmanser/test_ens/2016052812/")

    ref = xr.open_dataset(refpath)
    # All members are loaded implicitly as dask arrays, regardless of `type`
    members = xr.open_mfdataset(
        mempath.glob("mem*/wrfout_d02_2016-05-30_12:00:00"),
        concat_dim='members',
        combine='nested',
    )

    # For dask arrays, we select the individual variable dask arrays
    if type == 'dask':
        pressure = (members.P + ref.PB).data * units(ref.PB.units)
        theta = (members.T + ref.T00).data * units(ref.T00.units)
        mixing_ratio = members.QVAPOR.data * units('dimensionless')

    # For numpy arrays, we force variable arrays to be loaded into memory
    elif type == 'numpy':
        pressure = (members.P + ref.PB).values * units(ref.PB.units)
        theta = (members.T + ref.T00).values * units(ref.T00.units)
        mixing_ratio = members.QVAPOR.values * units('dimensionless')

    start_wall = time.time()
    start_proc = time.process_time()

    temperature = mpcalc.temperature_from_potential_temperature(
        pressure, theta)

    relative_humidity = mpcalc.relative_humidity_from_mixing_ratio(
        mixing_ratio, temperature, pressure)

    # We don't call metpy's function here because it implicitly triggers
    # a dask.compute() call
    dewpoint = dewpoint_from_relative_humidity(temperature, relative_humidity)

    if type == 'dask':
        td = dewpoint.compute()

    end_wall = time.time()
    end_proc = time.process_time()

    total_wall = end_wall - start_wall
    total_proc = end_proc - start_proc

    return total_wall, total_proc
Esempio n. 3
0
def test_rh_mixing_ratio():
    """Test relative humidity from mixing ratio."""
    p = 1013.25 * units.mbar
    temperature = 20. * units.degC
    w = 0.012 * units.dimensionless
    rh = relative_humidity_from_mixing_ratio(w, temperature, p)
    assert_almost_equal(rh, 81.7219 * units.percent, 3)
def get_relative_humidity(profiles):

    profiles["play"].attrs['units'] = 'hPa'
    profiles["tlay"].attrs['units'] = 'kelvin'

    rh = mpcalc.relative_humidity_from_mixing_ratio(profiles["mr"],
                                                    profiles["tlay"],
                                                    profiles["play"])
    profiles["rh"] = (["launch_time", "zlay"], rh.magnitude)

    return profiles
Esempio n. 5
0
def atmCalc(height, temp, humid):
    print("ATMCALC", height, temp, humid, file=sys.stderr)
    mtny = windh(MTNX, height, ratio=1,
                 yoffset=0)

    windx = XVALUES
    windy = windh(windx, height)

    temp_ = temp * units.degC
    initp = mc.height_to_pressure_std(windy[0] * units.meters)
    dewpt = mc.dewpoint_from_relative_humidity(temp_, humid / 100.)
    lcl_ = mc.lcl(initp, temp_, dewpt, max_iters=50, eps=1e-5)
    LCL = mc.pressure_to_height_std(lcl_[0])

    if (lcl_[0] > mc.height_to_pressure_std(max(windy) * units.meters)
            and LCL > windy[0] * units.meters * 1.000009):
        # add LCL to x
        xlcl = windh(LCL.to('meters').magnitude, height, inv=True)
        windx = np.sort(np.append(windx, xlcl))
        windy = windh(windx, height)

    pressures = mc.height_to_pressure_std(windy * units.meters)

    wvmr0 = mc.mixing_ratio_from_relative_humidity(initp, temp_, humid / 100.)

    # now calculate the air parcel temperatures and RH at each position
    if (lcl_[0] <= min(pressures)):
        T = mc.dry_lapse(pressures, temp_)
        RH = [
            mc.relative_humidity_from_mixing_ratio(
                wvmr0, t, p) for t, p in zip(
                T, pressures)]
    else:
        mini = np.argmin(pressures)
        p1 = pressures[:mini + 1]
        p2 = pressures[mini:]  # with an overlap
        p11 = p1[p1 >= lcl_[0] * .9999999]  # lower (with tol) with lcl
        p12 = p1[p1 < lcl_[0] * 1.000009]  # upper (with tol) with lcl
        T11 = mc.dry_lapse(p11, temp_)
        T12 = mc.moist_lapse(p12, lcl_[1])
        T1 = concatenate((T11[:-1], T12))
        T2 = mc.dry_lapse(p2, T1[-1])
        T = concatenate((T1, T2[1:]))
        wvmrtop = mc.saturation_mixing_ratio(pressures[mini], T[mini])
        RH=[]
        for i in range(len(pressures)):
            if pressures[i] > lcl_[0] and i <= mini:
                v=mc.relative_humidity_from_mixing_ratio(pressures[i], T[i], wvmr0)
            else:
                if i < mini:
                    v=1
                else:
                    v=mc.relative_humidity_from_mixing_ratio(pressures[i], T[i], wvmrtop)
            RH.append(v)
        
        #RH = [mc.relative_humidity_from_mixing_ratio(*tp, wvmr0) if tp[1] > lcl_[
            #0] and i <= mini else 1.0 if i < mini else
            #mc.relative_humidity_from_mixing_ratio(*tp, wvmrtop)
            #for i, tp in enumerate(zip(pressures, T))]

    RH = concatenate(RH)
    return windx, mtny, windy, lcl_, LCL, T.to("degC"), RH
Esempio n. 6
0
    temp = ncid['T'][:, 1:].filled(np.NaN)  # Kelvin
    wvmr = 1e-3 * ncid['r'][:, 1:].filled(np.NaN)  # convert to kg/kg

print('Time length: ', len(time))

# From dimension to variable.
press = np.zeros_like(temp)
for cnt in range(temp.shape[0]):
    press[cnt, :] = lev

pressure = press * units.hPa
temperature = temp * units.K
mixing_ratio = wvmr * units('kg/kg')

# get dew point
relative_humidity = mpcalc.relative_humidity_from_mixing_ratio(
    mixing_ratio, temperature, pressure)
e = mpcalc.vapor_pressure(pressure, mixing_ratio)
dew_point = mpcalc.dewpoint(e)


def get_cape(inargs, return_parcel_profile=False):
    pres_prof, temp_prof, dp_prof = inargs
    try:
        prof = mpcalc.parcel_profile(pres_prof, temp_prof[0], dp_prof[0])
        cape, cin = mpcalc.cape_cin(pres_prof, temp_prof, dp_prof, prof)
    except Exception:
        cape, cin, prof = np.NaN, np.NaN, np.NaN
        print('Problem during CAPE-calculation. Likely NaN-related.')
    if return_parcel_profile:
        return cape, cin, prof
    else:
Esempio n. 7
0
                    df_selected_time[
                        'saturation_mixing_ratio'] = mpcalc.mixing_ratio(
                            VPS, p)
                    df_selected_time['mixing_ratio'] = mpcalc.mixing_ratio(
                        VP, p)
                    MRS = df_selected_time[
                        'saturation_mixing_ratio'].values * units('g/kg')
                    MR = df_selected_time['mixing_ratio'].values * units(
                        'g/kg')

                    # Calculate RH
                    #RH = mpcalc.relative_humidity_from_dewpoint(T[0], Td[0])
                    df_selected_time[
                        'RH'] = mpcalc.relative_humidity_from_dewpoint(T, Td)
                    df_selected_time[
                        'RH_MR'] = mpcalc.relative_humidity_from_mixing_ratio(
                            MR, T, p)

                    print('df_selected_time after drop nan.\n{0}'.format(
                        df_selected_time))

                    df_selected_time.to_csv(
                        r'{0}{1}{2}_{3}_solution.csv'.format(
                            dir_name, save_dir_name, filename_el[-5],
                            selected_time[:13]))

                    p = df_selected_time['pressure'].values * units.hPa
                    T = df_selected_time['temperature'].values * units.degC
                    Td = df_selected_time['dewpoint'].values * units.degC
                    wind_speed = df_selected_time['speed'].values * units.knots
                    wind_dir = df_selected_time[
                        'direction'].values * units.degrees
def f(fullname, selected_time):
    fullname_el = fullname.split('/')
    #fullname_el = fullname.split('\\')
    filename = fullname_el[-1]
    filename_el = filename.split('_')
    save_base_dir_name = '../1data/'
    save_dir_name = '{0}{1}/'.format(save_base_dir_name + dir_name, obs_year)
    print('site : {0}'.format(dir_name))

    if os.path.isfile('{0}{1}_{2}_student.csv'\
                      .format(save_dir_name, filename_el[-5], selected_time[:13]))\
        and os.path.isfile('{0}{1}_{2}_solution.csv'\
                      .format(save_dir_name, filename_el[-5], selected_time[:13])):
        write_log(log_file, '{3} ::: {0}{1}_{2} files are already exist'\
                  .format(save_dir_name, filename_el[-5], selected_time[:13], datetime.now()))
    else:
        try:
            f = lambda s: selected_time in s
            ids = df['time'].apply(f)
            df_selected_time = df[ids]
            df_selected_time = df_selected_time.sort_values('pressure',
                                                            ascending=False)

            print('filename : {0}'.format(fullname))
            print('df_selected_time.\n{0}'.format(df_selected_time))

            df_selected_time.to_csv(r'{0}{1}_{2}_student.csv'\
                      .format(save_dir_name, filename_el[-5], selected_time[:13]))

            #################################################################################
            ### We will pull the data out of the example dataset into individual variables and
            ### assign units.
            #################################################################################

            p = df_selected_time['pressure'].values * units.hPa
            T = df_selected_time['temperature'].values * units.degC
            Td = df_selected_time['dewpoint'].values * units.degC
            wind_speed = df_selected_time['speed'].values * units.knots
            wind_dir = df_selected_time['direction'].values * units.degrees
            u, v = mpcalc.wind_components(wind_speed, wind_dir)

            # Calculate web bulb temperature
            df_selected_time['wet_bulb_T'] = mpcalc.wet_bulb_temperature(
                p, T, Td)

            # Calculate potential temperature
            df_selected_time['potential_T'] = mpcalc.potential_temperature(
                p, T)
            df_selected_time['potential_T_C'] = df_selected_time[
                'potential_T'].values - 273.15

            # Calculate saturation vaper pressure
            df_selected_time[
                'saturation_vaper_pressure'] = mpcalc.saturation_vapor_pressure(
                    T)
            df_selected_time[
                'vaper_pressure'] = mpcalc.saturation_vapor_pressure(Td)
            SVP = df_selected_time[
                'saturation_vaper_pressure'].values * units.hPa
            VP = df_selected_time['vaper_pressure'].values * units.hPa

            # Calculate mixing ratio
            df_selected_time['saturation_mixing_ratio'] = mpcalc.mixing_ratio(
                SVP, p)
            df_selected_time['mixing_ratio'] = mpcalc.mixing_ratio(VP, p)
            SMR = df_selected_time['saturation_mixing_ratio'].values * units(
                'g/kg')
            MR = df_selected_time['mixing_ratio'].values * units('g/kg')

            # Calculate relative humidity
            df_selected_time['relative_humidity_from_dewpoint'] \
                = mpcalc.relative_humidity_from_dewpoint(T, Td)
            df_selected_time['relative_humidity_from_mixing_ratio'] \
                = mpcalc.relative_humidity_from_mixing_ratio(MR, T, p)

            # Calculate virtual temperature
            df_selected_time['virtual_temperature'] \
                = mpcalc.virtual_temperature(T, MR)

            # Calculate virtual potential temperature
            df_selected_time['virtual_potential_temperature'] \
                = mpcalc.virtual_potential_temperature(p, T, MR)

            print('df_selected_time after drop nan.\n{0}'.format(
                df_selected_time))

            df_selected_time.to_csv(r'{0}{1}_{2}_solution.csv'\
                      .format(save_dir_name, filename_el[-5], selected_time[:13]))

        except Exception as err:
            write_log(err_log_file, '{4} ::: {0} with {1}{2} on {3}'\
                      .format(err, dir_name, filename, selected_time[:13], datetime.now()))
    print('Thread {0} is finished'.format(selected_time))
    return 0  # Return a dummy value