/[lmdze]/trunk/Sources/phylmd/hbtm.f
ViewVC logotype

Diff of /trunk/Sources/phylmd/hbtm.f

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

trunk/libf/phylmd/hbtm.f revision 3 by guez, Wed Feb 27 13:16:39 2008 UTC trunk/Sources/phylmd/hbtm.f revision 149 by guez, Thu Jun 18 12:23:44 2015 UTC
# Line 1  Line 1 
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  

Legend:
Removed from v.3  
changed lines
  Added in v.149

  ViewVC Help
Powered by ViewVC 1.1.21