/[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 229 by guez, Mon Nov 6 17:20:45 2017 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, paprs, pplay, ksta, ksta_ter, ts, rugos, u, v, t, &
8    ! paprs----input-R- pression a chaque intercouche (en Pa)         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: September 22nd, 1993
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 clcdrag_m, only: clcdrag
16    ! itop-----output-I- numero de couche du sommet de la couche limite      USE conf_phys_m, ONLY: iflag_pbl
17    ! pcfm-----output-R- coefficients a calculer (vitesse)      USE dimphy, ONLY: klev, klon
18    ! pcfh-----output-R- coefficients a calculer (chaleur et humidite)      USE fcttre, ONLY: foede, foeew
19        USE indicesol, ONLY: is_oce
20    INTEGER knon, nsrf      USE suphec_m, ONLY: rcpd, rd, retv, rg, rkappa, rlstt, rlvtt, rtt
21    REAL ts(klon)      USE yoethf_m, ONLY: r2es, r5ies, r5les, rvtmp2
22    REAL paprs(klon, klev+1), pplay(klon, klev)  
23    REAL u(klon, klev), v(klon, klev), q(klon, klev)      integer, intent(in):: nsrf ! indicateur de la nature du sol
24    REAL, intent(in):: t(klon, klev) ! temperature (K)  
25    REAL rugos(klon)      REAL, intent(in):: paprs(:, :) ! (klon, klev+1)
26        ! pression a chaque intercouche (en Pa)
27    REAL pcfm(klon, klev), pcfh(klon, klev)  
28    INTEGER itop(klon)      real, intent(in):: pplay(:, :) ! (klon, klev)
29        ! pression au milieu de chaque couche (en Pa)
30    ! Quelques constantes et options:  
31        REAL, intent(in):: ksta, ksta_ter
32    REAL cepdu2, ckap, cb, cc, cd, clam      REAL, intent(in):: ts(:) ! (knon) temperature du sol (en Kelvin)
33    PARAMETER (cepdu2 =(0.1)**2)      REAL, intent(in):: rugos(:) ! (klon) longeur de rugosite (en m)
34    PARAMETER (CKAP=0.4)      REAL, intent(in):: u(:, :), v(:, :) ! (klon, klev) wind
35    PARAMETER (cb=5.0)      REAL, intent(in):: t(:, :) ! (klon, klev) temperature (K)
36    PARAMETER (cc=5.0)      real, intent(in):: q(:, :) ! (klon, klev) vapeur d'eau (kg/kg)
37    PARAMETER (cd=5.0)      real, intent(in):: qsurf(:) ! (knon)
38    PARAMETER (clam=160.0)      REAL, intent(out):: coefm(:, :) ! (knon, klev) coefficient, vitesse
39    REAL ratqs ! largeur de distribution de vapeur d'eau  
40    PARAMETER (ratqs=0.05)      real, intent(out):: coefh(:, :) ! (knon, klev)
41    LOGICAL richum ! utilise le nombre de Richardson humide      ! coefficient, chaleur et humidité
42    PARAMETER (richum=.TRUE.)  
43    REAL ric ! nombre de Richardson critique      ! Local:
44    PARAMETER(ric=0.4)  
45    REAL prandtl      INTEGER knon ! nombre de points a traiter
46    PARAMETER (prandtl=0.4)      INTEGER itop(size(coefm, 1)) ! (knon) numero de couche du sommet
47    REAL kstable ! diffusion minimale (situation stable)                                   ! de la couche limite
48    ! GKtest  
49    ! PARAMETER (kstable=1.0e-10)      ! Quelques constantes et options:
50    REAL ksta, ksta_ter  
51    !IM: 261103     REAL kstable_ter, kstable_sinon      REAL, PARAMETER:: cepdu2 =0.1**2
52    !IM: 211003 cf GK   PARAMETER (kstable_ter = 1.0e-6)      REAL, PARAMETER:: CKAP = 0.4
53    !IM: 261103     PARAMETER (kstable_ter = 1.0e-8)      REAL, PARAMETER:: cb = 5.
54    !IM: 261103   PARAMETER (kstable_ter = 1.0e-10)      REAL, PARAMETER:: cc = 5.
55    !IM: 261103   PARAMETER (kstable_sinon = 1.0e-10)      REAL, PARAMETER:: cd = 5.
56    ! fin GKtest      REAL, PARAMETER:: clam = 160.
57    REAL mixlen ! constante controlant longueur de melange      REAL, PARAMETER:: ratqs = 0.05 ! largeur de distribution de vapeur d'eau
58    PARAMETER (mixlen=35.0)  
59    INTEGER isommet ! le sommet de la couche limite      LOGICAL, PARAMETER:: richum = .TRUE.
60    PARAMETER (isommet=klev)      ! utilise le nombre de Richardson humide
61    LOGICAL tvirtu ! calculer Ri d'une maniere plus performante  
62    PARAMETER (tvirtu=.TRUE.)      REAL, PARAMETER:: ric = 0.4 ! nombre de Richardson critique
63    LOGICAL opt_ec ! formule du Centre Europeen dans l'atmosphere      REAL, PARAMETER:: prandtl = 0.4
64    PARAMETER (opt_ec=.FALSE.)  
65        REAL kstable ! diffusion minimale (situation stable)
66    ! Variables locales:      REAL, PARAMETER:: mixlen = 35. ! constante contrôlant longueur de mélange
67        INTEGER, PARAMETER:: isommet = klev ! sommet de la couche limite
68    INTEGER i, k, kk !IM 120704  
69    REAL zgeop(klon, klev)      LOGICAL, PARAMETER:: tvirtu = .TRUE.
70    REAL zmgeom(klon)      ! calculer Ri d'une maniere plus performante
71    REAL zri(klon)  
72    REAL zl2(klon)      LOGICAL, PARAMETER:: opt_ec = .FALSE.
73        ! formule du Centre Europeen dans l'atmosphere
74    REAL u1(klon), v1(klon), t1(klon), q1(klon), z1(klon)  
75    REAL pcfm1(klon), pcfh1(klon)      INTEGER i, k
76        REAL zgeop(klon, klev)
77    REAL zdphi, zdu2, ztvd, ztvu, zcdn      REAL zmgeom(klon)
78    REAL zscf      REAL ri(klon)
79    REAL zt, zq, zdelta, zcvm5, zcor, zqs, zfr, zdqs      REAL l2(klon)
80    REAL z2geomf, zalh2, zalm2, zscfh, zscfm  
81    REAL t_coup      REAL u1(klon), v1(klon), t1(klon), q1(klon), z1(klon)
82    PARAMETER (t_coup=273.15)  
83    !IM      REAL zdphi, zdu2, ztvd, ztvu, cdn
84    LOGICAL check      REAL scf
85    PARAMETER (check=.false.)      REAL zt, zq, zcvm5, zcor, zqs, zfr, zdqs
86        logical zdelta
87    ! contre-gradient pour la chaleur sensible: Kelvin/metre      REAL z2geomf, zalh2, alm2, zscfh, scfm
88    REAL gamt(2:klev)      REAL gamt(2:klev) ! contre-gradient pour la chaleur sensible: Kelvin/metre
89    real qsurf(klon)  
90        !--------------------------------------------------------------------
91    LOGICAL appel1er  
92    SAVE appel1er      knon = size(coefm, 1)
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(nsrf, u1, v1, t1, q1, z1, ts, qsurf, rugos, coefm(:, 1), &
136    else           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            zdelta = RTT >=zt
154    DO k = 2, klev            zcvm5 = merge(R5IES * RLSTT, R5LES * RLVTT, zdelta) / RCPD &
155       DO i = 1, knon                 / (1. + RVTMP2*zq)
156          zgeop(i, k) = zgeop(i, k-1) &            zqs = R2ES * FOEEW(zt, zdelta) / pplay(i, k)
157               + RD * 0.5*(t(i, k-1)+t(i, k)) / paprs(i, k) &            zqs = MIN(0.5, zqs)
158               * (pplay(i, k-1)-pplay(i, k))            zcor = 1./(1.-RETV*zqs)
159       ENDDO            zqs = zqs*zcor
160    ENDDO            zdqs = FOEDE(zt, zdelta, zcvm5, zqs, zcor)
161    
162    ! Calculer le frottement au sol (Cdrag)            ! calculer la fraction nuageuse (processus humide):
163    
164    DO i = 1, knon            zfr = (zq+ratqs*zq-zqs) / (2.0*ratqs*zq)
165       u1(i) = u(i, 1)            zfr = MAX(0.0, MIN(1.0, zfr))
166       v1(i) = v(i, 1)            IF (.NOT.richum) zfr = 0.0
167       t1(i) = t(i, 1)  
168       q1(i) = q(i, 1)            !  calculer le nombre de Richardson:
169       z1(i) = zgeop(i, 1)  
170    ENDDO            IF (tvirtu) THEN
171                 ztvd =( t(i, k) &
172    CALL clcdrag(klon, knon, nsrf, zxli,  &                    + zdphi/RCPD/(1.+RVTMP2*zq) &
173         u1, v1, t1, q1, z1, &                    *( (1.-zfr) + zfr*(1.+RLVTT*zqs/RD/zt)/(1.+zdqs) ) &
174         ts, qsurf, rugos, &                    )*(1.+RETV*q(i, k))
175         pcfm1, pcfh1)               ztvu =( t(i, k-1) &
176    !IM  $             ts, qsurf, rugos,                    - zdphi/RCPD/(1.+RVTMP2*zq) &
177                      *( (1.-zfr) + zfr*(1.+RLVTT*zqs/RD/zt)/(1.+zdqs) ) &
178    DO i = 1, knon                    )*(1.+RETV*q(i, k-1))
179       pcfm(i, 1)=pcfm1(i)               ri(i) =zmgeom(i)*(ztvd-ztvu)/(zdu2*0.5*(ztvd+ztvu))
180       pcfh(i, 1)=pcfh1(i)               ri(i) = ri(i) &
181    ENDDO                    + zmgeom(i)*zmgeom(i)/RG*gamt(k) &
182                      *(paprs(i, k)/101325.0)**RKAPPA &
183    ! Calculer les coefficients turbulents dans l'atmosphere                    /(zdu2*0.5*(ztvd+ztvu))
184              ELSE
185    DO i = 1, knon               ! calcul de Ridchardson compatible LMD5
186       itop(i) = isommet               ri(i) =(RCPD*(t(i, k)-t(i, k-1)) &
187    ENDDO                    -RD*0.5*(t(i, k)+t(i, k-1))/paprs(i, k) &
188                      *(pplay(i, k)-pplay(i, k-1)) &
189    DO k = 2, isommet                    )*zmgeom(i)/(zdu2*0.5*RCPD*(t(i, k-1)+t(i, k)))
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)*gamt(k)/RG &
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*(t(i, k-1)+t(i, k)))
194          zdphi =zmgeom(i) / 2.0            ENDIF
195          zt = (t(i, k)+t(i, k-1)) * 0.5  
196          zq = (q(i, k)+q(i, k-1)) * 0.5            ! finalement, les coefficients d'echange sont obtenus:
197    
198          !           calculer Qs et dQs/dT:            cdn = SQRT(zdu2) / zmgeom(i) * RG
199    
200          IF (thermcep) THEN            IF (opt_ec) THEN
201             zdelta = MAX(0., SIGN(1., RTT-zt))               z2geomf = zgeop(i, k-1)+zgeop(i, k)
202             zcvm5 = R5LES*RLVTT/RCPD/(1.0+RVTMP2*zq)*(1.-zdelta)  &               alm2 = (0.5*ckap/RG*z2geomf &
203                  + R5IES*RLSTT/RCPD/(1.0+RVTMP2*zq)*zdelta                    /(1.+0.5*ckap/rg/clam*z2geomf))**2
204             zqs = R2ES * FOEEW(zt, zdelta) / pplay(i, k)               zalh2 = (0.5*ckap/rg*z2geomf &
205             zqs = MIN(0.5, zqs)                    /(1.+0.5*ckap/RG/(clam*SQRT(1.5*cd))*z2geomf))**2
206             zcor = 1./(1.-RETV*zqs)               IF (ri(i) < 0.) THEN
207             zqs = zqs*zcor                  ! situation instable
208             zdqs = FOEDE(zt, zdelta, zcvm5, zqs, zcor)                  scf = ((zgeop(i, k)/zgeop(i, k-1))**(1./3.)-1.)**3 &
209          ELSE                       / (zmgeom(i)/RG)**3 / (zgeop(i, k-1)/RG)
210             IF (zt .LT. t_coup) THEN                  scf = SQRT(-ri(i)*scf)
211                zqs = qsats(zt) / pplay(i, k)                  scfm = 1.0 / (1.0+3.0*cb*cc*alm2*scf)
212                zdqs = dqsats(zt, zqs)                  zscfh = 1.0 / (1.0+3.0*cb*cc*zalh2*scf)
213             ELSE                  coefm(i, k) = cdn * alm2 * (1. - 2. * cb * ri(i) * scfm)
214                zqs = qsatl(zt) / pplay(i, k)                  coefh(i, k) = cdn*zalh2*(1.-3.0*cb*ri(i)*zscfh)
215                zdqs = dqsatl(zt, zqs)               ELSE
216             ENDIF                  ! situation stable
217          ENDIF                  scf = SQRT(1.+cd*ri(i))
218                    coefm(i, k) = cdn * alm2 / (1. + 2. * cb * ri(i) / scf)
219          !           calculer la fraction nuageuse (processus humide):                  coefh(i, k) = cdn*zalh2/(1.+3.0*cb*ri(i)*scf)
220                 ENDIF
221          zfr = (zq+ratqs*zq-zqs) / (2.0*ratqs*zq)            ELSE
222          zfr = MAX(0.0, MIN(1.0, zfr))               l2(i) = (mixlen*MAX(0.0, (paprs(i, k)-paprs(i, itop(i)+1)) &
223          IF (.NOT.richum) zfr = 0.0                    /(paprs(i, 2)-paprs(i, itop(i)+1)) ))**2
224                 coefm(i, k) = sqrt(max(cdn**2 * (ric - ri(i)) / ric, kstable))
225          !           calculer le nombre de Richardson:               coefm(i, k)= l2(i) * coefm(i, k)
226                 coefh(i, k) = coefm(i, k) / prandtl ! h et m different
227          IF (tvirtu) THEN            ENDIF
228             ztvd =( t(i, k) &         ENDDO loop_horiz
229                  + zdphi/RCPD/(1.+RVTMP2*zq) &      ENDDO loop_vertical
230                  *( (1.-zfr) + zfr*(1.+RLVTT*zqs/RD/zt)/(1.+zdqs) ) &  
231                  )*(1.+RETV*q(i, k))      ! Au-delà du sommet, pas de diffusion turbulente :
232             ztvu =( t(i, k-1) &      forall (i = 1: knon)
233                  - zdphi/RCPD/(1.+RVTMP2*zq) &         coefh(i, itop(i) + 1:) = 0.
234                  *( (1.-zfr) + zfr*(1.+RLVTT*zqs/RD/zt)/(1.+zdqs) ) &         coefm(i, itop(i) + 1:) = 0.
235                  )*(1.+RETV*q(i, k-1))      END forall
236             zri(i) =zmgeom(i)*(ztvd-ztvu)/(zdu2*0.5*(ztvd+ztvu))  
237             zri(i) = zri(i) &    END SUBROUTINE coefkz
                 + zmgeom(i)*zmgeom(i)/RG*gamt(k) &  
                 *(paprs(i, k)/101325.0)**RKAPPA &  
                 /(zdu2*0.5*(ztvd+ztvu))  
   
         ELSE ! calcul de Ridchardson compatible LMD5  
   
            zri(i) =(RCPD*(t(i, k)-t(i, k-1)) &  
                 -RD*0.5*(t(i, k)+t(i, k-1))/paprs(i, k) &  
                 *(pplay(i, k)-pplay(i, k-1)) &  
                 )*zmgeom(i)/(zdu2*0.5*RCPD*(t(i, k-1)+t(i, k)))  
            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  
238    
239  END SUBROUTINE coefkz  end module coefkz_m

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

  ViewVC Help
Powered by ViewVC 1.1.21