get_init.py 6.05 KB
Newer Older
1 2 3
import numpy as np
import sys

4 5
def get_init(spd, T, SST, lat, P, Rl, Rs, cskin, skin, wl, gust, L, tol, meth,
             qmeth):
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
    """
    Checks initial input values and sets defaults if needed

    Parameters
    ----------
    spd : float
        relative wind speed in m/s (is assumed as magnitude difference
        between wind and surface current vectors)
    T : float
        air temperature in K
    SST : float
        sea surface temperature in K
    lat : float
        latitude (deg), default 45deg
    P : float
        air pressure (hPa), default 1013hPa
    Rl : float
        downward longwave radiation (W/m^2)
    Rs : float
        downward shortwave radiation (W/m^2)
    cskin : int
27 28 29 30 31
        cool skin correction (0: off, 1: on)
    skin : str
        cool skin adjustment method "C35" (default), "ecmwf" or "Beljaars"
    wl : int
        warm layer correction (0: off default, 1: on)
32 33 34
    gust : int
        3x1 [x, beta, zi] x=1 to include the effect of gustiness, else 0
        beta gustiness parameter, beta=1 for UA, beta=1.2 for COARE
35
        zi PBL height (m) 600 for COARE, 1000 for UA and ecmwf, 800 default
36
        default for COARE [1, 1.2, 600]
37
        default for UA, ecmwf [1, 1, 1000]
38 39 40 41 42 43 44 45
        default else [1, 1.2, 800]
    L : int
        Monin-Obukhov length definition options
    tol : float
        4x1 or 7x1 [option, lim1-3 or lim1-6]
        option : 'flux' to set tolerance limits for fluxes only lim1-3
        option : 'ref' to set tolerance limits for height adjustment lim-1-3
        option : 'all' to set tolerance limits for both fluxes and height
46
                 adjustment lim1-6 ['all', 0.01, 0.01, 5e-05, 1e-3, 0.1, 0.1]
47
    meth : str
48 49
        "S80","S88","LP82","YT96","UA","LY04","C30","C35","C40","ecmwf",
        "Beljaars"
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
    qmeth : str
        is the saturation evaporation method to use amongst
        "HylandWexler","Hardy","Preining","Wexler","GoffGratch","CIMO",
        "MagnusTetens","Buck","Buck2","WMO","WMO2000","Sonntag","Bolton",
        "IAPWS","MurphyKoop"]
        default is Buck2

    Returns
    -------
    lat : float
        latitude
    P : float
        air pressure (hPa)
    Rl : float
        downward longwave radiation (W/m^2)
    Rs : float
        downward shortwave radiation (W/m^2)
    cskin : int
        cool skin adjustment switch
69 70 71 72
    skin : str
        cool skin adjustment method
    wl : int
        warm layer correction switch
73 74 75 76 77 78 79 80
    gust : int
        gustiness switch
    tol : float
        tolerance limits
    L : int
        MO length switch

    """
81
    # check if input is correct (type, size, value) and set defaults
82 83 84
    if ((type(spd) != np.ndarray) or (type(T) != np.ndarray) or
         (type(SST) != np.ndarray)):
        sys.exit("input type of spd, T and SST should be numpy.ndarray")
85 86 87 88
    elif ((spd.dtype not in ['float64', 'float32']) or
          (T.dtype not in ['float64', 'float32']) or
          (SST.dtype not in ['float64', 'float32'])):
        sys.exit("input dtype of spd, T and SST should be float")
89 90
    # if input values are nan break
    if meth not in ["S80", "S88", "LP82", "YT96", "UA", "LY04", "C30", "C35",
91
                    "C40", "ecmwf", "Beljaars"]:
92
        sys.exit("unknown method")
93 94 95
    if qmeth not in ["HylandWexler", "Hardy", "Preining", "Wexler",
                     "GoffGratch", "WMO", "MagnusTetens", "Buck", "Buck2",
                     "WMO2018", "Sonntag", "Bolton", "IAPWS", "MurphyKoop"]:
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
        sys.exit("unknown q-method")
    if (np.all(np.isnan(spd)) or np.all(np.isnan(T)) or np.all(np.isnan(SST))):
        sys.exit("input wind, T or SST is empty")
    if (np.all(lat == None)):  # set latitude to 45deg if empty
        lat = 45*np.ones(spd.shape)
    elif ((np.all(lat != None)) and (np.size(lat) == 1)):
        lat = np.ones(spd.shape)*np.copy(lat)
    if ((np.all(P == None)) or np.all(np.isnan(P))):
        P = np.ones(spd.shape)*1013
    elif (((np.all(P != None)) or np.all(~np.isnan(P))) and np.size(P) == 1):
        P = np.ones(spd.shape)*np.copy(P)
    if (np.all(Rl == None) or np.all(np.isnan(Rl))):
        Rl = np.ones(spd.shape)*370    # set to default for COARE3.5
    if (np.all(Rs == None) or np.all(np.isnan(Rs))):
        Rs = np.ones(spd.shape)*150  # set to default for COARE3.5
    if ((cskin == None) and (meth == "S80" or meth == "S88" or meth == "LP82"
112 113
                             or meth == "YT96" or meth == "UA" or
                             meth == "LY04")):
114
        cskin = 0
115
    elif ((cskin == None) and (meth == "C30" or meth == "C35" or meth == "C40"
116
                               or meth == "ecmwf" or meth == "Beljaars")):
117
        cskin = 1
118 119 120 121 122 123 124 125 126
        if ((skin == None) and (meth == "C30" or meth == "C35"
                                or meth == "C40")):
            skin = "C35"
        elif ((skin == None) and (meth == "ecmwf")):
            skin = "ecmwf"
        elif ((skin == None) and (meth == "Beljaars")):
            skin = "Beljaars"
    if (wl == None):
        wl = 0
127 128
    if (np.all(gust == None) and (meth == "C30" or meth == "C35" or
                                  meth == "C40")):
129
        gust = [1, 1.2, 600]
130
    elif (np.all(gust == None) and (meth == "UA" or meth == "ecmwf" or
131
                                    meth == "Beljaars")):
132
        gust = [1, 1, 1000]
sbiri's avatar
sbiri committed
133
    elif np.all(gust == None):
134
        gust = [1, 1.2, 800]
135 136
    elif ((np.size(gust) < 3) and (gust == 0)):
        gust = [0, 0, 0]
137 138
    elif (np.size(gust) < 3):
        sys.exit("gust input must be a 3x1 array")
139
    if (L not in [None, "S80", "ecmwf"]):
140
        sys.exit("L input must be either None, S80 or ecmwf")
141
    if ((L == None) and (meth == "S80" or meth == "S88" or meth == "LP82"
142 143
                         or meth == "YT96" or meth == "LY04" or
                         meth == "UA" or meth == "C30" or meth == "C35"
144
                         or meth == "C40" or meth == "Beljaars")):
145
        L = "S80"
146 147
    elif ((L == None) and (meth == "ecmwf")):
        L = "ecmwf"
148
    if (tol == None):
149
        tol = ['flux', 1e-3, 0.1, 0.1]
150 151
    elif (tol[0] not in ['flux', 'ref', 'all']):
        sys.exit("unknown tolerance input")
152
    return lat, P, Rl, Rs, cskin, skin, wl, gust, tol, L