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

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

  ViewVC Help
Powered by ViewVC 1.1.21