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

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

  ViewVC Help
Powered by ViewVC 1.1.21