1 |
SUBROUTINE HBTM(knon, paprs, pplay, |
module HBTM_m |
2 |
. t2m,t10m,q2m,q10m,ustar, |
|
3 |
. flux_t,flux_q,u,v,t,q, |
IMPLICIT none |
4 |
. pblh,cape,EauLiq,ctei,pblT, |
|
5 |
. therm,trmb1,trmb2,trmb3,plcl) |
contains |
6 |
use dimens_m |
|
7 |
use dimphy |
SUBROUTINE HBTM(knon, paprs, pplay, t2m, q2m, ustar, flux_t, & |
8 |
use YOMCST |
flux_q, u, v, t, q, pblh, cape, EauLiq, ctei, pblT, therm, trmb1, & |
9 |
use yoethf |
trmb2, trmb3, plcl) |
10 |
use fcttre |
|
11 |
IMPLICIT none |
! D'apr\'es Holstag et Boville et Troen et Mahrt |
12 |
|
! JAS 47 BLM |
13 |
c*************************************************************** |
! Algorithme th\'ese Anne Mathieu |
14 |
c* * |
! Crit\'ere d'entra\^inement Peter Duynkerke (JAS 50) |
15 |
c* HBTM2 D'apres Holstag&Boville et Troen&Mahrt * |
! written by: Anne MATHIEU and Alain LAHELLEC, 22nd November 1999 |
16 |
c* JAS 47 BLM * |
! features : implem. exces Mathieu |
17 |
c* Algorithme These Anne Mathieu * |
|
18 |
c* Critere d'Entrainement Peter Duynkerke (JAS 50) * |
! modifications : decembre 99 passage th a niveau plus bas. voir fixer |
19 |
c* written by : Anne MATHIEU & Alain LAHELLEC, 22/11/99 * |
! la prise du th a z/Lambda = -.2 (max Ray) |
20 |
c* features : implem. exces Mathieu * |
! Autre algo : entrainement ~ Theta+v =cste mais comment=>The? |
21 |
c*************************************************************** |
! on peut fixer q a .7 qsat (cf. non adiabatique) => T2 et The2 |
22 |
c* mods : decembre 99 passage th a niveau plus bas. voir fixer * |
! voir aussi //KE pblh = niveau The_e ou l = env. |
23 |
c* la prise du th a z/Lambda = -.2 (max Ray) * |
|
24 |
c* Autre algo : entrainement ~ Theta+v =cste mais comment=>The?* |
! fin therm a la HBTM passage a forme Mathieu 12/09/2001 |
25 |
c* on peut fixer q a .7qsat(cf non adiab)=>T2 et The2 * |
|
26 |
c* voir aussi //KE pblh = niveau The_e ou l = env. * |
! Adaptation a LMDZ version couplee Pour le moment on fait passer |
27 |
c*************************************************************** |
! en argument les grandeurs de surface : flux, t, q2m, t, on va |
28 |
c* fin therm a la HBTM passage a forme Mathieu 12/09/2001 * |
! utiliser systematiquement les grandeurs a 2m mais on garde la |
29 |
c*************************************************************** |
! possibilit\'e de changer si besoin est (jusqu'à pr\'esent la |
30 |
c* |
! forme de HB avec le 1er niveau modele etait conservee) |
31 |
c |
|
32 |
c |
USE dimphy, ONLY: klev, klon |
33 |
cAM Fev 2003 |
USE suphec_m, ONLY: rcpd, rd, retv, rg, rkappa, rlvtt, rtt, rv |
34 |
c Adaptation a LMDZ version couplee |
USE yoethf_m, ONLY: r2es, rvtmp2 |
35 |
c |
USE fcttre, ONLY: foeew |
36 |
c Pour le moment on fait passer en argument les grdeurs de surface : |
|
37 |
c flux, t,q2m, t,q10m, on va utiliser systematiquement les grdeurs a 2m ms |
REAL RLvCp, REPS |
38 |
c on garde la possibilite de changer si besoin est (jusqu'a present la |
! Arguments: |
39 |
c forme de HB avec le 1er niveau modele etait conservee) |
|
40 |
c |
! nombre de points a calculer |
41 |
c |
INTEGER, intent(in):: knon |
42 |
c |
|
43 |
c |
REAL, intent(in):: t2m(klon) ! temperature a 2 m |
44 |
c |
! q a 2 et 10m |
45 |
REAL RLvCp, REPS |
REAL q2m(klon) |
46 |
c Arguments: |
REAL ustar(klon) |
47 |
c |
! pression a inter-couche (Pa) |
48 |
INTEGER knon ! nombre de points a calculer |
REAL paprs(klon, klev+1) |
49 |
cAM |
! pression au milieu de couche (Pa) |
50 |
REAL t2m(klon), t10m(klon) ! temperature a 2 et 10m |
REAL pplay(klon, klev) |
51 |
REAL q2m(klon), q10m(klon) ! q a 2 et 10m |
! Flux |
52 |
REAL ustar(klon) |
REAL flux_t(klon, klev), flux_q(klon, klev) |
53 |
REAL paprs(klon,klev+1) ! pression a inter-couche (Pa) |
! vitesse U (m/s) |
54 |
REAL pplay(klon,klev) ! pression au milieu de couche (Pa) |
REAL u(klon, klev) |
55 |
REAL flux_t(klon,klev), flux_q(klon,klev) ! Flux |
! vitesse V (m/s) |
56 |
REAL u(klon,klev) ! vitesse U (m/s) |
REAL v(klon, klev) |
57 |
REAL v(klon,klev) ! vitesse V (m/s) |
! temperature (K) |
58 |
REAL t(klon,klev) ! temperature (K) |
REAL t(klon, klev) |
59 |
REAL q(klon,klev) ! vapeur d'eau (kg/kg) |
! vapeur d'eau (kg/kg) |
60 |
cAM REAL cd_h(klon) ! coefficient de friction au sol pour chaleur |
REAL q(klon, klev) |
61 |
cAM REAL cd_m(klon) ! coefficient de friction au sol pour vitesse |
|
62 |
c |
INTEGER isommet |
63 |
INTEGER isommet |
! limite max sommet pbl |
64 |
PARAMETER (isommet=klev) ! limite max sommet pbl |
PARAMETER (isommet=klev) |
65 |
REAL vk |
REAL vk |
66 |
PARAMETER (vk=0.35) ! Von Karman => passer a .41 ! cf U.Olgstrom |
! Von Karman => passer a .41 ! cf U.Olgstrom |
67 |
REAL ricr |
PARAMETER (vk=0.35) |
68 |
PARAMETER (ricr=0.4) |
REAL ricr |
69 |
REAL fak |
PARAMETER (ricr=0.4) |
70 |
PARAMETER (fak=8.5) ! b calcul du Prandtl et de dTetas |
REAL fak |
71 |
REAL fakn |
! b calcul du Prandtl et de dTetas |
72 |
PARAMETER (fakn=7.2) ! a |
PARAMETER (fak=8.5) |
73 |
REAL onet |
REAL fakn |
74 |
PARAMETER (onet=1.0/3.0) |
! a |
75 |
REAL t_coup |
PARAMETER (fakn=7.2) |
76 |
PARAMETER(t_coup=273.15) |
REAL onet |
77 |
REAL zkmin |
PARAMETER (onet=1.0/3.0) |
78 |
PARAMETER (zkmin=0.01) |
REAL t_coup |
79 |
REAL betam |
PARAMETER(t_coup=273.15) |
80 |
PARAMETER (betam=15.0) ! pour Phim / h dans la S.L stable |
REAL zkmin |
81 |
REAL betah |
PARAMETER (zkmin=0.01) |
82 |
PARAMETER (betah=15.0) |
REAL betam |
83 |
REAL betas |
! pour Phim / h dans la S.L stable |
84 |
PARAMETER (betas=5.0) ! Phit dans la S.L. stable (mais 2 formes / z/OBL<>1 |
PARAMETER (betam=15.0) |
85 |
REAL sffrac |
REAL betah |
86 |
PARAMETER (sffrac=0.1) ! S.L. = z/h < .1 |
PARAMETER (betah=15.0) |
87 |
REAL binm |
REAL betas |
88 |
PARAMETER (binm=betam*sffrac) |
! Phit dans la S.L. stable (mais 2 formes / |
89 |
REAL binh |
PARAMETER (betas=5.0) |
90 |
PARAMETER (binh=betah*sffrac) |
! z/OBL<>1 |
91 |
REAL ccon |
REAL sffrac |
92 |
PARAMETER (ccon=fak*sffrac*vk) |
! S.L. = z/h < .1 |
93 |
c |
PARAMETER (sffrac=0.1) |
94 |
REAL q_star,t_star |
REAL binm |
95 |
REAL b1,b2,b212,b2sr ! Lambert correlations T' q' avec T* q* |
PARAMETER (binm=betam*sffrac) |
96 |
PARAMETER (b1=70.,b2=20.) |
REAL binh |
97 |
c |
PARAMETER (binh=betah*sffrac) |
98 |
REAL z(klon,klev) |
REAL ccon |
99 |
cAM REAL pcfm(klon,klev), pcfh(klon,klev) |
PARAMETER (ccon=fak*sffrac*vk) |
100 |
cAM |
|
101 |
REAL zref |
REAL q_star, t_star |
102 |
PARAMETER (zref=2.) ! Niveau de ref a 2m peut eventuellement |
! Lambert correlations T' q' avec T* q* |
103 |
c etre choisi a 10m |
REAL b1, b2, b212, b2sr |
104 |
cMA |
PARAMETER (b1=70., b2=20.) |
105 |
c |
|
106 |
INTEGER i, k, j |
REAL z(klon, klev) |
107 |
REAL zxt |
|
108 |
cAM REAL zxt, zxq, zxu, zxv, zxmod, taux, tauy |
REAL zref |
109 |
cAM REAL zx_alf1, zx_alf2 ! parametres pour extrapolation |
! Niveau de ref a 2m peut eventuellement |
110 |
REAL khfs(klon) ! surface kinematic heat flux [mK/s] |
PARAMETER (zref=2.) |
111 |
REAL kqfs(klon) ! sfc kinematic constituent flux [m/s] |
! etre choisi a 10m |
112 |
REAL heatv(klon) ! surface virtual heat flux |
|
113 |
REAL rhino(klon,klev) ! bulk Richardon no. mais en Theta_v |
INTEGER i, k |
114 |
LOGICAL unstbl(klon) ! pts w/unstbl pbl (positive virtual ht flx) |
REAL zxt |
115 |
LOGICAL stblev(klon) ! stable pbl with levels within pbl |
! surface kinematic heat flux [mK/s] |
116 |
LOGICAL unslev(klon) ! unstbl pbl with levels within pbl |
REAL khfs(klon) |
117 |
LOGICAL unssrf(klon) ! unstb pbl w/lvls within srf pbl lyr |
! sfc kinematic constituent flux [m/s] |
118 |
LOGICAL unsout(klon) ! unstb pbl w/lvls in outer pbl lyr |
REAL kqfs(klon) |
119 |
LOGICAL check(klon) ! True=>chk if Richardson no.>critcal |
! surface virtual heat flux |
120 |
LOGICAL omegafl(klon) ! flag de prolongerment cape pour pt Omega |
REAL heatv(klon) |
121 |
REAL pblh(klon) |
! bulk Richardon no. mais en Theta_v |
122 |
REAL pblT(klon) |
REAL rhino(klon, klev) |
123 |
REAL plcl(klon) |
! pts w/unstbl pbl (positive virtual ht flx) |
124 |
cAM REAL cgh(klon,2:klev) ! counter-gradient term for heat [K/m] |
LOGICAL unstbl(klon) |
125 |
cAM REAL cgq(klon,2:klev) ! counter-gradient term for constituents |
! stable pbl with levels within pbl |
126 |
cAM REAL cgs(klon,2:klev) ! counter-gradient star (cg/flux) |
LOGICAL stblev(klon) |
127 |
REAL obklen(klon) ! Monin-Obukhov lengh |
! unstbl pbl with levels within pbl |
128 |
cAM REAL ztvd, ztvu, |
LOGICAL unslev(klon) |
129 |
REAL zdu2 |
! unstb pbl w/lvls within srf pbl lyr |
130 |
REAL therm(klon) ! thermal virtual temperature excess |
LOGICAL unssrf(klon) |
131 |
REAL trmb1(klon),trmb2(klon),trmb3(klon) |
! unstb pbl w/lvls in outer pbl lyr |
132 |
C Algorithme thermique |
LOGICAL unsout(klon) |
133 |
REAL s(klon,klev) ! [P/Po]^Kappa milieux couches |
LOGICAL check(klon) ! Richardson number > critical |
134 |
REAL Th_th(klon) ! potential temperature of thermal |
! flag de prolongerment cape pour pt Omega |
135 |
REAL The_th(klon) ! equivalent potential temperature of thermal |
LOGICAL omegafl(klon) |
136 |
REAL qT_th(klon) ! total water of thermal |
REAL pblh(klon) |
137 |
REAL Tbef(klon) ! T thermique niveau precedent |
REAL pblT(klon) |
138 |
REAL qsatbef(klon) |
REAL plcl(klon) |
139 |
LOGICAL Zsat(klon) ! le thermique est sature |
|
140 |
REAL Cape(klon) ! Cape du thermique |
! Monin-Obukhov lengh |
141 |
REAL Kape(klon) ! Cape locale |
REAL obklen(klon) |
142 |
REAL EauLiq(klon) ! Eau liqu integr du thermique |
|
143 |
REAL ctei(klon) ! Critere d'instab d'entrainmt des nuages de CL |
REAL zdu2 |
144 |
REAL the1,the2,aa,bb,zthvd,zthvu,xintpos,qqsat |
! thermal virtual temperature excess |
145 |
cIM 091204 BEG |
REAL therm(klon) |
146 |
REAL a1,a2,a3 |
REAL trmb1(klon), trmb2(klon), trmb3(klon) |
147 |
cIM 091204 END |
! Algorithme thermique |
148 |
REAL xhis,rnum,denom,th1,th2,thv1,thv2,ql2 |
REAL s(klon, klev) ! [P/Po]^Kappa milieux couches |
149 |
REAL dqsat_dt,qsat2,qT1,q2,t1,t2,xnull,delt_the |
! equivalent potential temperature of therma |
150 |
REAL delt_qt,delt_2,quadsat,spblh,reduc |
REAL The_th(klon) |
151 |
c |
! total water of thermal |
152 |
REAL phiminv(klon) ! inverse phi function for momentum |
REAL qT_th(klon) |
153 |
REAL phihinv(klon) ! inverse phi function for heat |
! T thermique niveau precedent |
154 |
REAL wm(klon) ! turbulent velocity scale for momentum |
REAL Tbef(klon) |
155 |
REAL fak1(klon) ! k*ustar*pblh |
REAL qsatbef(klon) |
156 |
REAL fak2(klon) ! k*wm*pblh |
! le thermique est sature |
157 |
REAL fak3(klon) ! fakn*wstr/wm |
LOGICAL Zsat(klon) |
158 |
REAL pblk(klon) ! level eddy diffusivity for momentum |
! Cape du thermique |
159 |
REAL pr(klon) ! Prandtl number for eddy diffusivities |
REAL Cape(klon) |
160 |
REAL zl(klon) ! zmzp / Obukhov length |
! Cape locale |
161 |
REAL zh(klon) ! zmzp / pblh |
REAL Kape(klon) |
162 |
REAL zzh(klon) ! (1-(zmzp/pblh))**2 |
! Eau liqu integr du thermique |
163 |
REAL wstr(klon) ! w*, convective velocity scale |
REAL EauLiq(klon) |
164 |
REAL zm(klon) ! current level height |
! Critere d'instab d'entrainmt des nuages de |
165 |
REAL zp(klon) ! current level height + one level up |
REAL ctei(klon) |
166 |
REAL zcor, zdelta, zcvm5 |
REAL aa, zthvd, zthvu, qqsat |
167 |
cAM REAL zxqs |
REAL a1, a2, a3 |
168 |
REAL fac, pblmin, zmzp, term |
REAL t2 |
169 |
c |
|
170 |
|
! inverse phi function for momentum |
171 |
|
REAL phiminv(klon) |
172 |
|
! inverse phi function for heat |
173 |
! initialisations (Anne) |
REAL phihinv(klon) |
174 |
th_th(:) = 0. |
! turbulent velocity scale for momentum |
175 |
q_star = 0 |
REAL wm(klon) |
176 |
t_star = 0 |
! k*ustar*pblh |
177 |
|
REAL fak1(klon) |
178 |
|
! k*wm*pblh |
179 |
b212=sqrt(b1*b2) |
REAL fak2(klon) |
180 |
b2sr=sqrt(b2) |
! fakn*wstr/wm |
181 |
c |
REAL fak3(klon) |
182 |
C ============================================================ |
! level eddy diffusivity for momentum |
183 |
C Fonctions thermo implicites |
REAL pblk(klon) |
184 |
C ============================================================ |
! Prandtl number for eddy diffusivities |
185 |
c +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
REAL pr(klon) |
186 |
c Tetens : pression partielle de vap d'eau e_sat(T) |
! zmzp / Obukhov length |
187 |
c ================================================= |
REAL zl(klon) |
188 |
C++ e_sat(T) = r2*exp( r3*(T-Tf)/(T-r4) ) id a r2*FOEWE |
! zmzp / pblh |
189 |
C++ avec : |
REAL zh(klon) |
190 |
C++ Tf = 273.16 K (Temp de fusion de la glace) |
! (1-(zmzp/pblh))**2 |
191 |
C++ r2 = 611.14 Pa |
REAL zzh(klon) |
192 |
C++ r3 = 17.269 (liquide) 21.875 (solide) adim |
! w*, convective velocity scale |
193 |
C++ r4 = 35.86 7.66 Kelvin |
REAL wstr(klon) |
194 |
C++ q_sat = eps*e_sat/(p-(1-eps)*e_sat) |
! current level height |
195 |
C++ derivée : |
REAL zm(klon) |
196 |
C++ ========= |
! current level height + one level up |
197 |
C++ r3*(Tf-r4)*q_sat(T,p) |
REAL zp(klon) |
198 |
C++ d_qsat_dT = -------------------------------- |
REAL zcor |
199 |
C++ (T-r4)^2*( 1-(1-eps)*e_sat(T)/p ) |
|
200 |
c++ pour zcvm5=Lv, c'est FOEDE |
REAL fac, pblmin, zmzp, term |
201 |
c++ Rq :(1.-REPS)*esarg/Parg id a RETV*Qsat |
|
202 |
C ------------------------------------------------------------------ |
!----------------------------------------------------------------- |
203 |
c |
|
204 |
c Initialisation |
! initialisations |
205 |
RLvCp = RLVTT/RCPD |
q_star = 0 |
206 |
REPS = RD/RV |
t_star = 0 |
207 |
|
|
208 |
c |
b212=sqrt(b1*b2) |
209 |
c DO i = 1, klon |
b2sr=sqrt(b2) |
210 |
c pcfh(i,1) = cd_h(i) |
|
211 |
c pcfm(i,1) = cd_m(i) |
! Initialisation |
212 |
c ENDDO |
RLvCp = RLVTT/RCPD |
213 |
c DO k = 2, klev |
REPS = RD/RV |
214 |
c DO i = 1, klon |
|
215 |
c pcfh(i,k) = zkmin |
! Calculer les hauteurs de chaque couche |
216 |
c pcfm(i,k) = zkmin |
! (geopotentielle Int_dp/ro = Int_[Rd.T.dp/p] z = geop/g) |
217 |
c cgs(i,k) = 0.0 |
! pourquoi ne pas utiliser Phi/RG ? |
218 |
c cgh(i,k) = 0.0 |
DO i = 1, knon |
219 |
c cgq(i,k) = 0.0 |
z(i, 1) = RD * t(i, 1) / (0.5*(paprs(i, 1)+pplay(i, 1))) & |
220 |
c ENDDO |
* (paprs(i, 1)-pplay(i, 1)) / RG |
221 |
c ENDDO |
s(i, 1) = (pplay(i, 1)/paprs(i, 1))**RKappa |
222 |
c |
ENDDO |
223 |
c Calculer les hauteurs de chaque couche |
! s(k) = [pplay(k)/ps]^kappa |
224 |
c (geopotentielle Int_dp/ro = Int_[Rd.T.dp/p] z = geop/g) |
! + + + + + + + + + pplay <-> s(k) t dp=pplay(k-1)-pplay(k) |
225 |
c pourquoi ne pas utiliser Phi/RG ? |
! ----------------- paprs <-> sig(k) |
226 |
DO i = 1, knon |
! + + + + + + + + + pplay <-> s(k-1) |
227 |
z(i,1) = RD * t(i,1) / (0.5*(paprs(i,1)+pplay(i,1))) |
! + + + + + + + + + pplay <-> s(1) t dp=paprs-pplay z(1) |
228 |
. * (paprs(i,1)-pplay(i,1)) / RG |
! ----------------- paprs <-> sig(1) |
229 |
s(i,1) = (pplay(i,1)/paprs(i,1))**RKappa |
|
230 |
ENDDO |
DO k = 2, klev |
231 |
c s(k) = [pplay(k)/ps]^kappa |
DO i = 1, knon |
232 |
c + + + + + + + + + pplay <-> s(k) t dp=pplay(k-1)-pplay(k) |
z(i, k) = z(i, k-1) & |
233 |
c |
+ RD * 0.5*(t(i, k-1)+t(i, k)) / paprs(i, k) & |
234 |
c ----------------- paprs <-> sig(k) |
* (pplay(i, k-1)-pplay(i, k)) / RG |
235 |
c |
s(i, k) = (pplay(i, k) / paprs(i, 1))**RKappa |
236 |
c + + + + + + + + + pplay <-> s(k-1) |
ENDDO |
237 |
c |
ENDDO |
238 |
c |
|
239 |
c + + + + + + + + + pplay <-> s(1) t dp=paprs-pplay z(1) |
! Determination des grandeurs de surface |
240 |
c |
DO i = 1, knon |
241 |
c ----------------- paprs <-> sig(1) |
! Niveau de ref choisi a 2m |
242 |
c |
zxt = t2m(i) |
243 |
DO k = 2, klev |
|
244 |
DO i = 1, knon |
! convention >0 vers le bas ds lmdz |
245 |
z(i,k) = z(i,k-1) |
khfs(i) = - flux_t(i, 1)*zxt*Rd / (RCPD*paprs(i, 1)) |
246 |
. + RD * 0.5*(t(i,k-1)+t(i,k)) / paprs(i,k) |
kqfs(i) = - flux_q(i, 1)*zxt*Rd / (paprs(i, 1)) |
247 |
. * (pplay(i,k-1)-pplay(i,k)) / RG |
! verifier que khfs et kqfs sont bien de la forme w'l' |
248 |
s(i,k) = (pplay(i,k)/paprs(i,1))**RKappa |
heatv(i) = khfs(i) + 0.608*zxt*kqfs(i) |
249 |
ENDDO |
! a comparer aussi aux sorties de clqh : flux_T/RoCp et flux_q/RoLv |
250 |
ENDDO |
! Theta et qT du thermique sans exces (interpolin vers surf) |
251 |
c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
! chgt de niveau du thermique (jeudi 30/12/1999) |
252 |
c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
! (interpolation lineaire avant integration phi_h) |
253 |
c +++ Determination des grandeurs de surface +++++++++++++++++++++ |
qT_th(i) = q2m(i) |
254 |
c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
ENDDO |
255 |
c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
|
256 |
DO i = 1, knon |
DO i = 1, knon |
257 |
cAM IF (thermcep) THEN |
! Global Richardson |
258 |
cAM zdelta=MAX(0.,SIGN(1.,RTT-tsol(i))) |
rhino(i, 1) = 0.0 |
259 |
c zcvm5 = R5LES*RLVTT*(1.-zdelta) + R5IES*RLSTT*zdelta |
check(i) = .TRUE. |
260 |
c zcvm5 = zcvm5 / RCPD / (1.0+RVTMP2*q(i,1)) |
! on initialise pblh a l'altitude du 1er niv |
261 |
cAM zxqs= r2es * FOEEW(tsol(i),zdelta)/paprs(i,1) |
pblh(i) = z(i, 1) |
262 |
cAM zxqs=MIN(0.5,zxqs) |
plcl(i) = 6000. |
263 |
cAM zcor=1./(1.-retv*zxqs) |
! Lambda = -u*^3 / (alpha.g.kvon.<w'Theta'v> |
264 |
cAM zxqs=zxqs*zcor |
obklen(i) = -t(i, 1)*ustar(i)**3/(RG*vk*heatv(i)) |
265 |
cAM ELSE |
trmb1(i) = 0. |
266 |
cAM IF (tsol(i).LT.t_coup) THEN |
trmb2(i) = 0. |
267 |
cAM zxqs = qsats(tsol(i)) / paprs(i,1) |
trmb3(i) = 0. |
268 |
cAM ELSE |
ENDDO |
269 |
cAM zxqs = qsatl(tsol(i)) / paprs(i,1) |
|
270 |
cAM ENDIF |
! PBL height calculation: Search for level of pbl. Scan upward |
271 |
cAM ENDIF |
! until the Richardson number between the first level and the |
272 |
c niveau de reference bulk; mais ici, c,a pourrait etre le niveau de ref du thermique |
! current level exceeds the "critical" value. (bonne idee Nu de |
273 |
cAM zx_alf1 = 1.0 |
! separer le Ric et l'exces de temp du thermique) |
274 |
cAM zx_alf2 = 1.0 - zx_alf1 |
fac = 100. |
275 |
cAM zxt = (t(i,1)+z(i,1)*RG/RCPD/(1.+RVTMP2*q(i,1))) |
DO k = 2, isommet |
276 |
cAM . *(1.+RETV*q(i,1))*zx_alf1 |
DO i = 1, knon |
277 |
cAM . + (t(i,2)+z(i,2)*RG/RCPD/(1.+RVTMP2*q(i,2))) |
IF (check(i)) THEN |
278 |
cAM . *(1.+RETV*q(i,2))*zx_alf2 |
! pourquoi / niveau 1 (au lieu du sol) et le terme en u*^2 ? |
279 |
cAM zxu = u(i,1)*zx_alf1+u(i,2)*zx_alf2 |
zdu2 = u(i, k)**2+v(i, k)**2 |
280 |
cAM zxv = v(i,1)*zx_alf1+v(i,2)*zx_alf2 |
zdu2 = max(zdu2, 1.0e-20) |
281 |
cAM zxq = q(i,1)*zx_alf1+q(i,2)*zx_alf2 |
! Theta_v environnement |
282 |
cAM |
zthvd=t(i, k)/s(i, k)*(1.+RETV*q(i, k)) |
283 |
cAMAM zxu = u10m(i) |
|
284 |
cAMAM zxv = v10m(i) |
! therm Theta_v sans exces (avec hypothese fausse de H&B, sinon, |
285 |
cAMAM zxmod = 1.0+SQRT(zxu**2+zxv**2) |
! passer par Theta_e et virpot) |
286 |
cAM Niveau de ref choisi a 2m |
zthvu = T2m(i)*(1.+RETV*qT_th(i)) |
287 |
zxt = t2m(i) |
! Le Ri par Theta_v |
288 |
|
! On a nveau de ref a 2m ??? |
289 |
c *************************************************** |
rhino(i, k) = (z(i, k)-zref)*RG*(zthvd-zthvu) & |
290 |
c attention, il doit s'agir de <w'theta'> |
/(zdu2*0.5*(zthvd+zthvu)) |
291 |
c ;Calcul de tcls virtuel et de w'theta'virtuel |
|
292 |
c ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
IF (rhino(i, k).GE.ricr) THEN |
293 |
c tcls=tcls*(1+.608*qcls) |
pblh(i) = z(i, k-1) + (z(i, k-1)-z(i, k)) * & |
294 |
c |
(ricr-rhino(i, k-1))/(rhino(i, k-1)-rhino(i, k)) |
295 |
c ;Pour avoir w'theta', |
! test04 |
296 |
c ; il faut diviser par ro.Cp |
pblh(i) = pblh(i) + 100. |
297 |
c Cp=Cpd*(1+0.84*qcls) |
pblT(i) = t(i, k-1) + (t(i, k)-t(i, k-1)) * & |
298 |
c fcs=fcs/(ro_surf*Cp) |
(pblh(i)-z(i, k-1))/(z(i, k)-z(i, k-1)) |
299 |
c ;On transforme w'theta' en w'thetav' |
check(i) = .FALSE. |
300 |
c Lv=(2.501-0.00237*(tcls-273.15))*1.E6 |
ENDIF |
301 |
c xle=xle/(ro_surf*Lv) |
ENDIF |
302 |
c fcsv=fcs+.608*xle*tcls |
ENDDO |
303 |
c *************************************************** |
ENDDO |
304 |
cAM khfs(i) = (tsol(i)*(1.+RETV*q(i,1))-zxt) *zxmod*cd_h(i) |
|
305 |
cAM kqfs(i) = (zxqs-zxq) *zxmod*cd_h(i) * beta(i) |
! Set pbl height to maximum value where computation exceeds number of |
306 |
cAM |
! layers allowed |
307 |
cdif khfs est deja w't'_v / heatv(i) = khfs(i) + RETV*zxt*kqfs(i) |
DO i = 1, knon |
308 |
cAM calcule de Ro = paprs(i,1)/Rd zxt |
if (check(i)) pblh(i) = z(i, isommet) |
309 |
cAM convention >0 vers le bas ds lmdz |
ENDDO |
310 |
khfs(i) = - flux_t(i,1)*zxt*Rd / (RCPD*paprs(i,1)) |
|
311 |
kqfs(i) = - flux_q(i,1)*zxt*Rd / (paprs(i,1)) |
! Improve estimate of pbl height for the unstable points. |
312 |
cAM verifier que khfs et kqfs sont bien de la forme w'l' |
! Find unstable points (sensible heat flux is upward): |
313 |
heatv(i) = khfs(i) + 0.608*zxt*kqfs(i) |
DO i = 1, knon |
314 |
c a comparer aussi aux sorties de clqh : flux_T/RoCp et flux_q/RoLv |
IF (heatv(i) > 0.) THEN |
315 |
cAM heatv(i) = khfs(i) |
unstbl(i) = .TRUE. |
316 |
cAM ustar est en entree |
check(i) = .TRUE. |
317 |
cAM taux = zxu *zxmod*cd_m(i) |
ELSE |
318 |
cAM tauy = zxv *zxmod*cd_m(i) |
unstbl(i) = .FALSE. |
319 |
cAM ustar(i) = SQRT(taux**2+tauy**2) |
check(i) = .FALSE. |
320 |
cAM ustar(i) = MAX(SQRT(ustar(i)),0.01) |
ENDIF |
321 |
c Theta et qT du thermique sans exces (interpolin vers surf) |
ENDDO |
322 |
c chgt de niveau du thermique (jeudi 30/12/1999) |
|
323 |
c (interpolation lineaire avant integration phi_h) |
! For the unstable case, compute velocity scale and the |
324 |
cAM qT_th(i) = zxqs*beta(i) + 4./z(i,1)*(q(i,1)-zxqs*beta(i)) |
! convective temperature excess: |
325 |
cAM qT_th(i) = max(qT_th(i),q(i,1)) |
DO i = 1, knon |
326 |
qT_th(i) = q2m(i) |
IF (check(i)) THEN |
327 |
cn The_th restera la Theta du thermique sans exces jusqu'a 2eme calcul |
phiminv(i) = (1.-binm*pblh(i)/obklen(i))**onet |
328 |
cn reste a regler convention P) pour Theta |
|
329 |
c The_th(i) = tsol(i) + 4./z(i,1)*(t(i,1)-tsol(i)) |
! CALCUL DE wm |
330 |
c - + RLvCp*qT_th(i) |
! Ici on considerera que l'on est dans la couche de surf jusqu'a 100 |
331 |
cAM Th_th(i) = tsol(i) + 4./z(i,1)*(t(i,1)-tsol(i)) |
! On prend svt couche de surface=0.1*h mais on ne connait pas h |
332 |
Th_th(i) = t2m(i) |
! Dans la couche de surface |
333 |
ENDDO |
wm(i)= ustar(i)*phiminv(i) |
334 |
c |
|
335 |
DO i = 1, knon |
! forme Mathieu : |
336 |
rhino(i,1) = 0.0 ! Global Richardson |
q_star = kqfs(i)/wm(i) |
337 |
check(i) = .TRUE. |
t_star = khfs(i)/wm(i) |
338 |
pblh(i) = z(i,1) ! on initialise pblh a l'altitude du 1er niveau |
|
339 |
plcl(i) = 6000. |
a1=b1*(1.+2.*RETV*qT_th(i))*t_star**2 |
340 |
c Lambda = -u*^3 / (alpha.g.kvon.<w'Theta'v> |
a2=(RETV*T2m(i))**2*b2*q_star**2 |
341 |
obklen(i) = -t(i,1)*ustar(i)**3/(RG*vk*heatv(i)) |
a3=2.*RETV*T2m(i)*b212*q_star*t_star |
342 |
trmb1(i) = 0. |
aa=a1+a2+a3 |
343 |
trmb2(i) = 0. |
|
344 |
trmb3(i) = 0. |
therm(i) = sqrt( b1*(1.+2.*RETV*qT_th(i))*t_star**2 & |
345 |
ENDDO |
+ (RETV*T2m(i))**2*b2*q_star**2 & |
346 |
|
+ max(0., 2.*RETV*T2m(i)*b212*q_star*t_star)) |
347 |
C |
|
348 |
c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
! Theta et qT du thermique (forme H&B) avec exces |
349 |
C PBL height calculation: |
! (attention, on ajoute therm(i) qui est virtuelle ...) |
350 |
C Search for level of pbl. Scan upward until the Richardson number between |
! pourquoi pas sqrt(b1)*t_star ? |
351 |
C the first level and the current level exceeds the "critical" value. |
qT_th(i) = qT_th(i) + b2sr*q_star |
352 |
C (bonne idee Nu de separer le Ric et l'exces de temp du thermique) |
! new on differre le calcul de Theta_e |
353 |
c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
rhino(i, 1) = 0. |
354 |
fac = 100.0 |
ENDIF |
355 |
DO k = 2, isommet |
ENDDO |
356 |
DO i = 1, knon |
|
357 |
IF (check(i)) THEN |
! Improve pblh estimate for unstable conditions using the |
358 |
! pourquoi / niveau 1 (au lieu du sol) et le terme en u*^2 ? |
! convective temperature excess : |
359 |
ctest zdu2 = (u(i,k)-u(i,1))**2+(v(i,k)-v(i,1))**2+fac*ustar(i)**2 |
DO k = 2, isommet |
360 |
zdu2 = u(i,k)**2+v(i,k)**2 |
DO i = 1, knon |
361 |
zdu2 = max(zdu2,1.0e-20) |
IF (check(i)) THEN |
362 |
c Theta_v environnement |
zdu2 = u(i, k)**2 + v(i, k)**2 |
363 |
zthvd=t(i,k)/s(i,k)*(1.+RETV*q(i,k)) |
zdu2 = max(zdu2, 1e-20) |
364 |
c |
! Theta_v environnement |
365 |
c therm Theta_v sans exces (avec hypothese fausse de H&B, sinon, |
zthvd=t(i, k)/s(i, k)*(1.+RETV*q(i, k)) |
366 |
c passer par Theta_e et virpot) |
|
367 |
c zthvu=t(i,1)/s(i,1)*(1.+RETV*q(i,1)) |
! et therm Theta_v (avec hypothese de constance de H&B, |
368 |
cAM zthvu = Th_th(i)*(1.+RETV*q(i,1)) |
zthvu = T2m(i)*(1.+RETV*qT_th(i)) + therm(i) |
369 |
zthvu = Th_th(i)*(1.+RETV*qT_th(i)) |
|
370 |
c Le Ri par Theta_v |
! Le Ri par Theta_v |
371 |
cAM rhino(i,k) = (z(i,k)-z(i,1))*RG*(zthvd-zthvu) |
! Niveau de ref 2m |
372 |
cAM . /(zdu2*0.5*(zthvd+zthvu)) |
rhino(i, k) = (z(i, k)-zref)*RG*(zthvd-zthvu) & |
373 |
cAM On a nveau de ref a 2m ??? |
/(zdu2*0.5*(zthvd+zthvu)) |
374 |
rhino(i,k) = (z(i,k)-zref)*RG*(zthvd-zthvu) |
|
375 |
. /(zdu2*0.5*(zthvd+zthvu)) |
IF (rhino(i, k).GE.ricr) THEN |
376 |
c |
pblh(i) = z(i, k-1) + (z(i, k-1)-z(i, k)) * & |
377 |
IF (rhino(i,k).GE.ricr) THEN |
(ricr-rhino(i, k-1))/(rhino(i, k-1)-rhino(i, k)) |
378 |
pblh(i) = z(i,k-1) + (z(i,k-1)-z(i,k)) * |
! test04 |
379 |
. (ricr-rhino(i,k-1))/(rhino(i,k-1)-rhino(i,k)) |
pblh(i) = pblh(i) + 100. |
380 |
c test04 |
pblT(i) = t(i, k-1) + (t(i, k)-t(i, k-1)) * & |
381 |
pblh(i) = pblh(i) + 100. |
(pblh(i)-z(i, k-1))/(z(i, k)-z(i, k-1)) |
382 |
pblT(i) = t(i,k-1) + (t(i,k)-t(i,k-1)) * |
check(i) = .FALSE. |
383 |
. (pblh(i)-z(i,k-1))/(z(i,k)-z(i,k-1)) |
ENDIF |
384 |
check(i) = .FALSE. |
ENDIF |
385 |
ENDIF |
ENDDO |
386 |
ENDIF |
ENDDO |
387 |
ENDDO |
|
388 |
ENDDO |
! Set pbl height to maximum value where computation exceeds number of |
389 |
|
! layers allowed |
390 |
C |
DO i = 1, knon |
391 |
C Set pbl height to maximum value where computation exceeds number of |
if (check(i)) pblh(i) = z(i, isommet) |
392 |
C layers allowed |
ENDDO |
393 |
C |
|
394 |
DO i = 1, knon |
! PBL height must be greater than some minimum mechanical mixing depth |
395 |
if (check(i)) pblh(i) = z(i,isommet) |
! Several investigators have proposed minimum mechanical mixing depth |
396 |
ENDDO |
! relationships as a function of the local friction velocity, u*. We |
397 |
C |
! make use of a linear relationship of the form h = c u* where c=700. |
398 |
C Improve estimate of pbl height for the unstable points. |
! The scaling arguments that give rise to this relationship most often |
399 |
C Find unstable points (sensible heat flux is upward): |
! represent the coefficient c as some constant over the local coriolis |
400 |
C |
! parameter. Here we make use of the experimental results of Koracin |
401 |
DO i = 1, knon |
! and Berkowicz (1988) [BLM, Vol 43] for wich they recommend 0.07/f |
402 |
IF (heatv(i) .GT. 0.) THEN |
! where f was evaluated at 39.5 N and 52 N. Thus we use a typical mid |
403 |
unstbl(i) = .TRUE. |
! latitude value for f so that c = 0.07/f = 700. |
404 |
check(i) = .TRUE. |
DO i = 1, knon |
405 |
ELSE |
pblmin = 700. * ustar(i) |
406 |
unstbl(i) = .FALSE. |
pblh(i) = MAX(pblh(i), pblmin) |
407 |
check(i) = .FALSE. |
! par exemple : |
408 |
ENDIF |
pblT(i) = t(i, 2) + (t(i, 3)-t(i, 2)) * & |
409 |
ENDDO |
(pblh(i)-z(i, 2))/(z(i, 3)-z(i, 2)) |
410 |
C |
ENDDO |
411 |
C For the unstable case, compute velocity scale and the |
|
412 |
C convective temperature excess: |
! pblh is now available; do preparation for diffusivity calculation: |
413 |
C |
DO i = 1, knon |
414 |
DO i = 1, knon |
check(i) = .TRUE. |
415 |
IF (check(i)) THEN |
Zsat(i) = .FALSE. |
416 |
phiminv(i) = (1.-binm*pblh(i)/obklen(i))**onet |
! omegafl utilise pour prolongement CAPE |
417 |
c *************************************************** |
omegafl(i) = .FALSE. |
418 |
c Wm ? et W* ? c'est la formule pour z/h < .1 |
Cape(i) = 0. |
419 |
c ;Calcul de w* ;; |
Kape(i) = 0. |
420 |
c ;;;;;;;;;;;;;;;; |
EauLiq(i) = 0. |
421 |
c w_star=((g/tcls)*fcsv*z(ind))^(1/3.) [ou prendre la premiere approx de h) |
CTEI(i) = 0. |
422 |
c ;; CALCUL DE wm ;; |
pblk(i) = 0.0 |
423 |
c ;;;;;;;;;;;;;;;;;; |
fak1(i) = ustar(i)*pblh(i)*vk |
424 |
c ; Ici on considerera que l'on est dans la couche de surf jusqu'a 100m |
|
425 |
c ; On prend svt couche de surface=0.1*h mais on ne connait pas h |
! Do additional preparation for unstable cases only, set temperature |
426 |
c ;;;;;;;;;;;Dans la couche de surface |
! and moisture perturbations depending on stability. |
427 |
c if (z(ind) le 20) then begin |
! Remarque : les formule sont prises dans leur forme CS |
428 |
c Phim=(1.-15.*(z(ind)/L))^(-1/3.) |
IF (unstbl(i)) THEN |
429 |
c wm=u_star/Phim |
! Niveau de ref du thermique |
430 |
c ;;;;;;;;;;;En dehors de la couche de surface |
zxt=(T2m(i)-zref*0.5*RG/RCPD/(1.+RVTMP2*qT_th(i))) & |
431 |
c endif else if (z(ind) gt 20) then begin |
*(1.+RETV*qT_th(i)) |
|
c wm=(u_star^3+c1*w_star^3)^(1/3.) |
|
|
c endif |
|
|
c *************************************************** |
|
|
wm(i)= ustar(i)*phiminv(i) |
|
|
c====================================================================== |
|
|
cvaleurs de Dominique Lambert de la campagne SEMAPHORE : |
|
|
c <T'^2> = 100.T*^2; <q'^2> = 20.q*^2 a 10m |
|
|
c <Tv'^2> = (1+1.2q).100.T* + 1.2Tv.sqrt(20*100).T*.q* + (.608*Tv)^2*20.q*^2; |
|
|
c et dTetavS = sqrt(<Tv'^2>) ainsi calculee. |
|
|
c avec : T*=<w'T'>_s/w* et q*=<w'q'>/w* |
|
|
c !!! on peut donc utiliser w* pour les fluctuations <-> Lambert |
|
|
c(leur corellation pourrait dependre de beta par ex) |
|
|
c if fcsv(i,j) gt 0 then begin |
|
|
c dTetavs=b1*(1.+2.*.608*q_10(i,j))*(fcs(i,j)/wm(i,j))^2+$ |
|
|
c (.608*Thetav_10(i,j))^2*b2*(xle(i,j)/wm(i,j))^2+$ |
|
|
c 2.*.608*thetav_10(i,j)*sqrt(b1*b2)*(xle(i,j)/wm(i,j))*(fcs(i,j)/wm(i,j)) |
|
|
c dqs=b2*(xle(i,j)/wm(i,j))^2 |
|
|
c theta_s(i,j)=thetav_10(i,j)+sqrt(dTetavs) |
|
|
c q_s(i,j)=q_10(i,j)+sqrt(dqs) |
|
|
c endif else begin |
|
|
c Theta_s(i,j)=thetav_10(i,j) |
|
|
c q_s(i,j)=q_10(i,j) |
|
|
c endelse |
|
|
c====================================================================== |
|
|
c |
|
|
cHBTM therm(i) = heatv(i)*fak/wm(i) |
|
|
c forme Mathieu : |
|
|
q_star = kqfs(i)/wm(i) |
|
|
t_star = khfs(i)/wm(i) |
|
|
cIM 091204 BEG |
|
|
IF(1.EQ.0) THEN |
|
|
IF(t_star.LT.0..OR.q_star.LT.0.) THEN |
|
|
print*,'i t_star q_star khfs kqfs wm',i,t_star,q_star, |
|
|
$ khfs(i),kqfs(i),wm(i) |
|
|
ENDIF |
|
|
ENDIF |
|
|
cIM 091204 END |
|
|
cAM Nveau cde ref 2m => |
|
|
cAM therm(i) = sqrt( b1*(1.+2.*RETV*q(i,1))*t_star**2 |
|
|
cAM + + (RETV*T(i,1))**2*b2*q_star**2 |
|
|
cAM + + 2.*RETV*T(i,1)*b212*q_star*t_star |
|
|
cAM + ) |
|
|
cIM 091204 BEG |
|
|
a1=b1*(1.+2.*RETV*qT_th(i))*t_star**2 |
|
|
a2=(RETV*Th_th(i))**2*b2*q_star**2 |
|
|
a3=2.*RETV*Th_th(i)*b212*q_star*t_star |
|
|
aa=a1+a2+a3 |
|
|
IF(1.EQ.0) THEN |
|
|
IF (aa.LT.0.) THEN |
|
|
print*,'i a1 a2 a3 aa',i,a1,a2,a3,aa |
|
|
print*,'i qT_th Th_th t_star q_star RETV b1 b2 b212', |
|
|
$ i,qT_th(i),Th_th(i),t_star,q_star,RETV,b1,b2,b212 |
|
|
ENDIF |
|
|
ENDIF |
|
|
cIM 091204 END |
|
|
therm(i) = sqrt( b1*(1.+2.*RETV*qT_th(i))*t_star**2 |
|
|
+ + (RETV*Th_th(i))**2*b2*q_star**2 |
|
|
cIM 101204 + + 2.*RETV*Th_th(i)*b212*q_star*t_star |
|
|
+ + max(0.,2.*RETV*Th_th(i)*b212*q_star*t_star) |
|
|
+ ) |
|
|
c |
|
|
c Theta et qT du thermique (forme H&B) avec exces |
|
|
c (attention, on ajoute therm(i) qui est virtuelle ...) |
|
|
c pourquoi pas sqrt(b1)*t_star ? |
|
|
c dqs = b2sr*kqfs(i)/wm(i) |
|
|
qT_th(i) = qT_th(i) + b2sr*q_star |
|
|
cnew on differre le calcul de Theta_e |
|
|
c The_th(i) = The_th(i) + therm(i) + RLvCp*qT_th(i) |
|
|
c ou: The_th(i) = The_th(i) + sqrt(b1)*khfs(i)/wm(i) + RLvCp*qT_th(i) |
|
|
rhino(i,1) = 0.0 |
|
|
ENDIF |
|
|
ENDDO |
|
|
C |
|
|
c +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
|
|
c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
|
|
C ++ Improve pblh estimate for unstable conditions using the +++++++ |
|
|
C ++ convective temperature excess : +++++++ |
|
|
c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
|
|
c +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
|
|
C |
|
|
DO k = 2, isommet |
|
|
DO i = 1, knon |
|
|
IF (check(i)) THEN |
|
|
ctest zdu2 = (u(i,k)-u(i,1))**2+(v(i,k)-v(i,1))**2+fac*ustar(i)**2 |
|
|
zdu2 = u(i,k)**2+v(i,k)**2 |
|
|
zdu2 = max(zdu2,1.0e-20) |
|
|
c Theta_v environnement |
|
|
zthvd=t(i,k)/s(i,k)*(1.+RETV*q(i,k)) |
|
|
c |
|
|
c et therm Theta_v (avec hypothese de constance de H&B, |
|
|
c zthvu=(t(i,1)+therm(i))/s(i,1)*(1.+RETV*q(i,1)) |
|
|
zthvu = Th_th(i)*(1.+RETV*qT_th(i)) + therm(i) |
|
|
|
|
|
c |
|
|
c Le Ri par Theta_v |
|
|
cAM Niveau de ref 2m |
|
|
cAM rhino(i,k) = (z(i,k)-z(i,1))*RG*(zthvd-zthvu) |
|
|
cAM . /(zdu2*0.5*(zthvd+zthvu)) |
|
|
rhino(i,k) = (z(i,k)-zref)*RG*(zthvd-zthvu) |
|
|
. /(zdu2*0.5*(zthvd+zthvu)) |
|
|
c |
|
|
c |
|
|
IF (rhino(i,k).GE.ricr) THEN |
|
|
pblh(i) = z(i,k-1) + (z(i,k-1)-z(i,k)) * |
|
|
. (ricr-rhino(i,k-1))/(rhino(i,k-1)-rhino(i,k)) |
|
|
c test04 |
|
|
pblh(i) = pblh(i) + 100. |
|
|
pblT(i) = t(i,k-1) + (t(i,k)-t(i,k-1)) * |
|
|
. (pblh(i)-z(i,k-1))/(z(i,k)-z(i,k-1)) |
|
|
check(i) = .FALSE. |
|
|
cIM 170305 BEG |
|
|
IF(1.EQ.0) THEN |
|
|
c debug print -120;34 -34- 58 et 0;26 wamp |
|
|
if (i.eq.950.or.i.eq.192.or.i.eq.624.or.i.eq.118) then |
|
|
print*,' i,Th_th,Therm,qT :',i,Th_th(i),therm(i),qT_th(i) |
|
|
q_star = kqfs(i)/wm(i) |
|
|
t_star = khfs(i)/wm(i) |
|
|
print*,'q* t*, b1,b2,b212 ',q_star,t_star |
|
|
- , b1*(1.+2.*RETV*qT_th(i))*t_star**2 |
|
|
- , (RETV*Th_th(i))**2*b2*q_star**2 |
|
|
- , 2.*RETV*Th_th(i)*b212*q_star*t_star |
|
|
print*,'zdu2 ,100.*ustar(i)**2',zdu2 ,fac*ustar(i)**2 |
|
|
endif |
|
|
ENDIF !(1.EQ.0) THEN |
|
|
cIM 170305 END |
|
|
c q_star = kqfs(i)/wm(i) |
|
|
c t_star = khfs(i)/wm(i) |
|
|
c trmb1(i) = b1*(1.+2.*RETV*q(i,1))*t_star**2 |
|
|
c trmb2(i) = (RETV*T(i,1))**2*b2*q_star**2 |
|
|
c Omega now trmb3(i) = 2.*RETV*T(i,1)*b212*q_star*t_star |
|
|
ENDIF |
|
|
ENDIF |
|
|
ENDDO |
|
|
ENDDO |
|
|
C |
|
|
C Set pbl height to maximum value where computation exceeds number of |
|
|
C layers allowed |
|
|
C |
|
|
DO i = 1, knon |
|
|
if (check(i)) pblh(i) = z(i,isommet) |
|
|
ENDDO |
|
|
C |
|
|
C PBL height must be greater than some minimum mechanical mixing depth |
|
|
C Several investigators have proposed minimum mechanical mixing depth |
|
|
C relationships as a function of the local friction velocity, u*. We |
|
|
C make use of a linear relationship of the form h = c u* where c=700. |
|
|
C The scaling arguments that give rise to this relationship most often |
|
|
C represent the coefficient c as some constant over the local coriolis |
|
|
C parameter. Here we make use of the experimental results of Koracin |
|
|
C and Berkowicz (1988) [BLM, Vol 43] for wich they recommend 0.07/f |
|
|
C where f was evaluated at 39.5 N and 52 N. Thus we use a typical mid |
|
|
C latitude value for f so that c = 0.07/f = 700. |
|
|
C |
|
|
DO i = 1, knon |
|
|
pblmin = 700.0*ustar(i) |
|
|
pblh(i) = MAX(pblh(i),pblmin) |
|
|
c par exemple : |
|
|
pblT(i) = t(i,2) + (t(i,3)-t(i,2)) * |
|
|
. (pblh(i)-z(i,2))/(z(i,3)-z(i,2)) |
|
|
ENDDO |
|
|
|
|
|
C ******************************************************************** |
|
|
C pblh is now available; do preparation for diffusivity calculation : |
|
|
C ******************************************************************** |
|
|
DO i = 1, knon |
|
|
check(i) = .TRUE. |
|
|
Zsat(i) = .FALSE. |
|
|
c omegafl utilise pour prolongement CAPE |
|
|
omegafl(i) = .FALSE. |
|
|
Cape(i) = 0. |
|
|
Kape(i) = 0. |
|
|
EauLiq(i) = 0. |
|
|
CTEI(i) = 0. |
|
|
pblk(i) = 0.0 |
|
|
fak1(i) = ustar(i)*pblh(i)*vk |
|
|
C |
|
|
C Do additional preparation for unstable cases only, set temperature |
|
|
C and moisture perturbations depending on stability. |
|
|
C *** Rq: les formule sont prises dans leur forme CS *** |
|
|
IF (unstbl(i)) THEN |
|
|
cAM Niveau de ref du thermique |
|
|
cAM zxt=(t(i,1)-z(i,1)*0.5*RG/RCPD/(1.+RVTMP2*q(i,1))) |
|
|
cAM . *(1.+RETV*q(i,1)) |
|
|
zxt=(Th_th(i)-zref*0.5*RG/RCPD/(1.+RVTMP2*qT_th(i))) |
|
|
. *(1.+RETV*qT_th(i)) |
|
432 |
phiminv(i) = (1. - binm*pblh(i)/obklen(i))**onet |
phiminv(i) = (1. - binm*pblh(i)/obklen(i))**onet |
433 |
phihinv(i) = sqrt(1. - binh*pblh(i)/obklen(i)) |
phihinv(i) = sqrt(1. - binh*pblh(i)/obklen(i)) |
434 |
wm(i) = ustar(i)*phiminv(i) |
wm(i) = ustar(i)*phiminv(i) |
435 |
fak2(i) = wm(i)*pblh(i)*vk |
fak2(i) = wm(i)*pblh(i)*vk |
436 |
wstr(i) = (heatv(i)*RG*pblh(i)/zxt)**onet |
wstr(i) = (heatv(i)*RG*pblh(i)/zxt)**onet |
437 |
fak3(i) = fakn*wstr(i)/wm(i) |
fak3(i) = fakn*wstr(i)/wm(i) |
438 |
ENDIF |
ENDIF |
439 |
c Computes Theta_e for thermal (all cases : to be modified) |
! Computes Theta_e for thermal (all cases : to be modified) |
440 |
c attention ajout therm(i) = virtuelle |
! attention ajout therm(i) = virtuelle |
441 |
The_th(i) = Th_th(i) + therm(i) + RLvCp*qT_th(i) |
The_th(i) = T2m(i) + therm(i) + RLvCp*qT_th(i) |
442 |
c ou: The_th(i) = Th_th(i) + sqrt(b1)*khfs(i)/wm(i) + RLvCp*qT_th(i) |
ENDDO |
443 |
ENDDO |
|
444 |
|
! Main level loop to compute the diffusivities and |
445 |
C Main level loop to compute the diffusivities and |
! counter-gradient terms: |
446 |
C counter-gradient terms: |
loop_level: DO k = 2, isommet |
447 |
C |
! Find levels within boundary layer: |
448 |
DO 1000 k = 2, isommet |
DO i = 1, knon |
|
C |
|
|
C Find levels within boundary layer: |
|
|
C |
|
|
DO i = 1, knon |
|
449 |
unslev(i) = .FALSE. |
unslev(i) = .FALSE. |
450 |
stblev(i) = .FALSE. |
stblev(i) = .FALSE. |
451 |
zm(i) = z(i,k-1) |
zm(i) = z(i, k-1) |
452 |
zp(i) = z(i,k) |
zp(i) = z(i, k) |
453 |
IF (zkmin.EQ.0.0 .AND. zp(i).GT.pblh(i)) zp(i) = pblh(i) |
IF (zkmin == 0. .AND. zp(i) > pblh(i)) zp(i) = pblh(i) |
454 |
IF (zm(i) .LT. pblh(i)) THEN |
IF (zm(i) < pblh(i)) THEN |
455 |
zmzp = 0.5*(zm(i) + zp(i)) |
zmzp = 0.5*(zm(i) + zp(i)) |
456 |
C debug |
zh(i) = zmzp/pblh(i) |
457 |
c if (i.EQ.1864) then |
zl(i) = zmzp/obklen(i) |
458 |
c print*,'i,pblh(1864),obklen(1864)',i,pblh(i),obklen(i) |
zzh(i) = 0. |
459 |
c endif |
IF (zh(i) <= 1.) zzh(i) = (1. - zh(i))**2 |
460 |
|
|
461 |
zh(i) = zmzp/pblh(i) |
! stblev for points zm < plbh and stable and neutral |
462 |
zl(i) = zmzp/obklen(i) |
! unslev for points zm < plbh and unstable |
463 |
zzh(i) = 0. |
IF (unstbl(i)) THEN |
464 |
IF (zh(i).LE.1.0) zzh(i) = (1. - zh(i))**2 |
unslev(i) = .TRUE. |
465 |
C |
ELSE |
466 |
C stblev for points zm < plbh and stable and neutral |
stblev(i) = .TRUE. |
467 |
C unslev for points zm < plbh and unstable |
ENDIF |
|
C |
|
|
IF (unstbl(i)) THEN |
|
|
unslev(i) = .TRUE. |
|
|
ELSE |
|
|
stblev(i) = .TRUE. |
|
|
ENDIF |
|
468 |
ENDIF |
ENDIF |
469 |
ENDDO |
ENDDO |
470 |
c print*,'fin calcul niveaux' |
|
471 |
C |
! Stable and neutral points; set diffusivities; counter-gradient |
472 |
C Stable and neutral points; set diffusivities; counter-gradient |
! terms zero for stable case: |
473 |
C terms zero for stable case: |
DO i = 1, knon |
|
C |
|
|
DO i = 1, knon |
|
474 |
IF (stblev(i)) THEN |
IF (stblev(i)) THEN |
475 |
IF (zl(i).LE.1.) THEN |
IF (zl(i) <= 1.) THEN |
476 |
pblk(i) = fak1(i)*zh(i)*zzh(i)/(1. + betas*zl(i)) |
pblk(i) = fak1(i)*zh(i)*zzh(i)/(1. + betas*zl(i)) |
477 |
ELSE |
ELSE |
478 |
pblk(i) = fak1(i)*zh(i)*zzh(i)/(betas + zl(i)) |
pblk(i) = fak1(i)*zh(i)*zzh(i)/(betas + zl(i)) |
479 |
ENDIF |
ENDIF |
|
c pcfm(i,k) = pblk(i) |
|
|
c pcfh(i,k) = pcfm(i,k) |
|
480 |
ENDIF |
ENDIF |
481 |
ENDDO |
ENDDO |
482 |
C |
|
483 |
C unssrf, unstable within surface layer of pbl |
! unssrf, unstable within surface layer of pbl |
484 |
C unsout, unstable within outer layer of pbl |
! unsout, unstable within outer layer of pbl |
485 |
C |
DO i = 1, knon |
|
DO i = 1, knon |
|
486 |
unssrf(i) = .FALSE. |
unssrf(i) = .FALSE. |
487 |
unsout(i) = .FALSE. |
unsout(i) = .FALSE. |
488 |
IF (unslev(i)) THEN |
IF (unslev(i)) THEN |
489 |
IF (zh(i).lt.sffrac) THEN |
IF (zh(i) < sffrac) THEN |
490 |
unssrf(i) = .TRUE. |
unssrf(i) = .TRUE. |
491 |
ELSE |
ELSE |
492 |
unsout(i) = .TRUE. |
unsout(i) = .TRUE. |
493 |
ENDIF |
ENDIF |
494 |
ENDIF |
ENDIF |
495 |
ENDDO |
ENDDO |
496 |
C |
|
497 |
C Unstable for surface layer; counter-gradient terms zero |
! Unstable for surface layer; counter-gradient terms zero |
498 |
C |
DO i = 1, knon |
|
DO i = 1, knon |
|
499 |
IF (unssrf(i)) THEN |
IF (unssrf(i)) THEN |
500 |
term = (1. - betam*zl(i))**onet |
term = (1. - betam*zl(i))**onet |
501 |
pblk(i) = fak1(i)*zh(i)*zzh(i)*term |
pblk(i) = fak1(i)*zh(i)*zzh(i)*term |
502 |
pr(i) = term/sqrt(1. - betah*zl(i)) |
pr(i) = term/sqrt(1. - betah*zl(i)) |
503 |
ENDIF |
ENDIF |
504 |
ENDDO |
ENDDO |
505 |
c print*,'fin counter-gradient terms zero' |
|
506 |
C |
! Unstable for outer layer; counter-gradient terms non-zero: |
507 |
C Unstable for outer layer; counter-gradient terms non-zero: |
DO i = 1, knon |
|
C |
|
|
DO i = 1, knon |
|
508 |
IF (unsout(i)) THEN |
IF (unsout(i)) THEN |
509 |
pblk(i) = fak2(i)*zh(i)*zzh(i) |
pblk(i) = fak2(i)*zh(i)*zzh(i) |
510 |
c cgs(i,k) = fak3(i)/(pblh(i)*wm(i)) |
pr(i) = phiminv(i)/phihinv(i) + ccon*fak3(i)/fak |
|
c cgh(i,k) = khfs(i)*cgs(i,k) |
|
|
pr(i) = phiminv(i)/phihinv(i) + ccon*fak3(i)/fak |
|
|
c cgq(i,k) = kqfs(i)*cgs(i,k) |
|
511 |
ENDIF |
ENDIF |
512 |
ENDDO |
ENDDO |
513 |
c print*,'fin counter-gradient terms non zero' |
|
514 |
C |
! For all layers, compute integral info and CTEI |
515 |
C For all unstable layers, compute diffusivities and ctrgrad ter m |
DO i = 1, knon |
516 |
C |
if (check(i) .or. omegafl(i)) then |
517 |
c DO i = 1, knon |
if (.not. Zsat(i)) then |
518 |
c IF (unslev(i)) THEN |
T2 = T2m(i) * s(i, k) |
519 |
c pcfm(i,k) = pblk(i) |
! thermodyn functions |
520 |
c pcfh(i,k) = pblk(i)/pr(i) |
qqsat= r2es * FOEEW(T2, RTT >= T2) / pplay(i, k) |
521 |
c etc cf original |
qqsat=MIN(0.5, qqsat) |
522 |
c ENDIF |
zcor=1./(1.-retv*qqsat) |
523 |
c ENDDO |
qqsat=qqsat*zcor |
524 |
C |
|
525 |
C For all layers, compute integral info and CTEI |
if (qqsat < qT_th(i)) then |
526 |
C |
! on calcule lcl |
527 |
DO i = 1, knon |
if (k == 2) then |
528 |
if (check(i).or.omegafl(i)) then |
plcl(i) = z(i, k) |
529 |
if (.not.Zsat(i)) then |
else |
530 |
c Th2 = The_th(i) - RLvCp*qT_th(i) |
plcl(i) = z(i, k-1) + (z(i, k-1)-z(i, k)) & |
531 |
Th2 = Th_th(i) |
* (qT_th(i)-qsatbef(i)) / (qsatbef(i)-qqsat) |
532 |
T2 = Th2*s(i,k) |
endif |
533 |
c thermodyn functions |
Zsat(i) = .true. |
534 |
zdelta=MAX(0.,SIGN(1.,RTT-T2)) |
Tbef(i) = T2 |
535 |
qqsat= r2es * FOEEW(T2,zdelta)/pplay(i,k) |
endif |
536 |
qqsat=MIN(0.5,qqsat) |
endif |
537 |
zcor=1./(1.-retv*qqsat) |
qsatbef(i) = qqsat |
538 |
qqsat=qqsat*zcor |
! cette ligne a deja ete faite normalement ? |
|
c |
|
|
if (qqsat.lt.qT_th(i)) then |
|
|
c on calcule lcl |
|
|
if (k.eq.2) then |
|
|
plcl(i) = z(i,k) |
|
|
else |
|
|
plcl(i) = z(i,k-1) + (z(i,k-1)-z(i,k)) * |
|
|
. (qT_th(i)-qsatbef(i))/(qsatbef(i)-qqsat) |
|
|
endif |
|
|
Zsat(i) = .true. |
|
|
Tbef(i) = T2 |
|
|
endif |
|
|
c |
|
539 |
endif |
endif |
540 |
qsatbef(i) = qqsat |
ENDDO |
541 |
camn ???? cette ligne a deja ete faite normalement ? |
end DO loop_level |
542 |
endif |
|
543 |
c print*,'hbtm2 i,k=',i,k |
END SUBROUTINE HBTM |
544 |
ENDDO |
|
545 |
1000 continue ! end of level loop |
end module HBTM_m |
|
cIM 170305 BEG |
|
|
IF(1.EQ.0) THEN |
|
|
print*,'hbtm2 ok' |
|
|
ENDIF !(1.EQ.0) THEN |
|
|
cIM 170305 END |
|
|
RETURN |
|
|
END |
|