4 |
|
|
5 |
contains |
contains |
6 |
|
|
7 |
SUBROUTINE HBTM(knon, paprs, pplay, t2m, q2m, ustar, flux_t, & |
SUBROUTINE HBTM(paprs, pplay, t2m, q2m, ustar, flux_t, flux_q, u, v, t, q, & |
8 |
flux_q, u, v, t, q, pblh, cape, EauLiq, ctei, pblT, therm, trmb1, & |
pblh, cape, EauLiq, ctei, pblT, therm, plcl) |
|
trmb2, trmb3, plcl) |
|
9 |
|
|
10 |
! D'apr\'es Holstag et Boville et Troen et Mahrt |
! D'apr\'es Holstag et Boville et Troen et Mahrt |
11 |
! JAS 47 BLM |
! JAS 47 BLM |
12 |
! Algorithme th\'ese Anne Mathieu |
|
13 |
! Crit\'ere d'entra\^inement Peter Duynkerke (JAS 50) |
! Algorithme th\'ese Anne Mathieu. Crit\'ere d'entra\^inement |
14 |
! written by: Anne MATHIEU and Alain LAHELLEC, 22nd November 1999 |
! Peter Duynkerke (JAS 50). Written by: Anne MATHIEU and Alain |
15 |
! features : implem. exces Mathieu |
! LAHELLEC, 22nd November 1999. |
16 |
|
|
17 |
! modifications : decembre 99 passage th a niveau plus bas. voir fixer |
! Modifications : d\'ecembre 99 passage th \`a niveau plus bas. Voir fixer |
18 |
! la prise du th a z/Lambda = -.2 (max Ray) |
! la prise du th \`a z/Lambda = -.2 (max Ray) |
19 |
! Autre algo : entrainement ~ Theta+v =cste mais comment=>The? |
! Autre algorithme : entra\^inement ~ Theta + v =constante |
20 |
! on peut fixer q a .7 qsat (cf. non adiabatique) => T2 et The2 |
! mais comment ? The ? |
21 |
! voir aussi //KE pblh = niveau The_e ou l = env. |
! On peut fixer q \`a 0.7 qsat (cf. non adiabatique) d'où T2 et The2. |
22 |
|
! Voir aussi KE pblh = niveau The_e ou l = env. |
23 |
! fin therm a la HBTM passage a forme Mathieu 12/09/2001 |
|
24 |
|
! Adaptation \`a LMDZ version coupl\'ee. Pour le moment on fait |
25 |
! Adaptation a LMDZ version couplee Pour le moment on fait passer |
! passer en argument les grandeurs de surface : flux, t, q2m. On |
26 |
! en argument les grandeurs de surface : flux, t, q2m, t, on va |
! va utiliser syst\'ematiquement les grandeurs \`a 2 m mais on |
27 |
! utiliser systematiquement les grandeurs a 2m mais on garde la |
! garde la possibilit\'e de changer si besoin (jusqu'\`a pr\'esent |
28 |
! possibilit\'e de changer si besoin est (jusqu'\`a pr\'esent la |
! la forme de HB avec le premier niveau mod\`ele \'etait |
29 |
! forme de HB avec le 1er niveau modele etait conservee) |
! conserv\'ee). |
30 |
|
|
31 |
USE dimphy, ONLY: klev, klon |
USE dimphy, ONLY: klev, klon |
32 |
USE suphec_m, ONLY: rcpd, rd, retv, rg, rkappa, rtt |
USE suphec_m, ONLY: rcpd, rd, retv, rg, rkappa, rtt |
35 |
|
|
36 |
! Arguments: |
! Arguments: |
37 |
|
|
|
! nombre de points a calculer |
|
|
INTEGER, intent(in):: knon |
|
|
|
|
|
REAL, intent(in):: t2m(klon) ! temperature a 2 m |
|
|
! q a 2 et 10m |
|
|
REAL q2m(klon) |
|
|
REAL ustar(klon) |
|
38 |
! pression a inter-couche (Pa) |
! pression a inter-couche (Pa) |
39 |
REAL paprs(klon, klev+1) |
REAL, intent(in):: paprs(klon, klev+1) |
40 |
! pression au milieu de couche (Pa) |
! pression au milieu de couche (Pa) |
41 |
REAL pplay(klon, klev) |
REAL, intent(in):: pplay(klon, klev) |
42 |
! Flux |
REAL, intent(in):: t2m(klon) ! temperature a 2 m |
43 |
REAL flux_t(klon, klev), flux_q(klon, klev) |
! q a 2 et 10m |
44 |
! vitesse U (m/s) |
REAL, intent(in):: q2m(klon) |
45 |
REAL u(klon, klev) |
REAL, intent(in):: ustar(:) ! (knon) |
46 |
! vitesse V (m/s) |
REAL, intent(in):: flux_t(:), flux_q(:) ! (knon) flux à la surface |
47 |
REAL v(klon, klev) |
REAL, intent(in):: u(:, :) ! (knon, klev) vitesse U (m/s) |
48 |
! temperature (K) |
REAL, intent(in):: v(:, :) ! (knon, klev) vitesse V (m/s) |
49 |
REAL t(klon, klev) |
REAL, intent(in):: t(:, :) ! (knon, klev) temperature (K) |
50 |
! vapeur d'eau (kg/kg) |
REAL, intent(in):: q(:, :) ! (knon, klev) vapeur d'eau (kg/kg) |
51 |
REAL q(klon, klev) |
|
52 |
|
REAL, intent(out):: pblh(:) ! (knon) |
53 |
|
! Cape du thermique |
54 |
|
REAL Cape(klon) |
55 |
|
! Eau liqu integr du thermique |
56 |
|
REAL EauLiq(klon) |
57 |
|
! Critere d'instab d'entrainmt des nuages de |
58 |
|
REAL ctei(klon) |
59 |
|
REAL pblT(klon) |
60 |
|
! thermal virtual temperature excess |
61 |
|
REAL therm(klon) |
62 |
|
REAL plcl(klon) |
63 |
|
|
64 |
|
! Local: |
65 |
|
|
66 |
|
INTEGER knon ! nombre de points a calculer |
67 |
INTEGER isommet |
INTEGER isommet |
68 |
! limite max sommet pbl |
! limite max sommet pbl |
69 |
PARAMETER (isommet=klev) |
PARAMETER (isommet=klev) |
72 |
PARAMETER (vk=0.35) |
PARAMETER (vk=0.35) |
73 |
REAL ricr |
REAL ricr |
74 |
PARAMETER (ricr=0.4) |
PARAMETER (ricr=0.4) |
|
REAL fak |
|
|
! b calcul du Prandtl et de dTetas |
|
|
PARAMETER (fak=8.5) |
|
|
REAL fakn |
|
75 |
! a |
! a |
|
PARAMETER (fakn=7.2) |
|
76 |
REAL onet |
REAL onet |
77 |
PARAMETER (onet=1.0/3.0) |
PARAMETER (onet=1.0/3.0) |
|
REAL t_coup |
|
|
PARAMETER(t_coup=273.15) |
|
78 |
REAL zkmin |
REAL zkmin |
79 |
PARAMETER (zkmin=0.01) |
PARAMETER (zkmin=0.01) |
80 |
REAL betam |
REAL betam |
81 |
! pour Phim / h dans la S.L stable |
! pour Phim / h dans la S.L stable |
82 |
PARAMETER (betam=15.0) |
PARAMETER (betam=15.0) |
|
REAL betah |
|
|
PARAMETER (betah=15.0) |
|
|
REAL betas |
|
|
! Phit dans la S.L. stable (mais 2 formes / |
|
|
PARAMETER (betas=5.0) |
|
83 |
! z/OBL<>1 |
! z/OBL<>1 |
84 |
REAL sffrac |
REAL sffrac |
85 |
! S.L. = z/h < .1 |
! S.L. = z/h < .1 |
86 |
PARAMETER (sffrac=0.1) |
PARAMETER (sffrac=0.1) |
87 |
REAL binm |
REAL binm |
88 |
PARAMETER (binm=betam*sffrac) |
PARAMETER (binm=betam*sffrac) |
|
REAL binh |
|
|
PARAMETER (binh=betah*sffrac) |
|
|
REAL ccon |
|
|
PARAMETER (ccon=fak*sffrac*vk) |
|
89 |
|
|
90 |
REAL q_star, t_star |
REAL q_star, t_star |
91 |
! Lambert correlations T' q' avec T* q* |
! Lambert correlations T' q' avec T* q* |
114 |
LOGICAL check(klon) ! Richardson number > critical |
LOGICAL check(klon) ! Richardson number > critical |
115 |
! flag de prolongerment cape pour pt Omega |
! flag de prolongerment cape pour pt Omega |
116 |
LOGICAL omegafl(klon) |
LOGICAL omegafl(klon) |
|
REAL pblh(klon) |
|
|
REAL pblT(klon) |
|
|
REAL plcl(klon) |
|
117 |
|
|
118 |
! Monin-Obukhov lengh |
! Monin-Obukhov lengh |
119 |
REAL obklen(klon) |
REAL obklen(klon) |
120 |
|
|
121 |
REAL zdu2 |
REAL zdu2 |
|
! thermal virtual temperature excess |
|
|
REAL therm(klon) |
|
|
REAL trmb1(klon), trmb2(klon), trmb3(klon) |
|
122 |
! Algorithme thermique |
! Algorithme thermique |
123 |
REAL s(klon, klev) ! [P/Po]^Kappa milieux couches |
REAL s(klon, klev) ! [P/Po]^Kappa milieux couches |
124 |
! total water of thermal |
! total water of thermal |
127 |
REAL qsatbef(klon) |
REAL qsatbef(klon) |
128 |
! le thermique est sature |
! le thermique est sature |
129 |
LOGICAL Zsat(klon) |
LOGICAL Zsat(klon) |
|
! Cape du thermique |
|
|
REAL Cape(klon) |
|
|
! Eau liqu integr du thermique |
|
|
REAL EauLiq(klon) |
|
|
! Critere d'instab d'entrainmt des nuages de |
|
|
REAL ctei(klon) |
|
130 |
REAL zthvd, zthvu, qqsat |
REAL zthvd, zthvu, qqsat |
131 |
REAL t2 |
REAL t2 |
132 |
|
|
142 |
|
|
143 |
!----------------------------------------------------------------- |
!----------------------------------------------------------------- |
144 |
|
|
145 |
|
knon = size(pblh) |
146 |
|
|
147 |
! initialisations |
! initialisations |
148 |
q_star = 0 |
q_star = 0 |
149 |
t_star = 0 |
t_star = 0 |
181 |
zxt = t2m(i) |
zxt = t2m(i) |
182 |
|
|
183 |
! convention >0 vers le bas ds lmdz |
! convention >0 vers le bas ds lmdz |
184 |
khfs(i) = - flux_t(i, 1)*zxt*Rd / (RCPD*paprs(i, 1)) |
khfs(i) = - flux_t(i)*zxt*Rd / (RCPD*paprs(i, 1)) |
185 |
kqfs(i) = - flux_q(i, 1)*zxt*Rd / (paprs(i, 1)) |
kqfs(i) = - flux_q(i)*zxt*Rd / paprs(i, 1) |
186 |
! verifier que khfs et kqfs sont bien de la forme w'l' |
! verifier que khfs et kqfs sont bien de la forme w'l' |
187 |
heatv(i) = khfs(i) + 0.608*zxt*kqfs(i) |
heatv(i) = khfs(i) + 0.608*zxt*kqfs(i) |
188 |
! a comparer aussi aux sorties de clqh : flux_T/RoCp et flux_q/RoLv |
! a comparer aussi aux sorties de clqh : flux_T/RoCp et flux_q/RoLv |
201 |
plcl(i) = 6000. |
plcl(i) = 6000. |
202 |
! Lambda = -u*^3 / (alpha.g.kvon.<w'Theta'v> |
! Lambda = -u*^3 / (alpha.g.kvon.<w'Theta'v> |
203 |
obklen(i) = -t(i, 1)*ustar(i)**3/(RG*vk*heatv(i)) |
obklen(i) = -t(i, 1)*ustar(i)**3/(RG*vk*heatv(i)) |
|
trmb1(i) = 0. |
|
|
trmb2(i) = 0. |
|
|
trmb3(i) = 0. |
|
204 |
ENDDO |
ENDDO |
205 |
|
|
206 |
! PBL height calculation: Search for level of pbl. Scan upward |
! PBL height calculation: Search for level of pbl. Scan upward |
279 |
! (attention, on ajoute therm(i) qui est virtuelle ...) |
! (attention, on ajoute therm(i) qui est virtuelle ...) |
280 |
! pourquoi pas sqrt(b1)*t_star ? |
! pourquoi pas sqrt(b1)*t_star ? |
281 |
qT_th(i) = qT_th(i) + b2sr*q_star |
qT_th(i) = qT_th(i) + b2sr*q_star |
282 |
! new on differre le calcul de Theta_e |
! new on diff\`ere le calcul de Theta_e |
283 |
rhino(i, 1) = 0. |
rhino(i, 1) = 0. |
284 |
ENDIF |
ENDIF |
285 |
ENDDO |
ENDDO |