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

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

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

revision 40 by guez, Tue Feb 22 13:49:36 2011 UTC revision 57 by guez, Mon Jan 30 12:54:02 2012 UTC
# Line 1  Line 1 
1  SUBROUTINE coefkz(nsrf, knon, paprs, pplay, ksta, ksta_ter, ts, rugos, u, v, &  module coefkz_m
      t, q, qsurf, pcfm, pcfh)  
   
   ! Auteur(s) F. Hourdin, M. Forichon, Z.X. Li (LMD/CNRS) date: 1993/09/22  
   !           (une version strictement identique a l'ancien modele)  
   ! Objet: calculer le coefficient du frottement du sol (Cdrag) et les  
   !        coefficients d'echange turbulent dans l'atmosphere.  
   
   USE indicesol, ONLY : is_oce  
   USE dimphy, ONLY : klev, klon, max  
   USE iniprint, ONLY : prt_level  
   USE suphec_m, ONLY : rcpd, rd, retv, rg, rkappa, rlstt, rlvtt, rtt  
   USE yoethf_m, ONLY : r2es, r5ies, r5les, rvtmp2  
   USE fcttre, ONLY : dqsatl, dqsats, foede, foeew, qsatl, qsats, thermcep  
   USE conf_phys_m, ONLY : iflag_pbl  
2    
3    IMPLICIT none    IMPLICIT none
4    
5    ! Arguments:  contains
6    ! nsrf-----input-I- indicateur de la nature du sol  
7    ! knon-----input-I- nombre de points a traiter    SUBROUTINE coefkz(nsrf, knon, paprs, pplay, ksta, ksta_ter, ts, rugos, u, v, &
8    ! paprs----input-R- pression a chaque intercouche (en Pa)         t, q, qsurf, pcfm, pcfh)
9    ! pplay----input-R- pression au milieu de chaque couche (en Pa)  
10    ! ts-------input-R- temperature du sol (en Kelvin)      ! Authors: F. Hourdin, M. Forichon, Z.X. Li (LMD/CNRS)
11    ! rugos----input-R- longeur de rugosite (en m)      ! date: 1993/09/22
12    ! u--------input-R- vitesse u      ! Objet : calculer le coefficient de frottement du sol ("Cdrag") et les
13    ! v--------input-R- vitesse v      ! coefficients d'échange turbulent dans l'atmosphère.
14    ! q--------input-R- vapeur d'eau (kg/kg)  
15        USE indicesol, ONLY : is_oce
16    ! itop-----output-I- numero de couche du sommet de la couche limite      USE dimphy, ONLY : klev, klon, max
17    ! pcfm-----output-R- coefficients a calculer (vitesse)      USE conf_gcm_m, ONLY : prt_level
18    ! pcfh-----output-R- coefficients a calculer (chaleur et humidite)      USE suphec_m, ONLY : rcpd, rd, retv, rg, rkappa, rlstt, rlvtt, rtt
19        USE yoethf_m, ONLY : r2es, r5ies, r5les, rvtmp2
20    INTEGER knon, nsrf      USE fcttre, ONLY : dqsatl, dqsats, foede, foeew, qsatl, qsats, thermcep
21    REAL ts(klon)      USE conf_phys_m, ONLY : iflag_pbl
22    REAL paprs(klon, klev+1), pplay(klon, klev)  
23    REAL u(klon, klev), v(klon, klev), q(klon, klev)      ! Arguments:
24    REAL, intent(in):: t(klon, klev) ! temperature (K)  
25    REAL rugos(klon)      integer, intent(in):: nsrf ! indicateur de la nature du sol
26        INTEGER, intent(in):: knon ! nombre de points a traiter
27    REAL pcfm(klon, klev), pcfh(klon, klev)  
28    INTEGER itop(klon)      REAL, intent(in):: paprs(klon, klev+1)
29        ! pression a chaque intercouche (en Pa)
30    ! Quelques constantes et options:  
31        real, intent(in):: pplay(klon, klev)
32    REAL cepdu2, ckap, cb, cc, cd, clam      ! pression au milieu de chaque couche (en Pa)
33    PARAMETER (cepdu2 =(0.1)**2)  
34    PARAMETER (CKAP=0.4)      REAL, intent(in):: ksta, ksta_ter
35    PARAMETER (cb=5.0)      REAL, intent(in):: ts(klon) ! temperature du sol (en Kelvin)
36    PARAMETER (cc=5.0)      REAL, intent(in):: rugos(klon) ! longeur de rugosite (en m)
37    PARAMETER (cd=5.0)      REAL, intent(in):: u(klon, klev), v(klon, klev) ! wind
38    PARAMETER (clam=160.0)      REAL, intent(in):: t(klon, klev) ! temperature (K)
39    REAL ratqs ! largeur de distribution de vapeur d'eau      real, intent(in):: q(klon, klev) ! vapeur d'eau (kg/kg)
40    PARAMETER (ratqs=0.05)      real, intent(in):: qsurf(klon)
41    LOGICAL richum ! utilise le nombre de Richardson humide      REAL, intent(inout):: pcfm(klon, klev) ! coefficient, vitesse
42    PARAMETER (richum=.TRUE.)      real, intent(inout):: pcfh(klon, klev) ! coefficient, chaleur et humidité
43    REAL ric ! nombre de Richardson critique  
44    PARAMETER(ric=0.4)      ! Local:
45    REAL prandtl  
46    PARAMETER (prandtl=0.4)      INTEGER itop(klon) ! numero de couche du sommet de la couche limite
47    REAL kstable ! diffusion minimale (situation stable)  
48    ! GKtest      ! Quelques constantes et options:
49    ! PARAMETER (kstable=1.0e-10)  
50    REAL ksta, ksta_ter      REAL, PARAMETER:: cepdu2 =0.1**2
51    !IM: 261103     REAL kstable_ter, kstable_sinon      REAL, PARAMETER:: CKAP = 0.4
52    !IM: 211003 cf GK   PARAMETER (kstable_ter = 1.0e-6)      REAL, PARAMETER:: cb = 5.
53    !IM: 261103     PARAMETER (kstable_ter = 1.0e-8)      REAL, PARAMETER:: cc = 5.
54    !IM: 261103   PARAMETER (kstable_ter = 1.0e-10)      REAL, PARAMETER:: cd = 5.
55    !IM: 261103   PARAMETER (kstable_sinon = 1.0e-10)      REAL, PARAMETER:: clam = 160.
56    ! fin GKtest      REAL, PARAMETER:: ratqs = 0.05 ! ! largeur de distribution de vapeur d'eau
57    REAL mixlen ! constante controlant longueur de melange      LOGICAL, PARAMETER:: richum = .TRUE. ! utilise le nombre de Richardson humide
58    PARAMETER (mixlen=35.0)      REAL, PARAMETER:: ric = 0.4 ! nombre de Richardson critique
59    INTEGER isommet ! le sommet de la couche limite      REAL, PARAMETER:: prandtl = 0.4
60    PARAMETER (isommet=klev)  
61    LOGICAL tvirtu ! calculer Ri d'une maniere plus performante      REAL kstable ! diffusion minimale (situation stable)
62    PARAMETER (tvirtu=.TRUE.)      REAL, PARAMETER:: mixlen = 35. ! constante controlant longueur de melange
63    LOGICAL opt_ec ! formule du Centre Europeen dans l'atmosphere      INTEGER, PARAMETER:: isommet = klev ! le sommet de la couche limite
64    PARAMETER (opt_ec=.FALSE.)  
65        LOGICAL, PARAMETER:: tvirtu = .TRUE.
66    ! Variables locales:      ! calculer Ri d'une maniere plus performante
67    
68    INTEGER i, k, kk !IM 120704      LOGICAL, PARAMETER:: opt_ec = .FALSE.
69    REAL zgeop(klon, klev)      ! formule du Centre Europeen dans l'atmosphere
70    REAL zmgeom(klon)  
71    REAL zri(klon)      INTEGER i, k, kk
72    REAL zl2(klon)      REAL zgeop(klon, klev)
73        REAL zmgeom(klon)
74    REAL u1(klon), v1(klon), t1(klon), q1(klon), z1(klon)      REAL zri(klon)
75    REAL pcfm1(klon), pcfh1(klon)      REAL zl2(klon)
76    
77    REAL zdphi, zdu2, ztvd, ztvu, zcdn      REAL u1(klon), v1(klon), t1(klon), q1(klon), z1(klon)
78    REAL zscf      REAL pcfm1(klon), pcfh1(klon)
79    REAL zt, zq, zdelta, zcvm5, zcor, zqs, zfr, zdqs  
80    REAL z2geomf, zalh2, zalm2, zscfh, zscfm      REAL zdphi, zdu2, ztvd, ztvu, zcdn
81    REAL t_coup      REAL zscf
82    PARAMETER (t_coup=273.15)      REAL zt, zq, zdelta, zcvm5, zcor, zqs, zfr, zdqs
83    !IM      REAL z2geomf, zalh2, zalm2, zscfh, zscfm
84    LOGICAL check      REAL, PARAMETER:: t_coup = 273.15
85    PARAMETER (check=.false.)      REAL gamt(2:klev) ! contre-gradient pour la chaleur sensible: Kelvin/metre
86    
87    ! contre-gradient pour la chaleur sensible: Kelvin/metre      !--------------------------------------------------------------------
88    REAL gamt(2:klev)  
89    real qsurf(klon)      ! Initialiser les sorties
90        DO k = 1, klev
91    LOGICAL appel1er         DO i = 1, knon
92    SAVE appel1er            pcfm(i, k) = 0.
93              pcfh(i, k) = 0.
94    ! Fonctions thermodynamiques et fonctions d'instabilite         ENDDO
95    REAL fsta, fins, x      ENDDO
96    LOGICAL zxli ! utiliser un jeu de fonctions simples      DO i = 1, knon
97    PARAMETER (zxli=.FALSE.)         itop(i) = 0
98        ENDDO
99    fsta(x) = 1.0 / (1.0+10.0*x*(1+8.0*x))  
100    fins(x) = SQRT(1.0-18.0*x)      ! Prescrire la valeur de contre-gradient
101        if (iflag_pbl.eq.1) then
102    DATA appel1er /.TRUE./         DO k = 3, klev
103              gamt(k) = -1.0E-03
104    !--------------------------------------------------------------------         ENDDO
105           gamt(2) = -2.5E-03
106    IF (appel1er) THEN      else
107       if (prt_level > 9) THEN         DO k = 2, klev
108          print *, 'coefkz, opt_ec:', opt_ec            gamt(k) = 0.0
109          print *, 'coefkz, richum:', richum         ENDDO
110          IF (richum) print *, 'coefkz, ratqs:', ratqs      ENDIF
111          print *, 'coefkz, isommet:', isommet  
112          print *, 'coefkz, tvirtu:', tvirtu      IF ( nsrf .NE. is_oce ) THEN
113          appel1er = .FALSE.         kstable = ksta_ter
114       endif      ELSE
115    ENDIF         kstable = ksta
116        ENDIF
117    ! Initialiser les sorties  
118        ! Calculer les géopotentiels de chaque couche
119    DO k = 1, klev      DO i = 1, knon
120       DO i = 1, knon         zgeop(i, 1) = RD * t(i, 1) / (0.5 * (paprs(i, 1) + pplay(i, 1))) &
121          pcfm(i, k) = 0.0              * (paprs(i, 1) - pplay(i, 1))
122          pcfh(i, k) = 0.0      ENDDO
123       ENDDO      DO k = 2, klev
124    ENDDO         DO i = 1, knon
125    DO i = 1, knon            zgeop(i, k) = zgeop(i, k-1) &
126       itop(i) = 0                 + RD * 0.5*(t(i, k-1)+t(i, k)) / paprs(i, k) &
127    ENDDO                 * (pplay(i, k-1)-pplay(i, k))
128           ENDDO
129    ! Prescrire la valeur de contre-gradient      ENDDO
130    
131    if (iflag_pbl.eq.1) then      ! Calculer le frottement au sol (Cdrag)
132       DO k = 3, klev  
133          gamt(k) = -1.0E-03      DO i = 1, knon
134       ENDDO         u1(i) = u(i, 1)
135       gamt(2) = -2.5E-03         v1(i) = v(i, 1)
136    else         t1(i) = t(i, 1)
137       DO k = 2, klev         q1(i) = q(i, 1)
138          gamt(k) = 0.0         z1(i) = zgeop(i, 1)
139       ENDDO      ENDDO
140    ENDIF  
141        CALL clcdrag(klon, knon, nsrf, .false., u1, v1, t1, q1, z1, ts, qsurf, &
142    IF ( nsrf .NE. is_oce ) THEN           rugos, pcfm1, pcfh1)
143       kstable = ksta_ter  
144    ELSE      DO i = 1, knon
145       kstable = ksta         pcfm(i, 1) = pcfm1(i)
146    ENDIF         pcfh(i, 1) = pcfh1(i)
147        ENDDO
148    ! Calculer les géopotentiels de chaque couche  
149        ! Calculer les coefficients turbulents dans l'atmosphere
150    DO i = 1, knon  
151       zgeop(i, 1) = RD * t(i, 1) / (0.5 * (paprs(i, 1) + pplay(i, 1))) &      DO i = 1, knon
152            * (paprs(i, 1) - pplay(i, 1))         itop(i) = isommet
153    ENDDO      ENDDO
154    DO k = 2, klev  
155       DO i = 1, knon      loop_vertical: DO k = 2, isommet
156          zgeop(i, k) = zgeop(i, k-1) &         loop_horiz: DO i = 1, knon
157               + RD * 0.5*(t(i, k-1)+t(i, k)) / paprs(i, k) &            zdu2 = MAX(cepdu2, (u(i, k)-u(i, k-1))**2 &
158               * (pplay(i, k-1)-pplay(i, k))                 +(v(i, k)-v(i, k-1))**2)
159       ENDDO            zmgeom(i) = zgeop(i, k)-zgeop(i, k-1)
160    ENDDO            zdphi =zmgeom(i) / 2.0
161              zt = (t(i, k)+t(i, k-1)) * 0.5
162    ! Calculer le frottement au sol (Cdrag)            zq = (q(i, k)+q(i, k-1)) * 0.5
163    
164    DO i = 1, knon            ! calculer Qs et dQs/dT:
165       u1(i) = u(i, 1)  
166       v1(i) = v(i, 1)            IF (thermcep) THEN
167       t1(i) = t(i, 1)               zdelta = MAX(0., SIGN(1., RTT-zt))
168       q1(i) = q(i, 1)               zcvm5 = R5LES*RLVTT/RCPD/(1.0+RVTMP2*zq)*(1.-zdelta)  &
169       z1(i) = zgeop(i, 1)                    + R5IES*RLSTT/RCPD/(1.0+RVTMP2*zq)*zdelta
170    ENDDO               zqs = R2ES * FOEEW(zt, zdelta) / pplay(i, k)
171                 zqs = MIN(0.5, zqs)
172    CALL clcdrag(klon, knon, nsrf, zxli,  &               zcor = 1./(1.-RETV*zqs)
173         u1, v1, t1, q1, z1, &               zqs = zqs*zcor
174         ts, qsurf, rugos, &               zdqs = FOEDE(zt, zdelta, zcvm5, zqs, zcor)
175         pcfm1, pcfh1)            ELSE
176    !IM  $             ts, qsurf, rugos,               IF (zt .LT. t_coup) THEN
177                    zqs = qsats(zt) / pplay(i, k)
178    DO i = 1, knon                  zdqs = dqsats(zt, zqs)
179       pcfm(i, 1)=pcfm1(i)               ELSE
180       pcfh(i, 1)=pcfh1(i)                  zqs = qsatl(zt) / pplay(i, k)
181    ENDDO                  zdqs = dqsatl(zt, zqs)
182                 ENDIF
183    ! Calculer les coefficients turbulents dans l'atmosphere            ENDIF
184    
185    DO i = 1, knon            ! calculer la fraction nuageuse (processus humide):
186       itop(i) = isommet  
187    ENDDO            zfr = (zq+ratqs*zq-zqs) / (2.0*ratqs*zq)
188              zfr = MAX(0.0, MIN(1.0, zfr))
189    DO k = 2, isommet            IF (.NOT.richum) zfr = 0.0
190       DO i = 1, knon  
191          zdu2=MAX(cepdu2, (u(i, k)-u(i, k-1))**2 &            !  calculer le nombre de Richardson:
192               +(v(i, k)-v(i, k-1))**2)  
193          zmgeom(i)=zgeop(i, k)-zgeop(i, k-1)            IF (tvirtu) THEN
194          zdphi =zmgeom(i) / 2.0               ztvd =( t(i, k) &
195          zt = (t(i, k)+t(i, k-1)) * 0.5                    + zdphi/RCPD/(1.+RVTMP2*zq) &
196          zq = (q(i, k)+q(i, k-1)) * 0.5                    *( (1.-zfr) + zfr*(1.+RLVTT*zqs/RD/zt)/(1.+zdqs) ) &
197                      )*(1.+RETV*q(i, k))
198          !           calculer Qs et dQs/dT:               ztvu =( t(i, k-1) &
199                      - zdphi/RCPD/(1.+RVTMP2*zq) &
200          IF (thermcep) THEN                    *( (1.-zfr) + zfr*(1.+RLVTT*zqs/RD/zt)/(1.+zdqs) ) &
201             zdelta = MAX(0., SIGN(1., RTT-zt))                    )*(1.+RETV*q(i, k-1))
202             zcvm5 = R5LES*RLVTT/RCPD/(1.0+RVTMP2*zq)*(1.-zdelta)  &               zri(i) =zmgeom(i)*(ztvd-ztvu)/(zdu2*0.5*(ztvd+ztvu))
203                  + R5IES*RLSTT/RCPD/(1.0+RVTMP2*zq)*zdelta               zri(i) = zri(i) &
204             zqs = R2ES * FOEEW(zt, zdelta) / pplay(i, k)                    + zmgeom(i)*zmgeom(i)/RG*gamt(k) &
205             zqs = MIN(0.5, zqs)                    *(paprs(i, k)/101325.0)**RKAPPA &
206             zcor = 1./(1.-RETV*zqs)                    /(zdu2*0.5*(ztvd+ztvu))
207             zqs = zqs*zcor            ELSE
208             zdqs = FOEDE(zt, zdelta, zcvm5, zqs, zcor)               ! calcul de Ridchardson compatible LMD5
209          ELSE               zri(i) =(RCPD*(t(i, k)-t(i, k-1)) &
210             IF (zt .LT. t_coup) THEN                    -RD*0.5*(t(i, k)+t(i, k-1))/paprs(i, k) &
211                zqs = qsats(zt) / pplay(i, k)                    *(pplay(i, k)-pplay(i, k-1)) &
212                zdqs = dqsats(zt, zqs)                    )*zmgeom(i)/(zdu2*0.5*RCPD*(t(i, k-1)+t(i, k)))
213             ELSE               zri(i) = zri(i) + &
214                zqs = qsatl(zt) / pplay(i, k)                    zmgeom(i)*zmgeom(i)*gamt(k)/RG &
215                zdqs = dqsatl(zt, zqs)                    *(paprs(i, k)/101325.0)**RKAPPA &
216             ENDIF                    /(zdu2*0.5*(t(i, k-1)+t(i, k)))
217          ENDIF            ENDIF
218    
219          !           calculer la fraction nuageuse (processus humide):            ! finalement, les coefficients d'echange sont obtenus:
220    
221          zfr = (zq+ratqs*zq-zqs) / (2.0*ratqs*zq)            zcdn = SQRT(zdu2) / zmgeom(i) * RG
222          zfr = MAX(0.0, MIN(1.0, zfr))  
223          IF (.NOT.richum) zfr = 0.0            IF (opt_ec) THEN
224                 z2geomf = zgeop(i, k-1)+zgeop(i, k)
225          !           calculer le nombre de Richardson:               zalm2 = (0.5*ckap/RG*z2geomf &
226                      /(1.+0.5*ckap/rg/clam*z2geomf))**2
227          IF (tvirtu) THEN               zalh2 = (0.5*ckap/rg*z2geomf &
228             ztvd =( t(i, k) &                    /(1.+0.5*ckap/RG/(clam*SQRT(1.5*cd))*z2geomf))**2
229                  + zdphi/RCPD/(1.+RVTMP2*zq) &               IF (zri(i).LT.0.0) THEN
230                  *( (1.-zfr) + zfr*(1.+RLVTT*zqs/RD/zt)/(1.+zdqs) ) &                  ! situation instable
231                  )*(1.+RETV*q(i, k))                  zscf = ((zgeop(i, k)/zgeop(i, k-1))**(1./3.)-1.)**3 &
232             ztvu =( t(i, k-1) &                       / (zmgeom(i)/RG)**3 / (zgeop(i, k-1)/RG)
233                  - zdphi/RCPD/(1.+RVTMP2*zq) &                  zscf = SQRT(-zri(i)*zscf)
234                  *( (1.-zfr) + zfr*(1.+RLVTT*zqs/RD/zt)/(1.+zdqs) ) &                  zscfm = 1.0 / (1.0+3.0*cb*cc*zalm2*zscf)
235                  )*(1.+RETV*q(i, k-1))                  zscfh = 1.0 / (1.0+3.0*cb*cc*zalh2*zscf)
236             zri(i) =zmgeom(i)*(ztvd-ztvu)/(zdu2*0.5*(ztvd+ztvu))                  pcfm(i, k) = zcdn*zalm2*(1.-2.0*cb*zri(i)*zscfm)
237             zri(i) = zri(i) &                  pcfh(i, k) = zcdn*zalh2*(1.-3.0*cb*zri(i)*zscfh)
238                  + zmgeom(i)*zmgeom(i)/RG*gamt(k) &               ELSE
239                  *(paprs(i, k)/101325.0)**RKAPPA &                  ! situation stable
240                  /(zdu2*0.5*(ztvd+ztvu))                  zscf = SQRT(1.+cd*zri(i))
241                    pcfm(i, k) = zcdn*zalm2/(1.+2.0*cb*zri(i)/zscf)
242          ELSE ! calcul de Ridchardson compatible LMD5                  pcfh(i, k) = zcdn*zalh2/(1.+3.0*cb*zri(i)*zscf)
243                 ENDIF
244             zri(i) =(RCPD*(t(i, k)-t(i, k-1)) &            ELSE
245                  -RD*0.5*(t(i, k)+t(i, k-1))/paprs(i, k) &               zl2(i) = (mixlen*MAX(0.0, (paprs(i, k)-paprs(i, itop(i)+1)) &
246                  *(pplay(i, k)-pplay(i, k-1)) &                    /(paprs(i, 2)-paprs(i, itop(i)+1)) ))**2
247                  )*zmgeom(i)/(zdu2*0.5*RCPD*(t(i, k-1)+t(i, k)))               pcfm(i, k) = sqrt(max(zcdn*zcdn*(ric-zri(i))/ric, kstable))
248             zri(i) = zri(i) + &               pcfm(i, k)= zl2(i)* pcfm(i, k)
249                  zmgeom(i)*zmgeom(i)*gamt(k)/RG &               pcfh(i, k) = pcfm(i, k) /prandtl ! h et m different
250                  *(paprs(i, k)/101325.0)**RKAPPA &            ENDIF
251                  /(zdu2*0.5*(t(i, k-1)+t(i, k)))         ENDDO loop_horiz
252          ENDIF      ENDDO loop_vertical
253    
254          !           finalement, les coefficients d'echange sont obtenus:      ! Au-dela du sommet, pas de diffusion turbulente:
255    
256          zcdn=SQRT(zdu2) / zmgeom(i) * RG      DO i = 1, knon
257           IF (itop(i)+1 .LE. klev) THEN
258          IF (opt_ec) THEN            DO k = itop(i)+1, klev
259             z2geomf=zgeop(i, k-1)+zgeop(i, k)               pcfh(i, k) = 0.
260             zalm2=(0.5*ckap/RG*z2geomf &               pcfm(i, k) = 0.
261                  /(1.+0.5*ckap/rg/clam*z2geomf))**2            ENDDO
262             zalh2=(0.5*ckap/rg*z2geomf &         ENDIF
263                  /(1.+0.5*ckap/RG/(clam*SQRT(1.5*cd))*z2geomf))**2      ENDDO
264             IF (zri(i).LT.0.0) THEN  ! situation instable  
265                zscf = ((zgeop(i, k)/zgeop(i, k-1))**(1./3.)-1.)**3 &    END SUBROUTINE coefkz
                    / (zmgeom(i)/RG)**3 / (zgeop(i, k-1)/RG)  
               zscf = SQRT(-zri(i)*zscf)  
               zscfm = 1.0 / (1.0+3.0*cb*cc*zalm2*zscf)  
               zscfh = 1.0 / (1.0+3.0*cb*cc*zalh2*zscf)  
               pcfm(i, k)=zcdn*zalm2*(1.-2.0*cb*zri(i)*zscfm)  
               pcfh(i, k)=zcdn*zalh2*(1.-3.0*cb*zri(i)*zscfh)  
            ELSE ! situation stable  
               zscf=SQRT(1.+cd*zri(i))  
               pcfm(i, k)=zcdn*zalm2/(1.+2.0*cb*zri(i)/zscf)  
               pcfh(i, k)=zcdn*zalh2/(1.+3.0*cb*zri(i)*zscf)  
            ENDIF  
         ELSE  
            zl2(i)=(mixlen*MAX(0.0, (paprs(i, k)-paprs(i, itop(i)+1)) &  
                 /(paprs(i, 2)-paprs(i, itop(i)+1)) ))**2  
            pcfm(i, k)=sqrt(max(zcdn*zcdn*(ric-zri(i))/ric, kstable))  
            pcfm(i, k)= zl2(i)* pcfm(i, k)  
            pcfh(i, k) = pcfm(i, k) /prandtl ! h et m different  
         ENDIF  
      ENDDO  
   ENDDO  
   
   ! Au-dela du sommet, pas de diffusion turbulente:  
   
   DO i = 1, knon  
      IF (itop(i)+1 .LE. klev) THEN  
         DO k = itop(i)+1, klev  
            pcfh(i, k) = 0.0  
            pcfm(i, k) = 0.0  
         ENDDO  
      ENDIF  
   ENDDO  
266    
267  END SUBROUTINE coefkz  end module coefkz_m

Legend:
Removed from v.40  
changed lines
  Added in v.57

  ViewVC Help
Powered by ViewVC 1.1.21