/[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 105 by guez, Thu Sep 4 10:40:24 2014 UTC trunk/Sources/phylmd/CV30_routines/cv30_unsat.f revision 193 by guez, Thu May 12 13:22:19 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, 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 cv3_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, j, il, imax
45      real tinv, delti      real tinv, delti
46      real awat, afac, afac1, afac2, bfac      real awat, 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  
76    
77      call zilch(wdtrain,ncum)      forall (il = 1:ncum) lwork(il) = ep(il, inb(il)) >= 1e-4
78    
79      DO  i=nl+1,1,-1      imax = nl - 1
80        do while (.not. any(inb >= imax .and. lwork) .and. imax >= 1)
81           imax = imax - 1
82        end do
83    
84         num1=0      downdraft_loop: DO i = imax, 1, - 1
85         do il=1,ncum         ! Integrate liquid water equation to find condensed water
86            if ( i.le.inb(il) .and. lwork(il) ) num1=num1+1         ! and condensed water flux
        enddo  
        if (num1.le.0) cycle  
87    
88         !         ! Calculate detrained precipitation
89         !   ***  integrate liquid water equation to find condensed water   ***  
90         !   ***                and condensed water flux                    ***         do il = 1, ncum
91         !            if (i <= inb(il) .and. lwork(il)) then
92                 wdtrain(il) = grav * ep(il, i) * m(il, i) * clw(il, i)
        !  
        !    ***                    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  
93            endif            endif
94         enddo         enddo
95    
96         if(i.gt.1)then         if (i > 1) then
97            do j=1,i-1            do j = 1, i - 1
98               do il=1,ncum               do il = 1, ncum
99                  if (i.le.inb(il) .and. lwork(il)) then                  if (i <= inb(il) .and. lwork(il)) then
100                     awat=elij(il,j,i)-(1.-ep(il,i))*clw(il,i)                     awat = elij(il, j, i) - (1. - ep(il, i)) * clw(il, i)
101                     awat=amax1(awat,0.0)                     awat = max(awat, 0.)
102                     if (cvflag_grav) then                     wdtrain(il) = wdtrain(il) + grav * awat * ment(il, j, i)
                       wdtrain(il)=wdtrain(il)+grav*awat*ment(il,j,i)  
                    else  
                       wdtrain(il)=wdtrain(il)+10.0*awat*ment(il,j,i)  
                    endif  
103                  endif                  endif
104               enddo               enddo
105            end do            end do
106         endif         endif
107    
108         !         ! Find rain water and evaporation using provisional
109         !    ***    find rain water and evaporation using provisional   ***         ! estimates of qp(i) and qp(i - 1)
        !    ***              estimates of rp(i)and rp(i-1)             ***  
        !  
110    
111         do  il=1,ncum         do il = 1, ncum
112              if (i <= inb(il) .and. lwork(il)) then
113            if (i.le.inb(il) .and. lwork(il)) then               wt(il, i) = 45.
114    
115               wt(il,i)=45.0               if (i < inb(il)) then
116                    qp(il, i) = qp(il, i + 1) + (cpd * (t(il, i + 1) - t(il, i)) &
117               if(i.lt.inb(il))then                       + gz(il, i + 1) - gz(il, i)) / lv(il, i)
118                  rp(il,i)=rp(il,i+1) &                  qp(il, i) = 0.5 * (qp(il, i) + q(il, i))
                      +(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))  
119               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))  
120    
121               if(i.eq.1)then               qp(il, i) = max(qp(il, i), 0.)
122                  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))
123                 qp(il, inb(il)) = q(il, inb(il))
124    
125                 if (i == 1) then
126                    afac = p(il, 1) * (qs(il, 1) - qp(il, 1)) &
127                         / (1e4 + 2000. * p(il, 1) * qs(il, 1))
128               else               else
129                  rp(il,i-1)=rp(il,i) &                  qp(il, i - 1) = qp(il, i) + (cpd * (t(il, i) - t(il, i - 1)) &
130                       +(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)
131                  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))
132                  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))
133                  rp(il,i-1)=amax1(rp(il,i-1),0.0)                  qp(il, i - 1) = max(qp(il, i - 1), 0.)
134                  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)) &
135                  afac2=p(il,i-1)*(rs(il,i-1)-rp(il,i-1)) &                       / (1e4 + 2000. * p(il, i) * qs(il, i))
136                       /(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)) &
137                  afac=0.5*(afac1+afac2)                       / (1e4 + 2000. * p(il, i - 1) * qs(il, i - 1))
138                    afac = 0.5 * (afac1 + afac2)
139               endif               endif
140               if(i.eq.inb(il))afac=0.0  
141               afac=amax1(afac,0.0)               if (i == inb(il)) afac = 0.
142               bfac=1./(sigd*wt(il,i))               afac = max(afac, 0.)
143               !               bfac = 1. / (sigd * wt(il, i))
144               !jyg1  
145               !cc        sigt=1.0               ! Prise en compte de la variation progressive de sigt dans
146               !cc        if(i.ge.icb)sigt=sigp(i)               ! les couches icb et icb - 1:
147               ! prise en compte de la variation progressive de sigt dans               ! pour plcl < ph(i + 1), pr1 = 0 et pr2 = 1
148               ! les couches icb et icb-1:               ! pour plcl > ph(i), pr1 = 1 et pr2 = 0
149               !     pour plcl<ph(i+1), pr1=0 & pr2=1               ! pour ph(i + 1) < plcl < ph(i), pr1 est la proportion \`a cheval
150               !     pour plcl>ph(i),   pr1=1 & pr2=0               ! sur le nuage, et pr2 est la proportion sous la base du
151               !     pour ph(i+1)<plcl<ph(i), pr1 est la proportion a cheval               ! nuage.
152               !    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))
153               !    nuage.               pr1 = max(0., min(1., pr1))
154               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))
155               pr1=max(0.,min(1.,pr1))               pr2 = max(0., min(1., pr2))
156               pr2=(ph(il,i)-plcl(il))/(ph(il,i)-ph(il,i+1))               sigt = sigp(il, i) * pr1 + pr2
157               pr2=max(0.,min(1.,pr2))  
158               sigt=sigp(il,i)*pr1+pr2               b6 = bfac * 50. * sigd * (ph(il, i) - ph(il, i + 1)) * sigt * afac
159               !jyg2               c6 = water(il, i + 1) + bfac * wdtrain(il) - 50. * sigd * bfac &
160               !                    * (ph(il, i) - ph(il, i + 1)) * evap(il, i + 1)
161               b6=bfac*50.*sigd*(ph(il,i)-ph(il,i+1))*sigt*afac               if (c6 > 0.) then
162               c6=water(il,i+1)+bfac*wdtrain(il) &                  revap = 0.5 * (- b6 + sqrt(b6 * b6 + 4. * c6))
163                    -50.*sigd*bfac*(ph(il,i)-ph(il,i+1))*evap(il,i+1)                  evap(il, i) = sigt * afac * revap
164               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  
165               else               else
166                  evap(il,i)=-evap(il,i+1) &                  evap(il, i) = - evap(il, i + 1) + 0.02 * (wdtrain(il) + sigd &
167                       +0.02*(wdtrain(il)+sigd*wt(il,i)*water(il,i+1)) &                       * wt(il, i) * water(il, i + 1)) / (sigd * (ph(il, i) &
168                       /(sigd*(ph(il,i)-ph(il,i+1)))                       - ph(il, i + 1)))
169               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  
   
                 rp(il,i)=rr(il,i)  
170    
171                  if(mp(il,i).gt.mp(il,i+1))then               ! Calculate precipitating downdraft mass flux under
172                 ! hydrostatic approximation
173    
174                     if (cvflag_grav) then               test_above_surface: if (i /= 1) then
175                        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))
176                             +100.*ginv*0.5*sigd*(ph(il,i)-ph(il,i+1)) &                  delth = max(0.001, (th(il, i) - th(il, i - 1)))
177                             *(evap(il,i+1)+evap(il,i))                  mp(il, i) = 100. * ginv * lvcp(il, i) * sigd * tevap &
178                         * (p(il, i - 1) - p(il, i)) / delth
179    
180                    ! If hydrostatic assumption fails, solve cubic
181                    ! difference equation for downdraft theta and mass
182                    ! flux from two simultaneous differential equations
183    
184                    amfac = sigd * sigd * 70. * ph(il, i) &
185                         * (p(il, i - 1) - p(il, i)) &
186                         * (th(il, i) - th(il, i - 1)) / (tv(il, i) * th(il, i))
187                    amp2 = abs(mp(il, i + 1) * mp(il, i + 1) - mp(il, i) &
188                         * mp(il, i))
189    
190                    if (amp2 > 0.1 * amfac) then
191                       xf = 100. * sigd * sigd * sigd * (ph(il, i) - ph(il, i + 1))
192                       tf = b(il, i) - 5. * (th(il, i) - th(il, i - 1)) &
193                            * t(il, i) / (lvcp(il, i) * sigd * th(il, i))
194                       af = xf * tf + mp(il, i + 1) * mp(il, i + 1) * tinv
195                       bf = 2. * (tinv * mp(il, i + 1))**3 + tinv &
196                            * mp(il, i + 1) * xf * tf + 50. * (p(il, i - 1) &
197                            - p(il, i)) * xf * tevap
198                       fac2 = 1.
199                       if (bf < 0.) fac2 = - 1.
200                       bf = abs(bf)
201                       ur = 0.25 * bf * bf - af * af * af * tinv * tinv * tinv
202    
203                       if (ur >= 0.) then
204                          sru = sqrt(ur)
205                          fac = 1.
206                          if ((0.5 * bf - sru) < 0.) fac = - 1.
207                          mp(il, i) = mp(il, i + 1) * tinv + (0.5 * bf &
208                               + sru)**tinv + fac * (abs(0.5 * bf - sru))**tinv
209                     else                     else
210                        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))
211                             +5.*sigd*(ph(il,i)-ph(il,i+1)) &                        if (fac2 < 0.)d = 3.14159 - d
212                             *(evap(il,i+1)+evap(il,i))                        mp(il, i) = mp(il, i + 1) * tinv + 2. * sqrt(af * tinv) &
213                               * cos(d * tinv)
214                     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)  
215    
216                  else                     mp(il, i) = max(0., mp(il, i))
217    
218                     if(mp(il,i+1).gt.1.0e-16)then                     ! Il y a vraisemblablement une erreur dans la
219                        if (cvflag_grav) then                     ! ligne suivante : il faut diviser par (mp(il,
220                           rp(il,i)=rp(il,i+1) &                     ! i) * sigd * grav) et non par (mp(il, i) + sigd
221                                +100.*ginv*0.5*sigd*(ph(il,i)-ph(il,i+1)) &                     ! * 0.1).  Et il faut bien revoir les facteurs
222                                *(evap(il,i+1)+evap(il,i))/mp(il,i+1)                     ! 100.
223                        else                     b(il, i - 1) = b(il, i) + 100. * (p(il, i - 1) - p(il, i)) &
224                           rp(il,i)=rp(il,i+1) &                          * tevap / (mp(il, i) + sigd * 0.1) - 10. * (th(il, i) &
225                                +5.*sigd*(ph(il,i)-ph(il,i+1)) &                          - th(il, i - 1)) * t(il, i) / (lvcp(il, i) * sigd &
226                                *(evap(il,i+1)+evap(il,i))/mp(il,i+1)                          * th(il, i))
227                        endif                     b(il, i - 1) = max(b(il, i - 1), 0.)
228                        up(il,i)=up(il,i+1)                  endif
                       vp(il,i)=vp(il,i+1)  
229    
230                    ! Limit magnitude of mp(i) to meet CFL condition:
231                    ampmax = 2. * (ph(il, i) - ph(il, i + 1)) * delti
232                    amp2 = 2. * (ph(il, i - 1) - ph(il, i)) * delti
233                    ampmax = min(ampmax, amp2)
234                    mp(il, i) = min(mp(il, i), ampmax)
235    
236                    ! Force mp to decrease linearly to zero between cloud
237                    ! base and the surface:
238                    if (p(il, i) > p(il, icb(il))) mp(il, i) = mp(il, icb(il)) &
239                         * (p(il, 1) - p(il, i)) / (p(il, 1) - p(il, icb(il)))
240                 endif test_above_surface
241    
242                 ! Find mixing ratio of precipitating downdraft
243    
244                 if (i /= inb(il)) then
245                    qp(il, i) = q(il, i)
246    
247                    if (mp(il, i) > mp(il, i + 1)) then
248                       qp(il, i) = qp(il, i + 1) * mp(il, i + 1) + q(il, i) &
249                            * (mp(il, i) - mp(il, i + 1)) + 100. * ginv * 0.5 &
250                            * sigd * (ph(il, i) - ph(il, i + 1)) &
251                            * (evap(il, i + 1) + evap(il, i))
252                       qp(il, i) = qp(il, i) / mp(il, i)
253                       up(il, i) = up(il, i + 1) * mp(il, i + 1) + u(il, i) &
254                            * (mp(il, i) - mp(il, i + 1))
255                       up(il, i) = up(il, i) / mp(il, i)
256                       vp(il, i) = vp(il, i + 1) * mp(il, i + 1) + v(il, i) &
257                            * (mp(il, i) - mp(il, i + 1))
258                       vp(il, i) = vp(il, i) / mp(il, i)
259                    else
260                       if (mp(il, i + 1) > 1e-16) then
261                          qp(il, i) = qp(il, i + 1) + 100. * ginv * 0.5 * sigd &
262                               * (ph(il, i) - ph(il, i + 1)) * (evap(il, i + 1) &
263                               + evap(il, i)) / mp(il, i + 1)
264                          up(il, i) = up(il, i + 1)
265                          vp(il, i) = vp(il, i + 1)
266                     endif                     endif
267                  endif                  endif
                 rp(il,i)=amin1(rp(il,i),rs(il,i))  
                 rp(il,i)=amax1(rp(il,i),0.0)  
268    
269                    qp(il, i) = min(qp(il, i), qs(il, i))
270                    qp(il, i) = max(qp(il, i), 0.)
271               endif               endif
272            endif            endif
273         end do         end do
274        end DO downdraft_loop
275    
276      end DO    end SUBROUTINE cv30_unsat
   
   end SUBROUTINE cv3_unsat  
277    
278  end module cv3_unsat_m  end module cv30_unsat_m

Legend:
Removed from v.105  
changed lines
  Added in v.193

  ViewVC Help
Powered by ViewVC 1.1.21