Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add q and theta to L2 #92

Closed
Tracked by #90
Geet-George opened this issue Dec 14, 2023 · 2 comments
Closed
Tracked by #90

add q and theta to L2 #92

Geet-George opened this issue Dec 14, 2023 · 2 comments

Comments

@Geet-George
Copy link
Owner

No description provided.

@Geet-George Geet-George mentioned this issue Dec 14, 2023
14 tasks
@Geet-George
Copy link
Owner Author

Geet-George commented Aug 6, 2024

For the interpolation needed in L3, it is better to interpolate specific humidity and potential temperature (because they are conserved) than the relative humidity and temperature (which are the values in L2). Therefore, we first add the variables q and theta. We could use the following functions from JOANNE (with the necessary modifications):

import numpy as np
import metpy.calc as mpcalc
from metpy.units import units

def calc_saturation_pressure(temperature_K, method='hardy1998'):
    """
    Calculate saturation water vapor pressure
    
    Input
    -----
    temperature_K : array
        array of temperature in Kevlin or dew point temperature for actual vapor pressure
    method : str
        Formula used for calculating the saturation pressure
            'hardy1998' : ITS-90 Formulations for Vapor Pressure, Frostpoint Temperature,
                Dewpoint Temperature, and Enhancement Factors in the Range –100 to +100 C,
                Bob Hardy, Proceedings of the Third International Symposium on Humidity and Moisture,
                1998 (same as used in Aspen software after May 2018)
    
    Return
    ------
    e_sw : array
        saturation pressure (Pa)
    
    Examples
    --------
    >>> calc_saturation_pressure([273.15])
    array([ 611.2129107])
    
    >>> calc_saturation_pressure([273.15, 293.15, 253.15])
    array([  611.2129107 ,  2339.26239586,   125.58350529])
    """

    if method == 'hardy1998':
        g = np.empty(8)
        g[0] = -2.8365744*10**3
        g[1] = -6.028076559*10**3
        g[2] = 1.954263612*10**1
        g[3] = -2.737830188*10**(-2)
        g[4] = 1.6261698*10**(-5)
        g[5] = 7.0229056*10**(-10)
        g[6] = -1.8680009*10**(-13)
        g[7] = 2.7150305

        e_sw = np.zeros_like(temperature_K)

        for t, temp in enumerate(temperature_K):
            ln_e_sw = np.sum([g[i]*temp**(i-2) for i in range(0,7)]) + g[7]*np.log(temp)
            e_sw[t] = np.exp(ln_e_sw)
        return e_sw

def calc_q_from_rh(ds):
    """
    Input :

        ds : Dataset 

    Output :

        q : Specific humidity values
    
    Function to estimate specific humidity from the relative humidity,
    temperature and pressure in the given dataset. 
    """ 
    e_s = calc_saturation_pressure(ds.ta.values)
    w_s = mpcalc.mixing_ratio(e_s * units.Pa, ds.p.values * units.Pa).magnitude
    w = ds.rh.values * w_s
    q = w / (1 + w)

    return q


def calc_theta_from_T(dataset):
    """
    Input :

        dataset : Dataset

    Output :

        theta : Potential temperature values 

    Function to estimate potential temperature from the
    temperature and pressure in the given dataset. This function uses MetPy's
    functions to get theta:

    (i) mpcalc.potential_temperature()
    
    """
    theta = mpcalc.potential_temperature(
        dataset.p.values * units.Pa, dataset.ta.values * units.kelvin
    ).magnitude

    return theta
    

@Geet-George
Copy link
Owner Author

Fixed with #119

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant