diff --git a/flux_subs.py b/flux_subs.py index 94dc9f543cd1f0c56d10b4d7b45b236a1898e2df..780de7339a48de26f084e205373c0c394859b07c 100755 --- a/flux_subs.py +++ b/flux_subs.py @@ -130,14 +130,8 @@ def cdn_calc(u10n, Ta, Tp, method="S80"): cdn = np.where((u10n < 11) & (u10n >= 4), 1.2*0.001, np.where((u10n <= 25) & (u10n >= 11), (0.49+0.065*u10n)*0.001, 1.14*0.001)) - elif (method == "S88" or method == "C30" or - method == "COARE4.0" or method == "UA" or method == "ERA5"): + elif (method == "S88" or method == "UA" or method == "ERA5"): cdn = cdn_from_roughness(u10n, Ta, None, method) - elif (method == "HEXOS"): - # Smith et al. 1991 #(0.27 + 0.116*u10n)*0.001 Smith et al. 1992 - cdn = (0.5+0.091*u10n)*0.001 - elif (method == "HEXOSwave"): - cdn = cdn_from_roughness(u10n, Ta, Tp, method) elif (method == "YT96"): # for u<3 same as S80 cdn = np.where((u10n < 6) & (u10n >= 3), @@ -183,16 +177,6 @@ def cdn_from_roughness(u10n, Ta, Tp, method="S88"): # .....smooth surface roughness length (equn 6 in Smith 88) zs = 0.11*visc_air(Ta)/usr zo = zc + zs # .....equns 7 & 8 in Smith 88 to calculate new CDN - elif (method == "C30"): - zc = 0.011 + (u10n-10)/(18-10)*(0.018-0.011) - zc = np.where(u10n < 10, 0.011, np.where(u10n > 18, 0.018, zc)) - zs = 0.11*visc_air(Ta)/usr - zo = zc*np.power(usr, 2)/g + zs - elif (method == "HEXOSwave"): - if ((Tp is None) or np.nansum(Tp) == 0): - Tp = 0.729*u10n # Taylor and Yelland 2001 - cp_wave = g*Tp/2/np.pi # use input wave period - zo = 0.48*np.power(usr, 3)/g/cp_wave # Smith et al. 1992 elif (method == "UA"): # valid for 0<u<18m/s # Zeng et al. 1998 (24) zo = 0.013*np.power(usr, 2)/g+0.11*visc_air(Ta)/usr @@ -239,17 +223,6 @@ def ctcqn_calc(zol, cdn, u10n, zo, Ta, method="S80"): np.nan) ctn = np.where((zol <= 0) & (u10n > 4) & (u10n < 25), 1.13*0.001, 0.66*0.001) - elif (method == "HEXOS" or method == "HEXOSwave"): - cqn = np.where((u10n <= 23) & (u10n >= 3), 1.1*0.001, np.nan) - ctn = np.where((u10n <= 18) & (u10n >= 3), 1.1*0.001, np.nan) - elif (method == "C30" or method == "COARE4.0"): - usr = (cdn*u10n**2)**0.5 - rr = zo*usr/visc_air(Ta) - zoq = 5.5e-5/rr**0.6 - zoq[zoq > 1.15e-4] = 1.15e-4 - zot = zoq - cqn = kappa**2/np.log(10/zo)/np.log(10/zoq) - ctn = kappa**2/np.log(10/zo)/np.log(10/zot) elif (method == "LY04"): cqn = 34.6*0.001*cdn**0.5 ctn = np.where(zol <= 0, 32.7*0.001*cdn**0.5, 18*0.001*cdn**0.5) @@ -349,10 +322,7 @@ def psim_calc(zol, method="S80"): """ coeffs = get_stabco(method) alpha, beta, gamma = coeffs[0], coeffs[1], coeffs[2] - if (method == "C30" or method == "COARE4.0"): - psim = np.where(zol < 0, psim_conv_coare3(zol, alpha, beta, gamma), - psim_stab_coare3(zol, alpha, beta, gamma)) - elif (method == "ERA5"): + if (method == "ERA5"): psim = np.where(zol < 0, psim_conv(zol, alpha, beta, gamma), psim_stab_era5(zol, alpha, beta, gamma)) else: @@ -377,10 +347,7 @@ def psit_calc(zol, method="S80"): """ coeffs = get_stabco(method) alpha, beta, gamma = coeffs[0], coeffs[1], coeffs[2] - if (method == "C30" or method == "COARE4.0"): - psit = np.where(zol < 0, psi_conv_coare3(zol, alpha, beta, gamma), - psi_stab_coare3(zol, alpha, beta, gamma)) - elif (method == "ERA5"): + if (method == "ERA5"): psit = np.where(zol < 0, psi_conv(zol, alpha, beta, gamma), psi_stab_era5(zol, alpha, beta, gamma)) else: @@ -406,13 +373,8 @@ def get_stabco(method="S80"): alpha, beta, gamma = 16, 0.25, 5 # Smith 1980, from Dyer (1974) elif (method == "LP82"): alpha, beta, gamma = 16, 0.25, 7 - elif (method == "HEXOS" or method == "HEXOSwave"): - alpha, beta, gamma = 16, 0.25, 8 elif (method == "YT96"): alpha, beta, gamma = 20, 0.25, 5 - elif (method == "C30" or method == "COARE4.0"): - # use separate subroutine - alpha, beta, gamma = 15, 1/3, 5 # not sure about gamma=34.15 else: print("unknown method stabco: "+method) coeffs = np.zeros(3) @@ -423,55 +385,6 @@ def get_stabco(method="S80"): # --------------------------------------------------------------------- -def psi_conv_coare3(zol, alpha, beta, gamma): - """ Calculates heat stability function for unstable conditions - for method C30 - - Parameters - ---------- - zol : float - height over MO length - alpha : float - beta : float - gamma : float - constants given by get_stabco - - Returns - ------- - psit : float - """ - x = (1-alpha*zol)**0.5 # Kansas unstable - psik = 2*np.log((1+x)/2.) - y = (1-34.15*zol)**beta - psic = (1.5*np.log((1+y+y*y)/3.)-(3)**0.5*np.arctan((1+2*y)/(3)**0.5) + - 4*np.arctan(1)/(3)**0.5) - f = zol*zol/(1.+zol*zol) - psit = (1-f)*psik+f*psic - return psit -# --------------------------------------------------------------------- - - -def psi_stab_coare3(zol, alpha, beta, gamma): - """ Calculates heat stability function for stable conditions - for method C30 - - Parameters - ---------- - zol : float - height over MO length - alpha, beta, gamma : float - constants given by get_stabco - - Returns - ------- - psi : float - """ - c = np.where(0.35*zol > 50, 50, 0.35*zol) # Stable - psit = -((1+2*zol/3)**1.5+0.6667*(zol-14.28)/np.exp(c)+8.525) - return psit -# --------------------------------------------------------------------- - - def psi_stab_era5(zol, alpha, beta, gamma): """ Calculates heat stability function for stable conditions for method ERA5 @@ -558,53 +471,6 @@ def psit_26(zol): # --------------------------------------------------------------------- -def psim_conv_coare3(zol, alpha, beta, gamma): - """ Calculates momentum stability function for unstable conditions - for method C30 - - Parameters - ---------- - zol : float - height over MO length - alpha, beta, gamma : float - constants given by get_stabco - - Returns - ------- - psim : float - """ - x = (1-15*zol)**0.25 # Kansas unstable - psik = 2*np.log((1+x)/2)+np.log((1+x*x)/2)-2*np.arctan(x)+2*np.arctan(1) - y = (1-10.15*zol)**0.3333 # Convective - psic = (1.5*np.log((1+y+y*y)/3.)-np.sqrt(3)*np.arctan((1+2*y)/np.sqrt(3)) + - 4.*np.arctan(1)/np.sqrt(3)) - f = zol*zol/(1+zol*zol) - psim = (1-f)*psik+f*psic - return psim -# --------------------------------------------------------------------- - - -def psim_stab_coare3(zol, alpha, beta, gamma): - """ Calculates momentum stability function for stable conditions - for method C30 - - Parameters - ---------- - zol : float - height over MO length - alpha, beta, gamma : float - constants given by get_stabco - - Returns - ------- - psim : float - """ - c = np.where(0.35*zol > 50, 50, 0.35*zol) # Stable - psim = -((1+1*zol)**1.0+0.6667*(zol-14.28)/np.exp(-c)+8.525) - return psim -# --------------------------------------------------------------------- - - def psim_stab_era5(zol, alpha, beta, gamma): """ Calculates momentum stability function for stable conditions for method ERA5