/[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/phylmd/coefkz.f revision 103 by guez, Fri Aug 29 13:00:05 2014 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, kk
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.103

  ViewVC Help
Powered by ViewVC 1.1.21