/[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

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

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

  ViewVC Help
Powered by ViewVC 1.1.21