/[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 198 by guez, Tue May 31 16:17:35 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 * sigd * 70. * ph(il, i) &
193                         * (p(il, i - 1) - p(il, i)) &
194                         * (th(il, i) - th(il, i - 1)) / (tv(il, i) * th(il, i))
195                    amp2 = abs(mp(il, i + 1) * mp(il, i + 1) - mp(il, i) &
196                         * mp(il, i))
197    
198                    if (amp2 > 0.1 * amfac) then
199                       xf = 100. * sigd * sigd * sigd * (ph(il, i) - ph(il, i + 1))
200                       tf = b(il, i) - 5. * (th(il, i) - th(il, i - 1)) &
201                            * t(il, i) / (lvcp(il, i) * sigd * th(il, i))
202                       af = xf * tf + mp(il, i + 1) * mp(il, i + 1) * tinv
203                       bf = 2. * (tinv * mp(il, i + 1))**3 + tinv &
204                            * mp(il, i + 1) * xf * tf + 50. * (p(il, i - 1) &
205                            - p(il, i)) * xf * tevap
206                       fac2 = 1.
207                       if (bf < 0.) fac2 = - 1.
208                       bf = abs(bf)
209                       ur = 0.25 * bf * bf - af * af * af * tinv * tinv * tinv
210    
211                       if (ur >= 0.) then
212                          sru = sqrt(ur)
213                          fac = 1.
214                          if ((0.5 * bf - sru) < 0.) fac = - 1.
215                          mp(il, i) = mp(il, i + 1) * tinv + (0.5 * bf &
216                               + sru)**tinv + fac * (abs(0.5 * bf - sru))**tinv
217                     else                     else
218                        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))
219                             +5.*sigd*(ph(il,i)-ph(il,i+1)) &                        if (fac2 < 0.)d = 3.14159 - d
220                             *(evap(il,i+1)+evap(il,i))                        mp(il, i) = mp(il, i + 1) * tinv + 2. * sqrt(af * tinv) &
221                               * cos(d * tinv)
222                     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)  
223    
224                  else                     mp(il, i) = max(0., mp(il, i))
225    
226                     if(mp(il,i+1).gt.1.0e-16)then                     ! Il y a vraisemblablement une erreur dans la ligne
227                        if (cvflag_grav) then                     ! suivante : il faut diviser par (mp(il, i) * sigd
228                           rp(il,i)=rp(il,i+1) &                     ! * rg) et non par (mp(il, i) + sigd * 0.1).  Et il
229                                +100.*ginv*0.5*sigd*(ph(il,i)-ph(il,i+1)) &                     ! faut bien revoir les facteurs 100.
230                                *(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)) &
231                        else                          * tevap / (mp(il, i) + sigd * 0.1) - 10. * (th(il, i) &
232                           rp(il,i)=rp(il,i+1) &                          - th(il, i - 1)) * t(il, i) / (lvcp(il, i) * sigd &
233                                +5.*sigd*(ph(il,i)-ph(il,i+1)) &                          * th(il, i))
234                                *(evap(il,i+1)+evap(il,i))/mp(il,i+1)                     b(il, i - 1) = max(b(il, i - 1), 0.)
235                        endif                  endif
                       up(il,i)=up(il,i+1)  
                       vp(il,i)=vp(il,i+1)  
236    
237                    ! Limit magnitude of mp(i) to meet CFL condition:
238                    ampmax = 2. * (ph(il, i) - ph(il, i + 1)) * delti
239                    amp2 = 2. * (ph(il, i - 1) - ph(il, i)) * delti
240                    ampmax = min(ampmax, amp2)
241                    mp(il, i) = min(mp(il, i), ampmax)
242    
243                    ! Force mp to decrease linearly to zero between cloud
244                    ! base and the surface:
245                    if (p(il, i) > p(il, icb(il))) mp(il, i) = mp(il, icb(il)) &
246                         * (p(il, 1) - p(il, i)) / (p(il, 1) - p(il, icb(il)))
247                 endif test_above_surface
248    
249                 ! Find mixing ratio of precipitating downdraft
250    
251                 if (i /= inb(il)) then
252                    qp(il, i) = q(il, i)
253    
254                    if (mp(il, i) > mp(il, i + 1)) then
255                       qp(il, i) = qp(il, i + 1) * mp(il, i + 1) + q(il, i) &
256                            * (mp(il, i) - mp(il, i + 1)) + 100. * ginv * 0.5 &
257                            * sigd * (ph(il, i) - ph(il, i + 1)) &
258                            * (evap(il, i + 1) + evap(il, i))
259                       qp(il, i) = qp(il, i) / mp(il, i)
260                       up(il, i) = up(il, i + 1) * mp(il, i + 1) + u(il, i) &
261                            * (mp(il, i) - mp(il, i + 1))
262                       up(il, i) = up(il, i) / mp(il, i)
263                       vp(il, i) = vp(il, i + 1) * mp(il, i + 1) + v(il, i) &
264                            * (mp(il, i) - mp(il, i + 1))
265                       vp(il, i) = vp(il, i) / mp(il, i)
266                    else
267                       if (mp(il, i + 1) > 1e-16) then
268                          qp(il, i) = qp(il, i + 1) + 100. * ginv * 0.5 * sigd &
269                               * (ph(il, i) - ph(il, i + 1)) * (evap(il, i + 1) &
270                               + evap(il, i)) / mp(il, i + 1)
271                          up(il, i) = up(il, i + 1)
272                          vp(il, i) = vp(il, i + 1)
273                     endif                     endif
274                  endif                  endif
                 rp(il,i)=amin1(rp(il,i),rs(il,i))  
                 rp(il,i)=amax1(rp(il,i),0.0)  
275    
276                    qp(il, i) = min(qp(il, i), qs(il, i))
277                    qp(il, i) = max(qp(il, i), 0.)
278               endif               endif
279            endif            endif
280         end do         end do loop_horizontal
281        end DO downdraft_loop
     end DO  
282    
283    end SUBROUTINE cv3_unsat    end SUBROUTINE cv30_unsat
284    
285  end module cv3_unsat_m  end module cv30_unsat_m

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

  ViewVC Help
Powered by ViewVC 1.1.21