/[lmdze]/trunk/libf/phylmd/hbtm.f90
ViewVC logotype

Diff of /trunk/libf/phylmd/hbtm.f90

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

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

  ViewVC Help
Powered by ViewVC 1.1.21