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

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

  ViewVC Help
Powered by ViewVC 1.1.21