/[lmdze]/trunk/Sources/phylmd/cv_driver.f
ViewVC logotype

Diff of /trunk/Sources/phylmd/cv_driver.f

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 180 by guez, Tue Mar 15 17:07:47 2016 UTC revision 183 by guez, Wed Mar 16 14:42:58 2016 UTC
# Line 4  module cv_driver_m Line 4  module cv_driver_m
4    
5  contains  contains
6    
7    SUBROUTINE cv_driver(t1, q1, qs1, u1, v1, p1, ph1, iflag1, ft1, &    SUBROUTINE cv_driver(t1, q1, qs1, u1, v1, p1, ph1, iflag1, ft1, fq1, fu1, &
8         fq1, fu1, fv1, precip1, VPrecip1, cbmf1, sig1, w01, icb1, inb1, delt, &         fv1, precip1, VPrecip1, sig1, w01, icb1, inb1, delt, Ma1, upwd1, &
9         Ma1, upwd1, dnwd1, dnwd01, qcondc1, wd1, cape1, da1, phi1, mp1)         dnwd1, dnwd01, qcondc1, wd1, cape1, da1, phi1, mp1)
10    
11      ! From LMDZ4/libf/phylmd/cv_driver.F, version 1.3, 2005/04/15 12:36:17      ! From LMDZ4/libf/phylmd/cv_driver.F, version 1.3, 2005/04/15 12:36:17
12      ! Main driver for convection      ! Main driver for convection
# Line 14  contains Line 14  contains
14    
15      ! Several modules corresponding to different physical processes      ! Several modules corresponding to different physical processes
16    
     ! Several versions of convect may be used:  
     ! - iflag_con = 3: version lmd  
     ! - iflag_con = 4: version 4.3b  
   
     use clesphys2, only: iflag_con  
17      use cv3_compress_m, only: cv3_compress      use cv3_compress_m, only: cv3_compress
18      use cv3_feed_m, only: cv3_feed      use cv3_feed_m, only: cv3_feed
19      use cv3_mixing_m, only: cv3_mixing      use cv3_mixing_m, only: cv3_mixing
# Line 26  contains Line 21  contains
21      use cv3_prelim_m, only: cv3_prelim      use cv3_prelim_m, only: cv3_prelim
22      use cv3_tracer_m, only: cv3_tracer      use cv3_tracer_m, only: cv3_tracer
23      use cv3_uncompress_m, only: cv3_uncompress      use cv3_uncompress_m, only: cv3_uncompress
24        use cv3_undilute2_m, only: cv3_undilute2
25      use cv3_unsat_m, only: cv3_unsat      use cv3_unsat_m, only: cv3_unsat
26      use cv3_yield_m, only: cv3_yield      use cv3_yield_m, only: cv3_yield
     use cv_feed_m, only: cv_feed  
     use cv_uncompress_m, only: cv_uncompress  
27      USE dimphy, ONLY: klev, klon      USE dimphy, ONLY: klev, klon
28    
29      real, intent(in):: t1(klon, klev) ! temperature      real, intent(in):: t1(klon, klev) ! temperature
# Line 49  contains Line 43  contains
43      real, intent(out):: VPrecip1(klon, klev + 1)      real, intent(out):: VPrecip1(klon, klev + 1)
44      ! vertical profile of precipitation      ! vertical profile of precipitation
45    
     real, intent(inout):: cbmf1(klon) ! cloud base mass flux  
46      real, intent(inout):: sig1(klon, klev) ! section adiabatic updraft      real, intent(inout):: sig1(klon, klev) ! section adiabatic updraft
47    
48      real, intent(inout):: w01(klon, klev)      real, intent(inout):: w01(klon, klev)
# Line 208  contains Line 201  contains
201      integer iflag(klon), nk(klon), icb(klon)      integer iflag(klon), nk(klon), icb(klon)
202      integer nent(klon, klev)      integer nent(klon, klev)
203      integer icbs(klon)      integer icbs(klon)
204      integer inb(klon), inbis(klon)      integer inb(klon)
205    
206      real cbmf(klon), plcl(klon), tnk(klon), qnk(klon), gznk(klon)      real plcl(klon), tnk(klon), qnk(klon), gznk(klon)
207      real t(klon, klev), q(klon, klev), qs(klon, klev)      real t(klon, klev), q(klon, klev), qs(klon, klev)
208      real u(klon, klev), v(klon, klev)      real u(klon, klev), v(klon, klev)
209      real gz(klon, klev), h(klon, klev), lv(klon, klev), cpn(klon, klev)      real gz(klon, klev), h(klon, klev), lv(klon, klev), cpn(klon, klev)
210      real p(klon, klev), ph(klon, klev + 1), tv(klon, klev), tp(klon, klev)      real p(klon, klev), ph(klon, klev + 1), tv(klon, klev), tp(klon, klev)
211      real clw(klon, klev)      real clw(klon, klev)
     real dph(klon, klev)  
212      real pbase(klon), buoybase(klon), th(klon, klev)      real pbase(klon), buoybase(klon), th(klon, klev)
213      real tvp(klon, klev)      real tvp(klon, klev)
214      real sig(klon, klev), w0(klon, klev)      real sig(klon, klev), w0(klon, klev)
215      real hp(klon, klev), ep(klon, klev), sigp(klon, klev)      real hp(klon, klev), ep(klon, klev), sigp(klon, klev)
216      real frac(klon), buoy(klon, klev)      real buoy(klon, klev)
217      real cape(klon)      real cape(klon)
218      real m(klon, klev), ment(klon, klev, klev), qent(klon, klev, klev)      real m(klon, klev), ment(klon, klev, klev), qent(klon, klev, klev)
219      real uent(klon, klev, klev), vent(klon, klev, klev)      real uent(klon, klev, klev), vent(klon, klev, klev)
# Line 233  contains Line 225  contains
225      real fu(klon, klev), fv(klon, klev)      real fu(klon, klev), fv(klon, klev)
226      real upwd(klon, klev), dnwd(klon, klev), dnwd0(klon, klev)      real upwd(klon, klev), dnwd(klon, klev), dnwd0(klon, klev)
227      real Ma(klon, klev), mike(klon, klev), tls(klon, klev)      real Ma(klon, klev), mike(klon, klev), tls(klon, klev)
228      real tps(klon, klev), qprime(klon), tprime(klon)      real tps(klon, klev)
229      real precip(klon)      real precip(klon)
230      real VPrecip(klon, klev + 1)      real VPrecip(klon, klev + 1)
231      real qcondc(klon, klev) ! cld      real qcondc(klon, klev) ! cld
# Line 245  contains Line 237  contains
237    
238      ! set simulation flags:      ! set simulation flags:
239      ! (common cvflag)      ! (common cvflag)
   
240      CALL cv_flag      CALL cv_flag
241    
242      ! set thermodynamical constants:      ! set thermodynamical constants:
243      ! (common cvthermo)      ! (common cvthermo)
   
244      CALL cv_thermo      CALL cv_thermo
245    
246      ! set convect parameters      ! set convect parameters
   
247      ! includes microphysical parameters and parameters that      ! includes microphysical parameters and parameters that
248      ! control the rate of approach to quasi-equilibrium)      ! control the rate of approach to quasi-equilibrium)
249      ! (common cvparam)      ! (common cvparam)
250    
251      if (iflag_con == 3) CALL cv3_param(klev, delt)      CALL cv3_param(klev, delt)
252    
253      ! INITIALIZE OUTPUT ARRAYS AND PARAMETERS      ! INITIALIZE OUTPUT ARRAYS AND PARAMETERS
254    
# Line 272  contains Line 261  contains
261            tvp1(i, k) = 0.0            tvp1(i, k) = 0.0
262            tp1(i, k) = 0.0            tp1(i, k) = 0.0
263            clw1(i, k) = 0.0            clw1(i, k) = 0.0
           !ym  
264            clw(i, k) = 0.0            clw(i, k) = 0.0
265            gz1(i, k) = 0.            gz1(i, k) = 0.
266            VPrecip1(i, k) = 0.            VPrecip1(i, k) = 0.
# Line 292  contains Line 280  contains
280         VPrecip1(i, klev + 1) = 0.0         VPrecip1(i, klev + 1) = 0.0
281      end do      end do
282    
283      if (iflag_con == 3) then      do il = 1, klon
284         do il = 1, klon         sig1(il, klev) = sig1(il, klev) + 1.
285            sig1(il, klev) = sig1(il, klev) + 1.         sig1(il, klev) = min(sig1(il, klev), 12.1)
286            sig1(il, klev) = min(sig1(il, klev), 12.1)      enddo
        enddo  
     endif  
287    
288      ! CALCULATE ARRAYS OF GEOPOTENTIAL, HEAT CAPACITY & STATIC ENERGY      ! CALCULATE ARRAYS OF GEOPOTENTIAL, HEAT CAPACITY & STATIC ENERGY
289        CALL cv3_prelim(klon, klev, klev + 1, t1, q1, p1, ph1, lv1, cpn1, tv1, &
290      if (iflag_con == 3) then           gz1, h1, hm1, th1)
        CALL cv3_prelim(klon, klev, klev + 1, t1, q1, p1, ph1, lv1, cpn1, tv1, &  
             gz1, h1, hm1, th1)  
     else  
        ! iflag_con == 4  
        CALL cv_prelim(klon, klev, klev + 1, t1, q1, p1, ph1, lv1, cpn1, tv1, &  
             gz1, h1, hm1)  
     endif  
291    
292      ! CONVECTIVE FEED      ! CONVECTIVE FEED
293        CALL cv3_feed(klon, klev, t1, q1, qs1, p1, ph1, gz1, nk1, icb1, &
294      if (iflag_con == 3) then           icbmax, iflag1, tnk1, qnk1, gznk1, plcl1) ! klev->na
        CALL cv3_feed(klon, klev, t1, q1, qs1, p1, ph1, gz1, nk1, icb1, &  
             icbmax, iflag1, tnk1, qnk1, gznk1, plcl1) ! klev->na  
     else  
        ! iflag_con == 4  
        CALL cv_feed(klon, klev, t1, q1, qs1, p1, hm1, gz1, nk1, icb1, icbmax, &  
             iflag1, tnk1, qnk1, gznk1, plcl1)  
     endif  
295    
296      ! UNDILUTE (ADIABATIC) UPDRAFT / 1st part      ! UNDILUTE (ADIABATIC) UPDRAFT / 1st part
297      ! (up through ICB for convect4, up through ICB + 1 for convect3)      ! (up through ICB for convect4, up through ICB + 1 for convect3)
298      ! Calculates the lifted parcel virtual temperature at nk, the      ! Calculates the lifted parcel virtual temperature at nk, the
299      ! actual temperature, and the adiabatic liquid water content.      ! actual temperature, and the adiabatic liquid water content.
300        CALL cv3_undilute1(klon, klev, t1, q1, qs1, gz1, plcl1, p1, nk1, icb1, &
301      if (iflag_con == 3) then           tp1, tvp1, clw1, icbs1) ! klev->na
        CALL cv3_undilute1(klon, klev, t1, q1, qs1, gz1, plcl1, p1, nk1, icb1, &  
             tp1, tvp1, clw1, icbs1) ! klev->na  
     else  
        ! iflag_con == 4  
        CALL cv_undilute1(klon, klev, t1, q1, qs1, gz1, p1, nk1, icb1, icbmax, &  
             tp1, tvp1, clw1)  
     endif  
302    
303      ! TRIGGERING      ! TRIGGERING
304        CALL cv3_trigger(klon, klev, icb1, plcl1, p1, th1, tv1, tvp1, pbase1, &
305      if (iflag_con == 3) then           buoybase1, iflag1, sig1, w01) ! klev->na
        CALL cv3_trigger(klon, klev, icb1, plcl1, p1, th1, tv1, tvp1, pbase1, &  
             buoybase1, iflag1, sig1, w01) ! klev->na  
     else  
        ! iflag_con == 4  
        CALL cv_trigger(klon, klev, icb1, cbmf1, tv1, tvp1, iflag1)  
     end if  
306    
307      ! Moist convective adjustment is necessary      ! Moist convective adjustment is necessary
308    
# Line 358  contains Line 317  contains
317      IF (ncum > 0) THEN      IF (ncum > 0) THEN
318         ! COMPRESS THE FIELDS         ! COMPRESS THE FIELDS
319         ! (-> vectorization over convective gridpoints)         ! (-> vectorization over convective gridpoints)
320           CALL cv3_compress(klon, klon, ncum, klev, iflag1, nk1, icb1, icbs1, &
321         if (iflag_con == 3) then              plcl1, tnk1, qnk1, gznk1, pbase1, buoybase1, t1, q1, qs1, u1, &
322            CALL cv3_compress(klon, klon, ncum, klev, iflag1, nk1, icb1, icbs1, &              v1, gz1, th1, h1, lv1, cpn1, p1, ph1, tv1, tp1, tvp1, clw1, &
323                 plcl1, tnk1, qnk1, gznk1, pbase1, buoybase1, t1, q1, qs1, u1, &              sig1, w01, iflag, nk, icb, icbs, plcl, tnk, qnk, gznk, pbase, &
324                 v1, gz1, th1, h1, lv1, cpn1, p1, ph1, tv1, tp1, tvp1, clw1, &              buoybase, t, q, qs, u, v, gz, th, h, lv, cpn, p, ph, tv, tp, &
325                 sig1, w01, iflag, nk, icb, icbs, plcl, tnk, qnk, gznk, pbase, &              tvp, clw, sig, w0)
                buoybase, t, q, qs, u, v, gz, th, h, lv, cpn, p, ph, tv, tp, &  
                tvp, clw, sig, w0)  
        else  
           ! iflag_con == 4  
           CALL cv_compress(klon, klon, ncum, klev, iflag1, nk1, icb1, cbmf1, &  
                plcl1, tnk1, qnk1, gznk1, t1, q1, qs1, u1, v1, gz1, h1, lv1, &  
                cpn1, p1, ph1, tv1, tp1, tvp1, clw1, iflag, nk, icb, cbmf, &  
                plcl, tnk, qnk, gznk, t, q, qs, u, v, gz, h, lv, cpn, p, ph, &  
                tv, tp, tvp, clw, dph)  
        endif  
326    
327         ! UNDILUTE (ADIABATIC) UPDRAFT / second part :         ! UNDILUTE (ADIABATIC) UPDRAFT / second part :
328         ! FIND THE REST OF THE LIFTED PARCEL TEMPERATURES         ! FIND THE REST OF THE LIFTED PARCEL TEMPERATURES
# Line 382  contains Line 331  contains
331         ! FRACTION OF PRECIPITATION FALLING OUTSIDE OF CLOUD         ! FRACTION OF PRECIPITATION FALLING OUTSIDE OF CLOUD
332         ! &         ! &
333         ! FIND THE LEVEL OF NEUTRAL BUOYANCY         ! FIND THE LEVEL OF NEUTRAL BUOYANCY
334           CALL cv3_undilute2(klon, ncum, klev, icb, icbs, nk, tnk, qnk, gznk, &
335         if (iflag_con == 3) then              t, qs, gz, p, h, tv, lv, pbase, buoybase, plcl, inb, tp, &
336            CALL cv3_undilute2(klon, ncum, klev, icb, icbs, nk, tnk, qnk, gznk, &              tvp, clw, hp, ep, sigp, buoy) !na->klev
                t, qs, gz, p, h, tv, lv, pbase, buoybase, plcl, inb, tp, &  
                tvp, clw, hp, ep, sigp, buoy) !na->klev  
        else  
           ! iflag_con == 4  
           CALL cv_undilute2(klon, ncum, klev, icb, nk, tnk, qnk, gznk, t, &  
                qs, gz, p, dph, h, tv, lv, inb, inbis, tp, tvp, clw, hp, ep, &  
                sigp, frac)  
        endif  
337    
338         ! CLOSURE         ! CLOSURE
339           CALL cv3_closure(klon, ncum, klev, icb, inb, pbase, p, ph, tv, &
340         if (iflag_con == 3) then              buoy, sig, w0, cape, m) ! na->klev
           CALL cv3_closure(klon, ncum, klev, icb, inb, pbase, p, ph, tv, &  
                buoy, sig, w0, cape, m) ! na->klev  
        else  
           ! iflag_con == 4  
           CALL cv_closure(klon, ncum, klev, nk, icb, tv, tvp, p, ph, dph, &  
                plcl, cpn, iflag, cbmf)  
        endif  
341    
342         ! MIXING         ! MIXING
343           CALL cv3_mixing(klon, ncum, klev, klev, icb, nk, inb, t, q, qs, u, &
344         if (iflag_con == 3) then              v, h, lv, hp, ep, clw, m, sig, ment, qent, uent, vent, nent, &
345            CALL cv3_mixing(klon, ncum, klev, klev, icb, nk, inb, t, q, qs, u, &              sij, elij, ments, qents)
                v, h, lv, hp, ep, clw, m, sig, ment, qent, uent, vent, nent, &  
                sij, elij, ments, qents)  
        else  
           ! iflag_con == 4  
           CALL cv_mixing(klon, ncum, klev, icb, nk, inb, inbis, ph, t, q, qs, &  
                u, v, h, lv, qnk, hp, tv, tvp, ep, clw, cbmf, m, ment, qent, &  
                uent, vent, nent, sij, elij)  
        endif  
346    
347         ! UNSATURATED (PRECIPITATING) DOWNDRAFTS         ! UNSATURATED (PRECIPITATING) DOWNDRAFTS
348           CALL cv3_unsat(klon, ncum, klev, klev, icb, inb, t, q, qs, gz, u, &
349         if (iflag_con == 3) then              v, p, ph, th, tv, lv, cpn, ep, sigp, clw, m, ment, elij, delt, &
350            CALL cv3_unsat(klon, ncum, klev, klev, icb, inb, t, q, qs, gz, u, &              plcl, mp, qp, up, vp, wt, water, evap, b)! na->klev
                v, p, ph, th, tv, lv, cpn, ep, sigp, clw, m, ment, elij, delt, &  
                plcl, mp, qp, up, vp, wt, water, evap, b)! na->klev  
        else  
           ! iflag_con == 4  
           CALL cv_unsat(klon, ncum, klev, inb, t, q, qs, gz, u, v, p, ph, h, &  
                lv, ep, sigp, clw, m, ment, elij, iflag, mp, qp, up, vp, wt, &  
                water, evap)  
        endif  
351    
352         ! YIELD         ! YIELD
353         ! (tendencies, precipitation, variables of interface with other         ! (tendencies, precipitation, variables of interface with other
354         ! processes, etc)         ! processes, etc)
355           CALL cv3_yield(klon, ncum, klev, klev, icb, inb, delt, t, q, u, v, &
356         if (iflag_con == 3) then              gz, p, ph, h, hp, lv, cpn, th, ep, clw, m, tp, mp, qp, up, vp, &
357            CALL cv3_yield(klon, ncum, klev, klev, icb, inb, delt, t, q, u, v, &              wt, water, evap, b, ment, qent, uent, vent, nent, elij, sig, &
358                 gz, p, ph, h, hp, lv, cpn, th, ep, clw, m, tp, mp, qp, up, vp, &              tv, tvp, iflag, precip, VPrecip, ft, fq, fu, fv, upwd, dnwd, &
359                 wt, water, evap, b, ment, qent, uent, vent, nent, elij, sig, &              dnwd0, ma, mike, tls, tps, qcondc, wd)! na->klev
                tv, tvp, iflag, precip, VPrecip, ft, fq, fu, fv, upwd, dnwd, &  
                dnwd0, ma, mike, tls, tps, qcondc, wd)! na->klev  
        else  
           ! iflag_con == 4  
           CALL cv_yield(klon, ncum, klev, nk, icb, inb, delt, t, q, u, v, gz, &  
                p, ph, h, hp, lv, cpn, ep, clw, frac, m, mp, qp, up, vp, wt, &  
                water, evap, ment, qent, uent, vent, nent, elij, tv, tvp, &  
                iflag, wd, qprime, tprime, precip, cbmf, ft, fq, fu, fv, Ma, &  
                qcondc)  
        endif  
360    
361         ! passive tracers         ! passive tracers
362           CALL cv3_tracer(klon, ncum, klev, ment, sij, da, phi)
        if (iflag_con == 3) CALL cv3_tracer(klon, ncum, klev, ment, sij, da, phi)  
363    
364         ! UNCOMPRESS THE FIELDS         ! UNCOMPRESS THE FIELDS
365    
# Line 461  contains Line 368  contains
368            iflag1(i) = 42            iflag1(i) = 42
369         end do         end do
370    
371         if (iflag_con == 3) then         CALL cv3_uncompress(idcum(:ncum), iflag, precip, VPrecip, sig, w0, &
372            CALL cv3_uncompress(idcum(:ncum), iflag, precip, VPrecip, sig, w0, &              ft, fq, fu, fv, inb, Ma, upwd, dnwd, dnwd0, qcondc, wd, cape, &
373                 ft, fq, fu, fv, inb, Ma, upwd, dnwd, dnwd0, qcondc, wd, cape, &              da, phi, mp, iflag1, precip1, VPrecip1, sig1, w01, ft1, fq1, &
374                 da, phi, mp, iflag1, precip1, VPrecip1, sig1, w01, ft1, fq1, &              fu1, fv1, inb1, Ma1, upwd1, dnwd1, dnwd01, qcondc1, wd1, &
375                 fu1, fv1, inb1, Ma1, upwd1, dnwd1, dnwd01, qcondc1, wd1, &              cape1, da1, phi1, mp1)
376                 cape1, da1, phi1, mp1)      ENDIF
        else  
           ! iflag_con == 4  
           CALL cv_uncompress(idcum(:ncum), iflag, precip, cbmf, ft, fq, fu, &  
                fv, Ma, qcondc, iflag1, precip1, cbmf1, ft1, fq1, fu1, fv1, &  
                Ma1, qcondc1)  
        endif  
     ENDIF ! ncum>0  
377    
378    end SUBROUTINE cv_driver    end SUBROUTINE cv_driver
379    

Legend:
Removed from v.180  
changed lines
  Added in v.183

  ViewVC Help
Powered by ViewVC 1.1.21