/[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 194 by guez, Thu May 12 14:35:35 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, sigp, clw, m, ment, elij, delt, plcl, mp, qp, up, vp, wt, water, &
9         ,th,tv,lv,cpn,ep,sigp,clw &         evap, b)
10         ,m,ment,elij,delt,plcl &  
11         ,mp,rp,up,vp,wt,water,evap,b)      use cv30_param_m, only: nl, sigd
12      use cv30_param_m      use cv_thermo_m, only: cpd, ginv, grav
13      use cvthermo      USE dimphy, ONLY: klon, klev
14      use cvflag  
15        integer, intent(in):: icb(:) ! (ncum)
16    
17      ! inputs:      integer, intent(in):: inb(:) ! (ncum)
18      integer, intent(in):: ncum, nd, na, nloc      ! first model level above the level of neutral buoyancy of the
19      integer icb(nloc), inb(nloc)      ! parcel (1 <= inb <= nl - 1)
20    
21        real, intent(in):: t(:, :), q(:, :), qs(:, :) ! (klon, klev)
22        real, intent(in):: gz(:, :) ! (klon, klev)
23        real, intent(in):: u(:, :), v(:, :) ! (klon, klev)
24        real, intent(in):: p(klon, klev), ph(klon, klev + 1)
25        real, intent(in):: th(klon, klev)
26        real, intent(in):: tv(klon, klev)
27        real, intent(in):: lv(klon, klev)
28        real, intent(in):: cpn(klon, klev)
29        real, intent(in):: ep(:, :), sigp(:, :), clw(:, :) ! (ncum, klev)
30        real, intent(in):: m(:, :) ! (ncum, klev)
31        real, intent(in):: ment(:, :, :) ! (ncum, klev, klev)
32        real, intent(in):: elij(:, :, :) ! (ncum, klev, klev)
33      real, intent(in):: delt      real, intent(in):: delt
34      real plcl(nloc)      real, intent(in):: plcl(klon)
     real t(nloc,nd), rr(nloc,nd), rs(nloc,nd)  
     real u(nloc,nd), v(nloc,nd)  
     real p(nloc,nd), ph(nloc,nd+1)  
     real th(nloc,na), gz(nloc,na)  
     real lv(nloc,na), ep(nloc,na), sigp(nloc,na), clw(nloc,na)  
     real cpn(nloc,na), tv(nloc,na)  
     real m(nloc,na), ment(nloc,na,na), elij(nloc,na,na)  
35    
36      ! outputs:      ! outputs:
37      real mp(nloc,na), rp(nloc,na), up(nloc,na), vp(nloc,na)      real, intent(out):: mp(klon, klev)
38      real water(nloc,na), evap(nloc,na), wt(nloc,na)      real, intent(out):: qp(:, :), up(:, :), vp(:, :) ! (ncum, nl)
39      real b(nloc,na)      real wt(klon, klev), water(klon, klev), evap(klon, klev)
40        real, intent(out):: b(:, :) ! (ncum, nl - 1)
41      ! local variables  
42      integer i,j,il,num1      ! Local:
43        integer ncum
44        integer i, il, imax
45      real tinv, delti      real tinv, delti
46      real awat, afac, afac1, afac2, bfac      real afac, afac1, afac2, bfac
47      real pr1, pr2, sigt, b6, c6, revap, tevap, delth      real pr1, pr2, sigt, b6, c6, revap, tevap, delth
48      real amfac, amp2, xf, tf, fac2, ur, sru, fac, d, af, bf      real amfac, amp2, xf, tf, fac2, ur, sru, fac, d, af, bf
49      real ampmax      real ampmax
50      real lvcp(nloc,na)      real lvcp(klon, klev)
51      real wdtrain(nloc)      real wdtrain(size(icb)) ! (ncum)
52      logical lwork(nloc)      logical lwork(size(icb)) ! (ncum)
   
53    
54      !------------------------------------------------------      !------------------------------------------------------
55    
56      delti = 1./delt      ncum = size(icb)
57      tinv=1./3.      delti = 1. / delt
58        tinv = 1. / 3.
59      mp(:,:)=0.      mp = 0.
60        b = 0.
61      do i=1,nl  
62         do il=1,ncum      do i = 1, nl
63            mp(il,i)=0.0         do il = 1, ncum
64            rp(il,i)=rr(il,i)            qp(il, i) = q(il, i)
65            up(il,i)=u(il,i)            up(il, i) = u(il, i)
66            vp(il,i)=v(il,i)            vp(il, i) = v(il, i)
67            wt(il,i)=0.001            wt(il, i) = 0.001
68            water(il,i)=0.0            water(il, i) = 0.
69            evap(il,i)=0.0            evap(il, i) = 0.
70            b(il,i)=0.0            lvcp(il, i) = lv(il, i) / cpn(il, i)
           lvcp(il,i)=lv(il,i)/cpn(il,i)  
71         enddo         enddo
72      enddo      enddo
73    
74      !      ! Check whether ep(inb) = 0. If so, skip precipitating downdraft
75      !   ***  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)             ***  
        !  
   
        do  il=1,ncum  
   
           if (i.le.inb(il) .and. lwork(il)) then  
76    
77               wt(il,i)=45.0      forall (il = 1:ncum) lwork(il) = ep(il, inb(il)) >= 1e-4
78    
79               if(i.lt.inb(il))then      imax = nl - 1
80                  rp(il,i)=rp(il,i+1) &      do while (.not. any(inb >= imax .and. lwork) .and. imax >= 1)
81                       +(cpd*(t(il,i+1)-t(il,i))+gz(il,i+1)-gz(il,i))/lv(il,i)         imax = imax - 1
82                  rp(il,i)=0.5*(rp(il,i)+rr(il,i))      end do
83    
84        downdraft_loop: DO i = imax, 1, - 1
85           ! Integrate liquid water equation to find condensed water
86           ! and condensed water flux
87    
88           ! Calculate detrained precipitation
89           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               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))  
106    
107               if(i.eq.1)then               qp(il, i) = max(qp(il, i), 0.)
108                  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))
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               else
115                  rp(il,i-1)=rp(il,i) &                  qp(il, i - 1) = qp(il, i) + (cpd * (t(il, i) - t(il, i - 1)) &
116                       +(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)
117                  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))
118                  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))
119                  rp(il,i-1)=amax1(rp(il,i-1),0.0)                  qp(il, i - 1) = max(qp(il, i - 1), 0.)
120                  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)) &
121                  afac2=p(il,i-1)*(rs(il,i-1)-rp(il,i-1)) &                       / (1e4 + 2000. * p(il, i) * qs(il, i))
122                       /(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)) &
123                  afac=0.5*(afac1+afac2)                       / (1e4 + 2000. * p(il, i - 1) * qs(il, i - 1))
124                    afac = 0.5 * (afac1 + afac2)
125               endif               endif
126               if(i.eq.inb(il))afac=0.0  
127               afac=amax1(afac,0.0)               if (i == inb(il)) afac = 0.
128               bfac=1./(sigd*wt(il,i))               afac = max(afac, 0.)
129               !               bfac = 1. / (sigd * wt(il, i))
130               !jyg1  
131               !cc        sigt=1.0               ! Prise en compte de la variation progressive de sigt dans
132               !cc        if(i.ge.icb)sigt=sigp(i)               ! les couches icb et icb - 1:
133               ! prise en compte de la variation progressive de sigt dans               ! pour plcl < ph(i + 1), pr1 = 0 et pr2 = 1
134               ! les couches icb et icb-1:               ! pour plcl > ph(i), pr1 = 1 et pr2 = 0
135               !     pour plcl<ph(i+1), pr1=0 & pr2=1               ! pour ph(i + 1) < plcl < ph(i), pr1 est la proportion \`a cheval
136               !     pour plcl>ph(i),   pr1=1 & pr2=0               ! sur le nuage, et pr2 est la proportion sous la base du
137               !     pour ph(i+1)<plcl<ph(i), pr1 est la proportion a cheval               ! nuage.
138               !    sur le nuage, et pr2 est la proportion sous la base du               pr1 = (plcl(il) - ph(il, i + 1)) / (ph(il, i) - ph(il, i + 1))
139               !    nuage.               pr1 = max(0., min(1., pr1))
140               pr1=(plcl(il)-ph(il,i+1))/(ph(il,i)-ph(il,i+1))               pr2 = (ph(il, i) - plcl(il)) / (ph(il, i) - ph(il, i + 1))
141               pr1=max(0.,min(1.,pr1))               pr2 = max(0., min(1., pr2))
142               pr2=(ph(il,i)-plcl(il))/(ph(il,i)-ph(il,i+1))               sigt = sigp(il, i) * pr1 + pr2
143               pr2=max(0.,min(1.,pr2))  
144               sigt=sigp(il,i)*pr1+pr2               b6 = bfac * 50. * sigd * (ph(il, i) - ph(il, i + 1)) * sigt * afac
145               !jyg2               c6 = water(il, i + 1) + bfac * wdtrain(il) - 50. * sigd * bfac &
146               !                    * (ph(il, i) - ph(il, i + 1)) * evap(il, i + 1)
147               b6=bfac*50.*sigd*(ph(il,i)-ph(il,i+1))*sigt*afac               if (c6 > 0.) then
148               c6=water(il,i+1)+bfac*wdtrain(il) &                  revap = 0.5 * (- b6 + sqrt(b6 * b6 + 4. * c6))
149                    -50.*sigd*bfac*(ph(il,i)-ph(il,i+1))*evap(il,i+1)                  evap(il, i) = sigt * afac * revap
150               if(c6.gt.0.0)then                  water(il, i) = revap * revap
                 revap=0.5*(-b6+sqrt(b6*b6+4.*c6))  
                 evap(il,i)=sigt*afac*revap  
                 water(il,i)=revap*revap  
151               else               else
152                  evap(il,i)=-evap(il,i+1) &                  evap(il, i) = - evap(il, i + 1) + 0.02 * (wdtrain(il) + sigd &
153                       +0.02*(wdtrain(il)+sigd*wt(il,i)*water(il,i+1)) &                       * wt(il, i) * water(il, i + 1)) / (sigd * (ph(il, i) &
154                       /(sigd*(ph(il,i)-ph(il,i+1)))                       - ph(il, i + 1)))
155               end if               end if
              !  
              !    ***  calculate precipitating downdraft mass flux under     ***  
              !    ***              hydrostatic approximation                 ***  
              !  
              if (i.ne.1) then  
   
                 tevap=amax1(0.0,evap(il,i))  
                 delth=amax1(0.001,(th(il,i)-th(il,i-1)))  
                 if (cvflag_grav) then  
                    mp(il,i)=100.*ginv*lvcp(il,i)*sigd*tevap &  
                         *(p(il,i-1)-p(il,i))/delth  
                 else  
                    mp(il,i)=10.*lvcp(il,i)*sigd*tevap*(p(il,i-1)-p(il,i))/delth  
                 endif  
                 !  
                 !    ***           if hydrostatic assumption fails,             ***  
                 !    ***   solve cubic difference equation for downdraft theta  ***  
                 !    ***  and mass flux from two simultaneous differential eqns ***  
                 !  
                 amfac=sigd*sigd*70.0*ph(il,i)*(p(il,i-1)-p(il,i)) &  
                      *(th(il,i)-th(il,i-1))/(tv(il,i)*th(il,i))  
                 amp2=abs(mp(il,i+1)*mp(il,i+1)-mp(il,i)*mp(il,i))  
                 if(amp2.gt.(0.1*amfac))then  
                    xf=100.0*sigd*sigd*sigd*(ph(il,i)-ph(il,i+1))  
                    tf=b(il,i)-5.0*(th(il,i)-th(il,i-1))*t(il,i) &  
                         /(lvcp(il,i)*sigd*th(il,i))  
                    af=xf*tf+mp(il,i+1)*mp(il,i+1)*tinv  
                    bf=2.*(tinv*mp(il,i+1))**3+tinv*mp(il,i+1)*xf*tf &  
                         +50.*(p(il,i-1)-p(il,i))*xf*tevap  
                    fac2=1.0  
                    if(bf.lt.0.0)fac2=-1.0  
                    bf=abs(bf)  
                    ur=0.25*bf*bf-af*af*af*tinv*tinv*tinv  
                    if(ur.ge.0.0)then  
                       sru=sqrt(ur)  
                       fac=1.0  
                       if((0.5*bf-sru).lt.0.0)fac=-1.0  
                       mp(il,i)=mp(il,i+1)*tinv+(0.5*bf+sru)**tinv &  
                            +fac*(abs(0.5*bf-sru))**tinv  
                    else  
                       d=atan(2.*sqrt(-ur)/(bf+1.0e-28))  
                       if(fac2.lt.0.0)d=3.14159-d  
                       mp(il,i)=mp(il,i+1)*tinv+2.*sqrt(af*tinv)*cos(d*tinv)  
                    endif  
                    mp(il,i)=amax1(0.0,mp(il,i))  
   
                    if (cvflag_grav) then  
                       !jyg : il y a vraisemblablement une erreur dans la ligne 2 suivante:  
                       ! il faut diviser par (mp(il,i)*sigd*grav) et non par (mp(il,i)+sigd*0.1).  
                       ! Et il faut bien revoir les facteurs 100.  
                       b(il,i-1)=b(il,i)+100.0*(p(il,i-1)-p(il,i))*tevap &  
                            /(mp(il,i)+sigd*0.1) &  
                            -10.0*(th(il,i)-th(il,i-1))*t(il,i)/(lvcp(il,i)*sigd*th(il,i))  
                    else  
                       b(il,i-1)=b(il,i)+100.0*(p(il,i-1)-p(il,i))*tevap &  
                            /(mp(il,i)+sigd*0.1) &  
                            -10.0*(th(il,i)-th(il,i-1))*t(il,i)/(lvcp(il,i)*sigd*th(il,i))  
                    endif  
                    b(il,i-1)=amax1(b(il,i-1),0.0)  
                 endif  
                 !  
                 !   ***         limit magnitude of mp(i) to meet cfl condition      ***  
                 !  
                 ampmax=2.0*(ph(il,i)-ph(il,i+1))*delti  
                 amp2=2.0*(ph(il,i-1)-ph(il,i))*delti  
                 ampmax=amin1(ampmax,amp2)  
                 mp(il,i)=amin1(mp(il,i),ampmax)  
                 !  
                 !    ***      force mp to decrease linearly to zero                 ***  
                 !    ***       between cloud base and the surface                   ***  
                 !  
                 if(p(il,i).gt.p(il,icb(il)))then  
                    mp(il,i)=mp(il,icb(il))*(p(il,1)-p(il,i))/(p(il,1)-p(il,icb(il)))  
                 endif  
   
              endif ! i.eq.1  
              !  
              !    ***       find mixing ratio of precipitating downdraft     ***  
              !  
   
              if (i.ne.inb(il)) then  
156    
157                  rp(il,i)=rr(il,i)               ! Calculate precipitating downdraft mass flux under
158                 ! hydrostatic approximation
159    
160                  if(mp(il,i).gt.mp(il,i+1))then               test_above_surface: if (i /= 1) then
161                    tevap = max(0., evap(il, i))
162                     if (cvflag_grav) then                  delth = max(0.001, (th(il, i) - th(il, i - 1)))
163                        rp(il,i)=rp(il,i+1)*mp(il,i+1)+rr(il,i)*(mp(il,i)-mp(il,i+1)) &                  mp(il, i) = 100. * ginv * lvcp(il, i) * sigd * tevap &
164                             +100.*ginv*0.5*sigd*(ph(il,i)-ph(il,i+1)) &                       * (p(il, i - 1) - p(il, i)) / delth
165                             *(evap(il,i+1)+evap(il,i))  
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                     else
196                        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))
197                             +5.*sigd*(ph(il,i)-ph(il,i+1)) &                        if (fac2 < 0.)d = 3.14159 - d
198                             *(evap(il,i+1)+evap(il,i))                        mp(il, i) = mp(il, i + 1) * tinv + 2. * sqrt(af * tinv) &
199                               * cos(d * tinv)
200                     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)  
201    
202                  else                     mp(il, i) = max(0., mp(il, i))
203    
204                     if(mp(il,i+1).gt.1.0e-16)then                     ! Il y a vraisemblablement une erreur dans la
205                        if (cvflag_grav) then                     ! ligne suivante : il faut diviser par (mp(il,
206                           rp(il,i)=rp(il,i+1) &                     ! i) * sigd * grav) et non par (mp(il, i) + sigd
207                                +100.*ginv*0.5*sigd*(ph(il,i)-ph(il,i+1)) &                     ! * 0.1).  Et il faut bien revoir les facteurs
208                                *(evap(il,i+1)+evap(il,i))/mp(il,i+1)                     ! 100.
209                        else                     b(il, i - 1) = b(il, i) + 100. * (p(il, i - 1) - p(il, i)) &
210                           rp(il,i)=rp(il,i+1) &                          * tevap / (mp(il, i) + sigd * 0.1) - 10. * (th(il, i) &
211                                +5.*sigd*(ph(il,i)-ph(il,i+1)) &                          - th(il, i - 1)) * t(il, i) / (lvcp(il, i) * sigd &
212                                *(evap(il,i+1)+evap(il,i))/mp(il,i+1)                          * th(il, i))
213                        endif                     b(il, i - 1) = max(b(il, i - 1), 0.)
214                        up(il,i)=up(il,i+1)                  endif
                       vp(il,i)=vp(il,i+1)  
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                     endif
253                  endif                  endif
                 rp(il,i)=amin1(rp(il,i),rs(il,i))  
                 rp(il,i)=amax1(rp(il,i),0.0)  
254    
255                    qp(il, i) = min(qp(il, i), qs(il, i))
256                    qp(il, i) = max(qp(il, i), 0.)
257               endif               endif
258            endif            endif
259         end do         end do
260        end DO downdraft_loop
     end DO  
261    
262    end SUBROUTINE cv30_unsat    end SUBROUTINE cv30_unsat
263    

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

  ViewVC Help
Powered by ViewVC 1.1.21