source: LMDZ6/branches/Amaury_dev/libf/phylmd/hbtm_mod.F90 @ 5143

Last change on this file since 5143 was 5143, checked in by abarral, 3 months ago

Put YOEGWD.h, FCTTRE.h into modules

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 29.0 KB
RevLine 
[3774]1module hbtm_mod
[1992]2
3  IMPLICIT NONE
[674]4
[5119]5CONTAINS
[674]6
[3774]7  SUBROUTINE hbtm(knon, paprs, pplay, t2m, t10m, q2m, q10m, ustar, wstar, &
[5143]8          flux_t, flux_q, u, v, t, q, pblh, cape, eauliq, ctei, pblt, therm, &
9          trmb1, trmb2, trmb3, plcl)
[3774]10    USE dimphy
[5143]11    USE lmdz_YOETHF
12    USE lmdz_fcttre, ONLY: foeew, foede, qsats, qsatl, dqsats, dqsatl, thermcep
[674]13
[3774]14    ! ***************************************************************
15    ! *                                                             *
16    ! * HBTM2   D'apres Holstag&Boville et Troen&Mahrt              *
17    ! *                 JAS 47              BLM                     *
18    ! * Algorithme These Anne Mathieu                               *
19    ! * Critere d'Entrainement Peter Duynkerke (JAS 50)             *
20    ! * written by  : Anne MATHIEU & Alain LAHELLEC, 22/11/99       *
21    ! * features : implem. exces Mathieu                            *
22    ! ***************************************************************
23    ! * mods : decembre 99 passage th a niveau plus bas. voir fixer *
24    ! * la prise du th a z/Lambda = -.2 (max Ray)                   *
25    ! * Autre algo : entrainement ~ Theta+v =cste mais comment=>The?*
26    ! * on peut fixer q a .7qsat(cf non adiab)=>T2 et The2          *
27    ! * voir aussi //KE pblh = niveau The_e ou l = env.             *
28    ! ***************************************************************
29    ! * fin therm a la HBTM passage a forme Mathieu 12/09/2001      *
30    ! ***************************************************************
31    ! *
[674]32
33
[3774]34    ! AM Fev 2003
35    ! Adaptation a LMDZ version couplee
[644]36
[3774]37    ! Pour le moment on fait passer en argument les grdeurs de surface :
38    ! flux, t,q2m, t,q10m, on va utiliser systematiquement les grdeurs a 2m ms
39    ! on garde la possibilite de changer si besoin est (jusqu'a present la
40    ! forme de HB avec le 1er niveau modele etait conservee)
[644]41
[3774]42    include "YOMCST.h"
43    REAL rlvcp, reps
44    ! Arguments:
[1992]45
[3774]46    INTEGER knon ! nombre de points a calculer
47    ! AM
48    REAL t2m(klon), t10m(klon) ! temperature a 2 et 10m
49    REAL q2m(klon), q10m(klon) ! q a 2 et 10m
50    REAL ustar(klon)
51    REAL wstar(klon) ! w*, convective velocity scale
[5143]52    REAL paprs(klon, klev + 1) ! pression a inter-couche (Pa)
[3774]53    REAL pplay(klon, klev) ! pression au milieu de couche (Pa)
54    REAL flux_t(klon, klev), flux_q(klon, klev) ! Flux
55    REAL u(klon, klev) ! vitesse U (m/s)
56    REAL v(klon, klev) ! vitesse V (m/s)
57    REAL t(klon, klev) ! temperature (K)
58    REAL q(klon, klev) ! vapeur d'eau (kg/kg)
59    ! AM      REAL cd_h(klon) ! coefficient de friction au sol pour chaleur
60    ! AM      REAL cd_m(klon) ! coefficient de friction au sol pour vitesse
[1992]61
[3774]62    INTEGER isommet
63    ! um      PARAMETER (isommet=klev) ! limite max sommet pbl
64    REAL, PARAMETER :: vk = 0.35 ! Von Karman => passer a .41 ! cf U.Olgstrom
65    REAL, PARAMETER :: ricr = 0.4
66    REAL, PARAMETER :: fak = 8.5 ! b calcul du Prandtl et de dTetas
67    REAL, PARAMETER :: fakn = 7.2 ! a
[5143]68    REAL, PARAMETER :: onet = 1.0 / 3.0
[3774]69    REAL, PARAMETER :: t_coup = 273.15
70    REAL, PARAMETER :: zkmin = 0.01
71    REAL, PARAMETER :: betam = 15.0 ! pour Phim / h dans la S.L stable
72    REAL, PARAMETER :: betah = 15.0
[1992]73
[3774]74    REAL, PARAMETER :: betas = 5.0
75    ! Phit dans la S.L. stable (mais 2 formes / z/OBL<>1
[1992]76
[3774]77    REAL, PARAMETER :: sffrac = 0.1 ! S.L. = z/h < .1
78    REAL, PARAMETER :: usmin = 1.E-12
[5143]79    REAL, PARAMETER :: binm = betam * sffrac
80    REAL, PARAMETER :: binh = betah * sffrac
81    REAL, PARAMETER :: ccon = fak * sffrac * vk
[3774]82    REAL, PARAMETER :: b1 = 70., b2 = 20.
83    REAL, PARAMETER :: zref = 2. ! Niveau de ref a 2m peut eventuellement
84    ! etre choisi a 10m
85    REAL q_star, t_star
86    REAL b212, b2sr ! Lambert correlations T' q' avec T* q*
[1992]87
[3774]88    REAL z(klon, klev)
89    ! AM      REAL pcfm(klon,klev), pcfh(klon,klev)
90    INTEGER i, k, j
91    REAL zxt
92    ! AM      REAL zxt, zxq, zxu, zxv, zxmod, taux, tauy
93    ! AM      REAL zx_alf1, zx_alf2 ! parametres pour extrapolation
94    REAL khfs(klon) ! surface kinematic heat flux [mK/s]
95    REAL kqfs(klon) ! sfc kinematic constituent flux [m/s]
96    REAL heatv(klon) ! surface virtual heat flux
97    REAL rhino(klon, klev) ! bulk Richardon no. mais en Theta_v
98    LOGICAL unstbl(klon) ! pts w/unstbl pbl (positive virtual ht flx)
99    LOGICAL stblev(klon) ! stable pbl with levels within pbl
100    LOGICAL unslev(klon) ! unstbl pbl with levels within pbl
101    LOGICAL unssrf(klon) ! unstb pbl w/lvls within srf pbl lyr
102    LOGICAL unsout(klon) ! unstb pbl w/lvls in outer pbl lyr
103    LOGICAL check(klon) ! True=>chk if Richardson no.>critcal
104    LOGICAL omegafl(klon) ! flag de prolongerment cape pour pt Omega
105    REAL pblh(klon)
106    REAL pblt(klon)
107    REAL plcl(klon)
108    ! AM      REAL cgh(klon,2:klev) ! counter-gradient term for heat [K/m]
109    ! AM      REAL cgq(klon,2:klev) ! counter-gradient term for constituents
110    ! AM      REAL cgs(klon,2:klev) ! counter-gradient star (cg/flux)
111    REAL unsobklen(klon) ! Monin-Obukhov lengh
112    ! AM      REAL ztvd, ztvu,
113    REAL zdu2
[5143]114    REAL, INTENT(OUT) :: therm(:) ! (klon) thermal virtual temperature excess
[3774]115    REAL trmb1(klon), trmb2(klon), trmb3(klon)
116    ! Algorithme thermique
117    REAL s(klon, klev) ! [P/Po]^Kappa milieux couches
118    REAL th_th(klon) ! potential temperature of thermal
119    REAL the_th(klon) ! equivalent potential temperature of thermal
120    REAL qt_th(klon) ! total water  of thermal
121    REAL tbef(klon) ! T thermique niveau precedent
122    REAL qsatbef(klon)
123    LOGICAL zsat(klon) ! le thermique est sature
124    REAL cape(klon) ! Cape du thermique
125    REAL kape(klon) ! Cape locale
126    REAL eauliq(klon) ! Eau liqu integr du thermique
127    REAL ctei(klon) ! Critere d'instab d'entrainmt des nuages de CL
128    REAL the1, the2, aa, bb, zthvd, zthvu, xintpos, qqsat
129    ! IM 091204 BEG
130    REAL a1, a2, a3
131    ! IM 091204 END
132    REAL xhis, rnum, denom, th1, th2, thv1, thv2, ql2
133    REAL dqsat_dt, qsat2, qt1, q2, t1, t2, xnull, delt_the
134    REAL delt_qt, delt_2, quadsat, spblh, reduc
[1992]135
[3774]136    REAL phiminv(klon) ! inverse phi function for momentum
137    REAL phihinv(klon) ! inverse phi function for heat
138    REAL wm(klon) ! turbulent velocity scale for momentum
139    REAL fak1(klon) ! k*ustar*pblh
140    REAL fak2(klon) ! k*wm*pblh
141    REAL fak3(klon) ! fakn*wstar/wm
142    REAL pblk(klon) ! level eddy diffusivity for momentum
143    REAL pr(klon) ! Prandtl number for eddy diffusivities
144    REAL zl(klon) ! zmzp / Obukhov length
145    REAL zh(klon) ! zmzp / pblh
146    REAL zzh(klon) ! (1-(zmzp/pblh))**2
147    REAL zm(klon) ! current level height
148    REAL zp(klon) ! current level height + one level up
149    REAL zcor, zdelta, zcvm5
150    ! AM      REAL zxqs
151    REAL fac, pblmin, zmzp, term
[1992]152
[3774]153    ! initialisations (Anne)
154    isommet = klev
155    th_th(:) = 0.
156    q_star = 0
157    t_star = 0
158    therm = 0.
[1992]159
[5143]160    b212 = sqrt(b1 * b2)
[3774]161    b2sr = sqrt(b2)
[1992]162
[3774]163    ! ============================================================
164    ! Fonctions thermo implicites
165    ! ============================================================
166    ! +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
167    ! Tetens : pression partielle de vap d'eau e_sat(T)
168    ! =================================================
169    ! ++ e_sat(T) = r2*exp( r3*(T-Tf)/(T-r4) ) id a r2*FOEWE
170    ! ++ avec :
171    ! ++ Tf = 273.16 K  (Temp de fusion de la glace)
172    ! ++ r2 = 611.14 Pa
173    ! ++ r3 = 17.269 (liquide) 21.875 (solide) adim
174    ! ++ r4 = 35.86             7.66           Kelvin
175    ! ++  q_sat = eps*e_sat/(p-(1-eps)*e_sat)
[5093]176    ! ++ derivé :
[3774]177    ! ++ =========
178    ! ++                   r3*(Tf-r4)*q_sat(T,p)
179    ! ++ d_qsat_dT = --------------------------------
180    ! ++             (T-r4)^2*( 1-(1-eps)*e_sat(T)/p )
181    ! ++ pour zcvm5=Lv, c'est FOEDE
182    ! ++ Rq :(1.-REPS)*esarg/Parg id a RETV*Qsat
183    ! ------------------------------------------------------------------
[1992]184
[3774]185    ! Initialisation
[5143]186    rlvcp = rlvtt / rcpd
187    reps = rd / rv
[1992]188
189
[3774]190    ! DO i = 1, klon
191    ! pcfh(i,1) = cd_h(i)
192    ! pcfm(i,1) = cd_m(i)
193    ! ENDDO
194    ! DO k = 2, klev
195    ! DO i = 1, klon
196    ! pcfh(i,k) = zkmin
197    ! pcfm(i,k) = zkmin
198    ! cgs(i,k) = 0.0
199    ! cgh(i,k) = 0.0
200    ! cgq(i,k) = 0.0
201    ! ENDDO
202    ! ENDDO
[1992]203
[3774]204    ! Calculer les hauteurs de chaque couche
205    ! (geopotentielle Int_dp/ro = Int_[Rd.T.dp/p] z = geop/g)
206    ! pourquoi ne pas utiliser Phi/RG ?
[1992]207    DO i = 1, knon
[5143]208      z(i, 1) = rd * t(i, 1) / (0.5 * (paprs(i, 1) + pplay(i, 1)))&
209              * (paprs(i, 1) - pplay(i, 1)) / rg
210      s(i, 1) = (pplay(i, 1) / paprs(i, 1))**rkappa
[1992]211    END DO
[3774]212    ! s(k) = [pplay(k)/ps]^kappa
213    ! + + + + + + + + + pplay  <-> s(k)   t  dp=pplay(k-1)-pplay(k)
[1992]214
[3774]215    ! -----------------  paprs <-> sig(k)
[1992]216
[3774]217    ! + + + + + + + + + pplay  <-> s(k-1)
[1992]218
219
[3774]220    ! + + + + + + + + + pplay  <-> s(1)   t  dp=paprs-pplay   z(1)
[1992]221
[3774]222    ! -----------------  paprs <-> sig(1)
223
224    DO k = 2, klev
[5143]225      DO i = 1, knon
226        z(i, k) = z(i, k - 1) + rd * 0.5 * (t(i, k - 1) + t(i, k)) / paprs(i, k)&
227                * (pplay(i, k - 1) - pplay(i, k)) / rg
228        s(i, k) = (pplay(i, k) / paprs(i, 1))**rkappa
229      END DO
[3774]230    END DO
231    ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
232    ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
233    ! +++  Determination des grandeurs de surface  +++++++++++++++++++++
234    ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
235    ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[1992]236    DO i = 1, knon
[5143]237      ! AM         IF (thermcep) THEN
238      ! AM           zdelta=MAX(0.,SIGN(1.,RTT-tsol(i)))
239      ! zcvm5 = R5LES*RLVTT*(1.-zdelta) + R5IES*RLSTT*zdelta
240      ! zcvm5 = zcvm5 / RCPD / (1.0+RVTMP2*q(i,1))
241      ! AM           zxqs= r2es * FOEEW(tsol(i),zdelta)/paprs(i,1)
242      ! AM           zxqs=MIN(0.5,zxqs)
243      ! AM           zcor=1./(1.-retv*zxqs)
244      ! AM           zxqs=zxqs*zcor
245      ! AM         ELSE
246      ! AM           IF (tsol(i).LT.t_coup) THEN
247      ! AM              zxqs = qsats(tsol(i)) / paprs(i,1)
248      ! AM           ELSE
249      ! AM              zxqs = qsatl(tsol(i)) / paprs(i,1)
250      ! AM           ENDIF
251      ! AM         ENDIF
252      ! niveau de reference bulk; mais ici, c,a pourrait etre le niveau de ref
253      ! du thermique
254      ! AM        zx_alf1 = 1.0
255      ! AM        zx_alf2 = 1.0 - zx_alf1
256      ! AM        zxt = (t(i,1)+z(i,1)*RG/RCPD/(1.+RVTMP2*q(i,1)))
257      ! AM     .        *(1.+RETV*q(i,1))*zx_alf1
258      ! AM     .      + (t(i,2)+z(i,2)*RG/RCPD/(1.+RVTMP2*q(i,2)))
259      ! AM     .        *(1.+RETV*q(i,2))*zx_alf2
260      ! AM        zxu = u(i,1)*zx_alf1+u(i,2)*zx_alf2
261      ! AM        zxv = v(i,1)*zx_alf1+v(i,2)*zx_alf2
262      ! AM        zxq = q(i,1)*zx_alf1+q(i,2)*zx_alf2
263      ! AM
264      ! AMAM           zxu = u10m(i)
265      ! AMAM           zxv = v10m(i)
266      ! AMAM           zxmod = 1.0+SQRT(zxu**2+zxv**2)
267      ! AM Niveau de ref choisi a 2m
268      zxt = t2m(i)
[644]269
[5143]270      ! ***************************************************
271      ! attention, il doit s'agir de <w'theta'>
272      ! ;Calcul de tcls virtuel et de w'theta'virtuel
273      ! ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
274      ! tcls=tcls*(1+.608*qcls)
[1992]275
[5143]276      ! ;Pour avoir w'theta',
277      ! ; il faut diviser par ro.Cp
278      ! Cp=Cpd*(1+0.84*qcls)
279      ! fcs=fcs/(ro_surf*Cp)
280      ! ;On transforme w'theta' en w'thetav'
281      ! Lv=(2.501-0.00237*(tcls-273.15))*1.E6
282      ! xle=xle/(ro_surf*Lv)
283      ! fcsv=fcs+.608*xle*tcls
284      ! ***************************************************
285      ! AM        khfs(i) = (tsol(i)*(1.+RETV*q(i,1))-zxt) *zxmod*cd_h(i)
286      ! AM        kqfs(i) = (zxqs-zxq) *zxmod*cd_h(i) * beta(i)
287      ! AM
288      ! dif khfs est deja w't'_v / heatv(i) = khfs(i) + RETV*zxt*kqfs(i)
289      ! AM calcule de Ro = paprs(i,1)/Rd zxt
290      ! AM convention >0 vers le bas ds lmdz
291      khfs(i) = -flux_t(i, 1) * zxt * rd / (rcpd * paprs(i, 1))
292      kqfs(i) = -flux_q(i, 1) * zxt * rd / (paprs(i, 1))
293      ! AM   verifier que khfs et kqfs sont bien de la forme w'l'
294      heatv(i) = khfs(i) + 0.608 * zxt * kqfs(i)
295      ! a comparer aussi aux sorties de clqh : flux_T/RoCp et flux_q/RoLv
296      ! AM        heatv(i) = khfs(i)
297      ! AM ustar est en entree
298      ! AM        taux = zxu *zxmod*cd_m(i)
299      ! AM        tauy = zxv *zxmod*cd_m(i)
300      ! AM        ustar(i) = SQRT(taux**2+tauy**2)
301      ! AM        ustar(i) = MAX(SQRT(ustar(i)),0.01)
302      ! Theta et qT du thermique sans exces (interpolin vers surf)
303      ! chgt de niveau du thermique (jeudi 30/12/1999)
304      ! (interpolation lineaire avant integration phi_h)
305      ! AM        qT_th(i) = zxqs*beta(i) + 4./z(i,1)*(q(i,1)-zxqs*beta(i))
306      ! AM        qT_th(i) = max(qT_th(i),q(i,1))
307      qt_th(i) = q2m(i)
308      ! n The_th restera la Theta du thermique sans exces jusqu'a 2eme calcul
309      ! n reste a regler convention P) pour Theta
310      ! The_th(i) = tsol(i) + 4./z(i,1)*(t(i,1)-tsol(i))
311      ! -                      + RLvCp*qT_th(i)
312      ! AM        Th_th(i) = tsol(i) + 4./z(i,1)*(t(i,1)-tsol(i))
313      th_th(i) = t2m(i)
[1992]314    END DO
315
[3774]316    DO i = 1, knon
[5143]317      rhino(i, 1) = 0.0 ! Global Richardson
318      check(i) = .TRUE.
319      pblh(i) = z(i, 1) ! on initialise pblh a l'altitude du 1er niveau
320      plcl(i) = 6000.
321      ! Lambda = -u*^3 / (alpha.g.kvon.<w'Theta'v>
322      unsobklen(i) = -rg * vk * heatv(i) / (t(i, 1) * max(ustar(i), usmin)**3)
323      trmb1(i) = 0.
324      trmb2(i) = 0.
325      trmb3(i) = 0.
[3774]326    END DO
[1992]327
328
[3774]329    ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
330    ! PBL height calculation:
331    ! Search for level of pbl. Scan upward until the Richardson number between
332    ! the first level and the current level exceeds the "critical" value.
333    ! (bonne idee Nu de separer le Ric et l'exces de temp du thermique)
334    ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
335    fac = 100.0
336    DO k = 2, isommet
[5143]337      DO i = 1, knon
338        IF (check(i)) THEN
339          ! pourquoi / niveau 1 (au lieu du sol) et le terme en u*^2 ?
340          ! test     zdu2 =
341          ! (u(i,k)-u(i,1))**2+(v(i,k)-v(i,1))**2+fac*ustar(i)**2
342          zdu2 = u(i, k)**2 + v(i, k)**2
343          zdu2 = max(zdu2, 1.0E-20)
344          ! Theta_v environnement
345          zthvd = t(i, k) / s(i, k) * (1. + retv * q(i, k))
[1992]346
[5143]347          ! therm Theta_v sans exces (avec hypothese fausse de H&B, sinon,
348          ! passer par Theta_e et virpot)
349          ! zthvu=t(i,1)/s(i,1)*(1.+RETV*q(i,1))
350          ! AM         zthvu = Th_th(i)*(1.+RETV*q(i,1))
351          zthvu = th_th(i) * (1. + retv * qt_th(i))
352          ! Le Ri par Theta_v
353          ! AM         rhino(i,k) = (z(i,k)-z(i,1))*RG*(zthvd-zthvu)
354          ! AM     .               /(zdu2*0.5*(zthvd+zthvu))
355          ! AM On a nveau de ref a 2m ???
356          rhino(i, k) = (z(i, k) - zref) * rg * (zthvd - zthvu) / (zdu2 * 0.5&
357                  * (zthvd + zthvu))
[1992]358
[5143]359          IF (rhino(i, k)>=ricr) THEN
360            pblh(i) = z(i, k - 1) + (z(i, k - 1) - z(i, k)) * (ricr - rhino(i, k - 1))&
361                    / (rhino(i, k - 1) - rhino(i, k))
362            ! test04
363            pblh(i) = pblh(i) + 100.
364            pblt(i) = t(i, k - 1) + (t(i, k) - t(i, k - 1)) * (pblh(i) - z(i, k - 1))&
365                    / (z(i, k) - z(i, k - 1))
366            check(i) = .FALSE.
[3774]367          END IF
[5143]368        END IF
369      END DO
[3774]370    END DO
[1992]371
372
[3774]373    ! Set pbl height to maximum value where computation exceeds number of
374    ! layers allowed
[1992]375
[3774]376    DO i = 1, knon
[5143]377      IF (check(i)) pblh(i) = z(i, isommet)
[3774]378    END DO
[1992]379
[3774]380    ! Improve estimate of pbl height for the unstable points.
381    ! Find unstable points (sensible heat flux is upward):
[1992]382
[3774]383    DO i = 1, knon
[5143]384      IF (heatv(i)>0.) THEN
385        unstbl(i) = .TRUE.
386        check(i) = .TRUE.
387      ELSE
388        unstbl(i) = .FALSE.
389        check(i) = .FALSE.
390      END IF
[3774]391    END DO
[1992]392
[3774]393    ! For the unstable case, compute velocity scale and the
394    ! convective temperature excess:
395
[1992]396    DO i = 1, knon
[5143]397      IF (check(i)) THEN
398        phiminv(i) = (1. - binm * pblh(i) * unsobklen(i))**onet
399        ! ***************************************************
400        ! Wm ? et W* ? c'est la formule pour z/h < .1
401        ! ;Calcul de w* ;;
402        ! ;;;;;;;;;;;;;;;;
403        ! w_star=((g/tcls)*fcsv*z(ind))^(1/3.) [ou prendre la premiere approx
404        ! de h)
405        ! ;; CALCUL DE wm ;;
406        ! ;;;;;;;;;;;;;;;;;;
407        ! ; Ici on considerera que l'on est dans la couche de surf jusqu'a
408        ! 100 m
409        ! ; On prend svt couche de surface=0.1*h mais on ne connait pas h
410        ! ;;;;;;;;;;;Dans la couche de surface
411        ! if (z(ind) le 20) then begin
412        ! Phim=(1.-15.*(z(ind)/L))^(-1/3.)
413        ! wm=u_star/Phim
414        ! ;;;;;;;;;;;En dehors de la couche de surface
415        ! END IF ELSE IF (z(ind) gt 20) then begin
416        ! wm=(u_star^3+c1*w_star^3)^(1/3.)
417        ! END IF
418        ! ***************************************************
419        wm(i) = ustar(i) * phiminv(i)
420        ! ===================================================================
421        ! valeurs de Dominique Lambert de la campagne SEMAPHORE :
422        ! <T'^2> = 100.T*^2; <q'^2> = 20.q*^2 a 10m
423        ! <Tv'^2> = (1+1.2q).100.T* + 1.2Tv.sqrt(20*100).T*.q* +
424        ! (.608*Tv)^2*20.q*^2;
425        ! et dTetavS = sqrt(<Tv'^2>) ainsi calculee.
426        ! avec : T*=<w'T'>_s/w* et q*=<w'q'>/w*
427        ! !!! on peut donc utiliser w* pour les fluctuations <-> Lambert
428        ! (leur corellation pourrait dependre de beta par ex)
429        ! if fcsv(i,j) gt 0 then begin
430        ! dTetavs=b1*(1.+2.*.608*q_10(i,j))*(fcs(i,j)/wm(i,j))^2+$
431        ! (.608*Thetav_10(i,j))^2*b2*(xle(i,j)/wm(i,j))^2+$
432        ! 2.*.608*thetav_10(i,j)*sqrt(b1*b2)*(xle(i,j)/wm(i,j))*(fcs(i,j)
433        ! /wm(i,j))
434        ! dqs=b2*(xle(i,j)/wm(i,j))^2
435        ! theta_s(i,j)=thetav_10(i,j)+sqrt(dTetavs)
436        ! q_s(i,j)=q_10(i,j)+sqrt(dqs)
437        ! END IF else begin
438        ! Theta_s(i,j)=thetav_10(i,j)
439        ! q_s(i,j)=q_10(i,j)
440        ! endelse
441        ! ===================================================================
[644]442
[5143]443        ! HBTM        therm(i) = heatv(i)*fak/wm(i)
444        ! forme Mathieu :
445        q_star = kqfs(i) / wm(i)
446        t_star = khfs(i) / wm(i)
447        ! IM 091204 BEG
448        IF (1==0) THEN
449          IF (t_star<0. .OR. q_star<0.) THEN
450            PRINT *, 'i t_star q_star khfs kqfs wm', i, t_star, q_star, &
451                    khfs(i), kqfs(i), wm(i)
[3774]452          END IF
[5143]453        END IF
454        ! IM 091204 END
455        ! AM Nveau cde ref 2m =>
456        ! AM        therm(i) = sqrt( b1*(1.+2.*RETV*q(i,1))*t_star**2
457        ! AM     +             + (RETV*T(i,1))**2*b2*q_star**2
458        ! AM     +             + 2.*RETV*T(i,1)*b212*q_star*t_star
459        ! AM     +                 )
460        ! IM 091204 BEG
461        a1 = b1 * (1. + 2. * retv * qt_th(i)) * t_star**2
462        a2 = (retv * th_th(i))**2 * b2 * q_star * q_star
463        a3 = 2. * retv * th_th(i) * b212 * q_star * t_star
464        aa = a1 + a2 + a3
465        IF (1==0) THEN
466          IF (aa<0.) THEN
467            PRINT *, 'i a1 a2 a3 aa', i, a1, a2, a3, aa
468            PRINT *, 'i qT_th Th_th t_star q_star RETV b1 b2 b212', i, &
469                    qt_th(i), th_th(i), t_star, q_star, retv, b1, b2, b212
[3774]470          END IF
[5143]471        END IF
472        ! IM 091204 END
473        therm(i) = sqrt(b1 * (1. + 2. * retv * qt_th(i)) * t_star**2 + (retv * th_th(&
474                i))**2 * b2 * q_star * q_star &  ! IM 101204  +             +
475                ! 2.*RETV*Th_th(i)*b212*q_star*t_star
476                + max(0., 2. * retv * th_th(i) * b212 * q_star * t_star))
[644]477
[5143]478        ! Theta et qT du thermique (forme H&B) avec exces
479        ! (attention, on ajoute therm(i) qui est virtuelle ...)
480        ! pourquoi pas sqrt(b1)*t_star ?
481        ! dqs = b2sr*kqfs(i)/wm(i)
482        qt_th(i) = qt_th(i) + b2sr * q_star
483        ! new on differre le calcul de Theta_e
484        ! The_th(i) = The_th(i) + therm(i) + RLvCp*qT_th(i)
485        ! ou:    The_th(i) = The_th(i) + sqrt(b1)*khfs(i)/wm(i) +
486        ! RLvCp*qT_th(i)
487        rhino(i, 1) = 0.0
488      END IF
[3774]489    END DO
[1992]490
[3774]491    ! +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
492    ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
493    ! ++ Improve pblh estimate for unstable conditions using the +++++++
494    ! ++          convective temperature excess :                +++++++
495    ! ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
496    ! +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[1992]497
[3774]498    DO k = 2, isommet
[5143]499      DO i = 1, knon
500        IF (check(i)) THEN
501          ! test     zdu2 =
502          ! (u(i,k)-u(i,1))**2+(v(i,k)-v(i,1))**2+fac*ustar(i)**2
503          zdu2 = u(i, k)**2 + v(i, k)**2
504          zdu2 = max(zdu2, 1.0E-20)
505          ! Theta_v environnement
506          zthvd = t(i, k) / s(i, k) * (1. + retv * q(i, k))
[1992]507
[5143]508          ! et therm Theta_v (avec hypothese de constance de H&B,
509          ! zthvu=(t(i,1)+therm(i))/s(i,1)*(1.+RETV*q(i,1))
510          zthvu = th_th(i) * (1. + retv * qt_th(i)) + therm(i)
[3774]511
512
[5143]513          ! Le Ri par Theta_v
514          ! AM Niveau de ref 2m
515          ! AM         rhino(i,k) = (z(i,k)-z(i,1))*RG*(zthvd-zthvu)
516          ! AM     .               /(zdu2*0.5*(zthvd+zthvu))
517          rhino(i, k) = (z(i, k) - zref) * rg * (zthvd - zthvu) / (zdu2 * 0.5&
518                  * (zthvd + zthvu))
[3774]519
[5143]520          IF (rhino(i, k)>=ricr) THEN
521            pblh(i) = z(i, k - 1) + (z(i, k - 1) - z(i, k)) * (ricr - rhino(i, k - 1))&
522                    / (rhino(i, k - 1) - rhino(i, k))
523            ! test04
524            pblh(i) = pblh(i) + 100.
525            pblt(i) = t(i, k - 1) + (t(i, k) - t(i, k - 1)) * (pblh(i) - z(i, k - 1))&
526                    / (z(i, k) - z(i, k - 1))
527            check(i) = .FALSE.
528            ! IM 170305 BEG
529            IF (1==0) THEN
530              ! debug print -120;34       -34-        58 et    0;26 wamp
531              IF (i==950 .OR. i==192 .OR. i==624 .OR. i==118) THEN
532                PRINT *, ' i,Th_th,Therm,qT :', i, th_th(i), therm(i), &
533                        qt_th(i)
534                q_star = kqfs(i) / wm(i)
535                t_star = khfs(i) / wm(i)
536                PRINT *, 'q* t*, b1,b2,b212 ', q_star, t_star, &
537                        b1 * (1. + 2. * retv * qt_th(i)) * t_star**2, &
538                        (retv * th_th(i))**2 * b2 * q_star**2, 2. * retv * th_th(i)&
539                        * b212 * q_star * t_star
540                PRINT *, 'zdu2 ,100.*ustar(i)**2', zdu2, fac * ustar(i)**2
541              END IF
542            END IF !(1.EQ.0) THEN
543            ! IM 170305 END
544            ! q_star = kqfs(i)/wm(i)
545            ! t_star = khfs(i)/wm(i)
546            ! trmb1(i) = b1*(1.+2.*RETV*q(i,1))*t_star**2
547            ! trmb2(i) = (RETV*T(i,1))**2*b2*q_star**2
548            ! Omega now   trmb3(i) = 2.*RETV*T(i,1)*b212*q_star*t_star
[3774]549          END IF
[5143]550        END IF
551      END DO
[1992]552    END DO
553
[3774]554    ! Set pbl height to maximum value where computation exceeds number of
555    ! layers allowed
[1992]556
[3774]557    DO i = 1, knon
[5143]558      IF (check(i)) pblh(i) = z(i, isommet)
[3774]559    END DO
[1992]560
[3774]561    ! PBL height must be greater than some minimum mechanical mixing depth
562    ! Several investigators have proposed minimum mechanical mixing depth
563    ! relationships as a function of the local friction velocity, u*.  We
564    ! make use of a linear relationship of the form h = c u* where c=700.
565    ! The scaling arguments that give rise to this relationship most often
566    ! represent the coefficient c as some constant over the local coriolis
567    ! parameter.  Here we make use of the experimental results of Koracin
568    ! and Berkowicz (1988) [BLM, Vol 43] for wich they recommend 0.07/f
569    ! where f was evaluated at 39.5 N and 52 N.  Thus we use a typical mid
570    ! latitude value for f so that c = 0.07/f = 700.
[1992]571
[3774]572    DO i = 1, knon
[5143]573      pblmin = 700.0 * ustar(i)
574      pblh(i) = max(pblh(i), pblmin)
575      ! par exemple :
576      pblt(i) = t(i, 2) + (t(i, 3) - t(i, 2)) * (pblh(i) - z(i, 2)) / (z(i, 3) - z(i, 2))
[3774]577    END DO
[1992]578
[3774]579    ! ********************************************************************
580    ! pblh is now available; do preparation for diffusivity calculation :
581    ! ********************************************************************
582    DO i = 1, knon
[5143]583      check(i) = .TRUE.
584      zsat(i) = .FALSE.
585      ! omegafl utilise pour prolongement CAPE
586      omegafl(i) = .FALSE.
587      cape(i) = 0.
588      kape(i) = 0.
589      eauliq(i) = 0.
590      ctei(i) = 0.
591      pblk(i) = 0.0
592      fak1(i) = ustar(i) * pblh(i) * vk
[1992]593
[5143]594      ! Do additional preparation for unstable cases only, set temperature
595      ! and moisture perturbations depending on stability.
596      ! *** Rq: les formule sont prises dans leur forme CS ***
597      IF (unstbl(i)) THEN
598        ! AM Niveau de ref du thermique
599        ! AM          zxt=(t(i,1)-z(i,1)*0.5*RG/RCPD/(1.+RVTMP2*q(i,1)))
600        ! AM     .         *(1.+RETV*q(i,1))
601        zxt = (th_th(i) - zref * 0.5 * rg / rcpd / (1. + rvtmp2 * qt_th(i))) * &
602                (1. + retv * qt_th(i))
603        phiminv(i) = (1. - binm * pblh(i) * unsobklen(i))**onet
604        phihinv(i) = sqrt(1. - binh * pblh(i) * unsobklen(i))
605        wm(i) = ustar(i) * phiminv(i)
606        fak2(i) = wm(i) * pblh(i) * vk
607        wstar(i) = (heatv(i) * rg * pblh(i) / zxt)**onet
608        fak3(i) = fakn * wstar(i) / wm(i)
609      ELSE
610        wstar(i) = 0.
611      END IF
612      ! Computes Theta_e for thermal (all cases : to be modified)
613      ! attention ajout therm(i) = virtuelle
614      the_th(i) = th_th(i) + therm(i) + rlvcp * qt_th(i)
615      ! ou:    The_th(i) = Th_th(i) + sqrt(b1)*khfs(i)/wm(i) + RLvCp*qT_th(i)
[3774]616    END DO
[1992]617
[3774]618    ! Main level loop to compute the diffusivities and
619    ! counter-gradient terms:
[1992]620
[3774]621    DO k = 2, isommet
[1992]622
[5143]623      ! Find levels within boundary layer:
[1992]624
[5143]625      DO i = 1, knon
626        unslev(i) = .FALSE.
627        stblev(i) = .FALSE.
628        zm(i) = z(i, k - 1)
629        zp(i) = z(i, k)
630        IF (zkmin==0.0 .AND. zp(i)>pblh(i)) zp(i) = pblh(i)
631        IF (zm(i)<pblh(i)) THEN
632          zmzp = 0.5 * (zm(i) + zp(i))
633          ! debug
634          ! if (i.EQ.1864) THEN
635          ! PRINT*,'i,pblh(1864),obklen(1864)',i,pblh(i),obklen(i)
636          ! END IF
[1992]637
[5143]638          zh(i) = zmzp / pblh(i)
639          zl(i) = zmzp * unsobklen(i)
640          zzh(i) = 0.
641          IF (zh(i)<=1.0) zzh(i) = (1. - zh(i))**2
[1992]642
[5143]643          ! stblev for points zm < plbh and stable and neutral
644          ! unslev for points zm < plbh and unstable
[1992]645
[5143]646          IF (unstbl(i)) THEN
647            unslev(i) = .TRUE.
648          ELSE
649            stblev(i) = .TRUE.
[3774]650          END IF
[5143]651        END IF
652      END DO
653      ! PRINT*,'fin calcul niveaux'
[644]654
[5143]655      ! Stable and neutral points; set diffusivities; counter-gradient
656      ! terms zero for stable case:
[644]657
[5143]658      DO i = 1, knon
659        IF (stblev(i)) THEN
660          IF (zl(i)<=1.) THEN
661            pblk(i) = fak1(i) * zh(i) * zzh(i) / (1. + betas * zl(i))
662          ELSE
663            pblk(i) = fak1(i) * zh(i) * zzh(i) / (betas + zl(i))
[3774]664          END IF
[5143]665          ! pcfm(i,k) = pblk(i)
666          ! pcfh(i,k) = pcfm(i,k)
667        END IF
668      END DO
[1992]669
[5143]670      ! unssrf, unstable within surface layer of pbl
671      ! unsout, unstable within outer   layer of pbl
[1992]672
[5143]673      DO i = 1, knon
674        unssrf(i) = .FALSE.
675        unsout(i) = .FALSE.
676        IF (unslev(i)) THEN
677          IF (zh(i)<sffrac) THEN
678            unssrf(i) = .TRUE.
679          ELSE
680            unsout(i) = .TRUE.
[3774]681          END IF
[5143]682        END IF
683      END DO
[1992]684
[5143]685      ! Unstable for surface layer; counter-gradient terms zero
[1992]686
[5143]687      DO i = 1, knon
688        IF (unssrf(i)) THEN
689          term = (1. - betam * zl(i))**onet
690          pblk(i) = fak1(i) * zh(i) * zzh(i) * term
691          pr(i) = term / sqrt(1. - betah * zl(i))
692        END IF
693      END DO
694      ! PRINT*,'fin counter-gradient terms zero'
[1992]695
[5143]696      ! Unstable for outer layer; counter-gradient terms non-zero:
[1992]697
[5143]698      DO i = 1, knon
699        IF (unsout(i)) THEN
700          pblk(i) = fak2(i) * zh(i) * zzh(i)
701          ! cgs(i,k) = fak3(i)/(pblh(i)*wm(i))
702          ! cgh(i,k) = khfs(i)*cgs(i,k)
703          pr(i) = phiminv(i) / phihinv(i) + ccon * fak3(i) / fak
704          ! cgq(i,k) = kqfs(i)*cgs(i,k)
705        END IF
706      END DO
707      ! PRINT*,'fin counter-gradient terms non zero'
[1992]708
[5143]709      ! For all unstable layers, compute diffusivities and ctrgrad ter m
[1992]710
[5143]711      ! DO i = 1, knon
712      ! IF (unslev(i)) THEN
713      ! pcfm(i,k) = pblk(i)
714      ! pcfh(i,k) = pblk(i)/pr(i)
715      ! etc cf original
716      ! ENDIF
717      ! ENDDO
[1992]718
[5143]719      ! For all layers, compute integral info and CTEI
[1992]720
[5143]721      DO i = 1, knon
722        IF (check(i) .OR. omegafl(i)) THEN
723          IF (.NOT. zsat(i)) THEN
724            ! Th2 = The_th(i) - RLvCp*qT_th(i)
725            th2 = th_th(i)
726            t2 = th2 * s(i, k)
727            ! thermodyn functions
728            zdelta = max(0., sign(1., rtt - t2))
729            qqsat = r2es * foeew(t2, zdelta) / pplay(i, k)
730            qqsat = min(0.5, qqsat)
731            zcor = 1. / (1. - retv * qqsat)
732            qqsat = qqsat * zcor
[1992]733
[5143]734            IF (qqsat<qt_th(i)) THEN
735              ! on calcule lcl
736              IF (k==2) THEN
737                plcl(i) = z(i, k)
738              ELSE
739                plcl(i) = z(i, k - 1) + (z(i, k - 1) - z(i, k)) * (qt_th(i)&
740                        - qsatbef(i)) / (qsatbef(i) - qqsat)
741              END IF
742              zsat(i) = .TRUE.
743              tbef(i) = t2
744            END IF
[3774]745
[5143]746            qsatbef(i) = qqsat ! bug dans la version orig ???
[1992]747          END IF
[5143]748          ! amn ???? cette ligne a deja ete faite normalement ?
749        END IF
750        ! PRINT*,'hbtm2 i,k=',i,k
751      END DO
[3774]752    END DO ! end of level loop
753    ! IM 170305 BEG
754    IF (1==0) THEN
[5143]755      PRINT *, 'hbtm2  ok'
[3774]756    END IF !(1.EQ.0) THEN
757    ! IM 170305 END
[1992]758
[3774]759  END SUBROUTINE hbtm
760
[5119]761END MODULE hbtm_mod
Note: See TracBrowser for help on using the repository browser.