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

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

Legend:
Removed from v.185  
changed lines
  Added in v.195

  ViewVC Help
Powered by ViewVC 1.1.21