Ignore:
Timestamp:
Apr 29, 2019, 10:07:47 AM (6 years ago)
Author:
aboissinot
Message:

Fix in convadj.F
New version of the thermal plume model (new entrainment and detrainment formulae, alimentation is removed)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/LMDZ.GENERIC/libf/phystd/thermcell_main.F90

    r2104 r2127  
    22!
    33!
    4 SUBROUTINE thermcell_main(itap,ngrid,nlay,ptimestep,                          &
    5                           pplay,pplev,pphi,firstcall,                         &
    6                           pu,pv,pt,po,                                        &
    7                           pduadj,pdvadj,pdtadj,pdoadj,                        &
    8                           f0,fm0,entr0,detr0,                                 &
    9                           zqta,zqla,ztv,ztva,ztla,zthl,zqsatth,               &
    10                           zw2,fraca,                                          &
    11                           lmin,lmix,lalim,lmax,                               &
    12                           zpspsk,ratqscth,ratqsdiff,                          &
    13                           Ale_bl,Alp_bl,lalim_conv,wght_th,                   &
    14 !!! nrlmd le 10/04/2012
    15                           pbl_tke,pctsrf,omega,airephy,                       &
    16                           zlcl,fraca0,w0,w_conv,therm_tke_max0,env_tke_max0,  &
    17                           n2,s2,ale_bl_stat,                                  &
    18                           therm_tke_max,env_tke_max,                          &
    19                           alp_bl_det,alp_bl_fluct_m,alp_bl_fluct_tke,         &
    20                           alp_bl_conv,alp_bl_stat)
    21 !!! fin nrlmd le 10/04/2012
    22      
    23      
    24 !==============================================================================
     4SUBROUTINE thermcell_main(ngrid,nlay,nq,ptimestep,firstcall,                  &
     5                          pplay,pplev,pphi,zpopsk,                            &
     6                          pu,pv,pt,pq,                                        &
     7                          pduadj,pdvadj,pdtadj,pdqadj,                        &
     8                          f0,fm0,entr0,detr0,zw2,fraca,                       &
     9                          zqta,zqla,ztv,ztva,zhla,zhl,zqsa,                   &
     10                          lmin,lmix,lalim,lmax)
     11     
     12     
     13!===============================================================================
    2514!   Auteurs: Frederic Hourdin, Catherine Rio, Anne Mathieu
    2615!   Version du 09.02.07
     
    4433!    Introduction of an implicit computation of vertical advection in
    4534!    the environment of thermal plumes in thermcell_dq
    46 !    impl =     0 : explicit, 1 : implicit, -1 : old version
     35!    impl = 0 : explicit ; impl = 1 : implicit ; impl =-1 : old version
    4736!    controled by iflag_thermals =
    4837!       15, 16 run with impl=-1 : numerical convergence with NPv3
    4938!       17, 18 run with impl=1  : more stable
    5039!    15 and 17 correspond to the activation of the stratocumulus "bidouille"
    51 !
    52 !==============================================================================
     40!
     41! Major changes 2018-19 (AB alexandre.boissinot@lmd.jussieu.fr)
     42!    New detr and entre formulae (no longer alimentation)
     43!    lmin can be greater than 1
     44!    Mix every tracer (EN COURS)
     45!    Old version of thermcell_dq is removed
     46!    Alternative version thermcell_dv2 is removed
     47!
     48!===============================================================================
    5349     
    5450      USE thermcell_mod
     51      USE tracer_h, ONLY: igcm_h2o_vap
    5552      USE print_control_mod, ONLY: lunout, prt_level
    5653     
     
    5855     
    5956     
    60 !==============================================================================
     57!===============================================================================
    6158! Declaration
    62 !==============================================================================
    63      
    64 !   inputs:
    65 !   -------
    66      
    67       INTEGER itap
    68       INTEGER ngrid
    69       INTEGER nlay
     59!===============================================================================
     60     
     61!     Inputs:
     62!     -------
     63     
     64      INTEGER ngrid, nlay, nq
    7065     
    7166      REAL ptimestep
    72       REAL pplay(ngrid,nlay)
    73       REAL pplev(ngrid,nlay+1)
    74       REAL pphi(ngrid,nlay)
    75      
    76       REAL pt(ngrid,nlay)                       !
    77       REAL pu(ngrid,nlay)                       !
    78       REAL pv(ngrid,nlay)                       !
    79       REAL po(ngrid,nlay)                       !
     67      REAL pplay(ngrid,nlay)                    ! Layer pressure
     68      REAL pplev(ngrid,nlay+1)                  ! Level pressure
     69      REAL pphi(ngrid,nlay)                     ! Geopotential
     70     
     71      REAL pu(ngrid,nlay)                       ! Zonal wind
     72      REAL pv(ngrid,nlay)                       ! Meridional wind
     73      REAL pt(ngrid,nlay)                       ! Temperature
     74      REAL pq(ngrid,nlay,nq)                    ! Tracers mass mixing ratio
    8075     
    8176      LOGICAL firstcall
    8277     
    83 !   outputs:
    84 !   --------
    85      
    86       REAL pdtadj(ngrid,nlay)                   ! t convective variations
     78!     Outputs:
     79!     --------
     80     
    8781      REAL pduadj(ngrid,nlay)                   ! u convective variations
    8882      REAL pdvadj(ngrid,nlay)                   ! v convective variations
    89       REAL pdoadj(ngrid,nlay)                   ! water convective variations
    90      
     83      REAL pdtadj(ngrid,nlay)                   ! t convective variations
     84      REAL pdqadj(ngrid,nlay,nq)                ! q convective variations
     85     
     86      REAL f0(ngrid)                            ! mass flux norm (after possible time relaxation)
    9187      REAL fm0(ngrid,nlay+1)                    ! mass flux      (after possible time relaxation)
    9288      REAL entr0(ngrid,nlay)                    ! entrainment    (after possible time relaxation)
    9389      REAL detr0(ngrid,nlay)                    ! detrainment    (after possible time relaxation)
    94       REAL f0(ngrid)                            ! mass flux norm (after possible time relaxation)
    95      
    96 !   local:
    97 !   ------
    98      
    99       INTEGER, save :: dvimpl=1
    100 !$OMP THREADPRIVATE(dvimpl)
    101      
    102       INTEGER, save :: dqimpl=-1
    103 !$OMP THREADPRIVATE(dqimpl)
    104      
    105       INTEGER, SAVE :: igout=1
    106 !$OMP THREADPRIVATE(igout)
    107      
    108       INTEGER, SAVE :: lunout1=6
    109 !$OMP THREADPRIVATE(lunout1)
    110      
    111       INTEGER, SAVE :: lev_out=10
    112 !$OMP THREADPRIVATE(lev_out)
    113      
    114       INTEGER ig,k,l,ll,ierr
    115       INTEGER lmix_bis(ngrid)
    116       INTEGER lmax(ngrid)                       !
    117       INTEGER lmin(ngrid)                       !
    118       INTEGER lalim(ngrid)                      !
    119       INTEGER lmix(ngrid)                       !
    120      
    121       REAL linter(ngrid)
    122       REAL zmix(ngrid)
    123       REAL zmax(ngrid)
    124       REAL zw2(ngrid,nlay+1)
    125       REAL zw_est(ngrid,nlay+1)
    126       REAL zmax_sec(ngrid)
    127      
    128       REAL zlay(ngrid,nlay)                     ! layers altitude
    129       REAL zlev(ngrid,nlay+1)                   ! levels altitude
    130       REAL rho(ngrid,nlay)                      ! layers density
    131       REAL rhobarz(ngrid,nlay)                  ! levels density
    132       REAL deltaz(ngrid,nlay)                   ! layers heigth
    133       REAL masse(ngrid,nlay)                    ! layers mass
    134       REAL zpspsk(ngrid,nlay)                   ! Exner function
    135      
    136       REAL zu(ngrid,nlay)                       ! environment zonal wind
    137       REAL zv(ngrid,nlay)                       ! environment meridional wind
    138       REAL zo(ngrid,nlay)                       ! environment water tracer
    139       REAL zva(ngrid,nlay)                      ! plume zonal wind
    140       REAL zua(ngrid,nlay)                      ! plume meridional wind
    141       REAL zoa(ngrid,nlay)                      ! plume water tracer
    142      
    143       REAL zt(ngrid,nlay)                       ! T    environment
    144       REAL zh(ngrid,nlay)                       ! T,TP environment
    145       REAL zthl(ngrid,nlay)                     ! TP   environment
    146       REAL ztv(ngrid,nlay)                      ! TPV  environment ?
    147       REAL zl(ngrid,nlay)                       ! ql   environment
    148      
    149       REAL zta(ngrid,nlay)                      !
    150       REAL zha(ngrid,nlay)                      ! TRPV plume
    151       REAL ztla(ngrid,nlay)                     ! TP   plume
    152       REAL ztva(ngrid,nlay)                     ! TRPV plume
    153       REAL ztva_est(ngrid,nlay)                 ! TRPV plume (temporary)
     90     
     91!     Local:
     92!     ------
     93     
     94      INTEGER ig, k, l, iq
     95      INTEGER lmax(ngrid)                       ! Highest layer reached by the plume
     96      INTEGER lmix(ngrid)                       ! Layer in which plume vertical speed is maximal
     97      INTEGER lmin(ngrid)                       ! First unstable layer
     98     
     99      REAL zlay(ngrid,nlay)                     ! Layers altitudes
     100      REAL zlev(ngrid,nlay+1)                   ! Levels altitudes
     101      REAL rho(ngrid,nlay)                      ! Layers densities
     102      REAL rhobarz(ngrid,nlay)                  ! Levels densities
     103      REAL masse(ngrid,nlay)                    ! Layers masses
     104      REAL zpopsk(ngrid,nlay)                   ! Exner function
     105     
     106      REAL zu(ngrid,nlay)                       ! u    environment
     107      REAL zv(ngrid,nlay)                       ! v    environment
     108      REAL zt(ngrid,nlay)                       ! TR   environment
     109      REAL zqt(ngrid,nlay)                      ! qt   environment
     110      REAL zql(ngrid,nlay)                      ! ql   environment
     111      REAL zhl(ngrid,nlay)                      ! TP   environment
     112      REAL ztv(ngrid,nlay)                      ! TRPV environment
     113      REAL zqs(ngrid,nlay)                      ! qsat environment
     114     
     115      REAL zua(ngrid,nlay)                      ! u    plume
     116      REAL zva(ngrid,nlay)                      ! v    plume
     117      REAL zta(ngrid,nlay)                      ! TR   plume
    154118      REAL zqla(ngrid,nlay)                     ! qv   plume
    155119      REAL zqta(ngrid,nlay)                     ! qt   plume
    156      
    157       REAL wmax(ngrid)                          ! maximal vertical speed
    158       REAL wmax_tmp(ngrid)                      ! temporary maximal vertical speed
    159       REAL wmax_sec(ngrid)                      ! maximal vertical speed if dry case
    160      
    161       REAL fraca(ngrid,nlay+1)                  ! updraft fraction
    162       REAL f_star(ngrid,nlay+1)                 ! normalized mass flux
    163       REAL entr_star(ngrid,nlay)                ! normalized entrainment
    164       REAL detr_star(ngrid,nlay)                ! normalized detrainment
    165       REAL alim_star_tot(ngrid)                 ! integrated alimentation
    166       REAL alim_star(ngrid,nlay)                ! normalized alimentation
    167       REAL alim_star_clos(ngrid,nlay)           ! closure alimentation
    168      
    169       REAL fm(ngrid,nlay+1)                     ! mass flux
    170       REAL entr(ngrid,nlay)                     ! entrainment
    171       REAL detr(ngrid,nlay)                     ! detrainment
    172       REAL f(ngrid)                             ! mass flux norm
    173      
    174       REAL zdthladj(ngrid,nlay)                 !
    175       REAL lambda                               ! time relaxation coefficent
    176      
    177       REAL zsortie(ngrid,nlay)
    178       REAL zsortie1d(ngrid)
    179       REAL susqr2pi, Reuler
    180       REAL zf
    181       REAL zf2
    182       REAL thetath2(ngrid,nlay)
    183       REAL wth2(ngrid,nlay)
    184       REAL wth3(ngrid,nlay)
    185       REAL q2(ngrid,nlay)
    186 ! FH : probleme de dimensionnement avec l'allocation dynamique
    187 !     common/comtherm/thetath2,wth2
    188       real wq(ngrid,nlay)
    189       real wthl(ngrid,nlay)
    190       real wthv(ngrid,nlay)
    191       real ratqscth(ngrid,nlay)
    192       real var
    193       real vardiff
    194       real ratqsdiff(ngrid,nlay)
    195 ! niveau de condensation
    196       integer nivcon(ngrid)
    197       real zcon(ngrid)
    198       real CHI
    199       real zcon2(ngrid)
    200       real pcon(ngrid)
    201       real zqsat(ngrid,nlay)
    202       real zqsatth(ngrid,nlay)
    203       real zlevinter(ngrid)
    204       real seuil
    205      
    206 !!! nrlmd le 10/04/2012
    207      
    208 !------Entrees
    209       real pbl_tke(ngrid,nlay+1,nbsrf)
    210       real pctsrf(ngrid,nbsrf)
    211       real omega(ngrid,nlay)
    212       real airephy(ngrid)
    213 !------Sorties
    214       real zlcl(ngrid),fraca0(ngrid),w0(ngrid),w_conv(ngrid)
    215       real therm_tke_max0(ngrid)
    216       real env_tke_max0(ngrid)
    217       real n2(ngrid),s2(ngrid)
    218       real ale_bl_stat(ngrid)
    219       real therm_tke_max(ngrid,nlay)
    220       real env_tke_max(ngrid,nlay)
    221       real alp_bl_det(ngrid)
    222       real alp_bl_fluct_m(ngrid)
    223       real alp_bl_fluct_tke(ngrid)
    224       real alp_bl_conv(ngrid)
    225       real alp_bl_stat(ngrid)
    226 !------Local
    227       integer nsrf
    228       real rhobarz0(ngrid)                      ! Densite au LCL
    229       logical ok_lcl(ngrid)                     ! Existence du LCL des thermiques
    230       integer klcl(ngrid)                       ! Niveau du LCL
    231       real interp(ngrid)                        ! Coef d'interpolation pour le LCL
    232 !------Triggering
    233       real,parameter :: Su=4e4                  ! Surface unite: celle d'un updraft elementaire
    234       real,parameter :: hcoef=1.                ! Coefficient directeur pour le calcul de s2
    235       real,parameter :: hmincoef=0.3            ! Coefficient directeur pour l'ordonnee a l'origine pour le calcul de s2 (hmincoef=0.3)
    236       real,parameter :: eps1=0.3                ! Fraction de surface occupee par la population 1 : eps1=n1*s1/(fraca0*Sd)
    237       real hmin(ngrid)                          ! Ordonnee a l'origine pour le calcul de s2
    238       real zmax_moy(ngrid)                      ! Hauteur moyenne des thermiques : zmax_moy = zlcl + 0.33 (zmax-zlcl)
    239       real,parameter :: zmax_moy_coef=0.33
    240       real depth(ngrid)                         ! Epaisseur moyenne du cumulus
    241       real w_max(ngrid)                         ! Vitesse max statistique
    242       real s_max(ngrid)
    243 !------Closure
    244       real pbl_tke_max(ngrid,nlay)              ! Profil de TKE moyenne
    245       real pbl_tke_max0(ngrid)                  ! TKE moyenne au LCL
    246       real w_ls(ngrid,nlay)                     ! Vitesse verticale grande echelle (m/s)
    247       real,parameter :: coef_m=1.               ! On considere un rendement pour alp_bl_fluct_m
    248       real,parameter :: coef_tke=1.             ! On considere un rendement pour alp_bl_fluct_tke
    249      
    250 !!! fin nrlmd le 10/04/2012
    251      
    252 ! Nouvelles variables pour la convection
    253       integer lalim_conv(ngrid)
    254       integer n_int(ngrid)
    255       real Ale_bl(ngrid)
    256       real Alp_bl(ngrid)
    257       real alp_int(ngrid)
    258       real dp_int(ngrid),zdp
    259       real ale_int(ngrid)
    260       real fm_tot(ngrid)
    261       real wght_th(ngrid,nlay)
    262      
    263       CHARACTER*2 str2
    264       CHARACTER*10 str10
     120      REAL zhla(ngrid,nlay)                     ! TP   plume
     121      REAL ztva(ngrid,nlay)                     ! TRPV plume
     122      REAL zqsa(ngrid,nlay)                     ! qsat plume
     123     
     124      REAL zqa(ngrid,nlay,nq)                   ! q    plume (ql=0, qv=qt)
     125     
     126      REAL linter(ngrid)                        ! Level (continuous) of maximal vertical speed
     127      REAL zmix(ngrid)                          ! Altitude of maximal vertical speed
     128      REAL zmax(ngrid)                          ! Maximal altitude reached by the plume
     129      REAL wmax(ngrid)                          ! Maximal vertical speed
     130      REAL zw2(ngrid,nlay+1)                    ! Plume vertical speed
     131     
     132      REAL fraca(ngrid,nlay+1)                  ! Updraft fraction
     133     
     134      REAL f_star(ngrid,nlay+1)                 ! Normalized mass flux
     135      REAL entr_star(ngrid,nlay)                ! Normalized entrainment
     136      REAL detr_star(ngrid,nlay)                ! Normalized detrainment
     137     
     138      REAL f(ngrid)                             ! Mass flux norm
     139      REAL fm(ngrid,nlay+1)                     ! Mass flux
     140      REAL entr(ngrid,nlay)                     ! Entrainment
     141      REAL detr(ngrid,nlay)                     ! Detrainment
     142     
     143      REAL lambda                               ! Time relaxation coefficent
     144     
     145      REAL zdthladj(ngrid,nlay)                 ! Potential temperature variations
     146      REAL dummy(ngrid,nlay)                    ! Dummy argument for thermcell_dq()
    265147     
    266148      CHARACTER (len=20) :: modname='thermcell_main'
    267149      CHARACTER (len=80) :: abort_message
    268150     
    269       EXTERNAL SCOPY
    270      
    271 !==============================================================================
     151! AB: I remove alimentation, which is in fact included in entr_star. EN COURS
     152      INTEGER lalim(ngrid)                      ! Highest alimentation level
     153      REAL alim_star(ngrid,nlay)                ! Normalized alimentation
     154      REAL alim_star_tot(ngrid)                 ! Integrated alimentation
     155      REAL alim_star_clos(ngrid,nlay)           ! Closure alimentation
     156     
     157!===============================================================================
    272158! Initialization
    273 !==============================================================================
    274      
    275       seuil = 0.25
     159!===============================================================================
    276160     
    277161      IF (firstcall) THEN
    278          IF (iflag_thermals==15.or.iflag_thermals==16) THEN
    279             dvimpl = 0
    280             dqimpl = -1
    281          ELSE
    282             dvimpl = 1
    283             dqimpl = 1
    284          ENDIF
    285          
    286162         fm0(:,:) = 0.
    287163         entr0(:,:) = 0.
     
    289165      ENDIF
    290166     
     167      f_star(:,:) = 0.
     168      entr_star(:,:) = 0.
     169      detr_star(:,:) = 0.
     170     
     171      f(:) = 0.
     172     
    291173      fm(:,:) = 0.
    292174      entr(:,:) = 0.
    293175      detr(:,:) = 0.
    294       f(:) = 0.
    295      
     176     
     177      lmax(:) = 1
     178      lmix(:) = 1
     179      lmin(:) = 1
     180     
     181      pduadj(:,:) = 0.0
     182      pdvadj(:,:) = 0.0
     183      pdtadj(:,:) = 0.0
     184      pdqadj(:,:,:) = 0.0
     185     
     186! AB: I remove alimentation, which is in fact included in entr_star. EN COURS
     187      alim_star(:,:) = 0.
     188      alim_star_tot(:) = 0.
     189      alim_star_clos(:,:) = 0.
     190      lalim(:) = 1
     191     
     192! AB: Careful, hard-coded value from Earth tuned version of the thermal plume model!
    296193      DO ig=1,ngrid
    297194         f0(ig) = max(f0(ig), 1.e-2)
     
    304201      ENDIF
    305202     
    306       wmax_tmp(:) = 0.
    307      
    308 !------------------------------------------------------------------------------
     203!===============================================================================
     204! Environment settings
     205!===============================================================================
     206     
     207!-------------------------------------------------------------------------------
    309208! Calcul de T,q,ql a partir de Tl et qt dans l environnement
    310 !------------------------------------------------------------------------------
    311      
    312       CALL thermcell_env(ngrid,nlay,po,pt,pu,pv,pplay,                        &
    313       &                  pplev,zo,zh,zl,ztv,zthl,zu,zv,zpspsk,zqsat,lev_out)
    314      
    315 !------------------------------------------------------------------------------
    316 !
    317 !                       --------------------
    318 !
    319 !
    320 !                       + + + + + + + + + + +
    321 !
    322 !
    323 !  wa, fraca, wd, fracd --------------------   zlev(2), rhobarz
    324 !  wh,wt,wo ...
    325 !
    326 !                       + + + + + + + + + + +  zh,zu,zv,zo,rho
    327 !
    328 !
    329 !                       --------------------   zlev(1)
    330 !                       \\\\\\\\\\\\\\\\\\\\
    331 !
    332 !------------------------------------------------------------------------------
    333 ! Calcul des altitudes des couches
    334 !------------------------------------------------------------------------------
     209!-------------------------------------------------------------------------------
     210     
     211      CALL thermcell_env(ngrid,nlay,nq,pq,pt,pu,pv,pplay,pplev,               &
     212      &                  zqt,zql,zt,ztv,zhl,zu,zv,zpopsk,zqs)
     213     
     214!-------------------------------------------------------------------------------
     215! Levels and layers altitudes
     216!-------------------------------------------------------------------------------
    335217     
    336218      DO l=2,nlay
     
    345227      ENDDO
    346228     
    347 !------------------------------------------------------------------------------
    348 ! Calcul de l'epaisseur des couches
    349 !------------------------------------------------------------------------------
    350      
    351       DO l=1,nlay
    352          deltaz(:,l) = zlev(:,l+1)-zlev(:,l)
    353       ENDDO
    354      
    355 !------------------------------------------------------------------------------
    356 ! Calcul des densites
    357 !------------------------------------------------------------------------------
    358      
    359       rho(:,:) = pplay(:,:) / (zpspsk(:,:) * RD * ztv(:,:))
     229!-------------------------------------------------------------------------------
     230! Levels and layers densities
     231!-------------------------------------------------------------------------------
     232     
     233      rho(:,:) = pplay(:,:) / (zpopsk(:,:) * RD * ztv(:,:))
    360234     
    361235      IF (prt_level.ge.10) THEN
     
    369243      ENDDO
    370244     
    371 !------------------------------------------------------------------------------
    372 ! Calcul de la masse
    373 !------------------------------------------------------------------------------
     245!-------------------------------------------------------------------------------
     246! Layers masses
     247!-------------------------------------------------------------------------------
    374248     
    375249      DO l=1,nlay
     
    377251      ENDDO
    378252     
    379       IF (prt_level.ge.1) print *, 'thermcell_main apres initialisation'
    380      
    381 !------------------------------------------------------------------------------
    382 !             
    383 !             /|\
    384 !    --------  |  F_k+1 -------   
    385 !                              ----> D_k
    386 !             /|\              <---- E_k , A_k
    387 !    --------  |  F_k ---------
    388 !                              ----> D_k-1
    389 !                              <---- E_k-1 , A_k-1
    390 !
    391 !
    392 !
    393 !
    394 !
    395 !    ---------------------------
    396 !
    397 !    ----- F_lmax+1=0 ----------         \
    398 !            lmax     (zmax)              |
    399 !    ---------------------------          |
    400 !                                         |
    401 !    ---------------------------          |
    402 !                                         |
    403 !    ---------------------------          |
    404 !                                         |
    405 !    ---------------------------          |
    406 !                                         |
    407 !    ---------------------------          |
    408 !                                         |  E
    409 !    ---------------------------          |  D
    410 !                                         |
    411 !    ---------------------------          |
    412 !                                         |
    413 !    ---------------------------  \       |
    414 !            lalim                 |      |
    415 !    ---------------------------   |      |
    416 !                                  |      |
    417 !    ---------------------------   |      |
    418 !                                  | A    |
    419 !    ---------------------------   |      |
    420 !                                  |      |
    421 !    ---------------------------   |      |
    422 !    lmin                          |      |
    423 !    ----- F_lmin=0 ------------  /      /
    424 !
    425 !    ---------------------------
    426 !   ////////////////////////////
    427 !
    428 !------------------------------------------------------------------------------
    429      
    430 !==============================================================================
    431 ! Calculs initiaux ne faisant pas intervenir les changements de phase
    432 !==============================================================================
    433      
    434 !------------------------------------------------------------------------------
    435 !  1. alim_star est le profil vertical de l'alimentation a la base du
    436 !     panache thermique, calcule a partir de la flotabilite de l'air sec
    437 !  2. lmin et lalim sont les indices inferieurs et superieurs de alim_star
    438 !  3. wmax_sec et zmax_sec sont les vitesses et altitudes maximum d'un
    439 !     panache sec conservatif (e=d=0) alimente selon alim_star
    440 !     Il s'agit d'un calcul de type CAPE
    441 !     zmax_sec est utilise pour determiner la geometrie du thermique.
    442 !------------------------------------------------------------------------------
    443      
    444       entr_star(:,:) = 0.
    445       detr_star(:,:) = 0.
    446       alim_star(:,:) = 0.
    447      
    448       alim_star_tot(:) = 0.
    449      
    450       lmin(:) = 1
    451      
    452 !==============================================================================
    453 ! Calcul du melange et des variables dans le thermique
    454 !==============================================================================
    455      
    456       CALL thermcell_plume(itap,ngrid,nlay,ptimestep,ztv,zthl,                &
    457       &    po,zl,rhobarz,zlev,pplev,pphi,zpspsk,alim_star,alim_star_tot,      &
    458       &    lalim,f0,detr_star,entr_star,f_star,ztva,                          &
    459       &    ztla,zqla,zqta,zha,zw2,zw_est,ztva_est,zqsatth,lmix,lmix_bis,      &
    460       &    lmin,lev_out,lunout1,igout)
    461      
    462 !      CALL test_ltherm(ngrid,nlay,pplev,pplay,lalim,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_plum lalim ')
    463 !      CALL test_ltherm(ngrid,nlay,pplev,pplay,lmix ,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_plum lmix  ')
    464      
    465 !==============================================================================
     253!===============================================================================
     254! Explicative schemes
     255!===============================================================================
     256
     257!-------------------------------------------------------------------------------
     258! Thermal plume variables
     259!-------------------------------------------------------------------------------
     260     
     261!           top of the model     
     262!     ===========================
     263!                               
     264!     ---------------------------
     265!                                        _
     266!     ----- F_lmax+1=0 ------zmax         \
     267!     lmax                                 |
     268!     ------F_lmax>0-------------          |
     269!                                          |
     270!     ---------------------------          |
     271!                                          |
     272!     ---------------------------          |
     273!                                          |
     274!     ------------------wmax,zmix          |
     275!     lmix                                 |
     276!     ---------------------------          |
     277!                                          |
     278!     ---------------------------          |
     279!                                          | E, D
     280!     ---------------------------          |
     281!                                          |
     282!     --------------------------- rhobarz, f_star, fm, fm0, zw2, fraca
     283!         zt, zu, zv, zo, rho              |
     284!     ---------------------------          |
     285!                                          |
     286!     ---------------------------          |
     287!                                          |
     288!     ---------------------------          |
     289!                                          |
     290!     ------F_lmin+1>0-----------          |
     291!     lmin                                 |
     292!     ----- F_lmin=0 ------------        _/
     293!                               
     294!     ---------------------------
     295!                               
     296!     ===========================
     297!         bottom of the model   
     298     
     299!-------------------------------------------------------------------------------
     300! Zoom on layers k and k-1
     301!-------------------------------------------------------------------------------
     302     
     303!     |     /|\                  |                          |
     304!     |----  |  F_k+1 -----------|--------------------------|   level k+1
     305!     |      |  w_k+1         |                             |
     306!     |                     --|--> D_k                      |
     307!     |                       |                             |   layer k
     308!     |                    <--|--  E_k                      |
     309!     |     /|\               |                             |
     310!     |----  |  F_k ----------|-----------------------------|   level k
     311!     |      |  w_k        |                                |
     312!     |                  --|--> D_k-1                       |
     313!     |                    |                                |   layer k-1
     314!     |                 <--|--  E_k-1                       |
     315!     |     /|\            |                                |
     316!     |----  |  F_k-1 -----|--------------------------------|   level k-1
     317!            |  w_k-1                                       
     318!     0                  fraca                              1
     319!      \__________________/ \______________________________/
     320!          plume (fraca)          environment (1-fraca)   
     321     
     322!===============================================================================
     323! Thermal plumes computation
     324!===============================================================================
     325     
     326!-------------------------------------------------------------------------------
     327! Thermal plumes speeds, fluxes, tracers and temperatures
     328!-------------------------------------------------------------------------------
     329     
     330      CALL thermcell_plume(ngrid,nlay,nq,ptimestep,ztv,                       &
     331      &                    zhl,zqt,zql,rhobarz,zlev,pplev,pphi,zpopsk,        &
     332      &                    detr_star,entr_star,f_star,                        &
     333      &                    ztva,zhla,zqla,zqta,zta,                           &
     334      &                    zw2,zqsa,lmix,lmin)
     335     
     336!-------------------------------------------------------------------------------
    466337! Thermal plumes characteristics: zmax, zmix, wmax
    467 !==============================================================================
    468      
    469       CALL thermcell_height(ngrid,nlay,lalim,lmin,linter,lmix,zw2,            &
    470       &                     zlev,lmax,zmax,zmix,wmax,f_star,lev_out)
    471      
    472 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    473 ! AB : WARNING: zw2 became its square root in thermcell_height!
    474 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    475      
    476 !      CALL test_ltherm(ngrid,nlay,pplev,pplay,lalim,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_heig lalim ')
    477 !      CALL test_ltherm(ngrid,nlay,pplev,pplay,lmin ,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_heig lmin  ')
    478 !      CALL test_ltherm(ngrid,nlay,pplev,pplay,lmix ,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_heig lmix  ')
    479 !      CALL test_ltherm(ngrid,nlay,pplev,pplay,lmax ,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_heig lmax  ')
    480      
    481 !==============================================================================
     338!-------------------------------------------------------------------------------
     339     
     340! AB: Careful, zw2 became its square root in thermcell_height!
     341      CALL thermcell_height(ngrid,nlay,lmin,linter,lmix,zw2,                  &
     342      &                     zlev,lmax,zmax,zmix,wmax,f_star)
     343     
     344!===============================================================================
    482345! Closure and mass fluxes computation
    483 !==============================================================================
    484      
    485       CALL thermcell_dry(ngrid,nlay,zlev,pphi,ztv,alim_star,                  &
    486       &                  lalim,lmin,zmax_sec,wmax_sec,lev_out)
    487      
    488 !      CALL test_ltherm(ngrid,nlay,pplev,pplay,lmin ,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_dry  lmin  ')
    489 !      CALL test_ltherm(ngrid,nlay,pplev,pplay,lalim,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_dry  lalim ')
    490      
    491 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    492 ! Choix de la fonction d'alimentation utilisee pour la fermeture.
    493 ! Apparemment sans importance
    494 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    495       alim_star_clos(:,:) = alim_star(:,:)
    496       alim_star_clos(:,:) = entr_star(:,:) + alim_star(:,:)
    497      
    498 !------------------------------------------------------------------------------
    499 ! Closure (dry if iflag_thermals_closure=1, moist if iflag_thermals_closure=2)
    500 !------------------------------------------------------------------------------
    501      
    502       IF (iflag_thermals_closure.eq.1) THEN
    503          CALL thermcell_closure(ngrid,nlay,ptimestep,rho,zlev,                &
    504          &                      lalim,alim_star_clos,f_star,                  &
    505          &                      zmax_sec,wmax_sec,f,lev_out)
    506       ELSEIF (iflag_thermals_closure.eq.2) THEN
    507          CALL thermcell_closure(ngrid,nlay,ptimestep,rho,zlev,                &
    508          &                      lalim,alim_star,f_star,                       &
    509          &                      zmax,wmax,f,lev_out)
    510       ELSE
    511          print *, 'ERROR: no closure had been selected!'
    512          call abort
    513       ENDIF
     346!===============================================================================
     347     
     348!-------------------------------------------------------------------------------
     349! Closure
     350!-------------------------------------------------------------------------------
     351     
     352      CALL thermcell_closure(ngrid,nlay,ptimestep,rho,zlev,                   &
     353      &                      lmax,entr_star,zmax,wmax,f)
    514354     
    515355      IF (tau_thermals>1.) THEN
     
    520360      ENDIF
    521361     
    522 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     362!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    523363! Test valable seulement en 1D mais pas genant
    524 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     364!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    525365      IF (.not. (f0(1).ge.0.) ) THEN
    526366         abort_message = '.not. (f0(1).ge.0.)'
     
    529369      ENDIF
    530370     
    531 !------------------------------------------------------------------------------
     371!-------------------------------------------------------------------------------
    532372! Mass fluxes
    533 !------------------------------------------------------------------------------
     373!-------------------------------------------------------------------------------
    534374     
    535375      CALL thermcell_flux(ngrid,nlay,ptimestep,masse,                         &
    536       &                   lalim,lmin,lmax,alim_star,entr_star,detr_star,      &
    537       &                   f,rhobarz,zlev,zw2,fm,entr,detr,zqla,               &
    538       &                   lev_out,lunout1,igout)
    539      
    540 !      CALL test_ltherm(ngrid,nlay,pplev,pplay,lalim,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_flux lalim ')
    541 !      CALL test_ltherm(ngrid,nlay,pplev,pplay,lmax ,seuil,ztv,po,ztva,zqla,f_star,zw2,'thermcell_flux lmax  ')
    542      
    543 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     376! AB: I remove alimentation, which is in fact included in entr_star. EN COURS
     377!     That is not already done for thermcell_flux.
     378      &                   lalim,lmin,lmax,entr_star,detr_star,                &
     379      &                   f,rhobarz,zlev,zw2,fm,entr,detr,zqla)
     380     
     381!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    544382! On ne prend pas directement les profils issus des calculs precedents mais on
    545383! s'autorise genereusement une relaxation vers ceci avec une constante de temps
    546 ! tau_thermals (typiquement 1800s).
    547 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     384! tau_thermals (typiquement 1800s sur Terre).
     385!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    548386     
    549387      IF (tau_thermals>1.) THEN
     
    558396      ENDIF
    559397     
    560 !------------------------------------------------------------------------------
     398!-------------------------------------------------------------------------------
    561399! Updraft fraction
    562 !------------------------------------------------------------------------------
     400!-------------------------------------------------------------------------------
    563401     
    564402      DO ig=1,ngrid
     
    577415      ENDDO
    578416     
    579 !==============================================================================
     417!===============================================================================
    580418! Transport vertical
    581 !==============================================================================
    582      
    583 !------------------------------------------------------------------------------
    584 ! Calcul du transport vertical (de qt et tp)
    585 !------------------------------------------------------------------------------
    586      
    587       CALL thermcell_dq(ngrid,nlay,dqimpl,ptimestep,fm0,entr0,detr0,masse,    &
    588       &                 zthl,zdthladj,zta,lmin,lev_out)
    589      
    590       CALL thermcell_dq(ngrid,nlay,dqimpl,ptimestep,fm0,entr0,detr0,masse,    &
    591       &                 po,pdoadj,zoa,lmin,lev_out)
     419!===============================================================================
     420     
     421!-------------------------------------------------------------------------------
     422! Calcul du transport vertical de la temperature potentielle
     423!-------------------------------------------------------------------------------
     424     
     425      CALL thermcell_dq(ngrid,nlay,ptimestep,fm0,entr0,detr0,masse,           &
     426      &                 zhl,zdthladj,dummy,lmin)
    592427     
    593428      DO l=1,nlay
    594429         DO ig=1,ngrid
    595            pdtadj(ig,l) = zdthladj(ig,l) * zpspsk(ig,l) 
     430            pdtadj(ig,l) = zdthladj(ig,l) * zpopsk(ig,l) 
    596431         ENDDO
    597432      ENDDO
    598433     
    599 !------------------------------------------------------------------------------
     434!-------------------------------------------------------------------------------
     435! Calcul du transport vertical des traceurs
     436!-------------------------------------------------------------------------------
     437     
     438      DO iq=1,nq
     439         CALL thermcell_dq(ngrid,nlay,ptimestep,fm0,entr0,detr0,masse,        &
     440         &                 pq(:,:,iq),pdqadj(:,:,iq),zqa(:,:,iq),lmin)
     441      ENDDO
     442     
     443!-------------------------------------------------------------------------------
    600444! Calcul du transport vertical du moment horizontal
    601 !------------------------------------------------------------------------------
    602      
    603       IF (dvimpl.eq.0) THEN
    604 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    605 ! Calcul du transport de V tenant compte d'echange par gradient
    606 ! de pression horizontal avec l'environnement
    607 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    608          CALL thermcell_dv2(ngrid,nlay,ptimestep,fm0,entr0,masse,fraca,       &
    609          &                  zmax,zu,zv,pduadj,pdvadj,zua,zva,lev_out)
    610       ELSE
    611 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    612 ! Calcul purement conservatif pour le transport de V=(u,v)
    613 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    614          CALL thermcell_dq(ngrid,nlay,dqimpl,ptimestep,fm0,entr0,detr0,masse, &
    615          &                 zu,pduadj,zua,lmin,lev_out)
    616          
    617          CALL thermcell_dq(ngrid,nlay,dqimpl,ptimestep,fm0,entr0,detr0,masse, &
    618          &                 zv,pdvadj,zva,lmin,lev_out)
    619       ENDIF
    620      
    621 !==============================================================================
    622 ! Calculs de diagnostiques pour les sorties
    623 !==============================================================================
    624      
    625       IF (sorties) THEN
    626          
    627 !------------------------------------------------------------------------------
    628 ! Calcul du niveau de condensation
    629 !------------------------------------------------------------------------------
    630          
    631          DO ig=1,ngrid
    632             nivcon(ig) = 0
    633             zcon(ig) = 0.
    634          ENDDO
    635 !nouveau calcul
    636          do ig=1,ngrid
    637             CHI = zh(ig,1)/(1669.0-122.0*zo(ig,1)/zqsat(ig,1)-zh(ig,1))
    638             pcon(ig) = pplay(ig,1)*(zo(ig,1)/zqsat(ig,1))**CHI
    639          ENDDO
    640          
    641 !IM       do k=1,nlay
    642          do k=1,nlay-1
    643             do ig=1,ngrid
    644                IF ((pcon(ig).le.pplay(ig,k)).and.(pcon(ig).gt.pplay(ig,k+1))) then
    645                   zcon2(ig) = zlay(ig,k) - (pcon(ig) - pplay(ig,k))           &
    646                             / (RG * rho(ig,k)) / 100.
    647                ENDIF
    648             ENDDO
    649          ENDDO
    650          
    651          ierr = 0
    652          
    653          do ig=1,ngrid
    654            IF (pcon(ig).le.pplay(ig,nlay)) then
    655               zcon2(ig) = zlay(ig,nlay) - (pcon(ig) - pplay(ig,nlay))         &
    656                         / (RG * rho(ig,nlay)) / 100.
    657               ierr = 1
    658             ENDIF
    659          ENDDO
    660          
    661          IF (ierr==1) then
    662               write(*,*) 'ERROR: thermal plumes rise the model top'
    663               CALL abort
    664          ENDIF
    665          
    666          IF (prt_level.ge.1) print*,'14b OK convect8'
    667          
    668          do k=nlay,1,-1
    669             do ig=1,ngrid
    670                IF (zqla(ig,k).gt.1e-10) then
    671                   nivcon(ig) = k
    672                   zcon(ig) = zlev(ig,k)
    673                ENDIF
    674             ENDDO
    675          ENDDO
    676          
    677          IF (prt_level.ge.1) print*,'14c OK convect8'
    678          
    679 !------------------------------------------------------------------------------
    680 ! Calcul des moments
    681 !------------------------------------------------------------------------------
    682          
    683          do l=1,nlay
    684             do ig=1,ngrid
    685                q2(ig,l) = 0.
    686                wth2(ig,l) = 0.
    687                wth3(ig,l) = 0.
    688                ratqscth(ig,l) = 0.
    689                ratqsdiff(ig,l) = 0.
    690             ENDDO
    691          ENDDO
    692          
    693          IF (prt_level.ge.1) print*,'14d OK convect8'
    694          
    695          do l=1,nlay
    696            do ig=1,ngrid
    697                zf = fraca(ig,l)
    698                zf2 = zf/(1.-zf)
    699                thetath2(ig,l) = zf2*(ztla(ig,l)-zthl(ig,l))**2
    700                
    701                IF (zw2(ig,l).gt.1.e-10) then
    702                   wth2(ig,l) = zf2*(zw2(ig,l))**2
    703                else
    704                   wth2(ig,l) = 0.
    705                ENDIF
    706                
    707                wth3(ig,l) = zf2*(1-2.*fraca(ig,l))/(1-fraca(ig,l))            &
    708                &                *zw2(ig,l)*zw2(ig,l)*zw2(ig,l)
    709                q2(ig,l) = zf2*(zqta(ig,l)*1000.-po(ig,l)*1000.)**2
    710 !test: on calcul q2/po=ratqsc
    711                ratqscth(ig,l) = sqrt(max(q2(ig,l),1.e-6)/(po(ig,l)*1000.))
    712             ENDDO
    713          ENDDO
    714          
    715 !------------------------------------------------------------------------------
    716 ! Calcul des flux: q, thetal et thetav
    717 !------------------------------------------------------------------------------
    718          
    719          do l=1,nlay
    720             do ig=1,ngrid
    721                wq(ig,l)=fraca(ig,l)*zw2(ig,l)*(zqta(ig,l)*1000.-po(ig,l)*1000.)
    722                wthl(ig,l)=fraca(ig,l)*zw2(ig,l)*(ztla(ig,l)-zthl(ig,l))
    723                wthv(ig,l)=fraca(ig,l)*zw2(ig,l)*(ztva(ig,l)-ztv(ig,l))
    724             ENDDO
    725          ENDDO
    726          
    727          CALL thermcell_alp(ngrid,nlay,ptimestep,                             &
    728          &                  pplay,pplev,                                      &
    729          &                  fm0,entr0,lmax,                                   &
    730          &                  Ale_bl,Alp_bl,lalim_conv,wght_th,                 &
    731          &                  zw2,fraca,pcon,                                   &
    732          &                  rhobarz,wth3,wmax_sec,lalim,fm,alim_star,zmax,    &
    733          &                  pbl_tke,pctsrf,omega,airephy,                     &
    734          &                  zlcl,fraca0,w0,w_conv,therm_tke_max0,env_tke_max0,&
    735          &                  n2,s2,ale_bl_stat,                                &
    736          &                  therm_tke_max,env_tke_max,                        &
    737          &                  alp_bl_det,alp_bl_fluct_m,alp_bl_fluct_tke,       &
    738          &                  alp_bl_conv,alp_bl_stat)
    739          
    740 !------------------------------------------------------------------------------
    741 ! Calcul du ratqscdiff
    742 !------------------------------------------------------------------------------
    743      
    744          var = 0.
    745          vardiff = 0.
    746          ratqsdiff(:,:) = 0.
    747          
    748          DO l=1,nlay
    749             DO ig=1,ngrid
    750                IF (l<=lalim(ig)) THEN
    751                   var = var + alim_star(ig,l) * zqta(ig,l) * 1000.
    752                ENDIF
    753             ENDDO
    754          ENDDO
    755          
    756          IF (prt_level.ge.1) print*,'14f OK convect8'
    757      
    758          DO l=1,nlay
    759             DO ig=1,ngrid
    760                IF (l<=lalim(ig)) THEN
    761                   zf  = fraca(ig,l)
    762                   zf2 = zf / (1.-zf)
    763                   vardiff = vardiff + alim_star(ig,l)                         &
    764                           * (zqta(ig,l) * 1000. - var)**2
    765                ENDIF
    766             ENDDO
    767          ENDDO
    768      
    769          IF (prt_level.ge.1) print*,'14g OK convect8'
    770          
    771          DO l=1,nlay
    772             DO ig=1,ngrid
    773                ratqsdiff(ig,l) = sqrt(vardiff) / (po(ig,l) * 1000.)   
    774             ENDDO
    775          ENDDO
    776          
    777       ENDIF
     445!-------------------------------------------------------------------------------
     446     
     447      CALL thermcell_dq(ngrid,nlay,ptimestep,fm0,entr0,detr0,masse,           &
     448      &                 zu,pduadj,zua,lmin)
     449     
     450      CALL thermcell_dq(ngrid,nlay,ptimestep,fm0,entr0,detr0,masse,           &
     451      &                 zv,pdvadj,zva,lmin)
    778452     
    779453     
    780454RETURN
    781455END
    782 
    783 
    784 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    785 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    786 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    787 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    788 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    789 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    790 
    791 
    792 SUBROUTINE test_ltherm(ngrid,nlay,pplev,pplay,long,seuil,ztv,po,              &
    793                        ztva,zqla,f_star,zw2,comment)
    794      
    795      
    796       USE print_control_mod, ONLY: prt_level
    797      
    798       IMPLICIT NONE
    799      
    800      
    801 !==============================================================================
    802 ! Declaration
    803 !==============================================================================
    804      
    805 !      inputs:
    806 !      -------
    807      
    808       INTEGER ngrid
    809       INTEGER nlay
    810       INTEGER long(ngrid)
    811      
    812       REAL pplev(ngrid,nlay+1)
    813       REAL pplay(ngrid,nlay)
    814       REAL ztv(ngrid,nlay)
    815       REAL po(ngrid,nlay)
    816       REAL ztva(ngrid,nlay)
    817       REAL zqla(ngrid,nlay)
    818       REAL f_star(ngrid,nlay)
    819       REAL zw2(ngrid,nlay)
    820       REAL seuil
    821      
    822       CHARACTER*21 comment
    823      
    824 !      local:
    825 !      ------
    826      
    827       INTEGER i, k
    828      
    829 !==============================================================================
    830 ! Test
    831 !==============================================================================
    832      
    833       IF (prt_level.ge.1) THEN
    834          write(*,*) 'WARNING: in test, ', comment
    835       ENDIF
    836            
    837       return
    838      
    839 !  test sur la hauteur des thermiques ...
    840       do i=1,ngrid
    841 !IMtemp IF (pplay(i,long(i)).lt.seuil*pplev(i,1)) then
    842         IF (prt_level.ge.10) then
    843             print *, 'WARNING ',comment,' au point ',i,' K= ',long(i)
    844             print *, '  K  P(MB)  THV(K)     Qenv(g/kg)THVA        QLA(g/kg)   F*        W2'
    845             do k=1,nlay
    846                write(6,'(i3,7f10.3)') k,pplay(i,k),ztv(i,k),1000*po(i,k),ztva(i,k),1000*zqla(i,k),f_star(i,k),zw2(i,k)
    847             ENDDO
    848         ENDIF
    849       ENDDO
    850      
    851      
    852 RETURN
    853 END
    854 
    855 
    856 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    857 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    858 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    859 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    860 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    861 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    862 
    863 
    864 SUBROUTINE thermcell_tke_transport(ngrid,nlay,ptimestep,fm0,entr0,            &
    865                                    rg,pplev,therm_tke_max)
    866      
    867      
    868 !==============================================================================
    869 !   Calcul du transport verticale dans la couche limite en presence
    870 !   de "thermiques" explicitement representes
    871 !   calcul du dq/dt une fois qu'on connait les ascendances
    872 !
    873 !   Transport de la TKE par le thermique moyen pour la fermeture en ALP
    874 !   On transporte pbl_tke pour donner therm_tke
    875 !==============================================================================
    876      
    877       USE print_control_mod, ONLY: prt_level
    878      
    879       IMPLICIT NONE
    880      
    881      
    882 !==============================================================================
    883 ! Declarations
    884 !==============================================================================
    885      
    886       integer ngrid,nlay,nsrf
    887      
    888       real ptimestep
    889       real masse0(ngrid,nlay),fm0(ngrid,nlay+1),pplev(ngrid,nlay+1)
    890       real entr0(ngrid,nlay),rg
    891       real therm_tke_max(ngrid,nlay)
    892       real detr0(ngrid,nlay)
    893      
    894       real masse(ngrid,nlay),fm(ngrid,nlay+1)
    895       real entr(ngrid,nlay)
    896       real q(ngrid,nlay)
    897      
    898       real qa(ngrid,nlay),detr(ngrid,nlay),wqd(ngrid,nlay+1)
    899      
    900       real zzm
    901      
    902       integer ig,k
    903       integer isrf
    904      
    905 !------------------------------------------------------------------------------
    906 ! Calcul du detrainement
    907 !------------------------------------------------------------------------------
    908      
    909       do k=1,nlay
    910          detr0(:,k) = fm0(:,k) - fm0(:,k+1) + entr0(:,k)
    911          masse0(:,k) = (pplev(:,k) - pplev(:,k+1)) / RG
    912       ENDDO
    913      
    914 !------------------------------------------------------------------------------
    915 ! Decalage vertical des entrainements et detrainements.
    916 !------------------------------------------------------------------------------
    917      
    918       masse(:,1)=0.5*masse0(:,1)
    919       entr(:,1)=0.5*entr0(:,1)
    920       detr(:,1)=0.5*detr0(:,1)
    921       fm(:,1)=0.
    922      
    923       do k=1,nlay-1
    924          masse(:,k+1)=0.5*(masse0(:,k)+masse0(:,k+1))
    925          entr(:,k+1)=0.5*(entr0(:,k)+entr0(:,k+1))
    926          detr(:,k+1)=0.5*(detr0(:,k)+detr0(:,k+1))
    927          fm(:,k+1)=fm(:,k)+entr(:,k)-detr(:,k)
    928       ENDDO
    929      
    930       fm(:,nlay+1)=0.
    931      
    932 !!! nrlmd le 16/09/2010
    933 !   calcul de la valeur dans les ascendances
    934 !      do ig=1,ngrid
    935 !         qa(ig,1) = q(ig,1)
    936 !      ENDDO
    937      
    938       q(:,:)=therm_tke_max(:,:)
    939      
    940       do ig=1,ngrid
    941          qa(ig,1)=q(ig,1)
    942       ENDDO
    943      
    944       IF (1==1) then
    945          do k=2,nlay
    946             do ig=1,ngrid
    947                IF ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt.1.e-5*masse(ig,k)) then
    948                   qa(ig,k) = (fm(ig,k)*qa(ig,k-1)+entr(ig,k)*q(ig,k))         &
    949                   &        / (fm(ig,k+1)+detr(ig,k))
    950                else
    951                   qa(ig,k)=q(ig,k)
    952                ENDIF
    953                
    954 !               IF (qa(ig,k).lt.0.) print *, 'WARNING: qa is negative!'
    955 !               IF (q(ig,k).lt.0.) print *, 'WARNING: q is negative!'
    956             ENDDO
    957          ENDDO
    958          
    959 !------------------------------------------------------------------------------
    960 ! Calcul du flux subsident
    961 !------------------------------------------------------------------------------
    962          
    963          do k=2,nlay
    964             do ig=1,ngrid
    965                wqd(ig,k) = fm(ig,k) * q(ig,k)
    966                IF (wqd(ig,k).lt.0.) print*,'WARNING: wqd is negative!'
    967             ENDDO
    968          ENDDO
    969          
    970          do ig=1,ngrid
    971             wqd(ig,1) = 0.
    972             wqd(ig,nlay+1) = 0.
    973          ENDDO
    974          
    975 !------------------------------------------------------------------------------
    976 ! Calcul des tendances
    977 !------------------------------------------------------------------------------
    978          
    979          do k=1,nlay
    980             do ig=1,ngrid
    981                q(ig,k) = q(ig,k) + ptimestep / masse(ig,k)                    &
    982                &       * (detr(ig,k) * qa(ig,k) - entr(ig,k) * q(ig,k)        &
    983                &       - wqd(ig,k) + wqd(ig,k+1))
    984             ENDDO
    985          ENDDO
    986       ENDIF
    987      
    988       therm_tke_max(:,:) = q(:,:)
    989      
    990      
    991 RETURN
    992 END
    993 
Note: See TracChangeset for help on using the changeset viewer.