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

Legend:
Removed from v.82  
changed lines
  Added in v.198

  ViewVC Help
Powered by ViewVC 1.1.21