/[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

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

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

  ViewVC Help
Powered by ViewVC 1.1.21