/[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 194 by guez, Thu May 12 14:35:35 2016 UTC revision 195 by guez, Wed May 18 17:56:44 2016 UTC
# Line 5  module cv30_unsat_m Line 5  module cv30_unsat_m
5  contains  contains
6    
7    SUBROUTINE cv30_unsat(icb, inb, t, q, qs, gz, u, v, p, ph, th, tv, lv, cpn, &    SUBROUTINE cv30_unsat(icb, inb, t, q, qs, gz, u, v, p, ph, th, tv, lv, cpn, &
8         ep, sigp, clw, m, ment, elij, delt, plcl, mp, qp, up, vp, wt, water, &         ep, clw, m, ment, elij, delt, plcl, mp, qp, up, vp, wt, water, evap, b)
9         evap, b)  
10        ! Unsaturated (precipitating) downdrafts
11    
12      use cv30_param_m, only: nl, sigd      use cv30_param_m, only: nl, sigd
13      use cv_thermo_m, only: cpd, ginv, grav      use cv_thermo_m, only: cpd, ginv, grav
     USE dimphy, ONLY: klon, klev  
14    
15      integer, intent(in):: icb(:) ! (ncum)      integer, intent(in):: icb(:) ! (ncum)
16    
# Line 18  contains Line 18  contains
18      ! first model level above the level of neutral buoyancy of the      ! first model level above the level of neutral buoyancy of the
19      ! parcel (1 <= inb <= nl - 1)      ! parcel (1 <= inb <= nl - 1)
20    
21      real, intent(in):: t(:, :), q(:, :), qs(:, :) ! (klon, klev)      real, intent(in):: t(:, :), q(:, :), qs(:, :) ! (ncum, nl)
22      real, intent(in):: gz(:, :) ! (klon, klev)      real, intent(in):: gz(:, :) ! (klon, klev)
23      real, intent(in):: u(:, :), v(:, :) ! (klon, klev)      real, intent(in):: u(:, :), v(:, :) ! (klon, klev)
24      real, intent(in):: p(klon, klev), ph(klon, klev + 1)      real, intent(in):: p(:, :) ! (klon, klev) pressure at full level, in hPa
25      real, intent(in):: th(klon, klev)      real, intent(in):: ph(:, :) ! (klon, klev + 1)
26      real, intent(in):: tv(klon, klev)      real, intent(in):: th(:, :) ! (ncum, nl - 1)
27      real, intent(in):: lv(klon, klev)      real, intent(in):: tv(:, :) ! (klon, klev)
28      real, intent(in):: cpn(klon, klev)      real, intent(in):: lv(:, :) ! (klon, klev)
29      real, intent(in):: ep(:, :), sigp(:, :), clw(:, :) ! (ncum, klev)      real, intent(in):: cpn(:, :) ! (klon, klev)
30        real, intent(in):: ep(:, :) ! (ncum, klev)
31        real, intent(in):: clw(:, :) ! (ncum, klev)
32      real, intent(in):: m(:, :) ! (ncum, klev)      real, intent(in):: m(:, :) ! (ncum, klev)
33      real, intent(in):: ment(:, :, :) ! (ncum, klev, klev)      real, intent(in):: ment(:, :, :) ! (ncum, klev, klev)
34      real, intent(in):: elij(:, :, :) ! (ncum, klev, klev)      real, intent(in):: elij(:, :, :) ! (ncum, klev, klev)
35      real, intent(in):: delt      real, intent(in):: delt
36      real, intent(in):: plcl(klon)      real, intent(in):: plcl(:) ! (klon)
37    
38      ! outputs:      real, intent(out):: mp(:, :) ! (klon, klev)
     real, intent(out):: mp(klon, klev)  
39      real, intent(out):: qp(:, :), up(:, :), vp(:, :) ! (ncum, nl)      real, intent(out):: qp(:, :), up(:, :), vp(:, :) ! (ncum, nl)
40      real wt(klon, klev), water(klon, klev), evap(klon, klev)      real, intent(out):: wt(:, :) ! (ncum, nl)
41        real, intent(out):: water(:, :), evap(:, :) ! (ncum, nl)
42      real, intent(out):: b(:, :) ! (ncum, nl - 1)      real, intent(out):: b(:, :) ! (ncum, nl - 1)
43    
44      ! Local:      ! Local:
45    
46        real, parameter:: sigp = 0.15
47        ! fraction of precipitation falling outside of cloud, \sig_s in
48        ! Emanuel (1991 928)
49    
50      integer ncum      integer ncum
51      integer i, il, imax      integer i, il, imax
52      real tinv, delti      real tinv, delti
# Line 47  contains Line 54  contains
54      real pr1, pr2, sigt, b6, c6, revap, tevap, delth      real pr1, pr2, sigt, b6, c6, revap, tevap, delth
55      real amfac, amp2, xf, tf, fac2, ur, sru, fac, d, af, bf      real amfac, amp2, xf, tf, fac2, ur, sru, fac, d, af, bf
56      real ampmax      real ampmax
57      real lvcp(klon, klev)      real lvcp(size(icb), nl) ! (ncum, nl)
58      real wdtrain(size(icb)) ! (ncum)      real wdtrain(size(icb)) ! (ncum)
59      logical lwork(size(icb)) ! (ncum)      logical lwork(size(icb)) ! (ncum)
60    
# Line 94  contains Line 101  contains
101         ! Find rain water and evaporation using provisional         ! Find rain water and evaporation using provisional
102         ! estimates of qp(i) and qp(i - 1)         ! estimates of qp(i) and qp(i - 1)
103    
104         do il = 1, ncum         loop_horizontal: do il = 1, ncum
105            if (i <= inb(il) .and. lwork(il)) then            if (i <= inb(il) .and. lwork(il)) then
106               wt(il, i) = 45.               wt(il, i) = 45.
107    
# Line 130  contains Line 137  contains
137    
138               ! Prise en compte de la variation progressive de sigt dans               ! Prise en compte de la variation progressive de sigt dans
139               ! les couches icb et icb - 1:               ! les couches icb et icb - 1:
140               ! pour plcl < ph(i + 1), pr1 = 0 et pr2 = 1               ! pour plcl <= ph(i + 1), pr1 = 0 et pr2 = 1
141               ! pour plcl > ph(i), pr1 = 1 et pr2 = 0               ! pour plcl >= ph(i), pr1 = 1 et pr2 = 0
142               ! pour ph(i + 1) < plcl < ph(i), pr1 est la proportion \`a cheval               ! pour ph(i + 1) < plcl < ph(i), pr1 est la proportion \`a cheval
143               ! sur le nuage, et pr2 est la proportion sous la base du               ! sur le nuage, et pr2 est la proportion sous la base du
144               ! nuage.               ! nuage.
145               pr1 = (plcl(il) - ph(il, i + 1)) / (ph(il, i) - ph(il, i + 1))               pr1 = max(0., min(1., &
146               pr1 = max(0., min(1., pr1))                    (plcl(il) - ph(il, i + 1)) / (ph(il, i) - ph(il, i + 1))))
147               pr2 = (ph(il, i) - plcl(il)) / (ph(il, i) - ph(il, i + 1))               pr2 = max(0., min(1., &
148               pr2 = max(0., min(1., pr2))                    (ph(il, i) - plcl(il)) / (ph(il, i) - ph(il, i + 1))))
149               sigt = sigp(il, i) * pr1 + pr2               sigt = sigp * pr1 + pr2
150    
151               b6 = bfac * 50. * sigd * (ph(il, i) - ph(il, i + 1)) * sigt * afac               b6 = bfac * 50. * sigd * (ph(il, i) - ph(il, i + 1)) * sigt * afac
152               c6 = water(il, i + 1) + bfac * wdtrain(il) - 50. * sigd * bfac &               c6 = water(il, i + 1) + bfac * wdtrain(il) - 50. * sigd * bfac &
153                    * (ph(il, i) - ph(il, i + 1)) * evap(il, i + 1)                    * (ph(il, i) - ph(il, i + 1)) * evap(il, i + 1)
154    
155               if (c6 > 0.) then               if (c6 > 0.) then
156                  revap = 0.5 * (- b6 + sqrt(b6 * b6 + 4. * c6))                  revap = 0.5 * (- b6 + sqrt(b6 * b6 + 4. * c6))
157                  evap(il, i) = sigt * afac * revap                  evap(il, i) = sigt * afac * revap
# Line 256  contains Line 264  contains
264                  qp(il, i) = max(qp(il, i), 0.)                  qp(il, i) = max(qp(il, i), 0.)
265               endif               endif
266            endif            endif
267         end do         end do loop_horizontal
268      end DO downdraft_loop      end DO downdraft_loop
269    
270    end SUBROUTINE cv30_unsat    end SUBROUTINE cv30_unsat

Legend:
Removed from v.194  
changed lines
  Added in v.195

  ViewVC Help
Powered by ViewVC 1.1.21