/[lmdze]/trunk/Sources/phylmd/CV30_routines/cv30_unsat.f
ViewVC logotype

Diff of /trunk/Sources/phylmd/CV30_routines/cv30_unsat.f

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

trunk/Sources/phylmd/CV3_routines/cv3_unsat.f revision 134 by guez, Wed Apr 29 15:47:56 2015 UTC trunk/Sources/phylmd/CV30_routines/cv30_unsat.f revision 201 by guez, Mon Jun 6 17:42:15 2016 UTC
# Line 1  Line 1 
1  module cv3_unsat_m  module cv30_unsat_m
2    
3    implicit none    implicit none
4    
5  contains  contains
6    
7    SUBROUTINE cv3_unsat(nloc,ncum,nd,na,icb,inb &    SUBROUTINE cv30_unsat(icb, inb, t, q, qs, gz, u, v, p, ph, th, tv, lv, cpn, &
8         ,t,rr,rs,gz,u,v,p,ph &         ep, clw, m, ment, elij, delt, plcl, mp, qp, up, vp, wt, water, evap, b)
        ,th,tv,lv,cpn,ep,sigp,clw &  
        ,m,ment,elij,delt,plcl &  
        ,mp,rp,up,vp,wt,water,evap,b)  
     use cv3_param_m  
     use cvthermo  
     use cvflag  
9    
10        ! Unsaturated (precipitating) downdrafts
11    
12      ! inputs:      use cv30_param_m, only: nl, sigd
13      integer, intent(in):: ncum, nd, na, nloc      use cv_thermo_m, only: ginv
14      integer icb(nloc), inb(nloc)      use SUPHEC_M, only: rg, rcpd
15    
16        integer, intent(in):: icb(:) ! (ncum)
17        ! {2 <= icb <= nl - 3}
18    
19        integer, intent(in):: inb(:) ! (ncum)
20        ! first model level above the level of neutral buoyancy of the
21        ! parcel (1 <= inb <= nl - 1)
22    
23        real, intent(in):: t(:, :) ! (ncum, nl) temperature (K)
24        real, intent(in):: q(:, :), qs(:, :) ! (ncum, nl)
25        real, intent(in):: gz(:, :) ! (klon, klev)
26        real, intent(in):: u(:, :), v(:, :) ! (ncum, nl)
27        real, intent(in):: p(:, :) ! (klon, klev) pressure at full level, in hPa
28        real, intent(in):: ph(:, :) ! (ncum, klev + 1)
29        real, intent(in):: th(:, :) ! (ncum, nl - 1) potential temperature, in K
30        real, intent(in):: tv(:, :) ! (klon, klev)
31    
32        real, intent(in):: lv(:, :) ! (ncum, nl)
33        ! specific latent heat of vaporization of water, in J kg-1
34    
35        real, intent(in):: cpn(:, :) ! (ncum, nl)
36        ! specific heat capacity at constant pressure of humid air, in J K-1 kg-1
37    
38        real, intent(in):: ep(:, :) ! (ncum, klev)
39        real, intent(in):: clw(:, :) ! (ncum, klev)
40        real, intent(in):: m(:, :) ! (ncum, klev)
41        real, intent(in):: ment(:, :, :) ! (ncum, klev, klev)
42        real, intent(in):: elij(:, :, :) ! (ncum, klev, klev)
43      real, intent(in):: delt      real, intent(in):: delt
44      real plcl(nloc)      real, intent(in):: plcl(:) ! (ncum)
     real t(nloc,nd), rr(nloc,nd), rs(nloc,nd)  
     real u(nloc,nd), v(nloc,nd)  
     real p(nloc,nd), ph(nloc,nd+1)  
     real th(nloc,na), gz(nloc,na)  
     real lv(nloc,na), ep(nloc,na), sigp(nloc,na), clw(nloc,na)  
     real cpn(nloc,na), tv(nloc,na)  
     real m(nloc,na), ment(nloc,na,na), elij(nloc,na,na)  
   
     ! outputs:  
     real mp(nloc,na), rp(nloc,na), up(nloc,na), vp(nloc,na)  
     real water(nloc,na), evap(nloc,na), wt(nloc,na)  
     real b(nloc,na)  
   
     ! local variables  
     integer i,j,il,num1  
     real tinv, delti  
     real awat, afac, afac1, afac2, bfac  
     real pr1, pr2, sigt, b6, c6, revap, tevap, delth  
     real amfac, amp2, xf, tf, fac2, ur, sru, fac, d, af, bf  
     real ampmax  
     real lvcp(nloc,na)  
     real wdtrain(nloc)  
     logical lwork(nloc)  
45    
46        real, intent(out):: mp(:, :)
47        ! (ncum, nl) Mass flux of the unsaturated downdraft, defined
48        ! positive downward, in kg m-2 s-1.  M_p in Emanuel (1991 928).
49    
50      !------------------------------------------------------      real, intent(out):: qp(:, :), up(:, :), vp(:, :) ! (ncum, nl)
51        real, intent(out):: wt(:, :) ! (ncum, nl)
52    
53      delti = 1./delt      real, intent(out):: water(:, :) ! (ncum, nl)
54      tinv=1./3.      ! precipitation mixing ratio, l_p in Emanuel (1991 928)
55    
56      mp(:,:)=0.      real, intent(out):: evap(:, :) ! (ncum, nl)
57        ! sigt * rate of evaporation of precipitation, in s-1
58        ! \sigma_s E in Emanuel (1991 928)
59    
60      do i=1,nl      real, intent(out):: b(:, :) ! (ncum, nl - 1)
        do il=1,ncum  
           mp(il,i)=0.0  
           rp(il,i)=rr(il,i)  
           up(il,i)=u(il,i)  
           vp(il,i)=v(il,i)  
           wt(il,i)=0.001  
           water(il,i)=0.0  
           evap(il,i)=0.0  
           b(il,i)=0.0  
           lvcp(il,i)=lv(il,i)/cpn(il,i)  
        enddo  
     enddo  
61    
62      !      ! Local:
     !   ***  check whether ep(inb)=0, if so, skip precipitating    ***  
     !   ***             downdraft calculation                      ***  
     !  
   
     do il=1,ncum  
        lwork(il)=.TRUE.  
        if(ep(il,inb(il)).lt.0.0001)lwork(il)=.FALSE.  
     enddo  
63    
64      call zilch(wdtrain,ncum)      real, parameter:: sigp = 0.15
65        ! fraction of precipitation falling outside of cloud, \sig_s in
66        ! Emanuel (1991 928)
67    
68      DO  i=nl+1,1,-1      integer ncum
69        integer i, il, imax
70        real, parameter:: tinv = 1. / 3.
71        real  delti
72        real afac, afac1, afac2, bfac
73        real pr1, sigt, b6, c6, revap, tevap, delth
74        real xf, tf, fac2, ur, sru, fac, d, af, bf
75        real ampmax
76        real lvcp(size(icb), nl) ! (ncum, nl) L_v / C_p, in K
77        real wdtrain(size(icb)) ! (ncum)
78        logical lwork(size(icb)) ! (ncum)
79    
80         num1=0      !------------------------------------------------------
        do il=1,ncum  
           if ( i.le.inb(il) .and. lwork(il) ) num1=num1+1  
        enddo  
        if (num1.le.0) cycle  
81    
82         !      ncum = size(icb)
83         !   ***  integrate liquid water equation to find condensed water   ***      delti = 1. / delt
84         !   ***                and condensed water flux                    ***      mp = 0.
85         !      b = 0.
86    
87         !      do i = 1, nl
88         !    ***                    begin downdraft loop                    ***         do il = 1, ncum
89         !            qp(il, i) = q(il, i)
90              up(il, i) = u(il, i)
91         !            vp(il, i) = v(il, i)
92         !    ***              calculate detrained precipitation             ***            wt(il, i) = 0.001
93         !            water(il, i) = 0.
94         do il=1,ncum            evap(il, i) = 0.
95            if (i.le.inb(il) .and. lwork(il)) then            lvcp(il, i) = lv(il, i) / cpn(il, i)
              if (cvflag_grav) then  
                 wdtrain(il)=grav*ep(il,i)*m(il,i)*clw(il,i)  
              else  
                 wdtrain(il)=10.0*ep(il,i)*m(il,i)*clw(il,i)  
              endif  
           endif  
96         enddo         enddo
97        enddo
98    
99         if(i.gt.1)then      ! Check whether ep(inb) = 0. If so, skip precipitating downdraft
100            do j=1,i-1      ! calculation.
              do il=1,ncum  
                 if (i.le.inb(il) .and. lwork(il)) then  
                    awat=elij(il,j,i)-(1.-ep(il,i))*clw(il,i)  
                    awat=amax1(awat,0.0)  
                    if (cvflag_grav) then  
                       wdtrain(il)=wdtrain(il)+grav*awat*ment(il,j,i)  
                    else  
                       wdtrain(il)=wdtrain(il)+10.0*awat*ment(il,j,i)  
                    endif  
                 endif  
              enddo  
           end do  
        endif  
   
        !  
        !    ***    find rain water and evaporation using provisional   ***  
        !    ***              estimates of rp(i)and rp(i-1)             ***  
        !  
   
        do  il=1,ncum  
   
           if (i.le.inb(il) .and. lwork(il)) then  
101    
102               wt(il,i)=45.0      forall (il = 1:ncum) lwork(il) = ep(il, inb(il)) >= 1e-4
103    
104               if(i.lt.inb(il))then      imax = nl - 1
105                  rp(il,i)=rp(il,i+1) &      do while (.not. any(inb >= imax .and. lwork) .and. imax >= 1)
106                       +(cpd*(t(il,i+1)-t(il,i))+gz(il,i+1)-gz(il,i))/lv(il,i)         imax = imax - 1
107                  rp(il,i)=0.5*(rp(il,i)+rr(il,i))      end do
108    
109        downdraft_loop: DO i = imax, 1, - 1
110           ! Integrate liquid water equation to find condensed water
111           ! and condensed water flux
112    
113           ! Calculate detrained precipitation
114           forall (il = 1:ncum, inb(il) >= i .and. lwork(il)) wdtrain(il) = rg &
115                * (ep(il, i) * m(il, i) * clw(il, i) &
116                + sum(max(elij(il, :i - 1, i) - (1. - ep(il, i)) * clw(il, i), 0.) &
117                * ment(il, :i - 1, i)))
118    
119           ! Find rain water and evaporation using provisional
120           ! estimates of qp(i) and qp(i - 1)
121    
122           loop_horizontal: do il = 1, ncum
123              if (i <= inb(il) .and. lwork(il)) then
124                 wt(il, i) = 45.
125    
126                 if (i < inb(il)) then
127                    qp(il, i) = qp(il, i + 1) + (rcpd * (t(il, i + 1) - t(il, i)) &
128                         + gz(il, i + 1) - gz(il, i)) / lv(il, i)
129                    qp(il, i) = 0.5 * (qp(il, i) + q(il, i))
130               endif               endif
              rp(il,i)=amax1(rp(il,i),0.0)  
              rp(il,i)=amin1(rp(il,i),rs(il,i))  
              rp(il,inb(il))=rr(il,inb(il))  
131    
132               if(i.eq.1)then               qp(il, i) = max(qp(il, i), 0.)
133                  afac=p(il,1)*(rs(il,1)-rp(il,1))/(1.0e4+2000.0*p(il,1)*rs(il,1))               qp(il, i) = min(qp(il, i), qs(il, i))
134                 qp(il, inb(il)) = q(il, inb(il))
135    
136                 if (i == 1) then
137                    afac = p(il, 1) * (qs(il, 1) - qp(il, 1)) &
138                         / (1e4 + 2000. * p(il, 1) * qs(il, 1))
139               else               else
140                  rp(il,i-1)=rp(il,i) &                  qp(il, i - 1) = qp(il, i) + (rcpd * (t(il, i) - t(il, i - 1)) &
141                       +(cpd*(t(il,i)-t(il,i-1))+gz(il,i)-gz(il,i-1))/lv(il,i)                       + gz(il, i) - gz(il, i - 1)) / lv(il, i)
142                  rp(il,i-1)=0.5*(rp(il,i-1)+rr(il,i-1))                  qp(il, i - 1) = 0.5 * (qp(il, i - 1) + q(il, i - 1))
143                  rp(il,i-1)=amin1(rp(il,i-1),rs(il,i-1))                  qp(il, i - 1) = min(qp(il, i - 1), qs(il, i - 1))
144                  rp(il,i-1)=amax1(rp(il,i-1),0.0)                  qp(il, i - 1) = max(qp(il, i - 1), 0.)
145                  afac1=p(il,i)*(rs(il,i)-rp(il,i))/(1.0e4+2000.0*p(il,i)*rs(il,i))                  afac1 = p(il, i) * (qs(il, i) - qp(il, i)) &
146                  afac2=p(il,i-1)*(rs(il,i-1)-rp(il,i-1)) &                       / (1e4 + 2000. * p(il, i) * qs(il, i))
147                       /(1.0e4+2000.0*p(il,i-1)*rs(il,i-1))                  afac2 = p(il, i - 1) * (qs(il, i - 1) - qp(il, i - 1)) &
148                  afac=0.5*(afac1+afac2)                       / (1e4 + 2000. * p(il, i - 1) * qs(il, i - 1))
149                    afac = 0.5 * (afac1 + afac2)
150               endif               endif
151               if(i.eq.inb(il))afac=0.0  
152               afac=amax1(afac,0.0)               if (i == inb(il)) afac = 0.
153               bfac=1./(sigd*wt(il,i))               afac = max(afac, 0.)
154               !               bfac = 1. / (sigd * wt(il, i))
155               !jyg1  
156               !cc        sigt=1.0               if (i <= icb(il)) then
157               !cc        if(i.ge.icb)sigt=sigp(i)                  ! Prise en compte de la variation progressive de sigt dans
158               ! prise en compte de la variation progressive de sigt dans                  ! les couches icb et icb - 1 :
159               ! les couches icb et icb-1:                  ! pour plcl <= ph(i + 1), pr1 = 0
160               !     pour plcl<ph(i+1), pr1=0 & pr2=1                  ! pour plcl >= ph(i), pr1 = 1
161               !     pour plcl>ph(i),   pr1=1 & pr2=0                  ! pour ph(i + 1) < plcl < ph(i), pr1 est la proportion
162               !     pour ph(i+1)<plcl<ph(i), pr1 est la proportion a cheval                  ! \`a cheval sur le nuage.
163               !    sur le nuage, et pr2 est la proportion sous la base du                  pr1 = max(0., min(1., &
164               !    nuage.                       (plcl(il) - ph(il, i + 1)) / (ph(il, i) - ph(il, i + 1))))
165               pr1=(plcl(il)-ph(il,i+1))/(ph(il,i)-ph(il,i+1))                  sigt = sigp * pr1 + 1. - pr1
              pr1=max(0.,min(1.,pr1))  
              pr2=(ph(il,i)-plcl(il))/(ph(il,i)-ph(il,i+1))  
              pr2=max(0.,min(1.,pr2))  
              sigt=sigp(il,i)*pr1+pr2  
              !jyg2  
              !  
              b6=bfac*50.*sigd*(ph(il,i)-ph(il,i+1))*sigt*afac  
              c6=water(il,i+1)+bfac*wdtrain(il) &  
                   -50.*sigd*bfac*(ph(il,i)-ph(il,i+1))*evap(il,i+1)  
              if(c6.gt.0.0)then  
                 revap=0.5*(-b6+sqrt(b6*b6+4.*c6))  
                 evap(il,i)=sigt*afac*revap  
                 water(il,i)=revap*revap  
166               else               else
167                  evap(il,i)=-evap(il,i+1) &                  ! {i >= icb(il) + 1}
168                       +0.02*(wdtrain(il)+sigd*wt(il,i)*water(il,i+1)) &                  sigt = sigp
                      /(sigd*(ph(il,i)-ph(il,i+1)))  
169               end if               end if
              !  
              !    ***  calculate precipitating downdraft mass flux under     ***  
              !    ***              hydrostatic approximation                 ***  
              !  
              if (i.ne.1) then  
   
                 tevap=amax1(0.0,evap(il,i))  
                 delth=amax1(0.001,(th(il,i)-th(il,i-1)))  
                 if (cvflag_grav) then  
                    mp(il,i)=100.*ginv*lvcp(il,i)*sigd*tevap &  
                         *(p(il,i-1)-p(il,i))/delth  
                 else  
                    mp(il,i)=10.*lvcp(il,i)*sigd*tevap*(p(il,i-1)-p(il,i))/delth  
                 endif  
                 !  
                 !    ***           if hydrostatic assumption fails,             ***  
                 !    ***   solve cubic difference equation for downdraft theta  ***  
                 !    ***  and mass flux from two simultaneous differential eqns ***  
                 !  
                 amfac=sigd*sigd*70.0*ph(il,i)*(p(il,i-1)-p(il,i)) &  
                      *(th(il,i)-th(il,i-1))/(tv(il,i)*th(il,i))  
                 amp2=abs(mp(il,i+1)*mp(il,i+1)-mp(il,i)*mp(il,i))  
                 if(amp2.gt.(0.1*amfac))then  
                    xf=100.0*sigd*sigd*sigd*(ph(il,i)-ph(il,i+1))  
                    tf=b(il,i)-5.0*(th(il,i)-th(il,i-1))*t(il,i) &  
                         /(lvcp(il,i)*sigd*th(il,i))  
                    af=xf*tf+mp(il,i+1)*mp(il,i+1)*tinv  
                    bf=2.*(tinv*mp(il,i+1))**3+tinv*mp(il,i+1)*xf*tf &  
                         +50.*(p(il,i-1)-p(il,i))*xf*tevap  
                    fac2=1.0  
                    if(bf.lt.0.0)fac2=-1.0  
                    bf=abs(bf)  
                    ur=0.25*bf*bf-af*af*af*tinv*tinv*tinv  
                    if(ur.ge.0.0)then  
                       sru=sqrt(ur)  
                       fac=1.0  
                       if((0.5*bf-sru).lt.0.0)fac=-1.0  
                       mp(il,i)=mp(il,i+1)*tinv+(0.5*bf+sru)**tinv &  
                            +fac*(abs(0.5*bf-sru))**tinv  
                    else  
                       d=atan(2.*sqrt(-ur)/(bf+1.0e-28))  
                       if(fac2.lt.0.0)d=3.14159-d  
                       mp(il,i)=mp(il,i+1)*tinv+2.*sqrt(af*tinv)*cos(d*tinv)  
                    endif  
                    mp(il,i)=amax1(0.0,mp(il,i))  
   
                    if (cvflag_grav) then  
                       !jyg : il y a vraisemblablement une erreur dans la ligne 2 suivante:  
                       ! il faut diviser par (mp(il,i)*sigd*grav) et non par (mp(il,i)+sigd*0.1).  
                       ! Et il faut bien revoir les facteurs 100.  
                       b(il,i-1)=b(il,i)+100.0*(p(il,i-1)-p(il,i))*tevap &  
                            /(mp(il,i)+sigd*0.1) &  
                            -10.0*(th(il,i)-th(il,i-1))*t(il,i)/(lvcp(il,i)*sigd*th(il,i))  
                    else  
                       b(il,i-1)=b(il,i)+100.0*(p(il,i-1)-p(il,i))*tevap &  
                            /(mp(il,i)+sigd*0.1) &  
                            -10.0*(th(il,i)-th(il,i-1))*t(il,i)/(lvcp(il,i)*sigd*th(il,i))  
                    endif  
                    b(il,i-1)=amax1(b(il,i-1),0.0)  
                 endif  
                 !  
                 !   ***         limit magnitude of mp(i) to meet cfl condition      ***  
                 !  
                 ampmax=2.0*(ph(il,i)-ph(il,i+1))*delti  
                 amp2=2.0*(ph(il,i-1)-ph(il,i))*delti  
                 ampmax=amin1(ampmax,amp2)  
                 mp(il,i)=amin1(mp(il,i),ampmax)  
                 !  
                 !    ***      force mp to decrease linearly to zero                 ***  
                 !    ***       between cloud base and the surface                   ***  
                 !  
                 if(p(il,i).gt.p(il,icb(il)))then  
                    mp(il,i)=mp(il,icb(il))*(p(il,1)-p(il,i))/(p(il,1)-p(il,icb(il)))  
                 endif  
   
              endif ! i.eq.1  
              !  
              !    ***       find mixing ratio of precipitating downdraft     ***  
              !  
   
              if (i.ne.inb(il)) then  
170    
171                  rp(il,i)=rr(il,i)               b6 = bfac * 50. * sigd * (ph(il, i) - ph(il, i + 1)) * sigt * afac
172                 c6 = water(il, i + 1) + bfac * wdtrain(il) - 50. * sigd * bfac &
173                      * (ph(il, i) - ph(il, i + 1)) * evap(il, i + 1)
174    
175                 if (c6 > 0.) then
176                    revap = 0.5 * (- b6 + sqrt(b6 * b6 + 4. * c6))
177                    evap(il, i) = sigt * afac * revap
178                    water(il, i) = revap * revap
179                 else
180                    evap(il, i) = - evap(il, i + 1) + 0.02 * (wdtrain(il) + sigd &
181                         * wt(il, i) * water(il, i + 1)) / (sigd * (ph(il, i) &
182                         - ph(il, i + 1)))
183                 end if
184    
185                  if(mp(il,i).gt.mp(il,i+1))then               ! Calculate precipitating downdraft mass flux under
186                 ! hydrostatic approximation
187    
188                     if (cvflag_grav) then               test_above_surface: if (i /= 1) then
189                        rp(il,i)=rp(il,i+1)*mp(il,i+1)+rr(il,i)*(mp(il,i)-mp(il,i+1)) &                  tevap = max(0., evap(il, i))
190                             +100.*ginv*0.5*sigd*(ph(il,i)-ph(il,i+1)) &                  delth = max(0.001, (th(il, i) - th(il, i - 1)))
191                             *(evap(il,i+1)+evap(il,i))                  mp(il, i) = 100. * ginv * lvcp(il, i) * sigd * tevap &
192                         * (p(il, i - 1) - p(il, i)) / delth
193    
194                    ! If hydrostatic assumption fails, solve cubic
195                    ! difference equation for downdraft theta and mass
196                    ! flux from two simultaneous differential equations
197                    if (abs(mp(il, i + 1)**2 - mp(il, i)**2) > 0.1 * sigd**2 &
198                         * 70. * ph(il, i) * (p(il, i - 1) - p(il, i)) &
199                         * (th(il, i) - th(il, i - 1)) / (tv(il, i) * th(il, i))) &
200                         then
201                       xf = 100. * sigd**3 * (ph(il, i) - ph(il, i + 1))
202                       tf = b(il, i) - 5. * (th(il, i) - th(il, i - 1)) &
203                            * t(il, i) / (lvcp(il, i) * sigd * th(il, i))
204                       af = xf * tf + mp(il, i + 1)**2 * tinv
205                       bf = 2. * (tinv * mp(il, i + 1))**3 + tinv &
206                            * mp(il, i + 1) * xf * tf + 50. * (p(il, i - 1) &
207                            - p(il, i)) * xf * tevap
208                       fac2 = 1.
209                       if (bf < 0.) fac2 = - 1.
210                       bf = abs(bf)
211                       ur = 0.25 * bf * bf - af * af * af * tinv * tinv * tinv
212    
213                       if (ur >= 0.) then
214                          sru = sqrt(ur)
215                          fac = 1.
216                          if ((0.5 * bf - sru) < 0.) fac = - 1.
217                          mp(il, i) = mp(il, i + 1) * tinv + (0.5 * bf &
218                               + sru)**tinv + fac * (abs(0.5 * bf - sru))**tinv
219                     else                     else
220                        rp(il,i)=rp(il,i+1)*mp(il,i+1)+rr(il,i)*(mp(il,i)-mp(il,i+1)) &                        d = atan(2. * sqrt(- ur) / (bf + 1e-28))
221                             +5.*sigd*(ph(il,i)-ph(il,i+1)) &                        if (fac2 < 0.) d = 3.14159 - d
222                             *(evap(il,i+1)+evap(il,i))                        mp(il, i) = mp(il, i + 1) * tinv + 2. * sqrt(af * tinv) &
223                               * cos(d * tinv)
224                     endif                     endif
                    rp(il,i)=rp(il,i)/mp(il,i)  
                    up(il,i)=up(il,i+1)*mp(il,i+1)+u(il,i)*(mp(il,i)-mp(il,i+1))  
                    up(il,i)=up(il,i)/mp(il,i)  
                    vp(il,i)=vp(il,i+1)*mp(il,i+1)+v(il,i)*(mp(il,i)-mp(il,i+1))  
                    vp(il,i)=vp(il,i)/mp(il,i)  
225    
226                  else                     mp(il, i) = max(0., mp(il, i))
227    
228                     if(mp(il,i+1).gt.1.0e-16)then                     ! Il y a vraisemblablement une erreur dans la ligne
229                        if (cvflag_grav) then                     ! suivante : il faut diviser par (mp(il, i) * sigd
230                           rp(il,i)=rp(il,i+1) &                     ! * rg) et non par (mp(il, i) + sigd * 0.1).  Et il
231                                +100.*ginv*0.5*sigd*(ph(il,i)-ph(il,i+1)) &                     ! faut bien revoir les facteurs 100.
232                                *(evap(il,i+1)+evap(il,i))/mp(il,i+1)                     b(il, i - 1) = max(b(il, i) + 100. * (p(il, i - 1) &
233                        else                          - p(il, i)) * tevap / (mp(il, i) + sigd * 0.1) - 10. &
234                           rp(il,i)=rp(il,i+1) &                          * (th(il, i) - th(il, i - 1)) * t(il, i) &
235                                +5.*sigd*(ph(il,i)-ph(il,i+1)) &                          / (lvcp(il, i) * sigd * th(il, i)), 0.)
236                                *(evap(il,i+1)+evap(il,i))/mp(il,i+1)                  endif
                       endif  
                       up(il,i)=up(il,i+1)  
                       vp(il,i)=vp(il,i+1)  
237    
238                    ! Limit magnitude of mp to meet CFL condition:
239                    ampmax = 2. * (ph(il, i) - ph(il, i + 1)) * delti
240                    ampmax = min(ampmax, 2. * (ph(il, i - 1) - ph(il, i)) * delti)
241                    mp(il, i) = min(mp(il, i), ampmax)
242    
243                    ! Force mp to decrease linearly to zero between cloud
244                    ! base and the surface:
245                    if (p(il, i) > p(il, icb(il))) mp(il, i) = mp(il, icb(il)) &
246                         * (p(il, 1) - p(il, i)) / (p(il, 1) - p(il, icb(il)))
247                 endif test_above_surface
248    
249                 ! Find mixing ratio of precipitating downdraft
250    
251                 if (i /= inb(il)) then
252                    qp(il, i) = q(il, i)
253    
254                    if (mp(il, i) > mp(il, i + 1)) then
255                       qp(il, i) = qp(il, i + 1) * mp(il, i + 1) + q(il, i) &
256                            * (mp(il, i) - mp(il, i + 1)) + 100. * ginv * 0.5 &
257                            * sigd * (ph(il, i) - ph(il, i + 1)) &
258                            * (evap(il, i + 1) + evap(il, i))
259                       qp(il, i) = qp(il, i) / mp(il, i)
260                       up(il, i) = up(il, i + 1) * mp(il, i + 1) + u(il, i) &
261                            * (mp(il, i) - mp(il, i + 1))
262                       up(il, i) = up(il, i) / mp(il, i)
263                       vp(il, i) = vp(il, i + 1) * mp(il, i + 1) + v(il, i) &
264                            * (mp(il, i) - mp(il, i + 1))
265                       vp(il, i) = vp(il, i) / mp(il, i)
266                    else
267                       if (mp(il, i + 1) > 1e-16) then
268                          qp(il, i) = qp(il, i + 1) + 100. * ginv * 0.5 * sigd &
269                               * (ph(il, i) - ph(il, i + 1)) * (evap(il, i + 1) &
270                               + evap(il, i)) / mp(il, i + 1)
271                          up(il, i) = up(il, i + 1)
272                          vp(il, i) = vp(il, i + 1)
273                     endif                     endif
274                  endif                  endif
                 rp(il,i)=amin1(rp(il,i),rs(il,i))  
                 rp(il,i)=amax1(rp(il,i),0.0)  
275    
276                    qp(il, i) = min(qp(il, i), qs(il, i))
277                    qp(il, i) = max(qp(il, i), 0.)
278               endif               endif
279            endif            endif
280         end do         end do loop_horizontal
281        end DO downdraft_loop
     end DO  
282    
283    end SUBROUTINE cv3_unsat    end SUBROUTINE cv30_unsat
284    
285  end module cv3_unsat_m  end module cv30_unsat_m

Legend:
Removed from v.134  
changed lines
  Added in v.201

  ViewVC Help
Powered by ViewVC 1.1.21