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

  ViewVC Help
Powered by ViewVC 1.1.21