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

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

  ViewVC Help
Powered by ViewVC 1.1.21