Commit 6a8db925 authored by sbiri's avatar sbiri
Browse files

renamed GustFact to GFo where appropriate

added SST flag
rearranged and added output variables in get_outvars
parent 21b5254f
...@@ -23,10 +23,10 @@ class S88: ...@@ -23,10 +23,10 @@ class S88:
self.u10n[ind] = self.wind[ind]-self.usr[ind]/kappa*( self.u10n[ind] = self.wind[ind]-self.usr[ind]/kappa*(
np.log(self.h_in[0, ind]/self.ref10)-self.psim[ind]) np.log(self.h_in[0, ind]/self.ref10)-self.psim[ind])
else: else:
self.GustFact = np.sqrt(self.wind/self.spd) self.GustFact = self.wind/self.spd
self.u10n[ind] = self.spd[ind]-self.usr[ind]/kappa / \ self.u10n[ind] = self.spd[ind]-self.usr[ind]/kappa / \
self.GustFact[ind]*(np.log(self.h_in[0, ind]/self.ref10) - np.sqrt(self.GustFact[ind])*(
self.psim[ind]) np.log(self.h_in[0, ind]/self.ref10)-self.psim[ind])
else: else:
# initalisation of wind # initalisation of wind
self.wind[ind] = np.copy(self.spd[ind]) self.wind[ind] = np.copy(self.spd[ind])
...@@ -82,11 +82,32 @@ class S88: ...@@ -82,11 +82,32 @@ class S88:
def _update_coolskin_warmlayer(self, ind): def _update_coolskin_warmlayer(self, ind):
if self.cskin == 1: if self.cskin == 1:
self.dter[ind], self.tkt[ind] = cs(np.copy( # self.dter[ind], self.tkt[ind] = cs(np.copy(
self.SST[ind]), np.copy(self.tkt[ind]), self.rho[ind], # self.SST[ind]), np.copy(self.tkt[ind]), self.rho[ind],
self.Rs[ind], self.Rnl[ind], self.cp[ind], self.lv[ind], # self.Rs[ind], self.Rnl[ind], self.cp[ind], self.lv[ind],
self.usr[ind], self.tsr[ind], self.qsr[ind], self.grav[ind], # self.usr[ind], self.tsr[ind], self.qsr[ind], self.grav[ind],
self.skin) # self.skin)
if self.skin == "C35":
self.dter[ind], self.tkt[ind] = cs_C35(np.copy(
self.SST[ind]), self.rho[ind], self.Rs[ind], self.Rnl[ind],
self.cp[ind], self.lv[ind], np.copy(self.tkt[ind]),
self.usr[ind], self.tsr[ind], self.qsr[ind], self.grav[ind])
# self.dter[ind] = cs_C35(np.copy(
# self.skt[ind]), self.rho[ind], self.Rs[ind], self.Rnl[ind],
# self.cp[ind], self.lv[ind], self.usr[ind], self.tsr[ind],
# self.qsr[ind], self.grav[ind])
elif self.skin == "ecmwf":
self.dter[ind] = cs_ecmwf(
self.rho[ind], self.Rs[ind], self.Rnl[ind], self.cp[ind],
self.lv[ind], self.usr[ind], self.tsr[ind], self.qsr[ind],
np.copy(self.SST[ind]), self.grav[ind])
elif self.skin == "Beljaars":
self.Qs[ind], self.dter[ind] = cs_Beljaars(
self.rho[ind], self.Rs[ind], self.Rnl[ind], self.cp[ind],
self.lv[ind], self.usr[ind], self.tsr[ind], self.qsr[ind],
self.grav[ind], np.copy(self.Qs[ind]))
self.dqer[ind] = get_dqer(self.dter[ind], self.SST[ind], self.dqer[ind] = get_dqer(self.dter[ind], self.SST[ind],
self.qsea[ind], self.lv[ind]) self.qsea[ind], self.lv[ind])
self.skt[ind] = np.copy(self.SST[ind])+self.dter[ind] self.skt[ind] = np.copy(self.SST[ind])+self.dter[ind]
...@@ -371,12 +392,12 @@ class S88: ...@@ -371,12 +392,12 @@ class S88:
self._get_humidity() # Get the Relative humidity self._get_humidity() # Get the Relative humidity
self._flag(out=out) # Get flags self._flag(out=out) # Get flags
self.GustFact = apply_GF(self.gust, self.spd, self.wind, "TSF") self.GFo = apply_GF(self.gust, self.spd, self.wind, "TSF")
self.tau = self.rho*np.power(self.usr, 2)/self.GustFact[0] self.tau = self.rho*np.power(self.usr, 2)/self.GFo[0]
self.sensible = self.rho*self.cp*(self.usr/self.GustFact[1])*self.tsr self.sensible = self.rho*self.cp*(self.usr/self.GFo[1])*self.tsr
self.latent = self.rho*self.lv*(self.usr/self.GustFact[2])*self.qsr self.latent = self.rho*self.lv*(self.usr/self.GFo[2])*self.qsr
self.GustFact = apply_GF(self.gust, self.spd, self.wind, "u") self.GFo = apply_GF(self.gust, self.spd, self.wind, "u")
if self.gust[0] in [3, 4]: if self.gust[0] in [3, 4]:
self.u10n = self.wind-self.usr/kappa*( self.u10n = self.wind-self.usr/kappa*(
np.log(self.h_in[0]/self.ref10)-self.psim) np.log(self.h_in[0]/self.ref10)-self.psim)
...@@ -384,13 +405,15 @@ class S88: ...@@ -384,13 +405,15 @@ class S88:
np.log(self.h_in[0]/self.h_out[0])-self.psim + np.log(self.h_in[0]/self.h_out[0])-self.psim +
psim_calc(self.h_out[0]/self.monob, self.meth)) psim_calc(self.h_out[0]/self.monob, self.meth))
else: else:
self.u10n = self.spd-self.usr/kappa/self.GustFact*( self.u10n = self.spd-self.usr/kappa/self.GFo*(
np.log(self.h_in[0]/self.ref10)-self.psim) np.log(self.h_in[0]/self.ref10)-self.psim) # C.4-7
self.uref = self.spd-self.usr/kappa/self.GustFact * \ self.uref = self.spd-self.usr/kappa/self.GFo * \
(np.log(self.h_in[0]/self.h_out[0])-self.psim + (np.log(self.h_in[0]/self.h_out[0])-self.psim +
psim_calc(self.h_out[0]/self.monob, self.meth)) psim_calc(self.h_out[0]/self.monob, self.meth))
self.usrGF = self.usr/self.GustFact self.GustFact = self.wind/self.spd
self.usr_gust = np.copy(self.usr)
self.usr_nogust = self.usr/self.GFo
# include lapse rate adjustment as theta is well-mixed # include lapse rate adjustment as theta is well-mixed
self.tref = self.theta-self.tlapse*self.h_out[1]-self.tsr/kappa * \ self.tref = self.theta-self.tlapse*self.h_out[1]-self.tsr/kappa * \
(np.log(self.h_in[1]/self.h_out[1])-self.psit + (np.log(self.h_in[1]/self.h_out[1])-self.psit +
...@@ -462,12 +485,19 @@ class S88: ...@@ -462,12 +485,19 @@ class S88:
return resAll return resAll
def add_variables(self, spd, T, SST, lat=None, hum=None, P=None, L=None): def add_variables(self, spd, T, SST, SST_fl, cskin=0, lat=None, hum=None,
P=None, L=None):
# Add the mandatory variables # Add the mandatory variables
assert type(spd) == type(T) == type( assert type(spd) == type(T) == type(
SST) == np.ndarray, "input type of spd, T and SST should be" SST) == np.ndarray, "input type of spd, T and SST should be"
" numpy.ndarray" " numpy.ndarray"
if self.meth in ["S80", "S88", "LP82", "YT96", "UA", "NCAR"]:
assert SST_fl == "bulk", "input SST should be skin for method "+self.meth
if self.meth in ["C30", "C35", "ecmwf", "Beljaars"]:
if cskin == 1:
assert SST_fl == "bulk", "input SST should be bulk with cool skin correction switched on for method "+self.meth
else:
assert SST_fl == "skin", "input SST should be skin for method "+self.meth
self.L = "tsrv" if L is None else L self.L = "tsrv" if L is None else L
self.arr_shp = spd.shape self.arr_shp = spd.shape
self.nlen = len(spd) self.nlen = len(spd)
...@@ -609,8 +639,8 @@ class Beljaars(C30): ...@@ -609,8 +639,8 @@ class Beljaars(C30):
# self.skin = "Beljaars" # self.skin = "Beljaars"
def AirSeaFluxCode(spd, T, SST, meth, lat=None, hum=None, P=None, hin=18, def AirSeaFluxCode(spd, T, SST, SST_fl, meth, lat=None, hum=None, P=None,
hout=10, Rl=None, Rs=None, cskin=0, skin=None, wl=0, hin=18, hout=10, Rl=None, Rs=None, cskin=0, skin=None, wl=0,
gust=None, qmeth="Buck2", tol=None, maxiter=10, out=0, gust=None, qmeth="Buck2", tol=None, maxiter=10, out=0,
out_var=None, L=None): out_var=None, L=None):
""" """
...@@ -627,6 +657,9 @@ def AirSeaFluxCode(spd, T, SST, meth, lat=None, hum=None, P=None, hin=18, ...@@ -627,6 +657,9 @@ def AirSeaFluxCode(spd, T, SST, meth, lat=None, hum=None, P=None, hin=18,
air temperature in K (will convert if < 200) air temperature in K (will convert if < 200)
SST : float SST : float
sea surface temperature in K (will convert if < 200) sea surface temperature in K (will convert if < 200)
SST_fl : str
provides information on the type of the input SST; "bulk" or
"skin"
meth : str meth : str
"S80", "S88", "LP82", "YT96", "UA", "NCAR", "C30", "C35", "S80", "S88", "LP82", "YT96", "UA", "NCAR", "C30", "C35",
"ecmwf", "Beljaars" "ecmwf", "Beljaars"
...@@ -770,7 +803,8 @@ def AirSeaFluxCode(spd, T, SST, meth, lat=None, hum=None, P=None, hin=18, ...@@ -770,7 +803,8 @@ def AirSeaFluxCode(spd, T, SST, meth, lat=None, hum=None, P=None, hin=18,
iclass = globals()[meth]() iclass = globals()[meth]()
iclass.add_gust(gust=gust) iclass.add_gust(gust=gust)
iclass.add_variables(spd, T, SST, lat=lat, hum=hum, P=P, L=L) iclass.add_variables(spd, T, SST, SST_fl, cskin=cskin, lat=lat, hum=hum,
P=P, L=L)
iclass.get_heights(hin, hout) iclass.get_heights(hin, hout)
iclass.get_specHumidity(qmeth=qmeth) iclass.get_specHumidity(qmeth=qmeth)
iclass.set_coolskin_warmlayer(wl=wl, cskin=cskin, skin=skin, Rl=Rl, Rs=Rs) iclass.set_coolskin_warmlayer(wl=wl, cskin=cskin, skin=skin, Rl=Rl, Rs=Rs)
......
...@@ -186,25 +186,32 @@ def get_outvars(out_var, cskin, gust): ...@@ -186,25 +186,32 @@ def get_outvars(out_var, cskin, gust):
"usr", "psim", "psit", "psiq", "psim_ref", "psit_ref", "usr", "psim", "psit", "psiq", "psim_ref", "psit_ref",
"psiq_ref", "u10n", "t10n", "q10n", "zo", "zot", "zoq", "psiq_ref", "u10n", "t10n", "q10n", "zo", "zot", "zoq",
"uref", "tref", "qref", "dter", "dqer", "dtwl", "tkt", "uref", "tref", "qref", "dter", "dqer", "dtwl", "tkt",
"qair", "qsea", "Rl", "Rs", "Rnl", "Rb", "rh", "rho", "Rl", "Rs", "Rnl""qair", "qsea", "Rb", "rh", "rho",
"cp", "lv", "theta", "itera") "cp", "lv", "theta", "itera")
elif cskin == 0 and gust[0] != 0: # skin OFF and gust ON elif cskin == 0 and gust[0] != 0: # skin OFF and gust ON
res_vars = ("tau", "sensible", "latent", "monob", "cd", "cd10n",
"ct", "ct10n", "cq", "cq10n", "tsrv", "tsr", "qsr",
"usr", "usr_gust", "usr_nogust","ug", "GustFact",
"psim", "psit", "psiq", "psim_ref", "psit_ref",
"psiq_ref", "u10n", "t10n", "q10n", "zo", "zot", "zoq",
"uref", "tref", "qref", "qair", "qsea", "Rb", "rh",
"rho", "cp", "lv", "theta", "itera")
elif cskin == 0 and gust[0] == 0:
res_vars = ("tau", "sensible", "latent", "monob", "cd", "cd10n", res_vars = ("tau", "sensible", "latent", "monob", "cd", "cd10n",
"ct", "ct10n", "cq", "cq10n", "tsrv", "tsr", "qsr", "ct", "ct10n", "cq", "cq10n", "tsrv", "tsr", "qsr",
"usr", "psim", "psit", "psiq", "psim_ref", "psit_ref", "usr", "psim", "psit", "psiq", "psim_ref", "psit_ref",
"psiq_ref", "u10n", "t10n", "q10n", "zo", "zot", "zoq", "psiq_ref", "u10n", "t10n", "q10n", "zo", "zot", "zoq",
"uref", "tref", "qref", "qair", "qsea", "ug", "usrGF", "uref", "tref", "qref", "qair", "qsea", "Rb", "rh",
"GustFact", "Rb", "rh", "rho", "cp", "lv", "theta", "rho", "cp", "lv", "theta", "itera")
"itera")
else: else:
res_vars = ("tau", "sensible", "latent", "monob", "cd", "cd10n", res_vars = ("tau", "sensible", "latent", "monob", "cd", "cd10n",
"ct", "ct10n", "cq", "cq10n", "tsrv", "tsr", "qsr", "ct", "ct10n", "cq", "cq10n", "tsrv", "tsr", "qsr",
"usr", "psim", "psit", "psiq", "psim_ref", "psit_ref", "usr", "usr_gust", "usr_nogust","ug", "GustFact",
"psim", "psit", "psiq", "psim_ref", "psit_ref",
"psiq_ref", "u10n", "t10n", "q10n", "zo", "zot", "zoq", "psiq_ref", "u10n", "t10n", "q10n", "zo", "zot", "zoq",
"uref", "tref", "qref", "dter", "dqer", "dtwl", "tkt", "uref", "tref", "qref", "dter", "dqer", "dtwl", "tkt",
"qair", "qsea", "Rl", "Rs", "Rnl", "ug", "usrGF", "Rl", "Rs", "Rnl", "qair", "qsea", "Rb", "rh", "rho",
"GustFact", "Rb", "rh", "rho", "cp", "lv", "theta", "cp", "lv", "theta", "itera")
"itera")
elif out_var == "limited": elif out_var == "limited":
res_vars = ("tau", "sensible", "latent", "uref", "tref", "qref") res_vars = ("tau", "sensible", "latent", "uref", "tref", "qref")
else: else:
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment