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

Legend:
Removed from v.97  
changed lines
  Added in v.196

  ViewVC Help
Powered by ViewVC 1.1.21