/[lmdze]/trunk/libf/phylmd/coefkz.f90
ViewVC logotype

Diff of /trunk/libf/phylmd/coefkz.f90

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

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

  ViewVC Help
Powered by ViewVC 1.1.21