Changeset 2232


Ignore:
Timestamp:
Jan 30, 2020, 10:36:35 AM (5 years ago)
Author:
aboissinot
Message:

The thermal plume model is able to manage several plumes in the same column and
work without the convective adjustment.

Location:
trunk/LMDZ.GENERIC
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/LMDZ.GENERIC/README

    r2231 r2232  
    15061506- fix a bug in thermcell_env. Now zqt is correctly initialized when tracer h2o_vap is missing (consistency with flag water is assumed).
    15071507- clean up thermcell_dv2 and use plume height (zmin-zmax) instead of maximal altitude (zmax) in computations
     1508- the thermal plume model is able to manage several plumes in the same column and work without the convective adjustment.
  • trunk/LMDZ.GENERIC/libf/phystd/convadj.F

    r2127 r2232  
    33     &                   pu,pv,ph,pq,
    44     &                   pdufi,pdvfi,pdhfi,pdqfi,
    5      &                   pduadj,pdvadj,pdhadj,
    6      &                   pdqadj,lmax)
     5     &                   pduadj,pdvadj,pdhadj,pdqadj)
    76
    87      USE tracer_h
     
    4140      REAL pu(ngrid,nlay),pdufi(ngrid,nlay),pduadj(ngrid,nlay)
    4241      REAL pv(ngrid,nlay),pdvfi(ngrid,nlay),pdvadj(ngrid,nlay)
    43       INTEGER lmax(ngrid)
    4442
    4543!     Tracers
     
    157155      DO l=2,nlay
    158156        DO ig=1,ngrid
    159           IF (zhc(ig,l).LT.zhc(ig,l-1).and.(l.GT.lmax(ig))) THEN
     157          IF (zhc(ig,l).LT.zhc(ig,l-1)) THEN
    160158            vtest(ig)=.true.
    161159          ENDIF
     
    197195            l2 = l2 + 1
    198196            IF (l2 .GT. nlay) EXIT
    199             IF ((zhc(i, l2).LT.zhc(i, l2-1)).and.(l2.GT.lmax(i))) THEN
     197            IF (zhc(i, l2).LT.zhc(i, l2-1)) THEN
    200198 
    201199!     l2 is the highest level of the unstable column
     
    226224                down = .false.
    227225                IF (l1 .ne. 1) then    !--  and then
    228                   IF ((zhmc.LT.zhc(i, l1-1)).and.(l1.GT.lmax(i))) then
     226                  IF (zhmc.LT.zhc(i, l1-1)) then
    229227                    down = .true.
    230228                  END IF
  • trunk/LMDZ.GENERIC/libf/phystd/physiq_mod.F90

    r2176 r2232  
    253253! VARIABLES for the thermal plume model
    254254     
    255       INTEGER lmin(ngrid)                 ! Plume base level
    256       INTEGER lmix(ngrid)                 ! Plume maximal velocity level
    257       INTEGER lmax(ngrid)                 ! Maximal level reached by the plume
    258      
    259       real,allocatable,save :: f0(:)      ! Mass flux norm
    260       real,allocatable,save :: fm0(:,:)   ! Mass flux
    261       real,allocatable,save :: entr0(:,:) ! Entrainment
    262       real,allocatable,save :: detr0(:,:) ! Detrainment
     255      real f(ngrid)                       ! Mass flux norm
     256      real fm(ngrid,nlayer+1)             ! Mass flux
     257      real fm_bis(ngrid,nlayer)           ! Recasted fm
     258      real entr(ngrid,nlayer)             ! Entrainment
     259      real detr(ngrid,nlayer)             ! Detrainment
    263260      real dqevap(ngrid,nlayer,nq)        ! water tracer mass mixing ratio variations due to evaporation
    264261      real dtevap(ngrid,nlayer)           ! temperature variation due to evaporation
    265262      real zqtherm(ngrid,nlayer,nq)       ! vapor mass mixing ratio after evaporation
    266263      real zttherm(ngrid,nlayer)          ! temperature after evaporation
    267       real fraca(ngrid, nlayer+1)         ! Fraction of the surface that plumes occupies
    268       real zw2(ngrid, nlayer+1)           ! Vertical speed
    269       real zw2_bis(ngrid, nlayer)         !
    270       real zqsatth(ngrid, nlayer)         ! Water vapor mixing ratio at saturation
    271       real zqta(ngrid, nlayer)            ! Total water mass mixing ratio in the plume
    272       real zqla(ngrid, nlayer)            ! Liquid water mass mixing ratio in the plume
    273       real ztv(ngrid, nlayer)             ! Virtual potential temperature in the environment considering large scale condensation
    274       real ztva(ngrid, nlayer)            ! Virtual potential temperature in the plume
    275       real zthl(ngrid, nlayer)            ! Potential temperature in the environment without considering condensation
    276       real ztla(ngrid, nlayer)            ! Potential temperature in the plume
    277       real ratqscth(ngrid, nlayer)        !
    278       real ratqsdiff(ngrid, nlayer)       !
    279            
    280 ! AB : variables used for outputs
    281       REAL pmax(ngrid)                       ! Maximal pressure reached by the plume
    282       REAL pmin(ngrid)                       ! Minimal pressure reached by the plume
    283 
     264      real fraca(ngrid,nlayer+1)          ! Fraction of the surface that plumes occupies
     265      real zw2(ngrid,nlayer+1)            ! Vertical speed
     266      real zw2_bis(ngrid,nlayer)          ! Recasted zw2
     267     
    284268! TENDENCIES due to various processes :
    285269
     
    688672         if (calltherm) then
    689673            CALL init_thermcell_mod(g, rcp, r, pi, T_h2o_ice_liq, RV)
    690             ALLOCATE(f0(ngrid))
    691             ALLOCATE(fm0(ngrid,nlayer+1))
    692             ALLOCATE(entr0(ngrid,nlayer))
    693             ALLOCATE(detr0(ngrid,nlayer))
    694674         endif
    695675         
     
    11881168         ENDIF
    11891169         
    1190 ! AB: If a plume stops, the parametrization never look above if somewhere the atmosphere is still unstable!
    1191 !     Maybe it's a good idea to call convective adjustment too.
    11921170         CALL thermcell_main(ngrid, nlayer, nq, ptimestep, firstcall,            &
    11931171                             pplay, pplev, pphi, zpopsk,                         &
    11941172                             pu, pv, zttherm, zqtherm,                           &
    11951173                             zdutherm, zdvtherm, zdttherm, zdqtherm,             &
    1196                              f0, fm0, entr0, detr0, zw2, fraca,                  &
    1197                              zqta, zqla, ztv, ztva, ztla, zthl, zqsatth,         &
    1198                              lmin, lmix, lmax)
    1199          
    1200          DO ig=1,ngrid
    1201             pmin(ig) = pplev(ig,lmin(ig))
    1202             pmax(ig) = pplev(ig,lmax(ig))
    1203          ENDDO
     1174                             fm, entr, detr, zw2, fraca)
    12041175         
    12051176         pdu(1:ngrid,1:nlayer) = pdu(1:ngrid,1:nlayer) + zdutherm(1:ngrid,1:nlayer)
     
    12101181            pdq(1:ngrid,1:nlayer,1:nq) = pdq(1:ngrid,1:nlayer,1:nq) + zdqtherm(1:ngrid,1:nlayer,1:nq)
    12111182         ENDIF
    1212          
    1213       ELSE
    1214          
    1215          lmax(1:ngrid) = 1
    12161183         
    12171184      ENDIF ! end of 'calltherm'
     
    12341201                      pdu,pdv,zdh,pdq,                      &
    12351202                      zduadj,zdvadj,zdhadj,                 &
    1236                       zdqadj,lmax)
     1203                      zdqadj)
    12371204
    12381205         pdu(1:ngrid,1:nlayer) = pdu(1:ngrid,1:nlayer) + zduadj(1:ngrid,1:nlayer)
     
    17481715            DO l=1,nlayer
    17491716               zw2_bis(ig,l) = zw2(ig,l)
     1717               fm_bis(ig,l) = fm(ig,l)
    17501718            ENDDO
    17511719         ENDDO
     
    21382106      ! Thermal plume model
    21392107      if (calltherm) then
    2140          call writediagfi(ngrid,'entr','Entrainment','kg m$^{-2}$ s$^{-1}$', 3, entr0)
    2141          call writediagfi(ngrid,'detr','Detrainment','kg m$^{-2}$ s$^{-1}$', 3, detr0)
    2142          call writediagfi(ngrid,'fm','Mass flux','kg m$^{-2}$ s$^{-1}$', 3, fm0)
     2108         call writediagfi(ngrid,'entr','Entrainment','kg m$^{-2}$ s$^{-1}$', 3, entr)
     2109         call writediagfi(ngrid,'detr','Detrainment','kg m$^{-2}$ s$^{-1}$', 3, detr)
     2110         call writediagfi(ngrid,'fm','Mass flux','kg m$^{-2}$ s$^{-1}$', 3, fm_bis)
    21432111         call writediagfi(ngrid,'w_plm','Squared vertical velocity','m s$^{-1}$', 3, zw2_bis)
    21442112         call writediagfi(ngrid,'fraca','Updraft fraction','', 3, fraca)
    2145 !         call writediagfi(ngrid,'pmin', 'pmin', 'Pa', 2, pmin)
    2146 !         call writediagfi(ngrid,'pmax', 'pmax', 'Pa', 2, pmax)
    21472113      endif
    21482114     
     
    23522318      IF (calltherm) THEN
    23532319         CALL send_xios_field('w_plm',zw2_bis)
    2354          CALL send_xios_field('entr',entr0)
    2355          CALL send_xios_field('detr',detr0)
     2320         CALL send_xios_field('entr',entr)
     2321         CALL send_xios_field('detr',detr)
     2322!         CALL send_xios_field('fm',fm_bis)
     2323!         CALL send_xios_field('fraca',fraca)
    23562324      ENDIF
    23572325     
  • trunk/LMDZ.GENERIC/libf/phystd/thermcell_main.F90

    r2229 r2232  
    66                          pu,pv,pt,pq,                                        &
    77                          pduadj,pdvadj,pdtadj,pdqadj,                        &
    8                           f0,fm0,entr0,detr0,zw2,fraca,                       &
    9                           zqta,zqla,ztv,ztva,zhla,zhl,zqsa,                   &
    10                           lmin,lmix,lmax)
     8                          fm_tot,entr_tot,detr_tot,zw2_tot,fraca)
    119     
    1210     
     
    4341!    lmin can be greater than 1
    4442!    Mix every tracer
     43!    Can stack verticaly multiple plumes (it makes thermcell_dv2 unusable for the moment)
    4544!
    4645!===============================================================================
     
    6766      REAL, INTENT(in) :: pplev(ngrid,nlay+1)         ! Level pressure
    6867      REAL, INTENT(in) :: pphi(ngrid,nlay)            ! Geopotential
     68      REAL, INTENT(in) :: zpopsk(ngrid,nlay)          ! Exner function
    6969     
    7070      REAL, INTENT(in) :: pu(ngrid,nlay)              ! Zonal wind
     
    7878!     --------
    7979     
    80       INTEGER, INTENT(out) :: lmax(ngrid)             ! Highest layer reached by the plume
    81       INTEGER, INTENT(out) :: lmix(ngrid)             ! Layer in which plume vertical speed is maximal
    82       INTEGER, INTENT(out) :: lmin(ngrid)             ! First unstable layer
    83      
    8480      REAL, INTENT(out) :: pduadj(ngrid,nlay)         ! u convective variations
    8581      REAL, INTENT(out) :: pdvadj(ngrid,nlay)         ! v convective variations
     
    8783      REAL, INTENT(out) :: pdqadj(ngrid,nlay,nq)      ! q convective variations
    8884     
    89       REAL, INTENT(inout) :: f0(ngrid)                ! mass flux norm (after possible time relaxation)
    90       REAL, INTENT(inout) :: fm0(ngrid,nlay+1)        ! mass flux      (after possible time relaxation)
    91       REAL, INTENT(inout) :: entr0(ngrid,nlay)        ! entrainment    (after possible time relaxation)
    92       REAL, INTENT(inout) :: detr0(ngrid,nlay)        ! detrainment    (after possible time relaxation)
     85      REAL, INTENT(inout) :: fm_tot(ngrid,nlay+1)     ! Total mass flux
     86      REAL, INTENT(inout) :: entr_tot(ngrid,nlay)     ! Total entrainment
     87      REAL, INTENT(inout) :: detr_tot(ngrid,nlay)     ! Total detrainment
     88     
     89      REAL, INTENT(out) :: fraca(ngrid,nlay+1)        ! Updraft fraction
     90      REAL, INTENT(out) :: zw2_tot(ngrid,nlay+1)      ! Total plume vertical speed
    9391     
    9492!     Local:
     
    9694     
    9795      INTEGER ig, k, l, iq
     96      INTEGER lmax(ngrid)                             ! Highest layer reached by the plume
     97      INTEGER lmix(ngrid)                             ! Layer in which plume vertical speed is maximal
     98      INTEGER lmin(ngrid)                             ! First unstable layer
    9899     
    99100      REAL zmix(ngrid)                                ! Altitude of maximal vertical speed
     
    106107      REAL rhobarz(ngrid,nlay)                        ! Levels densities
    107108      REAL masse(ngrid,nlay)                          ! Layers masses
    108       REAL zpopsk(ngrid,nlay)                         ! Exner function
    109109     
    110110      REAL zu(ngrid,nlay)                             ! u    environment
     
    128128     
    129129      REAL f_star(ngrid,nlay+1)                       ! Normalized mass flux
    130       REAL entr_star(ngrid,nlay)                      ! Normalized entrainment (E* = e* dz)
    131       REAL detr_star(ngrid,nlay)                      ! Normalized detrainment (D* = d* dz)
    132      
     130      REAL entr_star(ngrid,nlay)                      ! Normalized entrainment
     131      REAL detr_star(ngrid,nlay)                      ! Normalized detrainment
     132     
     133      REAL f(ngrid)                                   ! Mass flux norm
    133134      REAL fm(ngrid,nlay+1)                           ! Mass flux
    134       REAL entr(ngrid,nlay)                           ! Entrainment (E = e dz)
    135       REAL detr(ngrid,nlay)                           ! Detrainment (D = d dz)
    136      
    137       REAL f(ngrid)                                   ! Mass flux norm
    138       REAL lambda                                     ! Time relaxation coefficent
    139       REAL fraca(ngrid,nlay+1)                        ! Updraft fraction
     135      REAL entr(ngrid,nlay)                           ! Entrainment
     136      REAL detr(ngrid,nlay)                           ! Detrainment
     137     
     138      REAL zw2(ngrid,nlay+1)                          ! Plume vertical speed
    140139      REAL wmax(ngrid)                                ! Maximal vertical speed
    141       REAL zw2(ngrid,nlay+1)                          ! Plume vertical speed
    142140      REAL zdthladj(ngrid,nlay)                       ! Potential temperature variations
    143141      REAL dummy(ngrid,nlay)                          ! Dummy argument for thermcell_dq()
    144142     
     143!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     144      INTEGER lbot(ngrid)
     145      LOGICAL re_tpm
     146      INTEGER while_loop_counter
     147!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     148     
    145149!===============================================================================
    146150! Initialization
    147151!===============================================================================
    148152     
    149       IF (firstcall) THEN
    150          fm0(:,:) = 0.
    151          entr0(:,:) = 0.
    152          detr0(:,:) = 0.
    153       ENDIF
    154      
    155       DO ig=1,ngrid
    156 ! AB: Minimal f0 value is set to 0. (instead of 1.e-2 in Earth version)
    157          f0(ig) = MAX(f0(ig), 0.)
    158       ENDDO
     153      fm_tot(:,:) = 0.
     154      entr_tot(:,:) = 0.
     155      detr_tot(:,:) = 0.
     156      zw2_tot(:,:) = 0.
    159157     
    160158      pduadj(:,:) = 0.0
     
    164162     
    165163      zdthladj(:,:) = 0.0
     164     
     165!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     166      re_tpm = .true.
     167      lbot(:) = linf
     168      while_loop_counter = 0.
     169!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    166170     
    167171!===============================================================================
     
    243247!     ---------------------------         |
    244248!                                         |
    245 !     --------------------------- rhobarz, f_star, fm, fm0, zw2, fraca
     249!     --------------------------- rhobarz, f_star, fm, zw2, fraca
    246250!         zt, zu, zv, zo, rho             |
    247251!     ---------------------------         |
     
    287291!===============================================================================
    288292     
    289 !-------------------------------------------------------------------------------
    290 ! Thermal plumes speeds, fluxes, tracers and temperatures
    291 !-------------------------------------------------------------------------------
    292      
    293       CALL thermcell_plume(ngrid,nlay,nq,ptimestep,                           &
    294       &                    ztv,zhl,zqt,zql,zlev,pplev,zpopsk,                 &
    295       &                    detr_star,entr_star,f_star,                        &
    296       &                    ztva,zhla,zqta,zqla,zqsa,                          &
    297       &                    zw2,lmin)
    298      
     293      DO WHILE (re_tpm.and.(while_loop_counter<nlay))
     294         while_loop_counter = while_loop_counter + 1
     295         
     296!-------------------------------------------------------------------------------
     297! Thermal plumes speeds, normalized fluxes, tracers and temperatures
     298!-------------------------------------------------------------------------------
     299         
     300         CALL thermcell_plume(ngrid,nlay,nq,ptimestep,                        &
     301         &                    ztv,zhl,zqt,zql,zlev,pplev,zpopsk,              &
     302         &                    detr_star,entr_star,f_star,                     &
     303         &                    ztva,zhla,zqta,zqla,zqsa,                       &
     304         &                    zw2,lbot,lmin)
     305         
    299306!-------------------------------------------------------------------------------
    300307! Thermal plumes characteristics: zmax, zmix, wmax
    301308!-------------------------------------------------------------------------------
    302      
     309         
    303310! AB: Careful, zw2 became its square root in thermcell_height!
    304       CALL thermcell_height(ngrid,nlay,lmin,lmix,lmax,zlev,                   &
    305       &                     zmin,zmix,zmax,zw2,wmax,f_star)
    306      
    307 !===============================================================================
    308 ! Closure and mass fluxes computation
    309 !===============================================================================
    310      
     311         CALL thermcell_height(ngrid,nlay,lmin,lmix,lmax,                     &
     312         &                     zlev,zmin,zmix,zmax,zw2,wmax,f_star)
     313         
    311314!-------------------------------------------------------------------------------
    312315! Closure
    313316!-------------------------------------------------------------------------------
    314      
    315       CALL thermcell_closure(ngrid,nlay,ptimestep,rho,zlev,                   &
    316       &                      lmax,entr_star,zmin,zmax,wmax,f)
    317      
    318       IF (tau_thermals>1.) THEN
    319          lambda = exp(-ptimestep/tau_thermals)
    320          f0(:) = (1.-lambda) * f(:) + lambda * f0(:)
    321       ELSE
    322          f0(:) = f(:)
    323       ENDIF
    324      
     317         
     318         CALL thermcell_closure(ngrid,nlay,ptimestep,rho,zlev,                &
     319         &                      lmax,entr_star,zmin,zmax,wmax,f)
     320         
    325321! FH: Test valable seulement en 1D mais pas genant
    326       IF (.not. (f0(1).ge.0.) ) THEN
    327          print *, 'ERROR: mass flux norm is not positive!'
    328          print *, 'f0 =', f0(1)
    329          CALL abort
    330       ENDIF
    331      
     322         IF (.not. (f(1).ge.0.) ) THEN
     323            print *, 'ERROR: mass flux norm is not positive!'
     324            print *, 'f =', f(1)
     325            CALL abort
     326         ENDIF
     327         
    332328!-------------------------------------------------------------------------------
    333329! Mass fluxes
    334330!-------------------------------------------------------------------------------
    335      
    336       CALL thermcell_flux(ngrid,nlay,ptimestep,masse,                         &
    337       &                   lmin,lmax,entr_star,detr_star,                      &
    338       &                   f,rhobarz,zlev,zw2,fm,entr,detr,zqla)
    339      
    340 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    341 ! On ne prend pas directement les profils issus des calculs precedents mais on
    342 ! s'autorise genereusement une relaxation vers ceci avec une constante de temps
    343 ! tau_thermals (typiquement 1800s sur Terre).
    344 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    345      
    346       IF (tau_thermals>1.) THEN
    347          lambda = exp(-ptimestep/tau_thermals)
    348          fm0   = (1.-lambda) * fm   + lambda * fm0
    349          entr0 = (1.-lambda) * entr + lambda * entr0
    350          detr0 = (1.-lambda) * detr + lambda * detr0
    351       ELSE
    352          fm0(:,:)   = fm(:,:)
    353          entr0(:,:) = entr(:,:)
    354          detr0(:,:) = detr(:,:)
    355       ENDIF
    356      
    357 !-------------------------------------------------------------------------------
     331         
     332         CALL thermcell_flux(ngrid,nlay,ptimestep,masse,                      &
     333         &                   lmin,lmax,entr_star,detr_star,                   &
     334         &                   f,rhobarz,zlev,zw2,fm,entr,detr)
     335         
     336!-------------------------------------------------------------------------------
     337!
     338!-------------------------------------------------------------------------------
     339         
     340         re_tpm = .false.
     341         DO ig=1,ngrid
     342            IF(lmax(ig) > lmin(ig)) THEN
     343               lbot(ig) = lmax(ig)
     344               re_tpm = .true.
     345            ELSE
     346               lbot(ig) = nlay
     347            ENDIF
     348         ENDDO
     349         
     350!-------------------------------------------------------------------------------
     351! Thermal plumes stacking
     352!-------------------------------------------------------------------------------
     353         
     354         zw2_tot(:,:)  = zw2_tot(:,:)  + zw2(:,:)
     355         entr_tot(:,:) = entr_tot(:,:) + entr(:,:)
     356         detr_tot(:,:) = detr_tot(:,:) + detr(:,:)
     357         fm_tot(:,:)   = fm_tot(:,:)   + fm(:,:)
     358         
     359      ENDDO
     360     
     361!===============================================================================
    358362! Updraft fraction
    359 !-------------------------------------------------------------------------------
     363!===============================================================================
    360364     
    361365      DO ig=1,ngrid
     
    366370      DO l=2,nlay
    367371         DO ig=1,ngrid
    368             IF (zw2(ig,l) > 0.) THEN
    369                fraca(ig,l) = fm(ig,l) / (rhobarz(ig,l) * zw2(ig,l))
     372            IF (zw2_tot(ig,l) > 0.) THEN
     373               fraca(ig,l) = fm_tot(ig,l) / (rhobarz(ig,l) * zw2_tot(ig,l))
    370374            ELSE
    371375               fraca(ig,l) = 0.
     
    375379     
    376380!===============================================================================
    377 ! Transport vertical
     381! Vertical transport
    378382!===============================================================================
    379383     
     
    382386!-------------------------------------------------------------------------------
    383387     
    384       CALL thermcell_dq(ngrid,nlay,ptimestep,fm0,entr0,detr0,masse,           &
    385       &                 zhl,zdthladj,dummy)
     388      CALL thermcell_dq(ngrid,nlay,ptimestep,fm_tot,entr_tot,detr_tot,        &
     389      &                 masse,zhl,zdthladj,dummy)
    386390     
    387391      DO l=1,nlay
     
    396400     
    397401      DO iq=1,nq
    398          CALL thermcell_dq(ngrid,nlay,ptimestep,fm0,entr0,detr0,masse,        &
    399          &                 pq(:,:,iq),pdqadj(:,:,iq),zqa(:,:,iq))
     402         CALL thermcell_dq(ngrid,nlay,ptimestep,fm_tot,entr_tot,detr_tot,     &
     403         &                 masse,pq(:,:,iq),pdqadj(:,:,iq),zqa(:,:,iq))
    400404      ENDDO
    401405     
     
    404408!-------------------------------------------------------------------------------
    405409     
     410! AB: Careful, thermcell_dv2 wasn't checked! It is not sure that it works
     411!     correctly with the plumes stacking (zmin, wmax doesn't make sense).
    406412      IF (dvimpl) THEN
    407          CALL thermcell_dv2(ngrid,nlay,ptimestep,fm0,entr0,detr0,masse,fraca,    &
    408          &                  zmax,zmin,pu,pv,pduadj,pdvadj,zua,zva)
     413         CALL thermcell_dv2(ngrid,nlay,ptimestep,fm_tot,entr_tot,detr_tot,    &
     414         &                  masse,fraca,zmax,zmin,pu,pv,pduadj,pdvadj,zua,zva)
    409415      ELSE
    410          CALL thermcell_dq(ngrid,nlay,ptimestep,fm0,entr0,detr0,masse,           &
    411          &                 zu,pduadj,zua)
    412          CALL thermcell_dq(ngrid,nlay,ptimestep,fm0,entr0,detr0,masse,           &
    413          &                 zv,pdvadj,zva)
     416         CALL thermcell_dq(ngrid,nlay,ptimestep,fm_tot,entr_tot,detr_tot,     &
     417         &                 masse,zu,pduadj,zua)
     418         CALL thermcell_dq(ngrid,nlay,ptimestep,fm_tot,entr_tot,detr_tot,     &
     419         &                 masse,zv,pdvadj,zva)
    414420      ENDIF
    415421     
  • trunk/LMDZ.GENERIC/libf/phystd/thermcell_plume.F90

    r2178 r2232  
    66                           detr_star,entr_star,f_star,                        &
    77                           ztva,zhla,zqta,zqla,zqsa,                          &
    8                            zw2,lmin)
     8                           zw2,lbot,lmin)
    99     
    1010     
     
    4141      INTEGER, INTENT(in) :: nq
    4242     
     43      INTEGER, INTENT(in) :: lbot(ngrid)              ! First considered layer
     44     
    4345      REAL, INTENT(in) :: ptimestep
    4446      REAL, INTENT(in) :: zlev(ngrid,nlay+1)          ! Levels altitude
     
    6567      REAL, INTENT(out) :: zqta(ngrid,nlay)           ! qt   plume (after mixing)
    6668      REAL, INTENT(out) :: zqsa(ngrid,nlay)           ! qsat plume (after mixing)
    67       REAL, INTENT(out) :: zw2(ngrid,nlay+1)          ! w    plumr (after mixing)
     69      REAL, INTENT(out) :: zw2(ngrid,nlay+1)          ! w    plume (after mixing)
    6870     
    6971!     Local:
     
    7173     
    7274      INTEGER ig, l, k
     75      INTEGER l_start
    7376     
    7477      REAL ztva_est(ngrid,nlay)                       ! TRPV plume (before mixing)
     
    8184     
    8285      REAL zbuoy(ngrid,nlay)                          ! Plume buoyancy
    83       REAL ztemp(ngrid)                               ! Temperature for saturation vapor pressure computation in plume
     86      REAL ztemp(ngrid)                               ! Temperature to compute saturation vapor pressure
    8487      REAL zdz                                        ! Layers heights
    8588      REAL ztv2(ngrid,nlay)                           ! ztv + d_temp * Dirac(l=linf)
     
    9396      REAL psat                                       ! Dummy argument for Psat_water()
    9497     
    95 !      REAL alpha
    96      
    97       LOGICAL active(ngrid)                           ! If the plume is active at ig (speed and incoming mass flux > 0)
    98       LOGICAL activetmp(ngrid)                        ! If the plume is active at ig (active=true and outgoing mass flux > 0)
     98      LOGICAL active(ngrid)                           ! If the plume is active (speed and incoming mass flux > 0)
     99      LOGICAL activetmp(ngrid)                        ! If the plume is active (active=true and outgoing mass flux > 0)
    99100     
    100101!===============================================================================
     
    102103!===============================================================================
    103104     
    104       ztva(:,:) = ztv(:,:)                                                ! ztva     is set to TPV environment
    105       zhla(:,:) = zhl(:,:)                                                ! zhla     is set to TP  environment
    106       zqta(:,:) = zqt(:,:)                                                ! zqta     is set to qt  environment
    107       zqla(:,:) = zql(:,:)                                                ! zqla     is set to ql  environment
    108      
    109       zqsa_est(:) = 0.
    110       zqsa(:,:)   = 0.
    111      
    112       zw2_est(:,:) = 0.
    113       zw2(:,:)     = 0.
     105      ztva(:,:) = ztv(:,:)                                                       ! ztva is set to TPV environment
     106      zhla(:,:) = zhl(:,:)                                                       ! zhla is set to TP  environment
     107      zqta(:,:) = zqt(:,:)                                                       ! zqta is set to qt  environment
     108      zqla(:,:) = zql(:,:)                                                       ! zqla is set to ql  environment
     109      zqsa(:,:) = 0.
     110      zw2(:,:)  = 0.
     111     
     112      ztva_est(:,:) = ztv(:,:)                                                   ! ztva_est is set to TPV environment
     113      zqla_est(:,:) = zql(:,:)                                                   ! zqla_est is set to ql  environment
     114      zqsa_est(:)   = 0.
     115      zw2_est(:,:)  = 0.
    114116     
    115117      zbuoy(:,:) = 0.
     
    119121      entr_star(:,:) = 0.
    120122     
    121       lmin(:) = 1
     123      lmin(:) = lbot(:)
    122124     
    123125      ztv2(:,:)    = ztv(:,:)
     
    126128      active(:) = .false.
    127129     
     130      l_start = nlay
     131     
    128132!===============================================================================
    129133! First layer computation
     
    131135     
    132136      DO ig=1,ngrid
    133          l = linf
     137         l = lbot(ig)
     138         l_start = MIN(l_start, lbot(ig)+1)
    134139         DO WHILE (.not.active(ig).and.(pplev(ig,l+1) > pres_limit).and.(l < nlay))
    135140            zbuoy(ig,l) = RG * (ztv2(ig,l) - ztv2(ig,l+1)) / ztv2(ig,l+1)
     
    157162!===============================================================================
    158163     
    159       DO l=linf+1,nlay-1
     164      DO l=l_start,nlay-1
    160165         
    161166!-------------------------------------------------------------------------------
     
    164169         
    165170         DO ig=1,ngrid
    166             active(ig) = (zw2(ig,l) > 1.e-10).and.(f_star(ig,l) > 1.e-10)
     171            active(ig) = (zw2(ig,l) > 1.e-9).and.(f_star(ig,l) > 1.e-9)
    167172         ENDDO
    168173         
     
    185190         DO ig=1,ngrid
    186191            IF (active(ig)) THEN
    187                zqla_est(ig,l) = MAX(0.,zqta(ig,l-1) - zqsa_est(ig))              ! zqla_est set to ql   plume
    188                zta_est(ig,l)  = zhla(ig,l-1) * zpopsk(ig,l)                   &  ! zta_est  set to TR   plume
     192               zqla_est(ig,l) = MAX(0.,zqta(ig,l-1) - zqsa_est(ig))              ! zqla_est is set to ql   plume
     193               zta_est(ig,l)  = zhla(ig,l-1) * zpopsk(ig,l)                   &  ! zta_est  is set to TR   plume
    189194               &              + RLvCp * zqla_est(ig,l)
    190                ztva_est(ig,l) = zta_est(ig,l) / zpopsk(ig,l)                  &  ! ztva_est set to TRPV plume
     195               ztva_est(ig,l) = zta_est(ig,l) / zpopsk(ig,l)                  &  ! ztva_est is set to TRPV plume
    191196               &              * (1. + RETV * (zqta(ig,l-1)-zqla_est(ig,l)) - zqla_est(ig,l))
    192197               
     
    196201               zw2fact = 2. * fact_epsilon * zdz / (1. + betalpha)
    197202               zdw2 = afact * zbuoy(ig,l) / fact_epsilon
    198                zw2_est(ig,l+1) = Max(0., exp(-zw2fact) * (zw2_est(ig,l) - zdw2) + zdw2)
     203               zw2_est(ig,l+1) = MAX(0., exp(-zw2fact) * (zw2_est(ig,l) - zdw2) + zdw2)
    199204            ENDIF
    200205         ENDDO
     
    208213               
    209214               zdz = zlev(ig,l+1) - zlev(ig,l)
    210                zw2m = (zw2_est(ig,l+1) + zw2_est(ig,l)) / 2.
     215               zw2m = (zw2_est(ig,l+1) + zw2(ig,l)) / 2.
    211216               gamma = afact * zbuoy(ig,l) - fact_epsilon * zw2m
    212217               
    213                IF (zw2_est(ig,l) > 0.) THEN
     218               IF (zw2m > 0.) THEN
    214219                  test = gamma / zw2m - nu
    215220               ELSE
    216                   print *, 'ERROR: zw2_est is negative while plume is active!'
     221                  test = 0.
     222                  print *, 'WARNING: vertical speed is negative while plume is active!'
    217223                  print *, 'ig,l', ig, l
    218                   print *, 'zw2_est', zw2_est(ig,l)
    219                   call abort
     224                  print *, 'zw2m', zw2m
    220225               ENDIF
    221226               
     
    237242!-------------------------------------------------------------------------------
    238243         
    239          activetmp(:) = active(:).and.(f_star(:,l+1) > 1.e-10)
     244         activetmp(:) = active(:).and.(f_star(:,l+1) > 1.e-9)
    240245         
    241246         DO ig=1,ngrid
     
    271276               zta(ig,l)  = zhla(ig,l) * zpopsk(ig,l)                         &  ! ztva is set to TR   plume (mixed)
    272277               &          + RLvCp * zqla(ig,l)
    273                ztva(ig,l) = zta(ig,l) / zpopsk(ig,l)                          &  ! ztva is set to TRPV plume (mixed)           
     278               ztva(ig,l) = zta(ig,l) / zpopsk(ig,l)                          &  ! ztva is set to TRPV plume (mixed)
    274279               &          * (1. + RETV*(zqta(ig,l)-zqla(ig,l)) - zqla(ig,l))
    275280               
     
    279284               zw2fact = 2. * fact_epsilon * zdz / (1. + betalpha)
    280285               zdw2 = afact * zbuoy(ig,l) / fact_epsilon
    281                zw2(ig,l+1) = Max(0., exp(-zw2fact) * (zw2(ig,l) - zdw2) + zdw2)
     286               zw2(ig,l+1) = MAX(0., exp(-zw2fact) * (zw2(ig,l) - zdw2) + zdw2)
    282287            ENDIF
    283288         ENDDO
Note: See TracChangeset for help on using the changeset viewer.