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

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

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

revision 46 by guez, Thu Mar 24 11:52:41 2011 UTC revision 47 by guez, Fri Jul 1 15:00:48 2011 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 iniprint, 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, u1, v1, t1, q1, z1, ts, qsurf, rugos, &               zcor = 1./(1.-RETV*zqs)
173         pcfm1, pcfh1)               zqs = zqs*zcor
174                 zdqs = FOEDE(zt, zdelta, zcvm5, zqs, zcor)
175    DO i = 1, knon            ELSE
176       pcfm(i, 1)=pcfm1(i)               IF (zt .LT. t_coup) THEN
177       pcfh(i, 1)=pcfh1(i)                  zqs = qsats(zt) / pplay(i, k)
178    ENDDO                  zdqs = dqsats(zt, zqs)
179                 ELSE
180    ! Calculer les coefficients turbulents dans l'atmosphere                  zqs = qsatl(zt) / pplay(i, k)
181                    zdqs = dqsatl(zt, zqs)
182    DO i = 1, knon               ENDIF
183       itop(i) = isommet            ENDIF
184    ENDDO  
185              ! calculer la fraction nuageuse (processus humide):
186    DO k = 2, isommet  
187       DO i = 1, knon            zfr = (zq+ratqs*zq-zqs) / (2.0*ratqs*zq)
188          zdu2=MAX(cepdu2, (u(i, k)-u(i, k-1))**2 &            zfr = MAX(0.0, MIN(1.0, zfr))
189               +(v(i, k)-v(i, k-1))**2)            IF (.NOT.richum) zfr = 0.0
190          zmgeom(i)=zgeop(i, k)-zgeop(i, k-1)  
191          zdphi =zmgeom(i) / 2.0            !  calculer le nombre de Richardson:
192          zt = (t(i, k)+t(i, k-1)) * 0.5  
193          zq = (q(i, k)+q(i, k-1)) * 0.5            IF (tvirtu) THEN
194                 ztvd =( t(i, k) &
195          !           calculer Qs et dQs/dT:                    + zdphi/RCPD/(1.+RVTMP2*zq) &
196                      *( (1.-zfr) + zfr*(1.+RLVTT*zqs/RD/zt)/(1.+zdqs) ) &
197          IF (thermcep) THEN                    )*(1.+RETV*q(i, k))
198             zdelta = MAX(0., SIGN(1., RTT-zt))               ztvu =( t(i, k-1) &
199             zcvm5 = R5LES*RLVTT/RCPD/(1.0+RVTMP2*zq)*(1.-zdelta)  &                    - zdphi/RCPD/(1.+RVTMP2*zq) &
200                  + R5IES*RLSTT/RCPD/(1.0+RVTMP2*zq)*zdelta                    *( (1.-zfr) + zfr*(1.+RLVTT*zqs/RD/zt)/(1.+zdqs) ) &
201             zqs = R2ES * FOEEW(zt, zdelta) / pplay(i, k)                    )*(1.+RETV*q(i, k-1))
202             zqs = MIN(0.5, zqs)               zri(i) =zmgeom(i)*(ztvd-ztvu)/(zdu2*0.5*(ztvd+ztvu))
203             zcor = 1./(1.-RETV*zqs)               zri(i) = zri(i) &
204             zqs = zqs*zcor                    + zmgeom(i)*zmgeom(i)/RG*gamt(k) &
205             zdqs = FOEDE(zt, zdelta, zcvm5, zqs, zcor)                    *(paprs(i, k)/101325.0)**RKAPPA &
206          ELSE                    /(zdu2*0.5*(ztvd+ztvu))
207             IF (zt .LT. t_coup) THEN            ELSE
208                zqs = qsats(zt) / pplay(i, k)               ! calcul de Ridchardson compatible LMD5
209                zdqs = dqsats(zt, zqs)               zri(i) =(RCPD*(t(i, k)-t(i, k-1)) &
210             ELSE                    -RD*0.5*(t(i, k)+t(i, k-1))/paprs(i, k) &
211                zqs = qsatl(zt) / pplay(i, k)                    *(pplay(i, k)-pplay(i, k-1)) &
212                zdqs = dqsatl(zt, zqs)                    )*zmgeom(i)/(zdu2*0.5*RCPD*(t(i, k-1)+t(i, k)))
213             ENDIF               zri(i) = zri(i) + &
214          ENDIF                    zmgeom(i)*zmgeom(i)*gamt(k)/RG &
215                      *(paprs(i, k)/101325.0)**RKAPPA &
216          !           calculer la fraction nuageuse (processus humide):                    /(zdu2*0.5*(t(i, k-1)+t(i, k)))
217              ENDIF
218          zfr = (zq+ratqs*zq-zqs) / (2.0*ratqs*zq)  
219          zfr = MAX(0.0, MIN(1.0, zfr))            ! finalement, les coefficients d'echange sont obtenus:
220          IF (.NOT.richum) zfr = 0.0  
221              zcdn = SQRT(zdu2) / zmgeom(i) * RG
222          !           calculer le nombre de Richardson:  
223              IF (opt_ec) THEN
224          IF (tvirtu) THEN               z2geomf = zgeop(i, k-1)+zgeop(i, k)
225             ztvd =( t(i, k) &               zalm2 = (0.5*ckap/RG*z2geomf &
226                  + zdphi/RCPD/(1.+RVTMP2*zq) &                    /(1.+0.5*ckap/rg/clam*z2geomf))**2
227                  *( (1.-zfr) + zfr*(1.+RLVTT*zqs/RD/zt)/(1.+zdqs) ) &               zalh2 = (0.5*ckap/rg*z2geomf &
228                  )*(1.+RETV*q(i, k))                    /(1.+0.5*ckap/RG/(clam*SQRT(1.5*cd))*z2geomf))**2
229             ztvu =( t(i, k-1) &               IF (zri(i).LT.0.0) THEN
230                  - zdphi/RCPD/(1.+RVTMP2*zq) &                  ! situation instable
231                  *( (1.-zfr) + zfr*(1.+RLVTT*zqs/RD/zt)/(1.+zdqs) ) &                  zscf = ((zgeop(i, k)/zgeop(i, k-1))**(1./3.)-1.)**3 &
232                  )*(1.+RETV*q(i, k-1))                       / (zmgeom(i)/RG)**3 / (zgeop(i, k-1)/RG)
233             zri(i) =zmgeom(i)*(ztvd-ztvu)/(zdu2*0.5*(ztvd+ztvu))                  zscf = SQRT(-zri(i)*zscf)
234             zri(i) = zri(i) &                  zscfm = 1.0 / (1.0+3.0*cb*cc*zalm2*zscf)
235                  + zmgeom(i)*zmgeom(i)/RG*gamt(k) &                  zscfh = 1.0 / (1.0+3.0*cb*cc*zalh2*zscf)
236                  *(paprs(i, k)/101325.0)**RKAPPA &                  pcfm(i, k) = zcdn*zalm2*(1.-2.0*cb*zri(i)*zscfm)
237                  /(zdu2*0.5*(ztvd+ztvu))                  pcfh(i, k) = zcdn*zalh2*(1.-3.0*cb*zri(i)*zscfh)
238                 ELSE
239          ELSE ! calcul de Ridchardson compatible LMD5                  ! situation stable
240                    zscf = SQRT(1.+cd*zri(i))
241             zri(i) =(RCPD*(t(i, k)-t(i, k-1)) &                  pcfm(i, k) = zcdn*zalm2/(1.+2.0*cb*zri(i)/zscf)
242                  -RD*0.5*(t(i, k)+t(i, k-1))/paprs(i, k) &                  pcfh(i, k) = zcdn*zalh2/(1.+3.0*cb*zri(i)*zscf)
243                  *(pplay(i, k)-pplay(i, k-1)) &               ENDIF
244                  )*zmgeom(i)/(zdu2*0.5*RCPD*(t(i, k-1)+t(i, k)))            ELSE
245             zri(i) = zri(i) + &               zl2(i) = (mixlen*MAX(0.0, (paprs(i, k)-paprs(i, itop(i)+1)) &
246                  zmgeom(i)*zmgeom(i)*gamt(k)/RG &                    /(paprs(i, 2)-paprs(i, itop(i)+1)) ))**2
247                  *(paprs(i, k)/101325.0)**RKAPPA &               pcfm(i, k) = sqrt(max(zcdn*zcdn*(ric-zri(i))/ric, kstable))
248                  /(zdu2*0.5*(t(i, k-1)+t(i, k)))               pcfm(i, k)= zl2(i)* pcfm(i, k)
249          ENDIF               pcfh(i, k) = pcfm(i, k) /prandtl ! h et m different
250              ENDIF
251          !           finalement, les coefficients d'echange sont obtenus:         ENDDO loop_horiz
252        ENDDO loop_vertical
253          zcdn=SQRT(zdu2) / zmgeom(i) * RG  
254        ! Au-dela du sommet, pas de diffusion turbulente:
255          IF (opt_ec) THEN  
256             z2geomf=zgeop(i, k-1)+zgeop(i, k)      DO i = 1, knon
257             zalm2=(0.5*ckap/RG*z2geomf &         IF (itop(i)+1 .LE. klev) THEN
258                  /(1.+0.5*ckap/rg/clam*z2geomf))**2            DO k = itop(i)+1, klev
259             zalh2=(0.5*ckap/rg*z2geomf &               pcfh(i, k) = 0.
260                  /(1.+0.5*ckap/RG/(clam*SQRT(1.5*cd))*z2geomf))**2               pcfm(i, k) = 0.
261             IF (zri(i).LT.0.0) THEN  ! situation instable            ENDDO
262                zscf = ((zgeop(i, k)/zgeop(i, k-1))**(1./3.)-1.)**3 &         ENDIF
263                     / (zmgeom(i)/RG)**3 / (zgeop(i, k-1)/RG)      ENDDO
264                zscf = SQRT(-zri(i)*zscf)  
265                zscfm = 1.0 / (1.0+3.0*cb*cc*zalm2*zscf)    END SUBROUTINE coefkz
               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.46  
changed lines
  Added in v.47

  ViewVC Help
Powered by ViewVC 1.1.21