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

Legend:
Removed from v.38  
changed lines
  Added in v.71

  ViewVC Help
Powered by ViewVC 1.1.21