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

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

  ViewVC Help
Powered by ViewVC 1.1.21