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

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

  ViewVC Help
Powered by ViewVC 1.1.21