Ignore:
Timestamp:
Mar 5, 2014, 2:19:12 PM (10 years ago)
Author:
lguez
Message:

Converted to free source form files in libf/phylmd which were still in
fixed source form. The conversion was done using the polish mode of
the NAG Fortran Compiler.

In addition to converting to free source form, the processing of the
files also:

-- indented the code (including comments);

-- set Fortran keywords to uppercase, and set all other identifiers
to lower case;

-- added qualifiers to end statements (for example "end subroutine
conflx", instead of "end");

-- changed the terminating statements of all DO loops so that each
loop ends with an ENDDO statement (instead of a labeled continue).

-- replaced #include by include.

File:
1 moved

Legend:

Unmodified
Added
Removed
  • LMDZ5/trunk/libf/phylmd/conccm.F90

    r1988 r1992  
    1 !
     1
    22! $Header$
    3 !
    4       SUBROUTINE conccm (dtime,paprs,pplay,t,q,conv_q,
    5      s                   d_t, d_q, rain, snow, kbascm, ktopcm)
    6 c
    7       USE dimphy
    8       IMPLICIT none
    9 c======================================================================
    10 c Auteur(s): Z.X. Li (LMD/CNRS) date: le 14 mars 1996
    11 c Objet: Schema simple (avec flux de masse) pour la convection
    12 c        (schema standard du modele NCAR CCM2)
    13 c======================================================================
    14 cym#include "dimensions.h"
    15 cym#include "dimphy.h"
    16 #include "YOMCST.h"
    17 #include "YOETHF.h"
    18 c
    19 c Entree:
    20       REAL dtime              ! pas d'integration
    21       REAL paprs(klon,klev+1) ! pression inter-couche (Pa)
    22       REAL pplay(klon,klev)   ! pression au milieu de couche (Pa)
    23       REAL t(klon,klev)       ! temperature (K)
    24       REAL q(klon,klev)       ! humidite specifique (g/g)
    25       REAL conv_q(klon,klev)  ! taux de convergence humidite (g/g/s)
    26 c Sortie:
    27       REAL d_t(klon,klev)     ! incrementation temperature
    28       REAL d_q(klon,klev)     ! incrementation vapeur
    29       REAL rain(klon)         ! pluie (mm/s)
    30       REAL snow(klon)         ! neige (mm/s)
    31       INTEGER kbascm(klon)    ! niveau du bas de convection
    32       INTEGER ktopcm(klon)    ! niveau du haut de convection
    33 c
    34       REAL pt(klon,klev)
    35       REAL pq(klon,klev)
    36       REAL pres(klon,klev)
    37       REAL dp(klon,klev)
    38       REAL zgeom(klon,klev)
    39       REAL cmfprs(klon)
    40       REAL cmfprt(klon)
    41       INTEGER ntop(klon)
    42       INTEGER nbas(klon)
    43       INTEGER i, k
    44       REAL zlvdcp, zlsdcp, zdelta, zz, za, zb
    45 c
    46       LOGICAL usekuo ! utiliser convection profonde (schema Kuo)
    47       PARAMETER (usekuo=.TRUE.)
    48 c
    49       REAL d_t_bis(klon,klev)
    50       REAL d_q_bis(klon,klev)
    51       REAL rain_bis(klon)
    52       REAL snow_bis(klon)
    53       INTEGER ibas_bis(klon)
    54       INTEGER itop_bis(klon)
    55       REAL d_ql_bis(klon,klev)
    56       REAL rneb_bis(klon,klev)
    57 c
    58 c initialiser les variables de sortie (pour securite)
     3
     4SUBROUTINE conccm(dtime, paprs, pplay, t, q, conv_q, d_t, d_q, rain, snow, &
     5    kbascm, ktopcm)
     6
     7  USE dimphy
     8  IMPLICIT NONE
     9  ! ======================================================================
     10  ! Auteur(s): Z.X. Li (LMD/CNRS) date: le 14 mars 1996
     11  ! Objet: Schema simple (avec flux de masse) pour la convection
     12  ! (schema standard du modele NCAR CCM2)
     13  ! ======================================================================
     14  ! ym#include "dimensions.h"
     15  ! ym#include "dimphy.h"
     16  include "YOMCST.h"
     17  include "YOETHF.h"
     18
     19  ! Entree:
     20  REAL dtime ! pas d'integration
     21  REAL paprs(klon, klev+1) ! pression inter-couche (Pa)
     22  REAL pplay(klon, klev) ! pression au milieu de couche (Pa)
     23  REAL t(klon, klev) ! temperature (K)
     24  REAL q(klon, klev) ! humidite specifique (g/g)
     25  REAL conv_q(klon, klev) ! taux de convergence humidite (g/g/s)
     26  ! Sortie:
     27  REAL d_t(klon, klev) ! incrementation temperature
     28  REAL d_q(klon, klev) ! incrementation vapeur
     29  REAL rain(klon) ! pluie (mm/s)
     30  REAL snow(klon) ! neige (mm/s)
     31  INTEGER kbascm(klon) ! niveau du bas de convection
     32  INTEGER ktopcm(klon) ! niveau du haut de convection
     33
     34  REAL pt(klon, klev)
     35  REAL pq(klon, klev)
     36  REAL pres(klon, klev)
     37  REAL dp(klon, klev)
     38  REAL zgeom(klon, klev)
     39  REAL cmfprs(klon)
     40  REAL cmfprt(klon)
     41  INTEGER ntop(klon)
     42  INTEGER nbas(klon)
     43  INTEGER i, k
     44  REAL zlvdcp, zlsdcp, zdelta, zz, za, zb
     45
     46  LOGICAL usekuo ! utiliser convection profonde (schema Kuo)
     47  PARAMETER (usekuo=.TRUE.)
     48
     49  REAL d_t_bis(klon, klev)
     50  REAL d_q_bis(klon, klev)
     51  REAL rain_bis(klon)
     52  REAL snow_bis(klon)
     53  INTEGER ibas_bis(klon)
     54  INTEGER itop_bis(klon)
     55  REAL d_ql_bis(klon, klev)
     56  REAL rneb_bis(klon, klev)
     57
     58  ! initialiser les variables de sortie (pour securite)
     59  DO i = 1, klon
     60    rain(i) = 0.0
     61    snow(i) = 0.0
     62    kbascm(i) = 0
     63    ktopcm(i) = 0
     64  END DO
     65  DO k = 1, klev
     66    DO i = 1, klon
     67      d_t(i, k) = 0.0
     68      d_q(i, k) = 0.0
     69    END DO
     70  END DO
     71
     72  ! preparer les variables d'entree (attention: l'ordre des niveaux
     73  ! verticaux augmente du haut vers le bas)
     74  DO k = 1, klev
     75    DO i = 1, klon
     76      pt(i, k) = t(i, klev-k+1)
     77      pq(i, k) = q(i, klev-k+1)
     78      pres(i, k) = pplay(i, klev-k+1)
     79      dp(i, k) = paprs(i, klev+1-k) - paprs(i, klev+1-k+1)
     80    END DO
     81  END DO
     82  DO i = 1, klon
     83    zgeom(i, klev) = rd*t(i, 1)/(0.5*(paprs(i,1)+pplay(i, &
     84      1)))*(paprs(i,1)-pplay(i,1))
     85  END DO
     86  DO k = 2, klev
     87    DO i = 1, klon
     88      zgeom(i, klev+1-k) = zgeom(i, klev+1-k+1) + rd*0.5*(t(i,k-1)+t(i,k))/ &
     89        paprs(i, k)*(pplay(i,k-1)-pplay(i,k))
     90    END DO
     91  END DO
     92
     93  CALL cmfmca(dtime, pres, dp, zgeom, pt, pq, cmfprt, cmfprs, ntop, nbas)
     94
     95  DO k = 1, klev
     96    DO i = 1, klon
     97      d_q(i, klev+1-k) = pq(i, k) - q(i, klev+1-k)
     98      d_t(i, klev+1-k) = pt(i, k) - t(i, klev+1-k)
     99    END DO
     100  END DO
     101
     102  DO i = 1, klon
     103    rain(i) = cmfprt(i)*rhoh2o
     104    snow(i) = cmfprs(i)*rhoh2o
     105    kbascm(i) = klev + 1 - nbas(i)
     106    ktopcm(i) = klev + 1 - ntop(i)
     107  END DO
     108
     109  IF (usekuo) THEN
     110    CALL conkuo(dtime, paprs, pplay, t, q, conv_q, d_t_bis, d_q_bis, &
     111      d_ql_bis, rneb_bis, rain_bis, snow_bis, ibas_bis, itop_bis)
     112    DO k = 1, klev
    59113      DO i = 1, klon
    60          rain(i) = 0.0
    61          snow(i) = 0.0
    62          kbascm(i) = 0
    63          ktopcm(i) = 0
    64       ENDDO
    65       DO k = 1, klev
     114        d_t(i, k) = d_t(i, k) + d_t_bis(i, k)
     115        d_q(i, k) = d_q(i, k) + d_q_bis(i, k)
     116      END DO
     117    END DO
     118    DO i = 1, klon
     119      rain(i) = rain(i) + rain_bis(i)
     120      snow(i) = snow(i) + snow_bis(i)
     121      kbascm(i) = min(kbascm(i), ibas_bis(i))
     122      ktopcm(i) = max(ktopcm(i), itop_bis(i))
     123    END DO
     124    DO k = 1, klev ! eau liquide convective est
     125      DO i = 1, klon ! dispersee dans l'air
     126        zlvdcp = rlvtt/rcpd/(1.0+rvtmp2*q(i,k))
     127        zlsdcp = rlstt/rcpd/(1.0+rvtmp2*q(i,k))
     128        zdelta = max(0., sign(1.,rtt-t(i,k)))
     129        zz = d_ql_bis(i, k) ! re-evap. de l'eau liquide
     130        zb = max(0.0, zz)
     131        za = -max(0.0, zz)*(zlvdcp*(1.-zdelta)+zlsdcp*zdelta)
     132        d_t(i, k) = d_t(i, k) + za
     133        d_q(i, k) = d_q(i, k) + zb
     134      END DO
     135    END DO
     136  END IF
     137
     138  RETURN
     139END SUBROUTINE conccm
     140SUBROUTINE cmfmca(deltat, p, dp, gz, tb, shb, cmfprt, cmfprs, cnt, cnb)
     141  USE dimphy
     142  IMPLICIT NONE
     143  ! -----------------------------------------------------------------------
     144  ! Moist convective mass flux procedure:
     145  ! If stratification is unstable to nonentraining parcel ascent,
     146  ! complete an adjustment making use of a simple cloud model
     147
     148  ! Code generalized to allow specification of parcel ("updraft")
     149  ! properties, as well as convective transport of an arbitrary
     150  ! number of passive constituents (see cmrb array).
     151  ! ----------------------------Code History-------------------------------
     152  ! Original version:  J. J. Hack, March 22, 1990
     153  ! Standardized:      J. Rosinski, June 1992
     154  ! Reviewed:          J. Hack, G. Taylor, August 1992
     155  ! Adaptation au LMD: Z.X. Li, mars 1996 (reference: Hack 1994,
     156  ! J. Geophys. Res. vol 99, D3, 5551-5568). J'ai
     157  ! introduit les constantes et les fonctions thermo-
     158  ! dynamiques du Centre Europeen. J'ai elimine le
     159  ! re-indicage du code en esperant que cela pourra
     160  ! simplifier la lecture et la comprehension.
     161  ! -----------------------------------------------------------------------
     162  ! ym#include "dimensions.h"
     163  ! ym#include "dimphy.h"
     164  INTEGER pcnst ! nombre de traceurs passifs
     165  PARAMETER (pcnst=1)
     166  ! ------------------------------Arguments--------------------------------
     167  ! Input arguments
     168
     169  REAL deltat ! time step (seconds)
     170  REAL p(klon, klev) ! pressure
     171  REAL dp(klon, klev) ! delta-p
     172  REAL gz(klon, klev) ! geopotential (a partir du sol)
     173
     174  REAL thtap(klon) ! PBL perturbation theta
     175  REAL shp(klon) ! PBL perturbation specific humidity
     176  REAL pblh(klon) ! PBL height (provided by PBL routine)
     177  REAL cmrp(klon, pcnst) ! constituent perturbations in PBL
     178
     179  ! Updated arguments:
     180
     181  REAL tb(klon, klev) ! temperature (t bar)
     182  REAL shb(klon, klev) ! specific humidity (sh bar)
     183  REAL cmrb(klon, klev, pcnst) ! constituent mixing ratios (cmr bar)
     184
     185  ! Output arguments
     186
     187  REAL cmfdt(klon, klev) ! dT/dt due to moist convection
     188  REAL cmfdq(klon, klev) ! dq/dt due to moist convection
     189  REAL cmfmc(klon, klev) ! moist convection cloud mass flux
     190  REAL cmfdqr(klon, klev) ! dq/dt due to convective rainout
     191  REAL cmfsl(klon, klev) ! convective lw static energy flux
     192  REAL cmflq(klon, klev) ! convective total water flux
     193  REAL cmfprt(klon) ! convective precipitation rate
     194  REAL cmfprs(klon) ! convective snowfall rate
     195  REAL qc(klon, klev) ! dq/dt due to rainout terms
     196  INTEGER cnt(klon) ! top level of convective activity
     197  INTEGER cnb(klon) ! bottom level of convective activity
     198  ! ------------------------------Parameters-------------------------------
     199  REAL c0 ! rain water autoconversion coefficient
     200  PARAMETER (c0=1.0E-4)
     201  REAL dzmin ! minimum convective depth for precipitation
     202  PARAMETER (dzmin=0.0)
     203  REAL betamn ! minimum overshoot parameter
     204  PARAMETER (betamn=0.10)
     205  REAL cmftau ! characteristic adjustment time scale
     206  PARAMETER (cmftau=3600.)
     207  INTEGER limcnv ! top interface level limit for convection
     208  PARAMETER (limcnv=1)
     209  REAL tpmax ! maximum acceptable t perturbation (degrees C)
     210  PARAMETER (tpmax=1.50)
     211  REAL shpmax ! maximum acceptable q perturbation (g/g)
     212  PARAMETER (shpmax=1.50E-3)
     213  REAL tiny ! arbitrary small num used in transport estimates
     214  PARAMETER (tiny=1.0E-36)
     215  REAL eps ! convergence criteria (machine dependent)
     216  PARAMETER (eps=1.0E-13)
     217  REAL tmelt ! freezing point of water(req'd for rain vs snow)
     218  PARAMETER (tmelt=273.15)
     219  REAL ssfac ! supersaturation bound (detrained air)
     220  PARAMETER (ssfac=1.001)
     221
     222  ! ---------------------------Local workspace-----------------------------
     223  REAL gam(klon, klev) ! L/cp (d(qsat)/dT)
     224  REAL sb(klon, klev) ! dry static energy (s bar)
     225  REAL hb(klon, klev) ! moist static energy (h bar)
     226  REAL shbs(klon, klev) ! sat. specific humidity (sh bar star)
     227  REAL hbs(klon, klev) ! sat. moist static energy (h bar star)
     228  REAL shbh(klon, klev+1) ! specific humidity on interfaces
     229  REAL sbh(klon, klev+1) ! s bar on interfaces
     230  REAL hbh(klon, klev+1) ! h bar on interfaces
     231  REAL cmrh(klon, klev+1) ! interface constituent mixing ratio
     232  REAL prec(klon) ! instantaneous total precipitation
     233  REAL dzcld(klon) ! depth of convective layer (m)
     234  REAL beta(klon) ! overshoot parameter (fraction)
     235  REAL betamx ! local maximum on overshoot
     236  REAL eta(klon) ! convective mass flux (kg/m^2 s)
     237  REAL etagdt ! eta*grav*deltat
     238  REAL cldwtr(klon) ! cloud water (mass)
     239  REAL rnwtr(klon) ! rain water  (mass)
     240  REAL sc(klon) ! dry static energy   ("in-cloud")
     241  REAL shc(klon) ! specific humidity   ("in-cloud")
     242  REAL hc(klon) ! moist static energy ("in-cloud")
     243  REAL cmrc(klon) ! constituent mix rat ("in-cloud")
     244  REAL dq1(klon) ! shb  convective change (lower lvl)
     245  REAL dq2(klon) ! shb  convective change (mid level)
     246  REAL dq3(klon) ! shb  convective change (upper lvl)
     247  REAL ds1(klon) ! sb   convective change (lower lvl)
     248  REAL ds2(klon) ! sb   convective change (mid level)
     249  REAL ds3(klon) ! sb   convective change (upper lvl)
     250  REAL dcmr1(klon) ! cmrb convective change (lower lvl)
     251  REAL dcmr2(klon) ! cmrb convective change (mid level)
     252  REAL dcmr3(klon) ! cmrb convective change (upper lvl)
     253  REAL flotab(klon) ! hc - hbs (mesure d'instabilite)
     254  LOGICAL ldcum(klon) ! .true. si la convection existe
     255  LOGICAL etagt0 ! true if eta > 0.0
     256  REAL dt ! current 2 delta-t (model time step)
     257  REAL cats ! modified characteristic adj. time
     258  REAL rdt ! 1./dt
     259  REAL qprime ! modified specific humidity pert.
     260  REAL tprime ! modified thermal perturbation
     261  REAL pblhgt ! bounded pbl height (max[pblh,1m])
     262  REAL fac1 ! intermediate scratch variable
     263  REAL shprme ! intermediate specific humidity pert.
     264  REAL qsattp ! saturation mixing ratio for
     265  ! !  thermally perturbed PBL parcels
     266  REAL dz ! local layer depth
     267  REAL b1 ! bouyancy measure in detrainment lvl
     268  REAL b2 ! bouyancy measure in condensation lvl
     269  REAL g ! bounded vertical gradient of hb
     270  REAL tmass ! total mass available for convective exchange
     271  REAL denom ! intermediate scratch variable
     272  REAL qtest1 ! used in negative q test (middle lvl)
     273  REAL qtest2 ! used in negative q test (lower lvl)
     274  REAL fslkp ! flux lw static energy (bot interface)
     275  REAL fslkm ! flux lw static energy (top interface)
     276  REAL fqlkp ! flux total water (bottom interface)
     277  REAL fqlkm ! flux total water (top interface)
     278  REAL botflx ! bottom constituent mixing ratio flux
     279  REAL topflx ! top constituent mixing ratio flux
     280  REAL efac1 ! ratio cmrb to convectively induced change (bot lvl)
     281  REAL efac2 ! ratio cmrb to convectively induced change (mid lvl)
     282  REAL efac3 ! ratio cmrb to convectively induced change (top lvl)
     283
     284  INTEGER i, k ! indices horizontal et vertical
     285  INTEGER km1 ! k-1 (index offset)
     286  INTEGER kp1 ! k+1 (index offset)
     287  INTEGER m ! constituent index
     288  INTEGER ktp ! temporary index used to track top
     289  INTEGER is ! nombre de points a ajuster
     290
     291  REAL tmp1, tmp2, tmp3, tmp4
     292  REAL zx_t, zx_p, zx_q, zx_qs, zx_gam
     293  REAL zcor, zdelta, zcvm5
     294
     295  REAL qhalf, sh1, sh2, shbs1, shbs2
     296  include "YOMCST.h"
     297  include "YOETHF.h"
     298  include "FCTTRE.h"
     299  qhalf(sh1, sh2, shbs1, shbs2) = min(max(sh1,sh2), &
     300    (shbs2*sh1+shbs1*sh2)/(shbs1+shbs2))
     301
     302  ! -----------------------------------------------------------------------
     303  ! pas de traceur pour l'instant
     304  DO m = 1, pcnst
     305    DO k = 1, klev
    66306      DO i = 1, klon
    67          d_t(i,k) = 0.0
    68          d_q(i,k) = 0.0
    69       ENDDO
    70       ENDDO
    71 c
    72 c preparer les variables d'entree (attention: l'ordre des niveaux
    73 c verticaux augmente du haut vers le bas)
    74       DO k = 1, klev
     307        cmrb(i, k, m) = 0.0
     308      END DO
     309    END DO
     310  END DO
     311
     312  ! Les perturbations de la couche limite sont zero pour l'instant
     313
     314  DO m = 1, pcnst
     315    DO i = 1, klon
     316      cmrp(i, m) = 0.0
     317    END DO
     318  END DO
     319  DO i = 1, klon
     320    thtap(i) = 0.0
     321    shp(i) = 0.0
     322    pblh(i) = 1.0
     323  END DO
     324
     325  ! Ensure that characteristic adjustment time scale (cmftau) assumed
     326  ! in estimate of eta isn't smaller than model time scale (deltat)
     327
     328  dt = deltat
     329  cats = max(dt, cmftau)
     330  rdt = 1.0/dt
     331
     332  ! Compute sb,hb,shbs,hbs
     333
     334  DO k = 1, klev
     335    DO i = 1, klon
     336      zx_t = tb(i, k)
     337      zx_p = p(i, k)
     338      zx_q = shb(i, k)
     339      zdelta = max(0., sign(1.,rtt-zx_t))
     340      zcvm5 = r5les*rlvtt*(1.-zdelta) + r5ies*rlstt*zdelta
     341      zcvm5 = zcvm5/rcpd/(1.0+rvtmp2*zx_q)
     342      zx_qs = r2es*foeew(zx_t, zdelta)/zx_p
     343      zx_qs = min(0.5, zx_qs)
     344      zcor = 1./(1.-retv*zx_qs)
     345      zx_qs = zx_qs*zcor
     346      zx_gam = foede(zx_t, zdelta, zcvm5, zx_qs, zcor)
     347      shbs(i, k) = zx_qs
     348      gam(i, k) = zx_gam
     349    END DO
     350  END DO
     351
     352  DO k = limcnv, klev
     353    DO i = 1, klon
     354      sb(i, k) = rcpd*tb(i, k) + gz(i, k)
     355      hb(i, k) = sb(i, k) + rlvtt*shb(i, k)
     356      hbs(i, k) = sb(i, k) + rlvtt*shbs(i, k)
     357    END DO
     358  END DO
     359
     360  ! Compute sbh, shbh
     361
     362  DO k = limcnv + 1, klev
     363    km1 = k - 1
     364    DO i = 1, klon
     365      sbh(i, k) = 0.5*(sb(i,km1)+sb(i,k))
     366      shbh(i, k) = qhalf(shb(i,km1), shb(i,k), shbs(i,km1), shbs(i,k))
     367      hbh(i, k) = sbh(i, k) + rlvtt*shbh(i, k)
     368    END DO
     369  END DO
     370
     371  ! Specify properties at top of model (not used, but filling anyway)
     372
     373  DO i = 1, klon
     374    sbh(i, limcnv) = sb(i, limcnv)
     375    shbh(i, limcnv) = shb(i, limcnv)
     376    hbh(i, limcnv) = hb(i, limcnv)
     377  END DO
     378
     379  ! Zero vertically independent control, tendency & diagnostic arrays
     380
     381  DO i = 1, klon
     382    prec(i) = 0.0
     383    dzcld(i) = 0.0
     384    cnb(i) = 0
     385    cnt(i) = klev + 1
     386  END DO
     387
     388  DO k = 1, klev
     389    DO i = 1, klon
     390      cmfdt(i, k) = 0.
     391      cmfdq(i, k) = 0.
     392      cmfdqr(i, k) = 0.
     393      cmfmc(i, k) = 0.
     394      cmfsl(i, k) = 0.
     395      cmflq(i, k) = 0.
     396    END DO
     397  END DO
     398
     399  ! Begin moist convective mass flux adjustment procedure.
     400  ! Formalism ensures that negative cloud liquid water can never occur
     401
     402  DO k = klev - 1, limcnv + 1, -1
     403    km1 = k - 1
     404    kp1 = k + 1
     405    DO i = 1, klon
     406      eta(i) = 0.0
     407      beta(i) = 0.0
     408      ds1(i) = 0.0
     409      ds2(i) = 0.0
     410      ds3(i) = 0.0
     411      dq1(i) = 0.0
     412      dq2(i) = 0.0
     413      dq3(i) = 0.0
     414
     415      ! Specification of "cloud base" conditions
     416
     417      qprime = 0.0
     418      tprime = 0.0
     419
     420      ! Assign tprime within the PBL to be proportional to the quantity
     421      ! thtap (which will be bounded by tpmax), passed to this routine by
     422      ! the PBL routine.  Don't allow perturbation to produce a dry
     423      ! adiabatically unstable parcel.  Assign qprime within the PBL to be
     424      ! an appropriately modified value of the quantity shp (which will be
     425      ! bounded by shpmax) passed to this routine by the PBL routine.  The
     426      ! quantity qprime should be less than the local saturation value
     427      ! (qsattp=qsat[t+tprime,p]).  In both cases, thtap and shp are
     428      ! linearly reduced toward zero as the PBL top is approached.
     429
     430      pblhgt = max(pblh(i), 1.0)
     431      IF (gz(i,kp1)/rg<=pblhgt .AND. dzcld(i)==0.0) THEN
     432        fac1 = max(0.0, 1.0-gz(i,kp1)/rg/pblhgt)
     433        tprime = min(thtap(i), tpmax)*fac1
     434        qsattp = shbs(i, kp1) + rcpd/rlvtt*gam(i, kp1)*tprime
     435        shprme = min(min(shp(i),shpmax)*fac1, max(qsattp-shb(i,kp1),0.0))
     436        qprime = max(qprime, shprme)
     437      ELSE
     438        tprime = 0.0
     439        qprime = 0.0
     440      END IF
     441
     442      ! Specify "updraft" (in-cloud) thermodynamic properties
     443
     444      sc(i) = sb(i, kp1) + rcpd*tprime
     445      shc(i) = shb(i, kp1) + qprime
     446      hc(i) = sc(i) + rlvtt*shc(i)
     447      flotab(i) = hc(i) - hbs(i, k)
     448      dz = dp(i, k)*rd*tb(i, k)/rg/p(i, k)
     449      IF (flotab(i)>0.0) THEN
     450        dzcld(i) = dzcld(i) + dz
     451      ELSE
     452        dzcld(i) = 0.0
     453      END IF
     454    END DO
     455
     456    ! Check on moist convective instability
     457
     458    is = 0
     459    DO i = 1, klon
     460      IF (flotab(i)>0.0) THEN
     461        ldcum(i) = .TRUE.
     462        is = is + 1
     463      ELSE
     464        ldcum(i) = .FALSE.
     465      END IF
     466    END DO
     467
     468    IF (is==0) THEN
    75469      DO i = 1, klon
    76          pt(i,k) = t(i,klev-k+1)
    77          pq(i,k) = q(i,klev-k+1)
    78          pres(i,k) = pplay(i,klev-k+1)
    79          dp(i,k) = paprs(i,klev+1-k)-paprs(i,klev+1-k+1)
    80       ENDDO
    81       ENDDO
     470        dzcld(i) = 0.0
     471      END DO
     472      GO TO 70
     473    END IF
     474
     475    ! Current level just below top level => no overshoot
     476
     477    IF (k<=limcnv+1) THEN
    82478      DO i = 1, klon
    83          zgeom(i,klev) = RD * t(i,1) / (0.5*(paprs(i,1)+pplay(i,1)))
    84      .                      * (paprs(i,1)-pplay(i,1))
    85       ENDDO
    86       DO k = 2, klev
     479        IF (ldcum(i)) THEN
     480          cldwtr(i) = sb(i, k) - sc(i) + flotab(i)/(1.0+gam(i,k))
     481          cldwtr(i) = max(0.0, cldwtr(i))
     482          beta(i) = 0.0
     483        END IF
     484      END DO
     485      GO TO 20
     486    END IF
     487
     488    ! First guess at overshoot parameter using crude buoyancy closure
     489    ! 10% overshoot assumed as a minimum and 1-c0*dz maximum to start
     490    ! If pre-existing supersaturation in detrainment layer, beta=0
     491    ! cldwtr is temporarily equal to RLVTT*l (l=> liquid water)
     492
     493    DO i = 1, klon
     494      IF (ldcum(i)) THEN
     495        cldwtr(i) = sb(i, k) - sc(i) + flotab(i)/(1.0+gam(i,k))
     496        cldwtr(i) = max(0.0, cldwtr(i))
     497        betamx = 1.0 - c0*max(0.0, (dzcld(i)-dzmin))
     498        b1 = (hc(i)-hbs(i,km1))*dp(i, km1)
     499        b2 = (hc(i)-hbs(i,k))*dp(i, k)
     500        beta(i) = max(betamn, min(betamx,1.0+b1/b2))
     501        IF (hbs(i,km1)<=hb(i,km1)) beta(i) = 0.0
     502      END IF
     503    END DO
     504
     505    ! Bound maximum beta to ensure physically realistic solutions
     506
     507    ! First check constrains beta so that eta remains positive
     508    ! (assuming that eta is already positive for beta equal zero)
     509    ! La premiere contrainte de beta est que le flux eta doit etre positif.
     510
     511    DO i = 1, klon
     512      IF (ldcum(i)) THEN
     513        tmp1 = (1.0+gam(i,k))*(sc(i)-sbh(i,kp1)+cldwtr(i)) - &
     514          (hbh(i,kp1)-hc(i))*dp(i, k)/dp(i, kp1)
     515        tmp2 = (1.0+gam(i,k))*(sc(i)-sbh(i,k))
     516        IF ((beta(i)*tmp2-tmp1)>0.0) THEN
     517          betamx = 0.99*(tmp1/tmp2)
     518          beta(i) = max(0.0, min(betamx,beta(i)))
     519        END IF
     520
     521        ! Second check involves supersaturation of "detrainment layer"
     522        ! small amount of supersaturation acceptable (by ssfac factor)
     523        ! La 2e contrainte est que la convection ne doit pas sursaturer
     524        ! la "detrainment layer", Neanmoins, une petite sursaturation
     525        ! est acceptee (facteur ssfac).
     526
     527        IF (hb(i,km1)<hbs(i,km1)) THEN
     528          tmp1 = (1.0+gam(i,k))*(sc(i)-sbh(i,kp1)+cldwtr(i)) - &
     529            (hbh(i,kp1)-hc(i))*dp(i, k)/dp(i, kp1)
     530          tmp1 = tmp1/dp(i, k)
     531          tmp2 = gam(i, km1)*(sbh(i,k)-sc(i)+cldwtr(i)) - hbh(i, k) + hc(i) - &
     532            sc(i) + sbh(i, k)
     533          tmp3 = (1.0+gam(i,k))*(sc(i)-sbh(i,k))/dp(i, k)
     534          tmp4 = (dt/cats)*(hc(i)-hbs(i,k))*tmp2/(dp(i,km1)*(hbs(i,km1)-hb(i, &
     535            km1))) + tmp3
     536          IF ((beta(i)*tmp4-tmp1)>0.0) THEN
     537            betamx = ssfac*(tmp1/tmp4)
     538            beta(i) = max(0.0, min(betamx,beta(i)))
     539          END IF
     540        ELSE
     541          beta(i) = 0.0
     542        END IF
     543
     544        ! Third check to avoid introducing 2 delta x thermodynamic
     545        ! noise in the vertical ... constrain adjusted h (or theta e)
     546        ! so that the adjustment doesn't contribute to "kinks" in h
     547
     548        g = min(0.0, hb(i,k)-hb(i,km1))
     549        tmp3 = (hb(i,k)-hb(i,km1)-g)*(cats/dt)/(hc(i)-hbs(i,k))
     550        tmp1 = (1.0+gam(i,k))*(sc(i)-sbh(i,kp1)+cldwtr(i)) - &
     551          (hbh(i,kp1)-hc(i))*dp(i, k)/dp(i, kp1)
     552        tmp1 = tmp1/dp(i, k)
     553        tmp1 = tmp3*tmp1 + (hc(i)-hbh(i,kp1))/dp(i, k)
     554        tmp2 = tmp3*(1.0+gam(i,k))*(sc(i)-sbh(i,k))/dp(i, k) + &
     555          (hc(i)-hbh(i,k)-cldwtr(i))*(1.0/dp(i,k)+1.0/dp(i,kp1))
     556        IF ((beta(i)*tmp2-tmp1)>0.0) THEN
     557          betamx = 0.0
     558          IF (tmp2/=0.0) betamx = tmp1/tmp2
     559          beta(i) = max(0.0, min(betamx,beta(i)))
     560        END IF
     561      END IF
     562    END DO
     563
     564    ! Calculate mass flux required for stabilization.
     565
     566    ! Ensure that the convective mass flux, eta, is positive by
     567    ! setting negative values of eta to zero..
     568    ! Ensure that estimated mass flux cannot move more than the
     569    ! minimum of total mass contained in either layer k or layer k+1.
     570    ! Also test for other pathological cases that result in non-
     571    ! physical states and adjust eta accordingly.
     572
     57320  CONTINUE
     574    DO i = 1, klon
     575      IF (ldcum(i)) THEN
     576        beta(i) = max(0.0, beta(i))
     577        tmp1 = hc(i) - hbs(i, k)
     578        tmp2 = ((1.0+gam(i,k))*(sc(i)-sbh(i,kp1)+cldwtr(i))-beta(i)*(1.0+gam( &
     579          i,k))*(sc(i)-sbh(i,k)))/dp(i, k) - (hbh(i,kp1)-hc(i))/dp(i, kp1)
     580        eta(i) = tmp1/(tmp2*rg*cats)
     581        tmass = min(dp(i,k), dp(i,kp1))/rg
     582        IF (eta(i)>tmass*rdt .OR. eta(i)<=0.0) eta(i) = 0.0
     583
     584        ! Check on negative q in top layer (bound beta)
     585
     586        IF (shc(i)-shbh(i,k)<0.0 .AND. beta(i)*eta(i)/=0.0) THEN
     587          denom = eta(i)*rg*dt*(shc(i)-shbh(i,k))/dp(i, km1)
     588          beta(i) = max(0.0, min(-0.999*shb(i,km1)/denom,beta(i)))
     589        END IF
     590
     591        ! Check on negative q in middle layer (zero eta)
     592
     593        qtest1 = shb(i, k) + eta(i)*rg*dt*((shc(i)-shbh(i, &
     594          kp1))-(1.0-beta(i))*cldwtr(i)/rlvtt-beta(i)*(shc(i)-shbh(i, &
     595          k)))/dp(i, k)
     596        IF (qtest1<=0.0) eta(i) = 0.0
     597
     598        ! Check on negative q in lower layer (bound eta)
     599
     600        fac1 = -(shbh(i,kp1)-shc(i))/dp(i, kp1)
     601        qtest2 = shb(i, kp1) - eta(i)*rg*dt*fac1
     602        IF (qtest2<0.0) THEN
     603          eta(i) = 0.99*shb(i, kp1)/(rg*dt*fac1)
     604        END IF
     605      END IF
     606    END DO
     607
     608
     609    ! Calculate cloud water, rain water, and thermodynamic changes
     610
     611    DO i = 1, klon
     612      IF (ldcum(i)) THEN
     613        etagdt = eta(i)*rg*dt
     614        cldwtr(i) = etagdt*cldwtr(i)/rlvtt/rg
     615        rnwtr(i) = (1.0-beta(i))*cldwtr(i)
     616        ds1(i) = etagdt*(sbh(i,kp1)-sc(i))/dp(i, kp1)
     617        dq1(i) = etagdt*(shbh(i,kp1)-shc(i))/dp(i, kp1)
     618        ds2(i) = (etagdt*(sc(i)-sbh(i,kp1))+rlvtt*rg*cldwtr(i)-beta(i)*etagdt &
     619          *(sc(i)-sbh(i,k)))/dp(i, k)
     620        dq2(i) = (etagdt*(shc(i)-shbh(i,kp1))-rg*rnwtr(i)-beta(i)*etagdt*(shc &
     621          (i)-shbh(i,k)))/dp(i, k)
     622        ds3(i) = beta(i)*(etagdt*(sc(i)-sbh(i,k))-rlvtt*rg*cldwtr(i))/dp(i, &
     623          km1)
     624        dq3(i) = beta(i)*etagdt*(shc(i)-shbh(i,k))/dp(i, km1)
     625
     626        ! Isolate convective fluxes for later diagnostics
     627
     628        fslkp = eta(i)*(sc(i)-sbh(i,kp1))
     629        fslkm = beta(i)*(eta(i)*(sc(i)-sbh(i,k))-rlvtt*cldwtr(i)*rdt)
     630        fqlkp = eta(i)*(shc(i)-shbh(i,kp1))
     631        fqlkm = beta(i)*eta(i)*(shc(i)-shbh(i,k))
     632
     633
     634        ! Update thermodynamic profile (update sb, hb, & hbs later)
     635
     636        tb(i, kp1) = tb(i, kp1) + ds1(i)/rcpd
     637        tb(i, k) = tb(i, k) + ds2(i)/rcpd
     638        tb(i, km1) = tb(i, km1) + ds3(i)/rcpd
     639        shb(i, kp1) = shb(i, kp1) + dq1(i)
     640        shb(i, k) = shb(i, k) + dq2(i)
     641        shb(i, km1) = shb(i, km1) + dq3(i)
     642        prec(i) = prec(i) + rnwtr(i)/rhoh2o
     643
     644        ! Update diagnostic information for final budget
     645        ! Tracking temperature & specific humidity tendencies,
     646        ! rainout term, convective mass flux, convective liquid
     647        ! water static energy flux, and convective total water flux
     648
     649        cmfdt(i, kp1) = cmfdt(i, kp1) + ds1(i)/rcpd*rdt
     650        cmfdt(i, k) = cmfdt(i, k) + ds2(i)/rcpd*rdt
     651        cmfdt(i, km1) = cmfdt(i, km1) + ds3(i)/rcpd*rdt
     652        cmfdq(i, kp1) = cmfdq(i, kp1) + dq1(i)*rdt
     653        cmfdq(i, k) = cmfdq(i, k) + dq2(i)*rdt
     654        cmfdq(i, km1) = cmfdq(i, km1) + dq3(i)*rdt
     655        cmfdqr(i, k) = cmfdqr(i, k) + (rg*rnwtr(i)/dp(i,k))*rdt
     656        cmfmc(i, kp1) = cmfmc(i, kp1) + eta(i)
     657        cmfmc(i, k) = cmfmc(i, k) + beta(i)*eta(i)
     658        cmfsl(i, kp1) = cmfsl(i, kp1) + fslkp
     659        cmfsl(i, k) = cmfsl(i, k) + fslkm
     660        cmflq(i, kp1) = cmflq(i, kp1) + rlvtt*fqlkp
     661        cmflq(i, k) = cmflq(i, k) + rlvtt*fqlkm
     662        qc(i, k) = (rg*rnwtr(i)/dp(i,k))*rdt
     663      END IF
     664    END DO
     665
     666    ! Next, convectively modify passive constituents
     667
     668    DO m = 1, pcnst
    87669      DO i = 1, klon
    88          zgeom(i,klev+1-k) = zgeom(i,klev+1-k+1)
    89      .              + RD * 0.5*(t(i,k-1)+t(i,k)) / paprs(i,k)
    90      .                   * (pplay(i,k-1)-pplay(i,k))
    91       ENDDO
    92       ENDDO
    93 c
    94       CALL cmfmca(dtime, pres, dp, zgeom, pt, pq,
    95      $                  cmfprt, cmfprs, ntop, nbas)
    96 C
    97       DO k = 1, klev
    98       DO i = 1, klon
    99          d_q(i,klev+1-k) = pq(i,k) - q(i,klev+1-k)
    100          d_t(i,klev+1-k) = pt(i,k) - t(i,klev+1-k)
    101       ENDDO
    102       ENDDO
    103 c
    104       DO i = 1, klon
    105          rain(i) = cmfprt(i) * rhoh2o
    106          snow(i) = cmfprs(i) * rhoh2o
    107          kbascm(i) = klev+1 - nbas(i)
    108          ktopcm(i) = klev+1 - ntop(i)
    109       ENDDO
    110 c
    111       IF (usekuo) THEN
    112       CALL conkuo(dtime, paprs, pplay, t, q, conv_q,
    113      s            d_t_bis, d_q_bis, d_ql_bis, rneb_bis,
    114      s            rain_bis, snow_bis, ibas_bis, itop_bis)
    115       DO k = 1, klev
    116       DO i = 1, klon
    117          d_t(i,k) = d_t(i,k) + d_t_bis(i,k)
    118          d_q(i,k) = d_q(i,k) + d_q_bis(i,k)
    119       ENDDO
    120       ENDDO
    121       DO i = 1, klon
    122          rain(i) = rain(i) + rain_bis(i)
    123          snow(i) = snow(i) + snow_bis(i)
    124          kbascm(i) = MIN(kbascm(i),ibas_bis(i))
    125          ktopcm(i) = MAX(ktopcm(i),itop_bis(i))
    126       ENDDO
    127       DO k = 1, klev ! eau liquide convective est
    128       DO i = 1, klon ! dispersee dans l'air
    129          zlvdcp=RLVTT/RCPD/(1.0+RVTMP2*q(i,k))
    130          zlsdcp=RLSTT/RCPD/(1.0+RVTMP2*q(i,k))
    131          zdelta = MAX(0.,SIGN(1.,RTT-t(i,k)))
    132          zz = d_ql_bis(i,k) ! re-evap. de l'eau liquide
    133          zb = MAX(0.0,zz)
    134          za = - MAX(0.0,zz) * (zlvdcp*(1.-zdelta)+zlsdcp*zdelta)
    135          d_t(i,k) = d_t(i,k) + za
    136          d_q(i,k) = d_q(i,k) + zb
    137       ENDDO
    138       ENDDO
    139       ENDIF
    140 c
    141       RETURN
    142       END
    143       SUBROUTINE cmfmca(deltat, p, dp, gz,
    144      $                  tb, shb,
    145      $                  cmfprt, cmfprs, cnt, cnb)
    146       USE dimphy
    147       IMPLICIT none
    148 C-----------------------------------------------------------------------
    149 C Moist convective mass flux procedure:
    150 C If stratification is unstable to nonentraining parcel ascent,
    151 C complete an adjustment making use of a simple cloud model
    152 C
    153 C Code generalized to allow specification of parcel ("updraft")
    154 C properties, as well as convective transport of an arbitrary
    155 C number of passive constituents (see cmrb array).
    156 C----------------------------Code History-------------------------------
    157 C Original version:  J. J. Hack, March 22, 1990
    158 C Standardized:      J. Rosinski, June 1992
    159 C Reviewed:          J. Hack, G. Taylor, August 1992
    160 c Adaptation au LMD: Z.X. Li, mars 1996 (reference: Hack 1994,
    161 c                    J. Geophys. Res. vol 99, D3, 5551-5568). J'ai
    162 c                    introduit les constantes et les fonctions thermo-
    163 c                    dynamiques du Centre Europeen. J'ai elimine le
    164 c                    re-indicage du code en esperant que cela pourra
    165 c                    simplifier la lecture et la comprehension.
    166 C-----------------------------------------------------------------------
    167 cym#include "dimensions.h"
    168 cym#include "dimphy.h"
    169       INTEGER pcnst ! nombre de traceurs passifs
    170       PARAMETER (pcnst=1)
    171 C------------------------------Arguments--------------------------------
    172 C Input arguments
    173 C
    174       REAL deltat                 ! time step (seconds)
    175       REAL p(klon,klev)           ! pressure
    176       REAL dp(klon,klev)          ! delta-p
    177       REAL gz(klon,klev)          ! geopotential (a partir du sol)
    178 c
    179       REAL thtap(klon)            ! PBL perturbation theta
    180       REAL shp(klon)              ! PBL perturbation specific humidity
    181       REAL pblh(klon)             ! PBL height (provided by PBL routine)
    182       REAL cmrp(klon,pcnst)       ! constituent perturbations in PBL
    183 c
    184 c Updated arguments:
    185 c
    186       REAL tb(klon,klev)         ! temperature (t bar)
    187       REAL shb(klon,klev)        ! specific humidity (sh bar)
    188       REAL cmrb(klon,klev,pcnst) ! constituent mixing ratios (cmr bar)
    189 C
    190 C Output arguments
    191 C
    192       REAL cmfdt(klon,klev)    ! dT/dt due to moist convection
    193       REAL cmfdq(klon,klev)    ! dq/dt due to moist convection
    194       REAL cmfmc(klon,klev )   ! moist convection cloud mass flux
    195       REAL cmfdqr(klon,klev)   ! dq/dt due to convective rainout
    196       REAL cmfsl(klon,klev )   ! convective lw static energy flux
    197       REAL cmflq(klon,klev )   ! convective total water flux
    198       REAL cmfprt(klon)        ! convective precipitation rate
    199       REAL cmfprs(klon)        ! convective snowfall rate
    200       REAL qc(klon,klev)       ! dq/dt due to rainout terms
    201       INTEGER cnt(klon)        ! top level of convective activity   
    202       INTEGER cnb(klon)        ! bottom level of convective activity
    203 C------------------------------Parameters-------------------------------
    204       REAL c0         ! rain water autoconversion coefficient
    205       PARAMETER (c0=1.0e-4)
    206       REAL dzmin       ! minimum convective depth for precipitation
    207       PARAMETER (dzmin=0.0)
    208       REAL betamn      ! minimum overshoot parameter
    209       PARAMETER (betamn=0.10)
    210       REAL cmftau      ! characteristic adjustment time scale
    211       PARAMETER (cmftau=3600.)
    212       INTEGER limcnv   ! top interface level limit for convection
    213       PARAMETER (limcnv=1)
    214       REAL tpmax       ! maximum acceptable t perturbation (degrees C)
    215       PARAMETER (tpmax=1.50)
    216       REAL shpmax      ! maximum acceptable q perturbation (g/g)
    217       PARAMETER (shpmax=1.50e-3)
    218       REAL tiny        ! arbitrary small num used in transport estimates
    219       PARAMETER (tiny=1.0e-36)
    220       REAL eps         ! convergence criteria (machine dependent)
    221       PARAMETER (eps=1.0e-13)
    222       REAL tmelt       ! freezing point of water(req'd for rain vs snow)
    223       PARAMETER (tmelt=273.15)
    224       REAL ssfac ! supersaturation bound (detrained air)
    225       PARAMETER (ssfac=1.001)
    226 C
    227 C---------------------------Local workspace-----------------------------
    228       REAL gam(klon,klev)     ! L/cp (d(qsat)/dT)
    229       REAL sb(klon,klev)      ! dry static energy (s bar)
    230       REAL hb(klon,klev)      ! moist static energy (h bar)
    231       REAL shbs(klon,klev)    ! sat. specific humidity (sh bar star)
    232       REAL hbs(klon,klev)     ! sat. moist static energy (h bar star)
    233       REAL shbh(klon,klev+1)  ! specific humidity on interfaces
    234       REAL sbh(klon,klev+1)   ! s bar on interfaces
    235       REAL hbh(klon,klev+1)   ! h bar on interfaces
    236       REAL cmrh(klon,klev+1)  ! interface constituent mixing ratio
    237       REAL prec(klon)         ! instantaneous total precipitation
    238       REAL dzcld(klon)        ! depth of convective layer (m)
    239       REAL beta(klon)         ! overshoot parameter (fraction)
    240       REAL betamx             ! local maximum on overshoot
    241       REAL eta(klon)          ! convective mass flux (kg/m^2 s)
    242       REAL etagdt             ! eta*grav*deltat
    243       REAL cldwtr(klon)       ! cloud water (mass)
    244       REAL rnwtr(klon)        ! rain water  (mass)
    245       REAL sc  (klon)         ! dry static energy   ("in-cloud")
    246       REAL shc (klon)         ! specific humidity   ("in-cloud")
    247       REAL hc  (klon)         ! moist static energy ("in-cloud")
    248       REAL cmrc(klon)         ! constituent mix rat ("in-cloud")
    249       REAL dq1(klon)          ! shb  convective change (lower lvl)
    250       REAL dq2(klon)          ! shb  convective change (mid level)
    251       REAL dq3(klon)          ! shb  convective change (upper lvl)
    252       REAL ds1(klon)          ! sb   convective change (lower lvl)
    253       REAL ds2(klon)          ! sb   convective change (mid level)
    254       REAL ds3(klon)          ! sb   convective change (upper lvl)
    255       REAL dcmr1(klon)        ! cmrb convective change (lower lvl)
    256       REAL dcmr2(klon)        ! cmrb convective change (mid level)
    257       REAL dcmr3(klon)        ! cmrb convective change (upper lvl)
    258       REAL flotab(klon)       ! hc - hbs (mesure d'instabilite)
    259       LOGICAL ldcum(klon)     ! .true. si la convection existe
    260       LOGICAL etagt0          ! true if eta > 0.0
    261       REAL dt                 ! current 2 delta-t (model time step)
    262       REAL cats     ! modified characteristic adj. time
    263       REAL rdt      ! 1./dt
    264       REAL qprime   ! modified specific humidity pert.
    265       REAL tprime   ! modified thermal perturbation
    266       REAL pblhgt   ! bounded pbl height (max[pblh,1m])
    267       REAL fac1     ! intermediate scratch variable
    268       REAL shprme   ! intermediate specific humidity pert.
    269       REAL qsattp   ! saturation mixing ratio for
    270 C                   !  thermally perturbed PBL parcels
    271       REAL dz       ! local layer depth
    272       REAL b1       ! bouyancy measure in detrainment lvl
    273       REAL b2       ! bouyancy measure in condensation lvl
    274       REAL g     ! bounded vertical gradient of hb
    275       REAL tmass ! total mass available for convective exchange
    276       REAL denom ! intermediate scratch variable
    277       REAL qtest1! used in negative q test (middle lvl)
    278       REAL qtest2! used in negative q test (lower lvl)
    279       REAL fslkp ! flux lw static energy (bot interface)
    280       REAL fslkm ! flux lw static energy (top interface)
    281       REAL fqlkp ! flux total water (bottom interface)
    282       REAL fqlkm ! flux total water (top interface)
    283       REAL botflx! bottom constituent mixing ratio flux
    284       REAL topflx! top constituent mixing ratio flux
    285       REAL efac1 ! ratio cmrb to convectively induced change (bot lvl)
    286       REAL efac2 ! ratio cmrb to convectively induced change (mid lvl)
    287       REAL efac3 ! ratio cmrb to convectively induced change (top lvl)
    288 c
    289       INTEGER i,k  ! indices horizontal et vertical
    290       INTEGER km1  ! k-1 (index offset)
    291       INTEGER kp1  ! k+1 (index offset)
    292       INTEGER m    ! constituent index
    293       INTEGER ktp  ! temporary index used to track top
    294       INTEGER is   ! nombre de points a ajuster
    295 C
    296       REAL tmp1, tmp2, tmp3, tmp4
    297       REAL zx_t, zx_p, zx_q, zx_qs, zx_gam
    298       REAL zcor, zdelta, zcvm5
    299 C
    300       REAL qhalf, sh1, sh2, shbs1, shbs2
    301 #include "YOMCST.h"
    302 #include "YOETHF.h"
    303 #include "FCTTRE.h"
    304       qhalf(sh1,sh2,shbs1,shbs2) = MIN(MAX(sh1,sh2),
    305      $                            (shbs2*sh1 + shbs1*sh2)/(shbs1+shbs2))
    306 C
    307 C-----------------------------------------------------------------------
    308 c pas de traceur pour l'instant
    309       DO m = 1, pcnst
    310       DO k = 1, klev
    311       DO i = 1, klon
    312          cmrb(i,k,m) = 0.0
    313       ENDDO
    314       ENDDO
    315       ENDDO
    316 c
    317 c Les perturbations de la couche limite sont zero pour l'instant
    318 c
    319       DO m = 1, pcnst
    320       DO i = 1, klon
    321          cmrp(i,m) = 0.0
    322       ENDDO
    323       ENDDO
    324       DO i = 1, klon
    325          thtap(i) = 0.0
    326          shp(i) = 0.0
    327          pblh(i) = 1.0
    328       ENDDO
    329 C
    330 C Ensure that characteristic adjustment time scale (cmftau) assumed
    331 C in estimate of eta isn't smaller than model time scale (deltat)
    332 C
    333       dt   = deltat
    334       cats = MAX(dt,cmftau)
    335       rdt  = 1.0/dt
    336 C
    337 C Compute sb,hb,shbs,hbs
    338 C
    339       DO k = 1, klev
    340       DO i = 1, klon
    341          zx_t = tb(i,k)
    342          zx_p = p(i,k)
    343          zx_q = shb(i,k)
    344            zdelta=MAX(0.,SIGN(1.,RTT-zx_t))
    345            zcvm5 = R5LES*RLVTT*(1.-zdelta) + R5IES*RLSTT*zdelta
    346            zcvm5 = zcvm5 / RCPD / (1.0+RVTMP2*zx_q)
    347            zx_qs= r2es * FOEEW(zx_t,zdelta)/zx_p
    348            zx_qs=MIN(0.5,zx_qs)
    349            zcor=1./(1.-retv*zx_qs)
    350            zx_qs=zx_qs*zcor
    351            zx_gam = FOEDE(zx_t,zdelta,zcvm5,zx_qs,zcor)
    352          shbs(i,k) = zx_qs
    353          gam(i,k) = zx_gam
    354       ENDDO
    355       ENDDO
    356 C
    357       DO k=limcnv,klev
    358          DO i=1,klon
    359             sb (i,k) = RCPD*tb(i,k) + gz(i,k)
    360             hb (i,k) = sb(i,k) + RLVTT*shb(i,k)
    361             hbs(i,k) = sb(i,k) + RLVTT*shbs(i,k)
    362          ENDDO
    363       ENDDO
    364 C
    365 C Compute sbh, shbh
    366 C
    367       DO k=limcnv+1,klev
    368          km1 = k - 1
    369          DO i=1,klon
    370             sbh (i,k) =0.5*(sb(i,km1) + sb(i,k))
    371             shbh(i,k) =qhalf(shb(i,km1),shb(i,k),shbs(i,km1),shbs(i,k))
    372             hbh (i,k) =sbh(i,k) + RLVTT*shbh(i,k)
    373          ENDDO
    374       ENDDO
    375 C
    376 C Specify properties at top of model (not used, but filling anyway)
    377 C
    378       DO i=1,klon
    379          sbh (i,limcnv) = sb(i,limcnv)
    380          shbh(i,limcnv) = shb(i,limcnv)
    381          hbh (i,limcnv) = hb(i,limcnv)
    382       ENDDO
    383 C
    384 C Zero vertically independent control, tendency & diagnostic arrays
    385 C
    386       DO i=1,klon
    387          prec(i)  = 0.0
    388          dzcld(i) = 0.0
    389          cnb(i)   = 0
    390          cnt(i)   = klev+1
    391       ENDDO
    392 
    393       DO k = 1, klev
    394         DO i = 1,klon
    395          cmfdt(i,k)  = 0.
    396          cmfdq(i,k)  = 0.
    397          cmfdqr(i,k) = 0.
    398          cmfmc(i,k)  = 0.
    399          cmfsl(i,k)  = 0.
    400          cmflq(i,k)  = 0.
    401         ENDDO
    402       ENDDO
    403 C
    404 C Begin moist convective mass flux adjustment procedure.
    405 C Formalism ensures that negative cloud liquid water can never occur
    406 C
    407       DO 70 k=klev-1,limcnv+1,-1
    408          km1 = k - 1
    409          kp1 = k + 1
    410          DO 10 i=1,klon
    411             eta   (i) = 0.0
    412             beta  (i) = 0.0
    413             ds1   (i) = 0.0
    414             ds2   (i) = 0.0
    415             ds3   (i) = 0.0
    416             dq1   (i) = 0.0
    417             dq2   (i) = 0.0
    418             dq3   (i) = 0.0
    419 C
    420 C Specification of "cloud base" conditions
    421 C
    422             qprime    = 0.0
    423             tprime    = 0.0
    424 C
    425 C Assign tprime within the PBL to be proportional to the quantity
    426 C thtap (which will be bounded by tpmax), passed to this routine by
    427 C the PBL routine.  Don't allow perturbation to produce a dry
    428 C adiabatically unstable parcel.  Assign qprime within the PBL to be
    429 C an appropriately modified value of the quantity shp (which will be
    430 C bounded by shpmax) passed to this routine by the PBL routine.  The
    431 C quantity qprime should be less than the local saturation value
    432 C (qsattp=qsat[t+tprime,p]).  In both cases, thtap and shp are
    433 C linearly reduced toward zero as the PBL top is approached.
    434 C
    435             pblhgt = MAX(pblh(i),1.0)
    436             IF (gz(i,kp1)/RG.LE.pblhgt .AND. dzcld(i).EQ.0.0) THEN
    437                fac1   = MAX(0.0,1.0-gz(i,kp1)/RG/pblhgt)
    438                tprime = MIN(thtap(i),tpmax)*fac1
    439                qsattp = shbs(i,kp1) + RCPD/RLVTT*gam(i,kp1)*tprime
    440                shprme = MIN(MIN(shp(i),shpmax)*fac1,
    441      $                        MAX(qsattp-shb(i,kp1),0.0))
    442                qprime = MAX(qprime,shprme)
    443             ELSE
    444                tprime = 0.0
    445                qprime = 0.0
    446             ENDIF
    447 C
    448 C Specify "updraft" (in-cloud) thermodynamic properties
    449 C
    450             sc (i)    = sb (i,kp1) + RCPD*tprime
    451             shc(i)    = shb(i,kp1) + qprime
    452             hc (i)    = sc (i    ) + RLVTT*shc(i)
    453             flotab(i) = hc(i) - hbs(i,k)
    454             dz        = dp(i,k)*RD*tb(i,k)/RG/p(i,k)
    455             IF (flotab(i).gt.0.0) THEN
    456                dzcld(i) = dzcld(i) + dz
    457             ELSE
    458                dzcld(i) = 0.0
    459             ENDIF
    460    10    CONTINUE
    461 C
    462 C Check on moist convective instability
    463 C
    464          is = 0
    465          DO i = 1, klon
    466             IF (flotab(i).GT.0.0) THEN
    467                ldcum(i) = .TRUE.
    468                is = is + 1
    469             ELSE
    470                ldcum(i) = .FALSE.
    471             ENDIF
    472          ENDDO
    473 C
    474          IF (is.EQ.0) THEN
    475             DO i=1,klon
    476                dzcld(i) = 0.0
    477             ENDDO
    478             GOTO 70
    479          ENDIF
    480 C
    481 C Current level just below top level => no overshoot
    482 C
    483          IF (k.le.limcnv+1) THEN
    484             DO i=1,klon
    485             IF (ldcum(i)) THEN
    486                cldwtr(i) = sb(i,k)-sc(i)+flotab(i)/(1.0+gam(i,k))
    487                cldwtr(i) = MAX(0.0,cldwtr(i))
    488                beta(i)   = 0.0
    489             ENDIF
    490             ENDDO
    491             GOTO 20
    492          ENDIF
    493 C
    494 C First guess at overshoot parameter using crude buoyancy closure
    495 C 10% overshoot assumed as a minimum and 1-c0*dz maximum to start
    496 C If pre-existing supersaturation in detrainment layer, beta=0
    497 C cldwtr is temporarily equal to RLVTT*l (l=> liquid water)
    498 C
    499          DO i=1,klon
    500          IF (ldcum(i)) THEN
    501             cldwtr(i) = sb(i,k)-sc(i)+flotab(i)/(1.0+gam(i,k))
    502             cldwtr(i) = MAX(0.0,cldwtr(i))
    503             betamx = 1.0 - c0*MAX(0.0,(dzcld(i)-dzmin))
    504             b1        = (hc(i) - hbs(i,km1))*dp(i,km1)
    505             b2        = (hc(i) - hbs(i,k  ))*dp(i,k  )
    506             beta(i)   = MAX(betamn,MIN(betamx, 1.0+b1/b2))
    507             IF (hbs(i,km1).le.hb(i,km1)) beta(i) = 0.0
    508          ENDIF
    509          ENDDO
    510 C
    511 C Bound maximum beta to ensure physically realistic solutions
    512 C
    513 C First check constrains beta so that eta remains positive
    514 C (assuming that eta is already positive for beta equal zero)
    515 c La premiere contrainte de beta est que le flux eta doit etre positif.
    516 C
    517          DO i=1,klon
    518          IF (ldcum(i)) THEN
    519             tmp1 = (1.0+gam(i,k))*(sc(i)-sbh(i,kp1) + cldwtr(i))
    520      $            - (hbh(i,kp1)-hc(i))*dp(i,k)/dp(i,kp1)
    521             tmp2 = (1.0+gam(i,k))*(sc(i)-sbh(i,k))
    522             IF ((beta(i)*tmp2-tmp1).GT.0.0) THEN
    523                betamx = 0.99*(tmp1/tmp2)
    524                beta(i) = MAX(0.0,MIN(betamx,beta(i)))
    525             ENDIF
    526 C
    527 C Second check involves supersaturation of "detrainment layer"
    528 C small amount of supersaturation acceptable (by ssfac factor)
    529 c La 2e contrainte est que la convection ne doit pas sursaturer
    530 c la "detrainment layer", Neanmoins, une petite sursaturation
    531 c est acceptee (facteur ssfac).
    532 C
    533             IF (hb(i,km1).lt.hbs(i,km1)) THEN
    534                tmp1 = (1.0+gam(i,k))*(sc(i)-sbh(i,kp1) + cldwtr(i))
    535      $               - (hbh(i,kp1)-hc(i))*dp(i,k)/dp(i,kp1)
    536                tmp1 = tmp1/dp(i,k)
    537                tmp2 = gam(i,km1)*(sbh(i,k)-sc(i) + cldwtr(i)) -
    538      $                 hbh(i,k) + hc(i) - sc(i) + sbh(i,k)
    539                tmp3 = (1.0+gam(i,k))*(sc(i)-sbh(i,k))/dp(i,k)
    540                tmp4 = (dt/cats)*(hc(i)-hbs(i,k))*tmp2
    541      $               / (dp(i,km1)*(hbs(i,km1)-hb(i,km1))) + tmp3
    542                IF ((beta(i)*tmp4-tmp1).GT.0.0) THEN
    543                   betamx = ssfac*(tmp1/tmp4)
    544                   beta(i)   = MAX(0.0,MIN(betamx,beta(i)))
    545                ENDIF
    546             ELSE
    547                beta(i) = 0.0
    548             ENDIF
    549 C
    550 C Third check to avoid introducing 2 delta x thermodynamic
    551 C noise in the vertical ... constrain adjusted h (or theta e)
    552 C so that the adjustment doesn't contribute to "kinks" in h
    553 C
    554             g = MIN(0.0,hb(i,k)-hb(i,km1))
    555             tmp3 = (hb(i,k)-hb(i,km1)-g)*(cats/dt) / (hc(i)-hbs(i,k))
    556             tmp1 = (1.0+gam(i,k))*(sc(i)-sbh(i,kp1) + cldwtr(i))
    557      $            - (hbh(i,kp1)-hc(i))*dp(i,k)/dp(i,kp1)
    558             tmp1 = tmp1/dp(i,k)
    559             tmp1 = tmp3*tmp1 + (hc(i) - hbh(i,kp1))/dp(i,k)
    560             tmp2 = tmp3*(1.0+gam(i,k))*(sc(i)-sbh(i,k))/dp(i,k)
    561      $            + (hc(i)-hbh(i,k)-cldwtr(i))
    562      $             *(1.0/dp(i,k)+1.0/dp(i,kp1))
    563             IF ((beta(i)*tmp2-tmp1).GT.0.0) THEN
    564                betamx = 0.0
    565                IF (tmp2.NE.0.0) betamx = tmp1/tmp2
    566                beta(i) = MAX(0.0,MIN(betamx,beta(i)))
    567             ENDIF
    568          ENDIF
    569          ENDDO
    570 C
    571 C Calculate mass flux required for stabilization.
    572 C
    573 C Ensure that the convective mass flux, eta, is positive by
    574 C setting negative values of eta to zero..
    575 C Ensure that estimated mass flux cannot move more than the
    576 C minimum of total mass contained in either layer k or layer k+1.
    577 C Also test for other pathological cases that result in non-
    578 C physical states and adjust eta accordingly.
    579 C
    580    20    CONTINUE
    581          DO i=1,klon
    582          IF (ldcum(i)) THEN
    583             beta(i) = MAX(0.0,beta(i))
    584             tmp1 = hc(i) - hbs(i,k)
    585             tmp2 = ((1.0+gam(i,k))*(sc(i)-sbh(i,kp1)+cldwtr(i)) -
    586      $               beta(i)*(1.0+gam(i,k))*(sc(i)-sbh(i,k)))/dp(i,k) -
    587      $              (hbh(i,kp1)-hc(i))/dp(i,kp1)
    588             eta(i) = tmp1/(tmp2*RG*cats)
    589             tmass = MIN(dp(i,k),dp(i,kp1))/RG
    590             IF (eta(i).GT.tmass*rdt .OR. eta(i).LE.0.0) eta(i) = 0.0
    591 C
    592 C Check on negative q in top layer (bound beta)
    593 C
    594             IF(shc(i)-shbh(i,k).LT.0.0 .AND. beta(i)*eta(i).NE.0.0)THEN
    595                denom = eta(i)*RG*dt*(shc(i) - shbh(i,k))/dp(i,km1)
    596                beta(i) = MAX(0.0,MIN(-0.999*shb(i,km1)/denom,beta(i)))
    597             ENDIF
    598 C
    599 C Check on negative q in middle layer (zero eta)
    600 C
    601             qtest1 = shb(i,k) + eta(i)*RG*dt*((shc(i) - shbh(i,kp1)) -
    602      $               (1.0 - beta(i))*cldwtr(i)/RLVTT -
    603      $               beta(i)*(shc(i) - shbh(i,k)))/dp(i,k)
    604             IF (qtest1.le.0.0) eta(i) = 0.0
    605 C
    606 C Check on negative q in lower layer (bound eta)
    607 C
    608             fac1 = -(shbh(i,kp1) - shc(i))/dp(i,kp1)
    609             qtest2 = shb(i,kp1) - eta(i)*RG*dt*fac1
    610             IF (qtest2 .lt. 0.0) THEN
    611                eta(i) = 0.99*shb(i,kp1)/(RG*dt*fac1)
    612             ENDIF
    613          ENDIF
    614          ENDDO
    615 C
    616 C
    617 C Calculate cloud water, rain water, and thermodynamic changes
    618 C
    619          DO 30 i=1,klon
    620          IF (ldcum(i)) THEN
    621             etagdt = eta(i)*RG*dt
    622             cldwtr(i) = etagdt*cldwtr(i)/RLVTT/RG
    623             rnwtr(i) = (1.0 - beta(i))*cldwtr(i)
    624             ds1(i) = etagdt*(sbh(i,kp1) - sc(i))/dp(i,kp1)
    625             dq1(i) = etagdt*(shbh(i,kp1) - shc(i))/dp(i,kp1)
    626             ds2(i) = (etagdt*(sc(i) - sbh(i,kp1)) +
    627      $                RLVTT*RG*cldwtr(i) - beta(i)*etagdt*
    628      $                (sc(i) - sbh(i,k)))/dp(i,k)
    629             dq2(i) = (etagdt*(shc(i) - shbh(i,kp1)) -
    630      $                RG*rnwtr(i) - beta(i)*etagdt*
    631      $                (shc(i) - shbh(i,k)))/dp(i,k)
    632             ds3(i) = beta(i)*(etagdt*(sc(i) - sbh(i,k)) -
    633      $               RLVTT*RG*cldwtr(i))/dp(i,km1)
    634             dq3(i) = beta(i)*etagdt*(shc(i) - shbh(i,k))/dp(i,km1)
    635 C
    636 C Isolate convective fluxes for later diagnostics
    637 C
    638             fslkp = eta(i)*(sc(i) - sbh(i,kp1))
    639             fslkm = beta(i)*(eta(i)*(sc(i) - sbh(i,k)) -
    640      $                       RLVTT*cldwtr(i)*rdt)
    641             fqlkp = eta(i)*(shc(i) - shbh(i,kp1))
    642             fqlkm = beta(i)*eta(i)*(shc(i) - shbh(i,k))
    643 C
    644 C
    645 C Update thermodynamic profile (update sb, hb, & hbs later)
    646 C
    647             tb (i,kp1) = tb(i,kp1)  + ds1(i) / RCPD
    648             tb (i,k  ) = tb(i,k  )  + ds2(i) / RCPD
    649             tb (i,km1) = tb(i,km1)  + ds3(i) / RCPD
    650             shb(i,kp1) = shb(i,kp1) + dq1(i)
    651             shb(i,k  ) = shb(i,k  ) + dq2(i)
    652             shb(i,km1) = shb(i,km1) + dq3(i)
    653             prec(i)    = prec(i)    + rnwtr(i)/rhoh2o
    654 C
    655 C Update diagnostic information for final budget
    656 C Tracking temperature & specific humidity tendencies,
    657 C rainout term, convective mass flux, convective liquid
    658 C water static energy flux, and convective total water flux
    659 C
    660             cmfdt (i,kp1) = cmfdt (i,kp1) + ds1(i)/RCPD*rdt
    661             cmfdt (i,k  ) = cmfdt (i,k  ) + ds2(i)/RCPD*rdt
    662             cmfdt (i,km1) = cmfdt (i,km1) + ds3(i)/RCPD*rdt
    663             cmfdq (i,kp1) = cmfdq (i,kp1) + dq1(i)*rdt
    664             cmfdq (i,k  ) = cmfdq (i,k  ) + dq2(i)*rdt
    665             cmfdq (i,km1) = cmfdq (i,km1) + dq3(i)*rdt
    666             cmfdqr(i,k  ) = cmfdqr(i,k  ) + (RG*rnwtr(i)/dp(i,k))*rdt
    667             cmfmc (i,kp1) = cmfmc (i,kp1) + eta(i)
    668             cmfmc (i,k  ) = cmfmc (i,k  ) + beta(i)*eta(i)
    669             cmfsl (i,kp1) = cmfsl (i,kp1) + fslkp
    670             cmfsl (i,k  ) = cmfsl (i,k  ) + fslkm
    671             cmflq (i,kp1) = cmflq (i,kp1) + RLVTT*fqlkp
    672             cmflq (i,k  ) = cmflq (i,k  ) + RLVTT*fqlkm
    673             qc    (i,k  ) =                (RG*rnwtr(i)/dp(i,k))*rdt
    674          ENDIF
    675    30    CONTINUE
    676 C
    677 C Next, convectively modify passive constituents
    678 C
    679          DO 50 m=1,pcnst
    680          DO 40 i=1,klon
    681          IF (ldcum(i)) THEN
    682 C
    683 C If any of the reported values of the constituent is negative in
    684 C the three adjacent levels, nothing will be done to the profile
    685 C
    686             IF ((cmrb(i,kp1,m).LT.0.0) .OR.
    687      $          (cmrb(i,k,m).LT.0.0) .OR.
    688      $          (cmrb(i,km1,m).LT.0.0)) GOTO 40
    689 C
    690 C Specify constituent interface values (linear interpolation)
    691 C
    692             cmrh(i,k  ) = 0.5*(cmrb(i,km1,m) + cmrb(i,k  ,m))
    693             cmrh(i,kp1) = 0.5*(cmrb(i,k  ,m) + cmrb(i,kp1,m))
    694 C
    695 C Specify perturbation properties of constituents in PBL
    696 C
    697             pblhgt = MAX(pblh(i),1.0)
    698             IF (gz(i,kp1)/RG.LE.pblhgt .AND. dzcld(i).EQ.0.) THEN
    699                fac1 = MAX(0.0,1.0-gz(i,kp1)/RG/pblhgt)
    700                cmrc(i) = cmrb(i,kp1,m) + cmrp(i,m)*fac1
    701             ELSE
    702                cmrc(i) = cmrb(i,kp1,m)
    703             ENDIF
    704 C
    705 C Determine fluxes, flux divergence => changes due to convection
    706 C Logic must be included to avoid producing negative values. A bit
    707 C messy since there are no a priori assumptions about profiles.
    708 C Tendency is modified (reduced) when pending disaster detected.
    709 C
    710             etagdt = eta(i)*RG*dt
    711             botflx   = etagdt*(cmrc(i) - cmrh(i,kp1))
    712             topflx   = beta(i)*etagdt*(cmrc(i)-cmrh(i,k))
    713             dcmr1(i) = -botflx/dp(i,kp1)
    714             efac1    = 1.0
    715             efac2    = 1.0
    716             efac3    = 1.0
    717 C
    718             IF (cmrb(i,kp1,m)+dcmr1(i) .LT. 0.0) THEN
    719                efac1 = MAX(tiny,ABS(cmrb(i,kp1,m)/dcmr1(i)) - eps)
    720             ENDIF
    721 C
    722             IF (efac1.EQ.tiny .OR. efac1.GT.1.0) efac1 = 0.0
    723             dcmr1(i) = -efac1*botflx/dp(i,kp1)
    724             dcmr2(i) = (efac1*botflx - topflx)/dp(i,k)
    725 
    726             IF (cmrb(i,k,m)+dcmr2(i) .LT. 0.0) THEN
    727                efac2 = MAX(tiny,ABS(cmrb(i,k  ,m)/dcmr2(i)) - eps)
    728             ENDIF
    729 C
    730             IF (efac2.EQ.tiny .OR. efac2.GT.1.0) efac2 = 0.0
    731             dcmr2(i) = (efac1*botflx - efac2*topflx)/dp(i,k)
    732             dcmr3(i) = efac2*topflx/dp(i,km1)
    733 C
    734             IF (cmrb(i,km1,m)+dcmr3(i) .LT. 0.0) THEN
    735                efac3 = MAX(tiny,ABS(cmrb(i,km1,m)/dcmr3(i)) - eps)
    736             ENDIF
    737 C
    738             IF (efac3.EQ.tiny .OR. efac3.GT.1.0) efac3 = 0.0
    739             efac3    = MIN(efac2,efac3)
    740             dcmr2(i) = (efac1*botflx - efac3*topflx)/dp(i,k)
    741             dcmr3(i) = efac3*topflx/dp(i,km1)
    742 C
    743             cmrb(i,kp1,m) = cmrb(i,kp1,m) + dcmr1(i)
    744             cmrb(i,k  ,m) = cmrb(i,k  ,m) + dcmr2(i)
    745             cmrb(i,km1,m) = cmrb(i,km1,m) + dcmr3(i)
    746          ENDIF
    747    40    CONTINUE
    748    50    CONTINUE              ! end of m=1,pcnst loop
    749 C
    750          IF (k.EQ.limcnv+1) GOTO 60 ! on ne pourra plus glisser
    751 c
    752 c Dans la procedure de glissage ascendant, les variables thermo-
    753 c dynamiques des couches k et km1 servent au calcul des couches
    754 c superieures. Elles ont donc besoin d'une mise-a-jour.
    755 C
    756          DO i = 1, klon
    757          IF (ldcum(i)) THEN
    758             zx_t = tb(i,k)
    759             zx_p = p(i,k)
    760             zx_q = shb(i,k)
    761               zdelta=MAX(0.,SIGN(1.,RTT-zx_t))
    762               zcvm5 = R5LES*RLVTT*(1.-zdelta) + R5IES*RLSTT*zdelta
    763               zcvm5 = zcvm5 / RCPD / (1.0+RVTMP2*zx_q)
    764               zx_qs= r2es * FOEEW(zx_t,zdelta)/zx_p
    765               zx_qs=MIN(0.5,zx_qs)
    766               zcor=1./(1.-retv*zx_qs)
    767               zx_qs=zx_qs*zcor
    768               zx_gam = FOEDE(zx_t,zdelta,zcvm5,zx_qs,zcor)
    769             shbs(i,k) = zx_qs
    770             gam(i,k) = zx_gam
    771 c
    772             zx_t = tb(i,km1)
    773             zx_p = p(i,km1)
    774             zx_q = shb(i,km1)
    775               zdelta=MAX(0.,SIGN(1.,RTT-zx_t))
    776               zcvm5 = R5LES*RLVTT*(1.-zdelta) + R5IES*RLSTT*zdelta
    777               zcvm5 = zcvm5 / RCPD / (1.0+RVTMP2*zx_q)
    778               zx_qs= r2es * FOEEW(zx_t,zdelta)/zx_p
    779               zx_qs=MIN(0.5,zx_qs)
    780               zcor=1./(1.-retv*zx_qs)
    781               zx_qs=zx_qs*zcor
    782               zx_gam = FOEDE(zx_t,zdelta,zcvm5,zx_qs,zcor)
    783             shbs(i,km1) = zx_qs
    784             gam(i,km1) = zx_gam
    785 C
    786             sb (i,k  ) = sb(i,k  ) + ds2(i)
    787             sb (i,km1) = sb(i,km1) + ds3(i)
    788             hb (i,k  ) = sb(i,k  ) + RLVTT*shb(i,k)
    789             hb (i,km1) = sb(i,km1) + RLVTT*shb(i,km1)
    790             hbs(i,k  ) = sb(i,k  ) + RLVTT*shbs(i,k  )
    791             hbs(i,km1) = sb(i,km1) + RLVTT*shbs(i,km1)
    792 C
    793             sbh (i,k) = 0.5*(sb(i,k) + sb(i,km1))
    794             shbh(i,k) = qhalf(shb(i,km1),shb(i,k)
    795      $                       ,shbs(i,km1),shbs(i,k))
    796             hbh (i,k) = sbh(i,k) + RLVTT*shbh(i,k)
    797             sbh (i,km1) = 0.5*(sb(i,km1) + sb(i,k-2))
    798             shbh(i,km1) = qhalf(shb(i,k-2),shb(i,km1),
    799      $                    shbs(i,k-2),shbs(i,km1))
    800             hbh (i,km1) = sbh(i,km1) + RLVTT*shbh(i,km1)
    801          ENDIF
    802          ENDDO
    803 C
    804 C Ensure that dzcld is reset if convective mass flux zero
    805 C specify the current vertical extent of the convective activity
    806 C top of convective layer determined by size of overshoot param.
    807 C
    808    60    CONTINUE
    809          DO i=1,klon
    810             etagt0 = eta(i).gt.0.0
    811             IF (.not.etagt0) dzcld(i) = 0.0
    812             IF (etagt0 .and. beta(i).gt.betamn) THEN
    813                ktp = km1
    814             ELSE
    815                ktp = k
    816             ENDIF
    817             IF (etagt0) THEN
    818                cnt(i) = MIN(cnt(i),ktp)
    819                cnb(i) = MAX(cnb(i),k)
    820             ENDIF
    821          ENDDO
    822    70 CONTINUE        ! end of k loop
    823 C
    824 C determine whether precipitation, prec, is frozen (snow) or not
    825 C
    826       DO i=1,klon
    827          IF (tb(i,klev).LT.tmelt .AND. tb(i,klev-1).lt.tmelt) THEN
    828              cmfprs(i) = prec(i)*rdt
    829          ELSE
    830              cmfprt(i) = prec(i)*rdt
    831          ENDIF
    832       ENDDO
    833 C
    834       RETURN  ! we're all done ... return to calling procedure
    835       END
     670        IF (ldcum(i)) THEN
     671
     672          ! If any of the reported values of the constituent is negative in
     673          ! the three adjacent levels, nothing will be done to the profile
     674
     675          IF ((cmrb(i,kp1,m)<0.0) .OR. (cmrb(i,k,m)<0.0) .OR. (cmrb(i,km1, &
     676            m)<0.0)) GO TO 40
     677
     678          ! Specify constituent interface values (linear interpolation)
     679
     680          cmrh(i, k) = 0.5*(cmrb(i,km1,m)+cmrb(i,k,m))
     681          cmrh(i, kp1) = 0.5*(cmrb(i,k,m)+cmrb(i,kp1,m))
     682
     683          ! Specify perturbation properties of constituents in PBL
     684
     685          pblhgt = max(pblh(i), 1.0)
     686          IF (gz(i,kp1)/rg<=pblhgt .AND. dzcld(i)==0.) THEN
     687            fac1 = max(0.0, 1.0-gz(i,kp1)/rg/pblhgt)
     688            cmrc(i) = cmrb(i, kp1, m) + cmrp(i, m)*fac1
     689          ELSE
     690            cmrc(i) = cmrb(i, kp1, m)
     691          END IF
     692
     693          ! Determine fluxes, flux divergence => changes due to convection
     694          ! Logic must be included to avoid producing negative values. A bit
     695          ! messy since there are no a priori assumptions about profiles.
     696          ! Tendency is modified (reduced) when pending disaster detected.
     697
     698          etagdt = eta(i)*rg*dt
     699          botflx = etagdt*(cmrc(i)-cmrh(i,kp1))
     700          topflx = beta(i)*etagdt*(cmrc(i)-cmrh(i,k))
     701          dcmr1(i) = -botflx/dp(i, kp1)
     702          efac1 = 1.0
     703          efac2 = 1.0
     704          efac3 = 1.0
     705
     706          IF (cmrb(i,kp1,m)+dcmr1(i)<0.0) THEN
     707            efac1 = max(tiny, abs(cmrb(i,kp1,m)/dcmr1(i))-eps)
     708          END IF
     709
     710          IF (efac1==tiny .OR. efac1>1.0) efac1 = 0.0
     711          dcmr1(i) = -efac1*botflx/dp(i, kp1)
     712          dcmr2(i) = (efac1*botflx-topflx)/dp(i, k)
     713
     714          IF (cmrb(i,k,m)+dcmr2(i)<0.0) THEN
     715            efac2 = max(tiny, abs(cmrb(i,k,m)/dcmr2(i))-eps)
     716          END IF
     717
     718          IF (efac2==tiny .OR. efac2>1.0) efac2 = 0.0
     719          dcmr2(i) = (efac1*botflx-efac2*topflx)/dp(i, k)
     720          dcmr3(i) = efac2*topflx/dp(i, km1)
     721
     722          IF (cmrb(i,km1,m)+dcmr3(i)<0.0) THEN
     723            efac3 = max(tiny, abs(cmrb(i,km1,m)/dcmr3(i))-eps)
     724          END IF
     725
     726          IF (efac3==tiny .OR. efac3>1.0) efac3 = 0.0
     727          efac3 = min(efac2, efac3)
     728          dcmr2(i) = (efac1*botflx-efac3*topflx)/dp(i, k)
     729          dcmr3(i) = efac3*topflx/dp(i, km1)
     730
     731          cmrb(i, kp1, m) = cmrb(i, kp1, m) + dcmr1(i)
     732          cmrb(i, k, m) = cmrb(i, k, m) + dcmr2(i)
     733          cmrb(i, km1, m) = cmrb(i, km1, m) + dcmr3(i)
     734        END IF
     73540    END DO
     736    END DO ! end of m=1,pcnst loop
     737
     738    IF (k==limcnv+1) GO TO 60 ! on ne pourra plus glisser
     739
     740    ! Dans la procedure de glissage ascendant, les variables thermo-
     741    ! dynamiques des couches k et km1 servent au calcul des couches
     742    ! superieures. Elles ont donc besoin d'une mise-a-jour.
     743
     744    DO i = 1, klon
     745      IF (ldcum(i)) THEN
     746        zx_t = tb(i, k)
     747        zx_p = p(i, k)
     748        zx_q = shb(i, k)
     749        zdelta = max(0., sign(1.,rtt-zx_t))
     750        zcvm5 = r5les*rlvtt*(1.-zdelta) + r5ies*rlstt*zdelta
     751        zcvm5 = zcvm5/rcpd/(1.0+rvtmp2*zx_q)
     752        zx_qs = r2es*foeew(zx_t, zdelta)/zx_p
     753        zx_qs = min(0.5, zx_qs)
     754        zcor = 1./(1.-retv*zx_qs)
     755        zx_qs = zx_qs*zcor
     756        zx_gam = foede(zx_t, zdelta, zcvm5, zx_qs, zcor)
     757        shbs(i, k) = zx_qs
     758        gam(i, k) = zx_gam
     759
     760        zx_t = tb(i, km1)
     761        zx_p = p(i, km1)
     762        zx_q = shb(i, km1)
     763        zdelta = max(0., sign(1.,rtt-zx_t))
     764        zcvm5 = r5les*rlvtt*(1.-zdelta) + r5ies*rlstt*zdelta
     765        zcvm5 = zcvm5/rcpd/(1.0+rvtmp2*zx_q)
     766        zx_qs = r2es*foeew(zx_t, zdelta)/zx_p
     767        zx_qs = min(0.5, zx_qs)
     768        zcor = 1./(1.-retv*zx_qs)
     769        zx_qs = zx_qs*zcor
     770        zx_gam = foede(zx_t, zdelta, zcvm5, zx_qs, zcor)
     771        shbs(i, km1) = zx_qs
     772        gam(i, km1) = zx_gam
     773
     774        sb(i, k) = sb(i, k) + ds2(i)
     775        sb(i, km1) = sb(i, km1) + ds3(i)
     776        hb(i, k) = sb(i, k) + rlvtt*shb(i, k)
     777        hb(i, km1) = sb(i, km1) + rlvtt*shb(i, km1)
     778        hbs(i, k) = sb(i, k) + rlvtt*shbs(i, k)
     779        hbs(i, km1) = sb(i, km1) + rlvtt*shbs(i, km1)
     780
     781        sbh(i, k) = 0.5*(sb(i,k)+sb(i,km1))
     782        shbh(i, k) = qhalf(shb(i,km1), shb(i,k), shbs(i,km1), shbs(i,k))
     783        hbh(i, k) = sbh(i, k) + rlvtt*shbh(i, k)
     784        sbh(i, km1) = 0.5*(sb(i,km1)+sb(i,k-2))
     785        shbh(i, km1) = qhalf(shb(i,k-2), shb(i,km1), shbs(i,k-2), &
     786          shbs(i,km1))
     787        hbh(i, km1) = sbh(i, km1) + rlvtt*shbh(i, km1)
     788      END IF
     789    END DO
     790
     791    ! Ensure that dzcld is reset if convective mass flux zero
     792    ! specify the current vertical extent of the convective activity
     793    ! top of convective layer determined by size of overshoot param.
     794
     79560  CONTINUE
     796    DO i = 1, klon
     797      etagt0 = eta(i) > 0.0
     798      IF (.NOT. etagt0) dzcld(i) = 0.0
     799      IF (etagt0 .AND. beta(i)>betamn) THEN
     800        ktp = km1
     801      ELSE
     802        ktp = k
     803      END IF
     804      IF (etagt0) THEN
     805        cnt(i) = min(cnt(i), ktp)
     806        cnb(i) = max(cnb(i), k)
     807      END IF
     808    END DO
     80970 END DO ! end of k loop
     810
     811  ! determine whether precipitation, prec, is frozen (snow) or not
     812
     813  DO i = 1, klon
     814    IF (tb(i,klev)<tmelt .AND. tb(i,klev-1)<tmelt) THEN
     815      cmfprs(i) = prec(i)*rdt
     816    ELSE
     817      cmfprt(i) = prec(i)*rdt
     818    END IF
     819  END DO
     820
     821  RETURN ! we're all done ... return to calling procedure
     822END SUBROUTINE cmfmca
Note: See TracChangeset for help on using the changeset viewer.