From 6a8db9255223d280db80383ed4920e385d6eff77 Mon Sep 17 00:00:00 2001 From: sbiri <sbiri@noc.ac.uk> Date: Tue, 15 Mar 2022 12:41:00 +0000 Subject: [PATCH] renamed GustFact to GFo where appropriate added SST flag rearranged and added output variables in get_outvars --- Code/AirSeaFluxCode.py | 78 ++++++++++++++++++++++++++++++------------ Code/util_subs.py | 23 ++++++++----- 2 files changed, 71 insertions(+), 30 deletions(-) diff --git a/Code/AirSeaFluxCode.py b/Code/AirSeaFluxCode.py index 9766dfb..a670880 100644 --- a/Code/AirSeaFluxCode.py +++ b/Code/AirSeaFluxCode.py @@ -23,10 +23,10 @@ class S88: self.u10n[ind] = self.wind[ind]-self.usr[ind]/kappa*( np.log(self.h_in[0, ind]/self.ref10)-self.psim[ind]) 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.GustFact[ind]*(np.log(self.h_in[0, ind]/self.ref10) - - self.psim[ind]) + np.sqrt(self.GustFact[ind])*( + np.log(self.h_in[0, ind]/self.ref10)-self.psim[ind]) else: # initalisation of wind self.wind[ind] = np.copy(self.spd[ind]) @@ -82,11 +82,32 @@ class S88: def _update_coolskin_warmlayer(self, ind): if self.cskin == 1: - self.dter[ind], self.tkt[ind] = cs(np.copy( - self.SST[ind]), np.copy(self.tkt[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], - self.skin) + # self.dter[ind], self.tkt[ind] = cs(np.copy( + # self.SST[ind]), np.copy(self.tkt[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], + # 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.qsea[ind], self.lv[ind]) self.skt[ind] = np.copy(self.SST[ind])+self.dter[ind] @@ -371,12 +392,12 @@ class S88: self._get_humidity() # Get the Relative humidity self._flag(out=out) # Get flags - self.GustFact = apply_GF(self.gust, self.spd, self.wind, "TSF") - self.tau = self.rho*np.power(self.usr, 2)/self.GustFact[0] - self.sensible = self.rho*self.cp*(self.usr/self.GustFact[1])*self.tsr - self.latent = self.rho*self.lv*(self.usr/self.GustFact[2])*self.qsr + self.GFo = apply_GF(self.gust, self.spd, self.wind, "TSF") + self.tau = self.rho*np.power(self.usr, 2)/self.GFo[0] + self.sensible = self.rho*self.cp*(self.usr/self.GFo[1])*self.tsr + 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]: self.u10n = self.wind-self.usr/kappa*( np.log(self.h_in[0]/self.ref10)-self.psim) @@ -384,13 +405,15 @@ class S88: np.log(self.h_in[0]/self.h_out[0])-self.psim + psim_calc(self.h_out[0]/self.monob, self.meth)) else: - self.u10n = self.spd-self.usr/kappa/self.GustFact*( - np.log(self.h_in[0]/self.ref10)-self.psim) - self.uref = 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) # C.4-7 + self.uref = self.spd-self.usr/kappa/self.GFo * \ (np.log(self.h_in[0]/self.h_out[0])-self.psim + 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 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 + @@ -462,12 +485,19 @@ class S88: 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 assert type(spd) == type(T) == type( SST) == np.ndarray, "input type of spd, T and SST should be" " 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.arr_shp = spd.shape self.nlen = len(spd) @@ -609,8 +639,8 @@ class Beljaars(C30): # self.skin = "Beljaars" -def AirSeaFluxCode(spd, T, SST, meth, lat=None, hum=None, P=None, hin=18, - hout=10, Rl=None, Rs=None, cskin=0, skin=None, wl=0, +def AirSeaFluxCode(spd, T, SST, SST_fl, meth, lat=None, hum=None, P=None, + hin=18, hout=10, Rl=None, Rs=None, cskin=0, skin=None, wl=0, gust=None, qmeth="Buck2", tol=None, maxiter=10, out=0, out_var=None, L=None): """ @@ -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) SST : float 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 "S80", "S88", "LP82", "YT96", "UA", "NCAR", "C30", "C35", "ecmwf", "Beljaars" @@ -770,7 +803,8 @@ def AirSeaFluxCode(spd, T, SST, meth, lat=None, hum=None, P=None, hin=18, iclass = globals()[meth]() 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_specHumidity(qmeth=qmeth) iclass.set_coolskin_warmlayer(wl=wl, cskin=cskin, skin=skin, Rl=Rl, Rs=Rs) diff --git a/Code/util_subs.py b/Code/util_subs.py index c6acb65..8970f02 100644 --- a/Code/util_subs.py +++ b/Code/util_subs.py @@ -186,25 +186,32 @@ def get_outvars(out_var, cskin, gust): "usr", "psim", "psit", "psiq", "psim_ref", "psit_ref", "psiq_ref", "u10n", "t10n", "q10n", "zo", "zot", "zoq", "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") 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", "ct", "ct10n", "cq", "cq10n", "tsrv", "tsr", "qsr", "usr", "psim", "psit", "psiq", "psim_ref", "psit_ref", "psiq_ref", "u10n", "t10n", "q10n", "zo", "zot", "zoq", - "uref", "tref", "qref", "qair", "qsea", "ug", "usrGF", - "GustFact", "Rb", "rh", "rho", "cp", "lv", "theta", - "itera") + "uref", "tref", "qref", "qair", "qsea", "Rb", "rh", + "rho", "cp", "lv", "theta", "itera") else: res_vars = ("tau", "sensible", "latent", "monob", "cd", "cd10n", "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", "uref", "tref", "qref", "dter", "dqer", "dtwl", "tkt", - "qair", "qsea", "Rl", "Rs", "Rnl", "ug", "usrGF", - "GustFact", "Rb", "rh", "rho", "cp", "lv", "theta", - "itera") + "Rl", "Rs", "Rnl", "qair", "qsea", "Rb", "rh", "rho", + "cp", "lv", "theta", "itera") elif out_var == "limited": res_vars = ("tau", "sensible", "latent", "uref", "tref", "qref") else: -- GitLab