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

revision 40 by guez, Tue Feb 22 13:49:36 2011 UTC revision 71 by guez, Mon Jul 8 18:12:18 2013 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, zdelta, zcvm5, zcor, zqs, zfr, zdqs
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 = MAX(0., SIGN(1., RTT-zt))
155       DO i = 1, knon               zcvm5 = R5LES*RLVTT/RCPD/(1.0+RVTMP2*zq)*(1.-zdelta)  &
156          zgeop(i, k) = zgeop(i, k-1) &                    + R5IES*RLSTT/RCPD/(1.0+RVTMP2*zq)*zdelta
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.71

  ViewVC Help
Powered by ViewVC 1.1.21