Ignore:
Timestamp:
Sep 20, 2024, 12:32:04 PM (4 months ago)
Author:
Laurent Fairhead
Message:

Updating cirrus branch to trunk revision 5171

Location:
LMDZ6/branches/cirrus
Files:
7 deleted
81 edited
18 copied

Legend:

Unmodified
Added
Removed
  • LMDZ6/branches/cirrus

  • LMDZ6/branches/cirrus/libf/dyn3d/check_isotopes.F90

    r4399 r5202  
    2323                             iso_O17, iso_HTO
    2424   LOGICAL, SAVE :: first=.TRUE.
     25   LOGICAL, PARAMETER :: tnat1=.TRUE.
    2526
    2627   modname='check_isotopes'
     
    3435      iso_O17 = strIdx(isoName,'H217O')
    3536      iso_HTO = strIdx(isoName,'HTO')
    36       IF(getKey('tnat', tnat)) CALL abort_gcm(modname, 'missing isotopic parameter', 1)
     37      if (tnat1) then
     38              tnat(:)=1.0
     39      else
     40         IF(getKey('tnat', tnat)) CALL abort_gcm(modname, 'missing isotopic parameter', 1)
     41      endif
    3742      first = .FALSE.
    3843   END IF
  • LMDZ6/branches/cirrus/libf/dyn3d/conf_gcm.F90

    r4519 r5202  
    1818  USE logic_mod, ONLY: fxyhypb, iflag_phys, ok_etat0, ok_gradsfile, &
    1919                       ok_guide, ok_limit, ok_strato, purmats, read_start, &
    20                        ysinus, read_orop
     20                       ysinus, read_orop, adv_qsat_liq
    2121  USE serre_mod, ONLY: clon,clat,grossismx,grossismy,dzoomx,dzoomy, &
    2222                       alphax,alphay,taux,tauy
     
    606606     type_trac = 'lmdz'
    607607     CALL getin('type_trac',type_trac)
     608
     609
     610     !Config  Key  = adv_qsat_liq
     611     !Config  Desc = option for qsat calculation in the dynamics
     612     !Config  Def  = n
     613     !Config  Help = controls which phase is considered for qsat calculation
     614     !Config         
     615     adv_qsat_liq = .FALSE.
     616     CALL getin('adv_qsat_liq',adv_qsat_liq)
    608617
    609618     !Config  Key  = ok_dynzon
     
    672681     write(lunout,*)' ok_dyn_ins = ', ok_dyn_ins
    673682     write(lunout,*)' ok_dyn_ave = ', ok_dyn_ave
     683     write(lunout,*)' adv_qsat_liq = ', adv_qsat_liq
    674684  ELSE
    675685     !Config  Key  = clon
  • LMDZ6/branches/cirrus/libf/dyn3d/dynetat0.F90

    r4492 r5202  
    4343  REAL    :: time, tnat, alpha_ideal, tab_cntrl(length)    !--- RUN PARAMS TABLE
    4444  LOGICAL :: lSkip, ll
     45  LOGICAL,PARAMETER :: tnat1=.TRUE.
    4546!-------------------------------------------------------------------------------
    4647  modname="dynetat0"
     
    155156      iqParent = tracers(iq)%iqParent
    156157      IF(tracers(iq)%iso_iZone == 0) THEN
    157          IF(getKey('tnat', tnat, isoName(iName)) .OR. getKey('alpha', alpha_ideal, isoName(iName))) &
     158         if (tnat1) then
     159                 tnat=1.0
     160                 alpha_ideal=1.0
     161                 write(*,*) 'attention dans dynetat0: les alpha_ideal sont a 1'
     162         else
     163          IF(getKey('tnat', tnat, isoName(iName)) .OR. getKey('alpha', alpha_ideal, isoName(iName))) &
    158164            CALL abort_gcm(TRIM(modname), 'missing isotopic parameters', 1)
     165         endif
    159166         CALL msg('Tracer <'//TRIM(var)//'> is missing => initialized with a simplified Rayleigh distillation law.', modname)
    160167         q(:,:,:,iq) = q(:,:,:,iqParent)*tnat*(q(:,:,:,iqParent)/30.e-3)**(alpha_ideal-1.)
  • LMDZ6/branches/cirrus/libf/dyn3d/dynredem_mod.F90

    r2299 r5202  
    44  PRIVATE
    55  PUBLIC :: dynredem_write_u, dynredem_write_v, dynredem_read_u, err
    6   PUBLIC :: cre_var, get_var1, put_var1, put_var2, fil, modname, msg
     6  PUBLIC :: cre_var, put_var1, put_var2, fil, modname, msg
    77  include "dimensions.h"
    88  include "paramet.h"
  • LMDZ6/branches/cirrus/libf/dyn3d/iniacademic.F90

    r4419 r5202  
    8080
    8181  REAL zdtvr, tnat, alpha_ideal
     82  LOGICAL,PARAMETER :: tnat1=.true.
    8283 
    8384  character(len=*),parameter :: modname="iniacademic"
     
    321322              iqParent = tracers(iq)%iqParent
    322323              IF(tracers(iq)%iso_iZone == 0) THEN
    323                  IF(getKey('tnat', tnat, isoName(iName)) .OR. getKey('alpha', alpha_ideal, isoName(iName))) &
     324                 if (tnat1) then
     325                         tnat=1.0
     326                         alpha_ideal=1.0
     327                         write(*,*) 'Attention dans iniacademic: alpha_ideal=1'
     328                 else
     329                    IF(getKey('tnat', tnat, isoName(iName)) .OR. getKey('alpha', alpha_ideal, isoName(iName))) &
    324330                    CALL abort_gcm(TRIM(modname), 'missing isotopic parameters', 1)
     331                 endif
    325332                 q(:,:,iq) = q(:,:,iqParent)*tnat*(q(:,:,iqParent)/30.e-3)**(alpha_ideal-1.)
    326               ELSE
    327                  q(:,:,iq) = q(:,:,iqIsoPha(iName,iPhase))
    328               END IF
     333              ELSE !IF(tracers(iq)%iso_iZone == 0) THEN
     334                 IF(tracers(iq)%iso_iZone == 1) THEN
     335                    ! correction le 14 mai 2024 pour que tous les traceurs soient de la couleur 1.
     336                    ! Sinon, on va avoir des porblèmes de conservation de masse de traceurs.
     337                    q(:,:,iq) = q(:,:,iqIsoPha(iName,iPhase))
     338                 else !IF(tracers(iq)%iso_iZone == 1) THEN
     339                    q(:,:,iq) = 0.
     340                 endif !IF(tracers(iq)%iso_iZone == 1) THEN
     341              END IF !IF(tracers(iq)%iso_iZone == 0) THEN
    329342           enddo
    330343        else
  • LMDZ6/branches/cirrus/libf/dyn3d/logic_mod.F90

    r2665 r5202  
    3030  LOGICAL hybrid ! vertical coordinate is hybrid if true (sigma otherwise)
    3131                 ! (only used if disvert_type==2)
     32  LOGICAL adv_qsat_liq ! true if qsat is calculated alwats wrt liquid for
     33                       ! adapted Van Leer advection scheme
    3234  INTEGER iflag_phys ! type of physics to call: 0 none, 1: phy*** package,
    3335                     ! 2: Held & Suarez, 101-200: aquaplanets & terraplanets
  • LMDZ6/branches/cirrus/libf/dyn3d/qminimum.F

    r4143 r5202  
    2828c     .................................................................
    2929c
     30cDC iq_val and iq_liq are usable for q only, NOT for q_follow
     31c   and zx_defau_diag (crash if iq_val/liq==3) => vapor/liquid
     32c   water at hardcoded indices 1/2 in these variables
    3033      INTEGER i, k, iq
    3134      REAL zx_defau, zx_abc, zx_pump(ip1jmp1), pompe
     
    5861
    5962      zx_defau_diag(:,:,:)=0.0
    60       q_follow(:,:,1:2)=q(:,:,1:2) 
    61       DO 1000 k = 1, llm
    62         DO 1040 i = 1, ip1jmp1
     63      q_follow(:,:,1)=q(:,:,iq_vap) 
     64      q_follow(:,:,2)=q(:,:,iq_liq) 
     65      DO k = 1, llm
     66        DO i = 1, ip1jmp1
    6367          if (seuil_liq - q(i,k,iq_liq) .gt. 0.d0 ) then
    6468
    65               if (niso > 0) zx_defau_diag(i,k,iq_liq)=AMAX1
     69            if (niso > 0) zx_defau_diag(i,k,2)=AMAX1
    6670     :               ( seuil_liq - q(i,k,iq_liq), 0.0 )
    6771
    68              q(i,k,iq_vap) = q(i,k,iq_vap) + q(i,k,iq_liq) - seuil_liq
    69              q(i,k,iq_liq) = seuil_liq
    70            endif
    71  1040   CONTINUE
    72  1000 CONTINUE
     72            q(i,k,iq_vap) = q(i,k,iq_vap) + q(i,k,iq_liq) - seuil_liq
     73            q(i,k,iq_liq) = seuil_liq
     74          endif
     75        ENDDO
     76      ENDDO
    7377c
    7478c Quand l'eau vapeur est trop faible (ou negative), on complete
    7579c le defaut en prennant de l'eau vapeur de la couche au-dessous.
    7680c
    77       iq = iq_vap
    78 c
    7981      DO k = llm, 2, -1
    8082ccc      zx_abc = dpres(k) / dpres(k-1)
    8183        DO i = 1, ip1jmp1
    82           if ( seuil_vap - q(i,k,iq) .gt. 0.d0 ) then
     84          if ( seuil_vap - q(i,k,iq_vap) .gt. 0.d0 ) then
    8385
    84             if (niso > 0)
    85      &        zx_defau_diag(i,k,iq)=AMAX1( seuil_vap - q(i,k,iq), 0.0 )
     86            if (niso > 0) zx_defau_diag(i,k,1)
     87     &           = AMAX1( seuil_vap - q(i,k,iq_vap), 0.0 )
    8688
    87             q(i,k-1,iq) =  q(i,k-1,iq) - ( seuil_vap - q(i,k,iq) ) *
    88      &                     deltap(i,k) / deltap(i,k-1)
    89             q(i,k,iq)   =  seuil_vap 
     89            q(i,k-1,iq_vap) = q(i,k-1,iq_vap) - (seuil_vap
     90     &           -q(i,k,iq_vap)) * deltap(i,k)/deltap(i,k-1)
     91            q(i,k,iq_vap)   =  seuil_vap 
     92
    9093          endif
    9194        ENDDO
    9295      ENDDO
     96
    9397c
    9498c Quand il s'agit de la premiere couche au-dessus du sol, on
     
    96100c
    97101      DO i = 1, ip1jmp1
    98          zx_pump(i) = AMAX1( 0.0, seuil_vap - q(i,1,iq) )
    99          q(i,1,iq)  = AMAX1( q(i,1,iq), seuil_vap )
     102         zx_pump(i) = AMAX1( 0.0, seuil_vap - q(i,1,iq_vap) )
     103         q(i,1,iq_vap)  = AMAX1( q(i,1,iq_vap), seuil_vap )
    100104      ENDDO
    101105      pompe = SSUM(ip1jmp1,zx_pump,1)
     
    121125      DO i = 1,ip1jmp1
    122126        if (zx_pump(i).gt.0.0) then
    123           q_follow(i,1,iq_vap)=q_follow(i,1,iq_vap)+zx_pump(i)
     127          q_follow(i,1,1)=q_follow(i,1,1)+zx_pump(i)
    124128        endif !if (zx_pump(i).gt.0.0) then
    125129      enddo !DO i = 1,ip1jmp1
     
    129133      do k=2,llm
    130134        DO i = 1,ip1jmp1
    131           if (zx_defau_diag(i,k,iq_vap).gt.0.0) then             
     135          if (zx_defau_diag(i,k,1).gt.0.0) then             
    132136              ! on ajoute la vapeur en k             
    133137              do ixt=1,ntiso
    134138               q(i,k,iqIsoPha(ixt,iq_vap))=q(i,k,iqIsoPha(ixt,iq_vap))
    135      :           +zx_defau_diag(i,k,iq_vap)
    136      :           *q(i,k-1,iqIsoPha(ixt,iq_vap))/q_follow(i,k-1,iq_vap)
     139     :           +zx_defau_diag(i,k,1)
     140     :           *q(i,k-1,iqIsoPha(ixt,iq_vap))/q_follow(i,k-1,1)
    137141               
    138142              ! et on la retranche en k-1
    139143               q(i,k-1,iqIsoPha(ixt,iq_vap))=
    140144     :            q(i,k-1,iqIsoPha(ixt,iq_vap))
    141      :              -zx_defau_diag(i,k,iq_vap)
     145     :              -zx_defau_diag(i,k,1)
    142146     :              *deltap(i,k)/deltap(i,k-1)
    143147     :              *q(i,k-1,iqIsoPha(ixt,iq_vap))
    144      :              /q_follow(i,k-1,iq_vap)
     148     :              /q_follow(i,k-1,1)
    145149
    146150              enddo !do ixt=1,niso
    147               q_follow(i,k,iq_vap)=   q_follow(i,k,iq_vap)
    148      :               +zx_defau_diag(i,k,iq_vap)
    149               q_follow(i,k-1,iq_vap)=   q_follow(i,k-1,iq_vap)
    150      :               -zx_defau_diag(i,k,iq_vap)
     151              q_follow(i,k,1)=   q_follow(i,k,1)
     152     :               +zx_defau_diag(i,k,1)
     153              q_follow(i,k-1,1)=   q_follow(i,k-1,1)
     154     :               -zx_defau_diag(i,k,1)
    151155     :              *deltap(i,k)/deltap(i,k-1)
    152           endif !if (zx_defau_diag(i,k,iq_vap).gt.0.0) then
     156          endif !if (zx_defau_diag(i,k,1).gt.0.0) then
    153157        enddo !DO i = 1, ip1jmp1       
    154158       enddo !do k=2,llm
     
    161165        do k=1,llm
    162166        DO i = 1,ip1jmp1
    163           if (zx_defau_diag(i,k,iq_liq).gt.0.0) then
     167          if (zx_defau_diag(i,k,2).gt.0.0) then
    164168
    165169              ! on ajoute eau liquide en k en k             
    166170              do ixt=1,ntiso
    167171               q(i,k,iqIsoPha(ixt,iq_liq))=q(i,k,iqIsoPha(ixt,iq_liq))
    168      :              +zx_defau_diag(i,k,iq_liq)
    169      :              *q(i,k,iqIsoPha(ixt,iq_vap))/q_follow(i,k,iq_vap)
     172     :              +zx_defau_diag(i,k,2)
     173     :              *q(i,k,iqIsoPha(ixt,iq_vap))/q_follow(i,k,1)
    170174              ! et on la retranche à la vapeur en k
    171175               q(i,k,iqIsoPha(ixt,iq_vap))=q(i,k,iqIsoPha(ixt,iq_vap))
    172      :              -zx_defau_diag(i,k,iq_liq)
    173      :              *q(i,k,iqIsoPha(ixt,iq_vap))/q_follow(i,k,iq_vap)   
     176     :              -zx_defau_diag(i,k,2)
     177     :              *q(i,k,iqIsoPha(ixt,iq_vap))/q_follow(i,k,1)   
    174178              enddo !do ixt=1,niso
    175               q_follow(i,k,iq_liq)=   q_follow(i,k,iq_liq)
    176      :               +zx_defau_diag(i,k,iq_liq)
    177               q_follow(i,k,iq_vap)=   q_follow(i,k,iq_vap)
    178      :               -zx_defau_diag(i,k,iq_liq)
    179           endif !if (zx_defau_diag(i,k,iq_vap).gt.0.0) then
     179              q_follow(i,k,2)=   q_follow(i,k,2)
     180     :               +zx_defau_diag(i,k,2)
     181              q_follow(i,k,1)=   q_follow(i,k,1)
     182     :               -zx_defau_diag(i,k,2)
     183          endif !if (zx_defau_diag(i,k,1).gt.0.0) then
    180184        enddo !DO i = 1, ip1jmp1
    181185       enddo !do k=2,llm 
  • LMDZ6/branches/cirrus/libf/dyn3d/vlspltqs.F

    r4470 r5202  
    2525     
    2626      USE comconst_mod, ONLY: cpp
    27      
     27      USE logic_mod, ONLY: adv_qsat_liq
    2828      IMPLICIT NONE
    2929c
     
    9292         ENDDO
    9393         DO ij = 1, ip1jmp1
    94           zdelta = MAX( 0., SIGN(1., rtt - tempe(ij)) )
     94          IF (adv_qsat_liq) THEN
     95             zdelta = 0.
     96          ELSE
     97             zdelta = MAX( 0., SIGN(1., rtt - tempe(ij)) )
     98          ENDIF
    9599          play   = 0.5*(p(ij,l)+p(ij,l+1))
    96100          qsat(ij,l) = MIN(0.5, r2es* FOEEW(tempe(ij),zdelta) / play )
  • LMDZ6/branches/cirrus/libf/dyn3d_common/infotrac.F90

    r4638 r5202  
    55   USE       strings_mod, ONLY: msg, fmsg, maxlen, cat, dispTable, int2str, bool2str, strStack, strParse
    66   USE readTracFiles_mod, ONLY: trac_type, readTracersFiles, tracers, setGeneration, itZonIso, nzone, tran0, isoZone, &
    7         delPhase, niso, getKey, isot_type, readIsotopesFile, isotope, maxTableWidth, iqIsoPha, nphas, ixIso, isoPhas, &
    8         addPhase, iH2O, addKey, isoSelect, testTracersFiles, isoKeys, indexUpdate,   isoCheck, nbIso, ntiso, isoName
     7        delPhase, niso, getKey, isot_type, processIsotopes, isotope, maxTableWidth, iqIsoPha, nphas, ixIso, isoPhas, &
     8        addPhase, iH2O, addKey, isoSelect, testTracersFiles, isoKeys, indexUpdate,  iqWIsoPha, nbIso, ntiso, isoName, isoCheck
    99   IMPLICIT NONE
    1010
     
    3636!  |--------------------+-----------------------+-----------------+---------------+----------------------------|
    3737!  | water in different |    water tagging      |  water isotopes | other tracers | additional tracers moments |
    38 !  | phases: H2O_[glsb] |      isotopes         |                 |               |  for higher order schemes  |
     38!  | phases: H2O_[gls] |      isotopes         |                 |               |  for higher order schemes  |
    3939!  |--------------------+-----------------------+-----------------+---------------+----------------------------|
    4040!  |                    |                       |                 |               |                            |
     
    6565!  | longName    | Long name (with adv. scheme suffix) for outputs      | ttext       |                        |
    6666!  | type        | Type (so far: tracer or tag)                         | /           | tracer,tag             |
    67 !  | phase       | Phases list ("g"as / "l"iquid / "s"olid / "b"lowing) | /           | [g][l][s][b]           |
     67!  | phase       | Phases list ("g"as / "l"iquid / "s"olid)             | /           | [g][l][s]              |
    6868!  | component   | Name(s) of the merged/cumulated section(s)           | /           | coma-separated names   |
    6969!  | iGeneration | Generation (>=1)                                     | /           |                        |
     
    9191!  | trac   | ntiso  | Isotopes + tagging tracers list + number         | / | ntraciso       |                 |
    9292!  | zone   | nzone  | Geographic tagging zones   list + number         | / | ntraceurs_zone |                 |
    93 !  | phase  | nphas  | Phases                     list + number         |                    |[g][l][s][b],1:4 |
     93!  | phase  | nphas  | Phases                     list + number         |                    | [g][l][s], 1:3 |
    9494!  | iqIsoPha        | Index in "qx"           = f(name(1:ntiso)),phas) | iqiso              | 1:nqtot         |
    9595!  | itZonIso        | Index in "trac(1:ntiso)"= f(zone, name(1:niso))  | index_trac         | 1:ntiso         |
     
    156156   INTEGER :: nqtrue                                                 !--- Tracers nb from tracer.def (no higher order moments)
    157157   INTEGER :: iad                                                    !--- Advection scheme number
    158    INTEGER :: ic, iq, jq, it, nt, im, nm, iz, k                      !--- Indexes and temporary variables
     158   INTEGER :: iq, jq, nt, im, nm                                     !--- Indexes and temporary variables
    159159   LOGICAL :: lerr, ll
    160    CHARACTER(LEN=1) :: p
    161160   TYPE(trac_type), ALLOCATABLE, TARGET :: ttr(:)
    162161   TYPE(trac_type), POINTER             :: t1, t(:)
    163    INTEGER :: ierr
    164162   CHARACTER(LEN=maxlen),   ALLOCATABLE :: types_trac(:)  !--- Keyword for tracers type(s), parsed version
    165163
     
    225223   ttp = type_trac; IF(fType /= 1) ttp = texp
    226224
    227    IF(readTracersFiles(ttp, type_trac == 'repr'))    CALL abort_gcm(modname, 'problem with tracers file(s)',1)
     225   IF(readTracersFiles(ttp, lRepr=type_trac=='repr')) CALL abort_gcm(modname, 'problem with tracers file(s)',1)
    228226   !---------------------------------------------------------------------------------------------------------------------------
    229227   IF(fType == 0) CALL abort_gcm(modname, 'Missing tracers file: "traceur.def", "tracer.def" or "tracer_<keyword>.def file.',1)
     
    236234      nbtr = nqINCA + nqCO2                                          !--- Number of tracers passed to phytrac
    237235      nqtrue = nbtr + nqo                                            !--- Total number of "true" tracers
    238       IF(ALL([2,3,4,5] /= nqo)) CALL abort_gcm(modname, 'Only 2, 3, 4 , 5 water phases allowed ; found nqo='//TRIM(int2str(nqo)), 1)
     236      IF(ALL([2,3] /= nqo)) CALL abort_gcm(modname, 'Only 2 or 3 water phases allowed ; found nqo='//TRIM(int2str(nqo)), 1)
    239237      ALLOCATE(hadv(nqtrue), hadv_inca(nqINCA), conv_flg_inca(nqINCA), solsym_inca(nqINCA))
    240238      ALLOCATE(vadv(nqtrue), vadv_inca(nqINCA),  pbl_flg_inca(nqINCA))
     
    245243      ttr(1+nqo:nqCO2+nqo   )%component = 'co2i'
    246244      ttr(1+nqo+nqCO2:nqtrue)%component = 'inca'
    247       ttr(1+nqo      :nqtrue)%name      = [('CO2     ', k=1, nqCO2), solsym_inca]
     245      ttr(1+nqo      :nqtrue)%name      = [('CO2     ', iq=1, nqCO2), solsym_inca]
    248246      ttr(1+nqo+nqCO2:nqtrue)%parent    = tran0
    249247      ttr(1+nqo+nqCO2:nqtrue)%phase     = 'g'
     
    348346      IF(nm == 0) CYCLE                                              !--- No higher moments
    349347      ttr(jq+1:jq+nm)             = t1
    350       ttr(jq+1:jq+nm)%name        = [(TRIM(t1%name)    //'-'//TRIM(suff(im)), im=1, nm) ]
    351       ttr(jq+1:jq+nm)%parent      = [(TRIM(t1%parent)  //'-'//TRIM(suff(im)), im=1, nm) ]
    352       ttr(jq+1:jq+nm)%longName    = [(TRIM(t1%longName)//'-'//TRIM(suff(im)), im=1, nm) ]
    353       ttr(jq+1:jq+nm)%iadv        = [(-iad,    im=1, nm) ]
    354       ttr(jq+1:jq+nm)%isAdvected  = [(.FALSE., im=1, nm) ]
     348      ttr(jq+1:jq+nm)%name        = [ (TRIM(t1%name)    //'-'//TRIM(suff(im)), im=1, nm) ]
     349      ttr(jq+1:jq+nm)%parent      = [ (TRIM(t1%parent)  //'-'//TRIM(suff(im)), im=1, nm) ]
     350      ttr(jq+1:jq+nm)%longName    = [ (TRIM(t1%longName)//'-'//TRIM(suff(im)), im=1, nm) ]
     351      ttr(jq+1:jq+nm)%iadv        = [ (-iad,    im=1, nm) ]
     352      ttr(jq+1:jq+nm)%isAdvected  = [ (.FALSE., im=1, nm) ]
    355353      jq = jq + nm
    356354   END DO
     
    359357
    360358   !--- SET FIELDS %iqParent, %nqChildren, %iGeneration, %iqDescen, %nqDescen
    361    CALL indexUpdate(tracers)
     359   IF(indexUpdate(tracers)) CALL abort_gcm(modname, 'problem with tracers indices update', 1)
    362360
    363361   !=== TEST ADVECTION SCHEME
     
    384382   !=== READ PHYSICAL PARAMETERS FOR ISOTOPES ; DONE HERE BECAUSE dynetat0 AND iniacademic NEED "tnat" AND "alpha_ideal"
    385383   niso = 0; nzone = 0; nphas = nqo; ntiso = 0; isoCheck = .FALSE.
    386    IF(readIsotopesFile()) CALL abort_gcm(modname, 'Problem when reading isotopes parameters', 1)
     384   IF(processIsotopes()) CALL abort_gcm(modname, 'problem when processing isotopes parameters', 1)
    387385
    388386   !--- Convection / boundary layer activation for all tracers
     
    393391   nqtottr = nqtot - COUNT(delPhase(tracers%gen0Name) == 'H2O' .AND. tracers%component == 'lmdz')
    394392   IF(COUNT(tracers%iso_iName == 0) - COUNT(delPhase(tracers%name) == 'H2O' .AND. tracers%component == 'lmdz') /= nqtottr) &
    395       CALL abort_gcm(modname, 'pb dans le calcul de nqtottr', 1)
     393      CALL abort_gcm(modname, 'problem with the computation of nqtottr', 1)
    396394
    397395   !=== DISPLAY THE RESULTS
     
    408406   t => tracers
    409407   CALL msg('Information stored in infotrac :', modname)
    410    IF(dispTable('isssssssssiiiiiiiii', &
    411       ['iq    ', 'name  ', 'lName ', 'gen0N ', 'parent', 'type  ', 'phase ', 'compon', 'isPhy ', 'isAdv ', &
    412        'iadv  ', 'iGen  ', 'iqPar ', 'nqDes ', 'nqChld', 'iGroup', 'iName ', 'iZone ', 'iPhase'],          &
     408
     409   IF(dispTable('isssssssssiiiiiiiii', ['iq  ', 'name', 'lNam', 'g0Nm', 'prnt', 'type', 'phas', 'comp',    &
     410                'isPh', 'isAd', 'iadv', 'iGen', 'iqPr', 'nqDe', 'nqCh', 'iGrp', 'iNam', 'iZon', 'iPha'],   &
    413411      cat(t%name, t%longName, t%gen0Name, t%parent, t%type, t%phase, t%component, bool2str(t%isInPhysics), &
    414412                                                                                  bool2str(t%isAdvected)), &
  • LMDZ6/branches/cirrus/libf/dyn3dmem/check_isotopes_loc.F90

    r4399 r5202  
    2424                             iso_O17, iso_HTO
    2525   LOGICAL, SAVE :: first=.TRUE.
     26   LOGICAL, PARAMETER :: tnat1=.TRUE.
    2627!$OMP THREADPRIVATE(first)
    2728
     
    3738      iso_O17 = strIdx(isoName,'H217O')
    3839      iso_HTO = strIdx(isoName,'HTO')
    39       IF(getKey('tnat', tnat)) CALL abort_gcm(modname, 'missing isotopic parameter', 1)
     40      if (tnat1) then
     41              tnat(:)=1.0
     42      else
     43         IF(getKey('tnat', tnat)) CALL abort_gcm(modname, 'missing isotopic parameter', 1)
     44      endif
    4045!$OMP END MASTER
    4146!$OMP BARRIER
  • LMDZ6/branches/cirrus/libf/dyn3dmem/conf_gcm.F90

    r4608 r5202  
    2222  USE logic_mod, ONLY: fxyhypb, iflag_phys, ok_etat0, ok_gradsfile, &
    2323                       ok_guide, ok_limit, ok_strato, purmats, read_start, &
    24                        ysinus, read_orop
     24                       ysinus, read_orop, adv_qsat_liq
    2525  USE serre_mod, ONLY: clon,clat,grossismx,grossismy,dzoomx,dzoomy, &
    2626                       alphax,alphay,taux,tauy
     
    660660     type_trac = 'lmdz'
    661661     CALL getin('type_trac',type_trac)
     662
     663
     664     !Config  Key  = adv_qsat_liq
     665     !Config  Desc = option for qsat calculation in the dynamics
     666     !Config  Def  = n
     667     !Config  Help = controls which phase is considered for qsat calculation
     668     !Config         
     669     adv_qsat_liq = .FALSE.
     670     CALL getin('adv_qsat_liq',adv_qsat_liq)
    662671
    663672     !Config  Key  = ok_dynzon
     
    736745     write(lunout,*)' ok_dyn_ave = ', ok_dyn_ave
    737746     write(lunout,*)' ok_dyn_xios = ', ok_dyn_xios
     747     write(lunout,*)' adv_qsat_liq = ', adv_qsat_liq
    738748  else
    739749     !Config  Key  = clon
  • LMDZ6/branches/cirrus/libf/dyn3dmem/dynetat0_loc.F90

    r4490 r5202  
    4242  INTEGER, PARAMETER :: length=100
    4343  INTEGER :: iq, fID, vID, idecal, ierr, iqParent, iName, iZone, iPhase, ix
    44   REAL    :: time, tnat, alpha_ideal, tab_cntrl(length)    !--- RUN PARAMS TABLE
     44  REAL    :: time,tab_cntrl(length)    !--- RUN PARAMS TABLE
     45  REAL    :: tnat, alpha_ideal
    4546  REAL,             ALLOCATABLE :: vcov_glo(:,:),masse_glo(:,:),   ps_glo(:)
    4647  REAL,             ALLOCATABLE :: ucov_glo(:,:),    q_glo(:,:), phis_glo(:)
    4748  REAL,             ALLOCATABLE :: teta_glo(:,:)
    4849  LOGICAL :: lSkip, ll
     50  LOGICAL,PARAMETER :: tnat1=.TRUE.
    4951!-------------------------------------------------------------------------------
    5052  modname="dynetat0_loc"
     
    179181      iqParent = tracers(iq)%iqParent
    180182      IF(tracers(iq)%iso_iZone == 0) THEN
    181          IF(getKey('tnat', tnat, isoName(iName)) .OR. getKey('alpha', alpha_ideal, isoName(iName))) &
     183         if (tnat1) then
     184                 tnat=1.0
     185                 alpha_ideal=1.0
     186                 write(*,*) 'attention dans dynetat0: les alpha_ideal sont a 1'
     187         else
     188          IF(getKey('tnat', tnat, isoName(iName)) .OR. getKey('alpha', alpha_ideal, isoName(iName))) &
    182189            CALL abort_gcm(TRIM(modname), 'missing isotopic parameters', 1)
     190         endif
    183191         CALL msg('Tracer <'//TRIM(var)//'> is missing => initialized with a simplified Rayleigh distillation law.', modname)
    184192         q(ijb_u:ije_u,:,iq) = q(ijb_u:ije_u,:,iqParent)*tnat*(q(ijb_u:ije_u,:,iqParent)/30.e-3)**(alpha_ideal-1.)
     
    193201         ! remplacant 1 par izone_init dans la ligne qui suit.
    194202         IF(tracers(iq)%iso_iZone == 1) THEN
    195           q(ijb_u:ije_u,:,iq) = q(ijb_u:ije_u,:,iqIsoPha(iName,iPhase))
     203           q(ijb_u:ije_u,:,iq) = q(ijb_u:ije_u,:,iqIsoPha(iName,iPhase))
    196204         ELSE
    197205           q(ijb_u:ije_u,:,iq) =  0.
  • LMDZ6/branches/cirrus/libf/dyn3dmem/dynredem_mod.F90

    r2299 r5202  
    77  PRIVATE
    88  PUBLIC :: dynredem_write_u, dynredem_write_v, dynredem_read_u, err
    9   PUBLIC :: cre_var, get_var1, put_var, fil, modname, msg
     9  PUBLIC :: cre_var, put_var, fil, modname, msg
    1010  CHARACTER(LEN=256), SAVE :: fil, modname
    1111  INTEGER,            SAVE :: nvarid
  • LMDZ6/branches/cirrus/libf/dyn3dmem/gcm.F90

    r4619 r5202  
    480480  !$OMP COPYIN(saison,ecripar,fxyhypb,ysinus,read_start,ok_guide) &
    481481  !$OMP COPYIN(ok_strato,ok_gradsfile,ok_limit,ok_etat0) &
    482   !$OMP COPYIN(iflag_phys,iflag_trac)
     482  !$OMP COPYIN(iflag_phys,iflag_trac,adv_qsat_liq)
    483483  CALL leapfrog_loc(ucov,vcov,teta,ps,masse,phis,q,time_0)
    484484  !$OMP END PARALLEL
  • LMDZ6/branches/cirrus/libf/dyn3dmem/iniacademic_loc.F90

    r4419 r5202  
    8585
    8686  REAL zdtvr, tnat, alpha_ideal
     87  LOGICAL,PARAMETER :: tnat1=.true.
    8788 
    8889  character(len=*),parameter :: modname="iniacademic"
     
    323324              iqParent = tracers(iq)%iqParent
    324325              IF(tracers(iq)%iso_iZone == 0) THEN
    325                  IF(getKey('tnat', tnat, isoName(iName)) .OR. getKey('alpha', alpha_ideal, isoName(iName))) &
     326                 if (tnat1) then
     327                         tnat=1.0
     328                         alpha_ideal=1.0
     329                         write(*,*) 'Attention dans iniacademic: alpha_ideal=1'
     330                 else
     331                    IF(getKey('tnat', tnat, isoName(iName)) .OR. getKey('alpha', alpha_ideal, isoName(iName))) &
    326332                    CALL abort_gcm(TRIM(modname), 'missing isotopic parameters', 1)
     333                 endif
    327334                 q(ijb_u:ije_u,:,iq) = q(ijb_u:ije_u,:,iqParent)*tnat*(q(ijb_u:ije_u,:,iqParent)/30.e-3)**(alpha_ideal-1.)
    328               ELSE
    329                  q(ijb_u:ije_u,:,iq) = q(ijb_u:ije_u,:,iqIsoPha(iName,iPhase))
    330               END IF
     335              ELSE !IF(tracers(iq)%iso_iZone == 0) THEN
     336                 IF(tracers(iq)%iso_iZone == 1) THEN ! a verifier.
     337                    ! correction le 14 mai 2024 pour que tous les traceurs soient de la couleur 1.
     338                    ! Sinon, on va avoir des porblèmes de conservation de masse de traceurs.
     339                    q(ijb_u:ije_u,:,iq) = q(ijb_u:ije_u,:,iqIsoPha(iName,iPhase))
     340                 else !IF(tracers(iq)%iso_iZone == 1) THEN
     341                    q(ijb_u:ije_u,:,iq) = 0.0
     342                 endif !IF(tracers(iq)%iso_iZone == 1) THEN
     343              END IF !IF(tracers(iq)%iso_iZone == 0) THEN
    331344           enddo
    332345        else
  • LMDZ6/branches/cirrus/libf/dyn3dmem/logic_mod.F90

    r2665 r5202  
    3030  LOGICAL hybrid ! vertical coordinate is hybrid if true (sigma otherwise)
    3131                 ! (only used if disvert_type==2)
     32  LOGICAL adv_qsat_liq ! true if qsat is calculated alwats wrt liquid for
     33                       ! adapted Van Leer advection scheme
    3234  INTEGER iflag_phys ! type of physics to call: 0 none, 1: phy*** package,
    3335                     ! 2: Held & Suarez, 101-200: aquaplanets & terraplanets
     
    3739!$OMP     apdiss,apdelq,saison,ecripar,fxyhypb,ysinus, &
    3840!$OMP     read_start,ok_guide,ok_strato,ok_gradsfile, &
    39 !$OMP     ok_limit,ok_etat0,hybrid)
     41!$OMP     ok_limit,ok_etat0,hybrid, adv_qsat_liq)
    4042!$OMP THREADPRIVATE(iflag_phys,iflag_trac)
    4143
  • LMDZ6/branches/cirrus/libf/dyn3dmem/qminimum_loc.F

    r4469 r5202  
    3131c     .................................................................
    3232c
     33cDC iq_val and iq_liq are usable for q only, NOT for q_follow
     34c   and zx_defau_diag (crash if iq_val/liq==3) => vapor/liquid
     35c   water at hardcoded indices 1/2 in these variables
    3336      INTEGER i, k, iq
    3437      REAL zx_defau, zx_abc, zx_pump(ijb_u:ije_u), pompe
     
    4952      INTEGER ixt
    5053      INTEGER iso_verif_noNaN_nostop
    51 c
    52 c Quand l'eau liquide est trop petite (ou negative), on prend
    53 c l'eau vapeur de la meme couche et la convertit en eau liquide
    54 c (sans changer la temperature !)
    55 c
    5654
    5755c$OMP BARRIER
     
    6361         first = .FALSE.
    6462      END IF
     63c
     64c Quand l'eau liquide est trop petite (ou negative), on prend
     65c l'eau vapeur de la meme couche et la convertit en eau liquide
     66c (sans changer la temperature !)
     67c
     68
    6569      call check_isotopes(q,ij_begin,ij_end,'qminimum 52')   
    6670
     
    7377          zx_defau_diag(i,k,1)=0.0
    7478          zx_defau_diag(i,k,2)=0.0
    75           q_follow(i,k,1)=q(i,k,1)
    76           q_follow(i,k,2)=q(i,k,2)
     79          q_follow(i,k,1)=q(i,k,iq_vap)
     80          q_follow(i,k,2)=q(i,k,iq_liq)
    7781        ENDDO
    7882c$OMP END DO NOWAIT
     
    8084
    8185      !write(lunout,*) 'qminimum 57'
    82       DO 1000 k = 1, llm
     86      DO k = 1, llm
    8387c$OMP DO SCHEDULE(STATIC)       
    84       DO 1040 i = ijb, ije
    85             if (seuil_liq - q(i,k,iq_liq) .gt. 0.d0 ) then
    86 
    87               if (niso > 0) zx_defau_diag(i,k,iq_liq)=AMAX1
     88        DO i = ijb, ije
     89          if (seuil_liq - q(i,k,iq_liq) .gt. 0.d0 ) then
     90
     91            if (niso > 0) zx_defau_diag(i,k,2)=AMAX1
    8892     :               ( seuil_liq - q(i,k,iq_liq), 0.0 )
    8993
    90                q(i,k,iq_vap) = q(i,k,iq_vap) + q(i,k,iq_liq) - seuil_liq
    91                q(i,k,iq_liq) = seuil_liq
    92             endif
    93  1040 CONTINUE
    94 c$OMP END DO NOWAIT
    95  1000 CONTINUE
     94            q(i,k,iq_vap) = q(i,k,iq_vap) + q(i,k,iq_liq) - seuil_liq
     95            q(i,k,iq_liq) = seuil_liq
     96          endif
     97        END DO
     98c$OMP END DO NOWAIT
     99      END DO
    96100
    97101c
     
    100104c
    101105      !write(lunout,*) 'qminimum 81'
    102       iq = iq_vap
    103 c
    104106      DO k = llm, 2, -1
    105107ccc      zx_abc = dpres(k) / dpres(k-1)
    106108c$OMP DO SCHEDULE(STATIC)
    107       DO i = ijb, ije
    108 
    109          if ( seuil_vap - q(i,k,iq) .gt. 0.d0 ) then
    110 
    111             if (niso > 0)
    112      &        zx_defau_diag(i,k,iq)=AMAX1( seuil_vap - q(i,k,iq), 0.0 )
    113 
    114             q(i,k-1,iq) =  q(i,k-1,iq) - ( seuil_vap - q(i,k,iq) ) *
    115      &           deltap(i,k) / deltap(i,k-1)
    116             q(i,k,iq)   =  seuil_vap 
    117 
    118          endif
    119       ENDDO
     109        DO i = ijb, ije
     110
     111          if ( seuil_vap - q(i,k,iq_vap) .gt. 0.d0 ) then
     112
     113            if (niso > 0) zx_defau_diag(i,k,1)
     114     &           = AMAX1( seuil_vap - q(i,k,iq_vap), 0.0 )
     115
     116            q(i,k-1,iq_vap) = q(i,k-1,iq_vap) - (seuil_vap
     117     &           -q(i,k,iq_vap)) * deltap(i,k)/deltap(i,k-1)
     118            q(i,k,iq_vap)   =  seuil_vap 
     119
     120          endif
     121        ENDDO
    120122c$OMP END DO NOWAIT
    121123      ENDDO
     
    129131c$OMP DO SCHEDULE(STATIC)
    130132      DO i = ijb, ije
    131          zx_pump(i) = AMAX1( 0.0, seuil_vap - q(i,1,iq) )
    132          q(i,1,iq)  = AMAX1( q(i,1,iq), seuil_vap )
     133         zx_pump(i) = AMAX1( 0.0, seuil_vap - q(i,1,iq_vap) )
     134         q(i,1,iq_vap)  = AMAX1( q(i,1,iq_vap), seuil_vap )
    133135         IF (zx_pump(i) > 0.0) THEN
    134136            nb_pump = nb_pump+1
     
    165167      DO i = ijb, ije
    166168        if (zx_pump(i).gt.0.0) then
    167           q_follow(i,1,iq_vap)=q_follow(i,1,iq_vap)+zx_pump(i)
     169          q_follow(i,1,1)=q_follow(i,1,1)+zx_pump(i)
    168170        endif !if (zx_pump(i).gt.0.0) then
    169171      enddo !DO i = ijb, ije 
     
    175177c$OMP DO SCHEDULE(STATIC)     
    176178        DO i = ijb, ije
    177           if (zx_defau_diag(i,k,iq_vap).gt.0.0) then             
     179          if (zx_defau_diag(i,k,1).gt.0.0) then             
    178180              ! on ajoute la vapeur en k     
    179 !              write(lunout,*) 'i,k,q_follow(i,k-1,iq_vap)=',
    180 !     :                 i,k,q_follow(i,k-1,iq_vap)         
    181               if (q_follow(i,k-1,iq_vap).lt.min_qParent) then
     181!              write(lunout,*) 'i,k,q_follow(i,k-1,ivap)=',
     182!     :                 i,k,q_follow(i,k-1,1)         
     183              if (q_follow(i,k-1,1).lt.min_qParent) then
    182184                write(lunout,*) 'tmp qmin: on stoppe'
    183185                write(lunout,*) 'zx_pump(i)=',zx_pump(i)
    184                 write(lunout,*) 'q_follow(i,:,iq_vap)=',
    185      :                   q_follow(i,:,iq_vap)
     186                write(lunout,*) 'q_follow(i,:,ivap)=',
     187     :                   q_follow(i,:,1)
    186188                write(lunout,*) 'k=',k
    187189                call abort_gcm("qminimum","not enough vapor",1)
     
    189191            do ixt=1,ntiso
    190192!                write(lunout,*) 'qmin 168: ixt=',ixt
    191 !                write(lunout,*) 'q(i,k,iqIsoPha(ixt,iq_vap)=',
     193!                write(lunout,*) 'q(i,k,iqIsoPha(ixt,iq_vap))=',
    192194!     :             q(i,k,iqIsoPha(ixt,iq_vap))
    193 !                write(lunout,*) 'zx_defau_diag(i,k,iq_vap)=',
    194 !     :                  zx_defau_diag(i,k,iq_vap)
    195 !                write(lunout,*) 'q(i,k-1,iqIsoPha(ixt,iq_vap)=',
     195!                write(lunout,*) 'zx_defau_diag(i,k,ivap)=',
     196!     :                  zx_defau_diag(i,k,1)
     197!                write(lunout,*) 'q(i,k-1,iqIsoPha(ixt,iq_vap))=',
    196198!     :                   q(i,k-1,iqIsoPha(ixt,iq_vap))     
    197199
    198200               q(i,k,iqIsoPha(ixt,iq_vap))=q(i,k,iqIsoPha(ixt,iq_vap))
    199      :           +zx_defau_diag(i,k,iq_vap)
    200      :           *q(i,k-1,iqIsoPha(ixt,iq_vap))/q_follow(i,k-1,iq_vap)
     201     :           +zx_defau_diag(i,k,1)
     202     :           *q(i,k-1,iqIsoPha(ixt,iq_vap))/q_follow(i,k-1,1)
    201203               
    202204              if (isoCheck) then
     
    204206     :                   'qminimum 155').eq.1) then
    205207                   write(*,*) 'i,k,ixt=',i,k,ixt
    206                    write(*,*) 'q_follow(i,k-1,iq_vap)=',
    207      :                   q_follow(i,k-1,iq_vap)
     208                   write(*,*) 'q_follow(i,k-1,ivap)=',
     209     :                   q_follow(i,k-1,1)
    208210                   write(*,*) 'q(i,k,iqIsoPha(ixt,iq_vap))=',
    209211     :                   q(i,k,iqIsoPha(ixt,iq_vap))
    210                    write(*,*) 'zx_defau_diag(i,k,iq_vap)=',
    211      :                   zx_defau_diag(i,k,iq_vap)
     212                   write(*,*) 'zx_defau_diag(i,k,ivap)=',
     213     :                   zx_defau_diag(i,k,1)
    212214                   write(*,*) 'q(i,k-1,iqIsoPha(ixt,iq_vap))=',
    213215     :                   q(i,k-1,iqIsoPha(ixt,iq_vap))
     
    219221               q(i,k-1,iqIsoPha(ixt,iq_vap)) =
    220222     :            q(i,k-1,iqIsoPha(ixt,iq_vap))
    221      :              -zx_defau_diag(i,k,iq_vap)
     223     :              -zx_defau_diag(i,k,1)
    222224     :              *deltap(i,k)/deltap(i,k-1)
    223225     :              *q(i,k-1,iqIsoPha(ixt,iq_vap))
    224      :              /q_follow(i,k-1,iq_vap)
     226     :              /q_follow(i,k-1,1)
    225227
    226228               if (isoCheck) then
     
    229231     :                   'qminimum 175').eq.1) then
    230232                   write(*,*) 'k,i,ixt=',k,i,ixt
    231                    write(*,*) 'q_follow(i,k-1,iq_vap)=',
    232      :                   q_follow(i,k-1,iq_vap)
     233                   write(*,*) 'q_follow(i,k-1,ivap)=',
     234     :                   q_follow(i,k-1,1)
    233235                   write(*,*) 'q(i,k,iqIsoPha(ixt,iq_vap))=',
    234236     :                   q(i,k,iqIsoPha(ixt,iq_vap))
    235                    write(*,*) 'zx_defau_diag(i,k,iq_vap)=',
    236      :                   zx_defau_diag(i,k,iq_vap)
     237                   write(*,*) 'zx_defau_diag(i,k,ivap)=',
     238     :                   zx_defau_diag(i,k,1)
    237239                   write(*,*) 'q(i,k-1,iqIsoPha(ixt,iq_vap))=',
    238240     :                   q(i,k-1,iqIsoPha(ixt,iq_vap))
     
    242244
    243245              enddo !do ixt=1,niso
    244               q_follow(i,k,iq_vap)=   q_follow(i,k,iq_vap)
    245      :               +zx_defau_diag(i,k,iq_vap)
    246               q_follow(i,k-1,iq_vap)=   q_follow(i,k-1,iq_vap)
    247      :               -zx_defau_diag(i,k,iq_vap)
     246              q_follow(i,k,1)=   q_follow(i,k,1)
     247     :               +zx_defau_diag(i,k,1)
     248              q_follow(i,k-1,1)=   q_follow(i,k-1,1)
     249     :               -zx_defau_diag(i,k,1)
    248250     :              *deltap(i,k)/deltap(i,k-1)
    249           endif !if (zx_defau_diag(i,k,iq_vap).gt.0.0) then
     251          endif !if (zx_defau_diag(i,k,1).gt.0.0) then
    250252        enddo !DO i = 1, ip1jmp1       
    251253c$OMP END DO NOWAIT
     
    260262c$OMP DO SCHEDULE(STATIC)
    261263        DO i = ijb, ije
    262           if (zx_defau_diag(i,k,iq_liq).gt.0.0) then
     264          if (zx_defau_diag(i,k,2).gt.0.0) then
    263265
    264266              ! on ajoute eau liquide en k en k             
    265267              do ixt=1,ntiso
    266268               q(i,k,iqIsoPha(ixt,iq_liq))=q(i,k,iqIsoPha(ixt,iq_liq))
    267      :              +zx_defau_diag(i,k,iq_liq)
    268      :              *q(i,k,iqIsoPha(ixt,iq_vap))/q_follow(i,k,iq_vap)
     269     :              +zx_defau_diag(i,k,2)
     270     :              *q(i,k,iqIsoPha(ixt,iq_vap))/q_follow(i,k,1)
    269271              ! et on la retranche à la vapeur en k
    270272               q(i,k,iqIsoPha(ixt,iq_vap))=q(i,k,iqIsoPha(ixt,iq_vap))
    271      :              -zx_defau_diag(i,k,iq_liq)
    272      :              *q(i,k,iqIsoPha(ixt,iq_vap))/q_follow(i,k,iq_vap)   
     273     :              -zx_defau_diag(i,k,2)
     274     :              *q(i,k,iqIsoPha(ixt,iq_vap))/q_follow(i,k,1)   
    273275              enddo !do ixt=1,niso
    274               q_follow(i,k,iq_liq)=   q_follow(i,k,iq_liq)
    275      :               +zx_defau_diag(i,k,iq_liq)
    276               q_follow(i,k,iq_vap)=   q_follow(i,k,iq_vap)
    277      :               -zx_defau_diag(i,k,iq_liq)
    278           endif !if (zx_defau_diag(i,k,iq_vap).gt.0.0) then
     276              q_follow(i,k,2)=   q_follow(i,k,2)
     277     :               +zx_defau_diag(i,k,2)
     278              q_follow(i,k,1)=   q_follow(i,k,1)
     279     :               -zx_defau_diag(i,k,2)
     280          endif !if (zx_defau_diag(i,k,1).gt.0.0) then
    279281        enddo !DO i = ijb, ije
    280282c$OMP END DO NOWAIT       
  • LMDZ6/branches/cirrus/libf/dyn3dmem/vlspltgen_loc.F

    r4469 r5202  
    1010c
    1111c    ********************************************************************
    12 c          Shema  d'advection " pseudo amont " .
     12c          Schema  d'advection " pseudo amont " .
    1313c      + test sur humidite specifique: Q advecte< Qsat aval
    1414c                   (F. Codron, 10/99)
     
    3232      USE vlspltgen_mod
    3333      USE comconst_mod, ONLY: cpp
     34      USE logic_mod, ONLY: adv_qsat_liq
    3435      IMPLICIT NONE
    3536
     
    108109         ENDDO
    109110         DO ij = ijb, ije
    110           zdelta = MAX( 0., SIGN(1., rtt - tempe(ij)) )
     111          IF (adv_qsat_liq) THEN
     112             zdelta = 0.
     113          ELSE
     114             zdelta = MAX( 0., SIGN(1., rtt - tempe(ij)) )
     115          ENDIF
    111116          play   = 0.5*(p(ij,l)+p(ij,l+1))
    112117          qsat(ij,l) = MIN(0.5, r2es* FOEEW(tempe(ij),zdelta) / play )
  • LMDZ6/branches/cirrus/libf/dyn3dmem/vlspltqs_loc.F

    r4469 r5202  
    806806         IF (pole_sud) THEN
    807807         
    808            convps  = -SSUM(iim,qbyv(ip1jm-iim,l,iq),iq,1)/apols
     808           convps  = -SSUM(iim,qbyv(ip1jm-iim,l,iq),1)/apols
    809809           convmps = -SSUM(iim,masse_adv_v(ip1jm-iim,l),1)/apols
    810810           DO ij = ip1jm+1,ip1jmp1
  • LMDZ6/branches/cirrus/libf/misc/readTracFiles_mod.f90

    r4951 r5202  
    11MODULE readTracFiles_mod
    22
    3   USE strings_mod,    ONLY: msg, find, get_in, str2int, dispTable, strHead,  strReduce,  strFind, strStack, strIdx, &
    4        test, removeComment, cat, fmsg, maxlen, int2str, checkList, strParse, strReplace, strTail, strCount, reduceExpr
     3  USE strings_mod,    ONLY: msg, find, get_in, dispTable, strHead,  strReduce,  strFind, strStack, strIdx, &
     4             removeComment, cat, fmsg, maxlen, checkList, strParse, strReplace, strTail, strCount, reduceExpr, &
     5             int2str, str2int, real2str, str2real, bool2str, str2bool
    56
    67  IMPLICIT NONE
     
    910
    1011  PUBLIC :: maxlen                                              !--- PARAMETER FOR CASUAL STRING LENGTH
    11   PUBLIC :: tracers                                             !--- TRACERS  DESCRIPTION DATABASE
    12   PUBLIC :: trac_type, setGeneration, indexUpdate               !--- TRACERS  DESCRIPTION ASSOCIATED TOOLS
     12  PUBLIC :: trac_type, tracers, setGeneration, indexUpdate      !--- TRACERS  DESCRIPTION DATABASE + ASSOCIATED TOOLS
    1313  PUBLIC :: testTracersFiles, readTracersFiles                  !--- TRACERS FILES READING ROUTINES
    14   PUBLIC :: getKey, fGetKey, fGetKeys, addKey, setDirectKeys    !--- TOOLS TO GET/SET KEYS FROM/TO  tracers & isotopes
    15   PUBLIC :: getKeysDBase,    setKeysDBase                       !--- TOOLS TO GET/SET THE DATABASE (tracers & isotopes)
    16 
    17   PUBLIC :: addPhase, getiPhase,  old_phases, phases_sep, &     !--- FUNCTIONS RELATED TO THE PHASES
    18    nphases, delPhase, getPhase, known_phases, phases_names      !--- + ASSOCIATED VARIABLES
     14  PUBLIC :: getKeysDBase, setKeysDBase                          !--- TOOLS TO GET/SET THE DATABASE (tracers & isotopes)
     15  PUBLIC :: addTracer, delTracer                                !--- ADD/REMOVE A TRACER FROM
     16  PUBLIC :: addKey,    delKey,    getKey,    keys_type          !--- TOOLS TO SET/DEL/GET KEYS FROM/TO  tracers & isotopes
     17  PUBLIC :: addPhase,  delPhase,  getPhase,  getiPhase,  &      !--- FUNCTIONS RELATED TO THE PHASES
     18   nphases, old_phases, phases_sep, known_phases, phases_names  !--- + ASSOCIATED VARIABLES
    1919
    2020  PUBLIC :: oldH2OIso, newH2OIso, old2newH2O, new2oldH2O        !--- H2O ISOTOPES BACKWARD COMPATIBILITY (OLD traceur.def)
    2121  PUBLIC :: oldHNO3,   newHNO3                                  !--- HNO3 REPRO   BACKWARD COMPATIBILITY (OLD start.nc)
    2222
    23   PUBLIC :: tran0, idxAncestor, ancestor                        !--- GENERATION 0 TRACER + TOOLS FOR GENERATIONS
     23  PUBLIC :: tran0                                               !--- TRANSPORTING FLUID (USUALLY air)
    2424
    2525  !=== FOR ISOTOPES: GENERAL
    26   PUBLIC :: isot_type, readIsotopesFile, isoSelect              !--- ISOTOPES DESCRIPTION TYPE + READING ROUTINE
    27   PUBLIC :: ixIso, nbIso                                        !--- INDEX OF SELECTED ISOTOPES CLASS + NUMBER OF CLASSES
     26  PUBLIC :: isot_type, processIsotopes, isoSelect, ixIso, nbIso !--- PROCESS [AND READ] & SELECT ISOTOPES + CLASS IDX & NUMBER
    2827
    2928  !=== FOR ISOTOPES: H2O FAMILY ONLY
     
    3635  PUBLIC :: itZonIso                                            !--- Idx IN isoName(1:niso) = f(tagging idx, isotope idx)
    3736  PUBLIC :: iqIsoPha                                            !--- Idx IN qx(1:nqtot)     = f(isotope idx,   phase idx)
     37  PUBLIC :: iqWIsoPha                                           !--- Idx IN qx(1:nqtot)     = f(isotope idx,   phase idx) but with normal water first
    3838  PUBLIC :: isoCheck                                            !--- FLAG TO RUN ISOTOPES CHECKING ROUTINES
    3939
    4040  PUBLIC :: maxTableWidth
    4141!------------------------------------------------------------------------------------------------------------------------------
    42   TYPE :: keys_type                                        !=== TYPE FOR A SET OF KEYS ASSOCIATED TO AN ELEMENT
    43     CHARACTER(LEN=maxlen)              :: name             !--- Tracer name
    44     CHARACTER(LEN=maxlen), ALLOCATABLE :: key(:)           !--- Keys string list
    45     CHARACTER(LEN=maxlen), ALLOCATABLE :: val(:)           !--- Corresponding values string list
     42  TYPE :: keys_type                                             !=== TYPE FOR A SET OF KEYS ASSOCIATED TO AN ELEMENT
     43    CHARACTER(LEN=maxlen)              :: name                  !--- Tracer name
     44    CHARACTER(LEN=maxlen), ALLOCATABLE :: key(:)                !--- Keys string list
     45    CHARACTER(LEN=maxlen), ALLOCATABLE :: val(:)                !--- Corresponding values string list
    4646  END TYPE keys_type
    4747!------------------------------------------------------------------------------------------------------------------------------
    48   TYPE :: trac_type                                        !=== TYPE FOR A SINGLE TRACER NAMED "name"
    49     CHARACTER(LEN=maxlen) :: name        = ''              !--- Name of the tracer
    50     CHARACTER(LEN=maxlen) :: gen0Name    = ''              !--- First generation ancestor name
    51     CHARACTER(LEN=maxlen) :: parent      = ''              !--- Parent name
    52     CHARACTER(LEN=maxlen) :: longName    = ''              !--- Long name (with advection scheme suffix)
    53     CHARACTER(LEN=maxlen) :: type        = 'tracer'        !--- Type  (so far: 'tracer' / 'tag')
    54     CHARACTER(LEN=maxlen) :: phase       = 'g'             !--- Phase ('g'as / 'l'iquid / 's'olid)
    55     CHARACTER(LEN=maxlen) :: component   = ''              !--- Coma-separated list of components (Ex: lmdz,inca)
    56     INTEGER               :: iGeneration = -1              !--- Generation number (>=0)
    57     INTEGER               :: iqParent    = 0               !--- Parent index
    58     INTEGER,  ALLOCATABLE :: iqDescen(:)                   !--- Descendants index (in growing generation order)
    59     INTEGER               :: nqDescen    = 0               !--- Number of descendants (all generations)
    60     INTEGER               :: nqChildren  = 0               !--- Number of children  (first generation)
    61     TYPE(keys_type)       :: keys                          !--- <key>=<val> pairs vector
    62     INTEGER               :: iadv        = 10              !--- Advection scheme used
    63     LOGICAL               :: isAdvected  = .FALSE.         !--- "true" tracers: iadv > 0.   COUNT(isAdvected )=nqtrue
    64     LOGICAL               :: isInPhysics = .TRUE.          !--- "true" tracers: in tr_seri. COUNT(isInPhysics)=nqtottr
    65     INTEGER               :: iso_iGroup  = 0               !--- Isotopes group index in isotopes(:)
    66     INTEGER               :: iso_iName   = 0               !--- Isotope  name  index in isotopes(iso_iGroup)%trac(:)
    67     INTEGER               :: iso_iZone   = 0               !--- Isotope  zone  index in isotopes(iso_iGroup)%zone(:)
    68     INTEGER               :: iso_iPhase  = 0               !--- Isotope  phase index in isotopes(iso_iGroup)%phase
     48  TYPE :: trac_type                                             !=== TYPE FOR A SINGLE TRACER NAMED "name"
     49    CHARACTER(LEN=maxlen) :: name        = ''                   !--- Name of the tracer
     50    TYPE(keys_type)       :: keys                               !--- <key>=<val> pairs vector
     51    CHARACTER(LEN=maxlen) :: gen0Name    = ''                   !--- First generation ancestor name
     52    CHARACTER(LEN=maxlen) :: parent      = ''                   !--- Parent name
     53    CHARACTER(LEN=maxlen) :: longName    = ''                   !--- Long name (with advection scheme suffix)
     54    CHARACTER(LEN=maxlen) :: type        = 'tracer'             !--- Type  (so far: 'tracer' / 'tag')
     55    CHARACTER(LEN=maxlen) :: phase       = 'g'                  !--- Phase ('g'as / 'l'iquid / 's'olid)
     56    CHARACTER(LEN=maxlen) :: component   = ''                   !--- Coma-separated list of components (Ex: lmdz,inca)
     57    INTEGER               :: iGeneration = -1                   !--- Generation number (>=0)
     58    INTEGER               :: iqParent    = 0                    !--- Parent index
     59    INTEGER,  ALLOCATABLE :: iqDescen(:)                        !--- Descendants index (in growing generation order)
     60    INTEGER               :: nqDescen    = 0                    !--- Number of descendants (all generations)
     61    INTEGER               :: nqChildren  = 0                    !--- Number of children  (first generation)
     62    INTEGER               :: iadv        = 10                   !--- Advection scheme used
     63    LOGICAL               :: isAdvected  = .FALSE.              !--- "true" tracers: iadv > 0.   COUNT(isAdvected )=nqtrue
     64    LOGICAL               :: isInPhysics = .TRUE.               !--- "true" tracers: in tr_seri. COUNT(isInPhysics)=nqtottr
     65    INTEGER               :: iso_iGroup  = 0                    !--- Isotopes group index in isotopes(:)
     66    INTEGER               :: iso_iName   = 0                    !--- Isotope  name  index in isotopes(iso_iGroup)%trac(:)
     67    INTEGER               :: iso_iZone   = 0                    !--- Isotope  zone  index in isotopes(iso_iGroup)%zone(:)
     68    INTEGER               :: iso_iPhase  = 0                    !--- Isotope  phase index in isotopes(iso_iGroup)%phase
    6969  END TYPE trac_type
    7070!------------------------------------------------------------------------------------------------------------------------------
    71   TYPE :: isot_type                                        !=== TYPE FOR AN ISOTOPES FAMILY DESCENDING ON TRACER "parent"
    72     CHARACTER(LEN=maxlen)              :: parent           !--- Isotopes family name (parent tracer name ; ex: H2O)
    73     LOGICAL                            :: check=.FALSE.    !--- Triggering of the checking routines
    74     TYPE(keys_type),       ALLOCATABLE :: keys(:)          !--- Isotopes keys/values pairs list     (length: niso)
    75     CHARACTER(LEN=maxlen), ALLOCATABLE :: trac(:)          !--- Isotopes + tagging tracers list     (length: ntiso)
    76     CHARACTER(LEN=maxlen), ALLOCATABLE :: zone(:)          !--- Geographic tagging zones names list (length: nzone)
    77     CHARACTER(LEN=maxlen)              :: phase = 'g'      !--- Phases list: [g][l][s]              (length: nphas)
    78     INTEGER                            :: niso  = 0        !--- Number of isotopes, excluding tagging tracers
    79     INTEGER                            :: nzone = 0        !--- Number of geographic tagging zones
    80     INTEGER                            :: ntiso = 0        !--- Number of isotopes, including tagging tracers
    81     INTEGER                            :: nphas = 0        !--- Number phases
    82     INTEGER,               ALLOCATABLE :: iqIsoPha(:,:)    !--- Idx in "tracers(1:nqtot)" = f(name(1:ntiso)),phas)
    83                                                            !---        "iqIsoPha" former name: "iqiso"
    84     INTEGER,               ALLOCATABLE :: itZonIso(:,:)    !--- Idx in "trac(1:ntiso)" = f(zone, name(1:niso))
    85                                                            !---        "itZonIso" former name: "index_trac"
    86   END TYPE isot_type
     71  TYPE :: isot_type                                             !=== TYPE FOR AN ISOTOPES FAMILY DESCENDING ON TRACER "parent"
     72    CHARACTER(LEN=maxlen)              :: parent                !--- Isotopes family name (parent tracer name ; ex: H2O)
     73    TYPE(keys_type),       ALLOCATABLE :: keys(:)               !--- Isotopes keys/values pairs list     (length: niso)
     74    LOGICAL                            :: check=.FALSE.         !--- Flag for checking routines triggering
     75    CHARACTER(LEN=maxlen), ALLOCATABLE :: trac(:)               !--- Isotopes + tagging tracers list     (length: ntiso)
     76    CHARACTER(LEN=maxlen), ALLOCATABLE :: zone(:)               !--- Geographic tagging zones names list (length: nzone)
     77    CHARACTER(LEN=maxlen)              :: phase = 'g'           !--- Phases list: [g][l][s]              (length: nphas)
     78    INTEGER                            :: niso  = 0             !--- Number of isotopes, excluding tagging tracers
     79    INTEGER                            :: ntiso = 0             !--- Number of isotopes, including tagging tracers
     80    INTEGER                            :: nzone = 0             !--- Number of geographic tagging zones
     81    INTEGER                            :: nphas = 0             !--- Number of phases
     82    INTEGER,               ALLOCATABLE :: iqIsoPha(:,:)         !--- Idx in "tracers(1:nqtot)" = f(name(1:ntiso),phas)
     83                                                                !---        (former name: "iqiso"
     84    INTEGER,               ALLOCATABLE :: iqWIsoPha(:,:)        !--- Idx in "tracers(1:nqtot)" = f([H2O,name(1:ntiso)],phas)
     85    INTEGER,               ALLOCATABLE :: itZonIso(:,:)         !--- Idx in "trac(1:ntiso)" = f(zone, name(1:niso))
     86  END TYPE isot_type                                            !---        (former name: "index_trac")
    8787!------------------------------------------------------------------------------------------------------------------------------
    8888  TYPE :: dataBase_type                                         !=== TYPE FOR TRACERS SECTION
    89     CHARACTER(LEN=maxlen)  :: name                              !--- Section name
     89    CHARACTER(LEN=maxlen) :: name                               !--- Section name
    9090    TYPE(trac_type), ALLOCATABLE :: trac(:)                     !--- Tracers descriptors
    9191  END TYPE dataBase_type
    9292!------------------------------------------------------------------------------------------------------------------------------
    9393  INTERFACE getKey
    94     MODULE PROCEDURE getKeyByName_s1, getKeyByName_s1m, getKeyByName_sm, getKey_sm, &
    95                      getKeyByName_i1, getKeyByName_i1m, getKeyByName_im, getKey_im, &
    96                      getKeyByName_r1, getKeyByName_r1m, getKeyByName_rm, getKey_rm, &
    97                      getKeyByName_l1, getKeyByName_l1m, getKeyByName_lm, getKey_lm
     94    MODULE PROCEDURE &
     95       getKeyByIndex_s111, getKeyByIndex_sm11, getKeyByIndex_s1m1, getKeyByIndex_smm1, getKeyByIndex_s1mm, getKeyByIndex_smmm, &
     96       getKeyByIndex_i111, getKeyByIndex_im11, getKeyByIndex_i1m1, getKeyByIndex_imm1, getKeyByIndex_i1mm, getKeyByIndex_immm, &
     97       getKeyByIndex_r111, getKeyByIndex_rm11, getKeyByIndex_r1m1, getKeyByIndex_rmm1, getKeyByIndex_r1mm, getKeyByIndex_rmmm, &
     98       getKeyByIndex_l111, getKeyByIndex_lm11, getKeyByIndex_l1m1, getKeyByIndex_lmm1, getKeyByIndex_l1mm, getKeyByIndex_lmmm, &
     99        getKeyByName_s111,  getKeyByName_sm11,  getKeyByName_s1m1,  getKeyByName_smm1,  getKeyByName_s1mm,  getKeyByName_smmm, &
     100        getKeyByName_i111,  getKeyByName_im11,  getKeyByName_i1m1,  getKeyByName_imm1,  getKeyByName_i1mm,  getKeyByName_immm, &
     101        getKeyByName_r111,  getKeyByName_rm11,  getKeyByName_r1m1,  getKeyByName_rmm1,  getKeyByName_r1mm,  getKeyByName_rmmm, &
     102        getKeyByName_l111,  getKeyByName_lm11,  getKeyByName_l1m1,  getKeyByName_lmm1,  getKeyByName_l1mm,  getKeyByName_lmmm
    98103  END INTERFACE getKey
    99104!------------------------------------------------------------------------------------------------------------------------------
    100   INTERFACE    isoSelect;  MODULE PROCEDURE  isoSelectByIndex,  isoSelectByName; END INTERFACE isoSelect
    101   INTERFACE  old2newH2O;   MODULE PROCEDURE  old2newH2O_1,  old2newH2O_m;        END INTERFACE old2newH2O
    102   INTERFACE  new2oldH2O;   MODULE PROCEDURE  new2oldH2O_1,  new2oldH2O_m;        END INTERFACE new2oldH2O
    103   INTERFACE fGetKey;       MODULE PROCEDURE fgetKeyIdx_s1, fgetKeyNam_s1;        END INTERFACE fGetKey
    104   INTERFACE tracersSubset; MODULE PROCEDURE trSubset_Indx, trSubset_Name, trSubset_gen0Name; END INTERFACE tracersSubset
    105   INTERFACE idxAncestor;   MODULE PROCEDURE idxAncestor_1, idxAncestor_m, idxAncestor_mt;    END INTERFACE idxAncestor
    106   INTERFACE    ancestor;   MODULE PROCEDURE    ancestor_1,    ancestor_m,    ancestor_mt;    END INTERFACE    ancestor
    107   INTERFACE      addKey;   MODULE PROCEDURE      addKey_1; END INTERFACE addKey!,      addKey_m,     addKey_mm;     END INTERFACE addKey
    108   INTERFACE    addPhase;   MODULE PROCEDURE   addPhase_s1,   addPhase_sm,   addPhase_i1,   addPhase_im; END INTERFACE addPhase
     105  INTERFACE addKey
     106    MODULE PROCEDURE addKey_s11, addKey_s1m, addKey_smm, addKey_i11, addKey_i1m, addKey_imm, &
     107                     addKey_r11, addKey_r1m, addKey_rmm, addKey_l11, addKey_l1m, addKey_lmm
     108  END INTERFACE addKey
     109!------------------------------------------------------------------------------------------------------------------------------
     110  INTERFACE     isoSelect; MODULE PROCEDURE  isoSelectByIndex,  isoSelectByName; END INTERFACE isoSelect
     111  INTERFACE    old2newH2O; MODULE PROCEDURE  old2newH2O_1,  old2newH2O_m;        END INTERFACE old2newH2O
     112  INTERFACE    new2oldH2O; MODULE PROCEDURE  new2oldH2O_1,  new2oldH2O_m;        END INTERFACE new2oldH2O
     113  INTERFACE     addTracer; MODULE PROCEDURE   addTracer_1, addTracer_1def;       END INTERFACE addTracer
     114  INTERFACE     delTracer; MODULE PROCEDURE   delTracer_1, delTracer_1def;       END INTERFACE delTracer
     115  INTERFACE      addPhase; MODULE PROCEDURE   addPhase_s1,  addPhase_sm,  addPhase_i1,  addPhase_im; END INTERFACE addPhase
     116  INTERFACE tracersSubset; MODULE PROCEDURE trSubset_Indx,     trSubset_Name,     trSubset_gen0Name; END INTERFACE tracersSubset
    109117!------------------------------------------------------------------------------------------------------------------------------
    110118
     
    114122  !--- SOME PARAMETERS THAT ARE NOT LIKELY TO CHANGE OFTEN
    115123  CHARACTER(LEN=maxlen), SAVE      :: tran0        = 'air'      !--- Default transporting fluid
    116   CHARACTER(LEN=maxlen), PARAMETER :: old_phases   = 'vlifbc'     !--- Old phases for water (no separator)
    117   CHARACTER(LEN=maxlen), PARAMETER :: known_phases = 'glsfbc'     !--- Known phases initials
     124  CHARACTER(LEN=maxlen), PARAMETER :: old_phases   = 'vlirb'    !--- Old phases for water (no separator)
     125  CHARACTER(LEN=maxlen), PARAMETER :: known_phases = 'glsrb'    !--- Known phases initials
    118126  INTEGER, PARAMETER :: nphases = LEN_TRIM(known_phases)        !--- Number of phases
    119127  CHARACTER(LEN=maxlen), SAVE      :: phases_names(nphases) &   !--- Known phases names
    120                                 = ['gaseous', 'liquid ', 'solid  ', 'fracld ', 'blosnow', 'cldvapr']
    121   CHARACTER(LEN=1), SAVE :: phases_sep  =  '_'                  !--- Phase separator
    122   LOGICAL,          SAVE :: tracs_merge = .TRUE.                !--- Merge/stack tracers lists
    123   LOGICAL,          SAVE :: lSortByGen  = .TRUE.                !--- Sort by growing generation
     128                                = ['gaseous  ', 'liquid   ', 'solid    ', 'cloud    ','blownSnow']
     129  CHARACTER(LEN=1),      SAVE :: phases_sep  =  '_'             !--- Phase separator
    124130  CHARACTER(LEN=maxlen), SAVE :: isoFile = 'isotopes_params.def'!--- Name of the isotopes parameters file
    125131
     
    128134  CHARACTER(LEN=maxlen), SAVE :: newH2OIso(5) = ['H216O', 'HDO  ', 'H218O', 'H217O', 'HTO  ']
    129135
    130   !--- CORRESPONDANCE BETWEEN OLD AND NEW HNO3 RELATED SPECIES NAMES
     136  !--- CORRESPONDANCE BETWEEN OLD AND NEW HNO3 RELATED SPECIES NAMES (FOR REPROBUS)
    131137  CHARACTER(LEN=maxlen), SAVE ::   oldHNO3(2) = ['HNO3_g ', 'HNO3   ']
    132138  CHARACTER(LEN=maxlen), SAVE ::   newHNO3(2) = ['HNO3   ', 'HNO3tot']
     
    138144  !=== ALIASES OF VARIABLES FROM SELECTED ISOTOPES FAMILY EMBEDDED IN "isotope" (isotopes(ixIso))
    139145  TYPE(isot_type),         SAVE, POINTER :: isotope             !--- CURRENTLY SELECTED ISOTOPES FAMILY DESCRIPTOR
    140   INTEGER,                 SAVE          :: ixIso, iH2O         !--- Index of the selected isotopes family and H2O family
     146  INTEGER,                 SAVE          :: ixIso, iH2O=0       !--- Index of the selected isotopes family and H2O family
    141147  INTEGER,                 SAVE          :: nbIso               !--- Number of isotopes classes
    142148  LOGICAL,                 SAVE          :: isoCheck            !--- Flag to trigger the checking routines
     
    148154                                            nphas, ntiso        !--- NUMBER OF PHASES AND ISOTOPES + ISOTOPIC TAGGING TRACERS
    149155  INTEGER,                 SAVE, POINTER ::itZonIso(:,:), &     !--- INDEX IN "isoTrac" AS f(tagging zone idx,  isotope idx)
    150                                            iqIsoPha(:,:)        !--- INDEX IN "qx"      AS f(isotopic tracer idx, phase idx)
     156                                           iqIsoPha(:,:), &     !--- INDEX IN "qx" AS f(isotopic tracer idx, phase idx)
     157                                           iqWIsoPha(:,:)       !--- INDEX IN "qx" AS f(H2O + isotopic tracer idx, phase idx)
     158
     159  !=== PARAMETERS FOR DEFAULT BEHAVIOUR
     160  LOGICAL, PARAMETER :: lTracsMerge = .FALSE.                   !--- Merge/stack tracers lists
     161  LOGICAL, PARAMETER :: lSortByGen  = .TRUE.                    !--- Sort by growing generation
    151162
    152163  INTEGER,    PARAMETER :: maxTableWidth = 192                  !--- Maximum width of a table displayed with "dispTable"
     
    179190!     * If you need to convert a %key/%val pair into a direct-access key, add the corresponding line in "setDirectKeys".
    180191!==============================================================================================================================
    181 LOGICAL FUNCTION readTracersFiles(type_trac, lRepr) RESULT(lerr)
    182 !------------------------------------------------------------------------------------------------------------------------------
    183   CHARACTER(LEN=*),  INTENT(IN)  :: type_trac                        !--- List of components used
    184   LOGICAL, OPTIONAL, INTENT(IN)  :: lRepr                            !--- Activate the HNNO3 exceptions for REPROBUS
     192LOGICAL FUNCTION readTracersFiles(type_trac, tracs, lRepr) RESULT(lerr)
     193!------------------------------------------------------------------------------------------------------------------------------
     194  CHARACTER(LEN=*),                               INTENT(IN)  :: type_trac     !--- List of components used
     195  TYPE(trac_type), ALLOCATABLE, TARGET, OPTIONAL, INTENT(OUT) :: tracs(:)      !--- Tracers descriptor for external storage
     196  LOGICAL,                              OPTIONAL, INTENT(IN)  :: lRepr         !--- Activate the HNO3 exceptions for REPROBUS
    185197  CHARACTER(LEN=maxlen),  ALLOCATABLE :: s(:), sections(:), trac_files(:)
    186198  CHARACTER(LEN=maxlen) :: str, fname, tname, pname, cname
    187199  INTEGER               :: nsec, ierr, it, ntrac, ns, ip, ix, fType
     200  INTEGER, ALLOCATABLE  :: iGen(:)
    188201  LOGICAL :: lRep
    189202  TYPE(keys_type), POINTER :: k
     
    195208
    196209  !--- Required sections + corresponding files names (new style single section case) for tests
    197   IF(test(testTracersFiles(modname, type_trac, fType, .FALSE., trac_files, sections), lerr)) RETURN
     210  lerr = testTracersFiles(modname, type_trac, fType, .FALSE., trac_files, sections); IF(lerr) RETURN
    198211  nsec = SIZE(sections)
    199212
    200213  !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    201   SELECT CASE(fType)                         !--- Set %name, %genOName, %parent, %type, %phase, %component, %iGeneration, %keys
     214  SELECT CASE(fType)                         !--- Set name, component, parent, phase, iGeneration, gen0Name, type
    202215  !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    203216    CASE(1)                                                          !=== OLD FORMAT "traceur.def"
    204217    !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    205218      !--- OPEN THE "traceur.def" FILE
    206       OPEN(90, FILE="traceur.def", FORM='formatted', STATUS='old', IOSTAT=ierr)
     219      OPEN(90, FILE="traceur.def", FORM='formatted', STATUS='old', POSITION='REWIND', IOSTAT=ierr)
    207220
    208221      !--- GET THE TRACERS NUMBER
    209222      READ(90,'(i3)',IOSTAT=ierr)ntrac                               !--- Number of lines/tracers
    210       IF(test(fmsg('Invalid format for "'//TRIM(fname)//'"', modname, ierr /= 0), lerr)) RETURN
     223      lerr = ierr/=0; IF(fmsg('Invalid format for "'//TRIM(fname)//'"', modname, lerr)) RETURN
    211224
    212225      !--- READ THE REMAINING LINES: <hadv> <vadv> <tracer> [<transporting fluid>]
    213       IF(ALLOCATED(tracers)) DEALLOCATE(tracers)
    214226      ALLOCATE(tracers(ntrac))
    215       DO it=1,ntrac                                                  !=== READ RAW DATA: loop on the line/tracer number
     227      DO it = 1, ntrac                                               !=== READ RAW DATA: loop on the line/tracer number
    216228        READ(90,'(a)',IOSTAT=ierr) str
    217         IF(test(fmsg('Invalid format for "' //TRIM(fname)//'"', modname, ierr>0), lerr)) RETURN
    218         IF(test(fmsg('Not enough lines in "'//TRIM(fname)//'"', modname, ierr<0), lerr)) RETURN
     229        lerr = ierr>0; IF(fmsg('Invalid format for "' //TRIM(fname)//'"', modname, lerr)) RETURN
     230        lerr = ierr<0; IF(fmsg('Not enough lines in "'//TRIM(fname)//'"', modname, lerr)) RETURN
    219231        lerr = strParse(str, ' ', s, ns)
    220232        CALL msg('This file is for air tracers only',           modname, ns == 3 .AND. it == 1)
     
    226238        ix = strIdx(oldHNO3, s(3))
    227239        IF(ix /= 0 .AND. lRep) tname = newHNO3(ix)                   !--- Exception for HNO3 (REPROBUS ONLY)
    228         tracers(it)%name = tname                                     !--- Set %name
    229         CALL addKey_1('name', tname, k)                              !--- Set the name of the tracer
     240        tracers(it)%name = tname                                     !--- Set the name of the tracer
     241        CALL addKey('name', tname, k)                                !--- Set the name of the tracer
    230242        tracers(it)%keys%name = tname                                !--- Copy tracers names in keys components
    231243
     
    233245        cname = type_trac                                            !--- Name of the model component
    234246        IF(ANY([(addPhase('H2O', ip), ip = 1, nphases)] == tname)) cname = 'lmdz'
    235         tracers(it)%component = cname                                !--- Set %component
    236         CALL addKey_1('component', cname, k)                         !--- Set the name of the model component
     247        tracers(it)%component = cname                                !--- Set component
     248        CALL addKey('component', cname, k)                           !--- Set the name of the model component
    237249
    238250        !=== NAME OF THE PARENT
     
    243255          IF(ix /= 0 .AND. lRep) pname = newHNO3(ix)                 !--- Exception for HNO3 (REPROBUS ONLY)
    244256        END IF
    245         tracers(it)%parent = pname                                   !--- Set %parent
    246         CALL addKey_1('parent', pname, k)
     257        tracers(it)%parent = pname                                   !--- Set the parent name
     258        CALL addKey('parent', pname, k)
    247259
    248260        !=== PHASE AND ADVECTION SCHEMES NUMBERS
    249         tracers(it)%phase = known_phases(ip:ip)                      !--- Set %phase:  tracer phase (default: "g"azeous)
    250         CALL addKey_1('phase', known_phases(ip:ip), k)               !--- Set the phase of the tracer (default: "g"azeous)
    251         CALL addKey_1('hadv', s(1),  k)                              !--- Set the horizontal advection schemes number
    252         CALL addKey_1('vadv', s(2),  k)                              !--- Set the vertical   advection schemes number
     261        tracers(it)%phase = known_phases(ip:ip)                      !--- Set the phase of the tracer (default: "g"azeous)
     262        CALL addKey('phase', known_phases(ip:ip), k)                 !--- Set the phase of the tracer (default: "g"azeous)
     263        CALL addKey('hadv', s(1),  k)                                !--- Set the horizontal advection schemes number
     264        CALL addKey('vadv', s(2),  k)                                !--- Set the vertical   advection schemes number
    253265      END DO
    254266      CLOSE(90)
    255       IF(test(setGeneration(tracers), lerr)) RETURN                  !--- Set %iGeneration and %gen0Name
    256       WHERE(tracers%iGeneration == 2) tracers(:)%type = 'tag'        !--- Set %type:        'tracer' or 'tag'
    257       DO it=1,ntrac
    258         CALL addKey_1('type', tracers(it)%type, tracers(it)%keys)    !--- Set the type of tracer
     267      lerr = setGeneration(tracers); IF(lerr) RETURN                 !--- Set iGeneration and gen0Name
     268      lerr = getKey('iGeneration', iGen, tracers(:)%keys)            !--- Generation number
     269      WHERE(iGen == 2) tracers(:)%type = 'tag'                       !--- Set type:      'tracer' or 'tag'
     270      DO it = 1, ntrac
     271        CALL addKey('type', tracers(it)%type, tracers(it)%keys)      !--- Set the type of tracer
    259272      END DO
    260       IF(test(checkTracers(tracers, fname, fname), lerr)) RETURN     !--- Detect orphans and check phases
    261       IF(test(checkUnique (tracers, fname, fname), lerr)) RETURN     !--- Detect repeated tracers
    262       CALL sortTracers    (tracers)                                  !--- Sort the tracers
     273      lerr = checkTracers(tracers, fname, fname); IF(lerr) RETURN    !--- Detect orphans and check phases
     274      lerr = checkUnique (tracers, fname, fname); IF(lerr) RETURN    !--- Detect repeated tracers
     275      CALL sortTracers   (tracers)                                   !--- Sort the tracers
    263276    !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    264     CASE(2); IF(test(feedDBase(["tracer.def"], [type_trac], modname), lerr)) RETURN !=== SINGLE   FILE, MULTIPLE SECTIONS
     277    CASE(2); lerr=feedDBase(["tracer.def"], [type_trac], modname); IF(lerr) RETURN !=== SINGLE   FILE, MULTIPLE SECTIONS
    265278    !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    266     CASE(3); IF(test(feedDBase(  trac_files  ,  sections,   modname), lerr)) RETURN !=== MULTIPLE FILES, SINGLE  SECTION
     279    CASE(3); lerr=feedDBase(  trac_files  ,  sections,   modname); IF(lerr) RETURN !=== MULTIPLE FILES, SINGLE  SECTION
    267280  !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    268281  END SELECT
    269282  !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    270283  IF(ALL([2,3] /= fType)) RETURN
    271 
    272   IF(nsec  == 1) THEN;
    273     tracers = dBase(1)%trac
    274   ELSE IF(tracs_merge) THEN
    275     CALL msg('The multiple required sections will be MERGED.',    modname)
    276     IF(test(mergeTracers(dBase, tracers), lerr)) RETURN
    277   ELSE
    278     CALL msg('The multiple required sections will be CUMULATED.', modname)
    279     IF(test(cumulTracers(dBase, tracers), lerr)) RETURN
     284  IF(nsec == 1) tracers = dBase(1)%trac
     285  IF(nsec /= 1) THEN
     286    CALL msg('Multiple sections are MERGED',    modname,      lTracsMerge)
     287    CALL msg('Multiple sections are CUMULATED', modname, .NOT.lTracsMerge)
     288    IF(     lTracsMerge) lerr = cumulTracers(dBase, tracers)
     289    IF(.NOT.lTracsMerge) lerr = cumulTracers(dBase, tracers)
     290    IF(lerr) RETURN
    280291  END IF
    281   CALL setDirectKeys(tracers)                                        !--- Set %iqParent, %iqDescen, %nqDescen, %nqChildren
     292  lerr = indexUpdate(tracers); IF(lerr) RETURN                       !--- Set iqParent, iqDescen, nqDescen, nqChildren
     293  IF(PRESENT(tracs)) CALL MOVE_ALLOC(FROM=tracers, TO=tracs)
    282294END FUNCTION readTracersFiles
    283295!==============================================================================================================================
     
    299311  !--- PARSE "type_trac" LIST AND DETERMINE THE TRACERS FILES NAMES (FOR CASE 3: MULTIPLE FILES, SINGLE SECTION PER FILE)
    300312  !--- If type_trac is a scalar (case 1), "sections" and "trac_files" are not usable, but are meaningless for case 1 anyway.
    301   IF(test(strParse(type_trac, '|', sections,  n=nsec), lerr)) RETURN !--- Parse "type_trac" list
     313  lerr = strParse(type_trac, '|', sections, n=nsec); IF(lerr) RETURN !--- Parse "type_trac" list
    302314  IF(PRESENT(sects)) sects = sections
    303315  ALLOCATE(trac_files(nsec), ll(nsec))
     
    313325  IF(.NOT.lD) RETURN                                                 !--- NO CHECKING/DISPLAY NEEDED: JUST GET type_trac,fType
    314326  IF(ANY(ll) .AND. fType/=3) THEN                                    !--- MISSING FILES
    315     IF(test(checkList(trac_files, .NOT.ll, 'Failed reading tracers description', 'files', 'missing'), lerr)) RETURN
     327    lerr = checkList(trac_files, .NOT.ll, 'Failed reading tracers description', 'files', 'missing'); IF(lerr) RETURN
    316328  END IF
    317329
     
    344356  ll = strCount(snames, '|', ndb)                                    !--- Number of sections for each file
    345357  ALLOCATE(ixf(SUM(ndb)))
    346   DO i=1, SIZE(fnames)                                               !--- Set %name, %keys
    347     IF(test(readSections(fnames(i), snames(i), 'default'), lerr)) RETURN
     358  DO i=1, SIZE(fnames)                                               !--- Set name, keys
     359    lerr = readSections(fnames(i), snames(i), 'default'); IF(lerr) RETURN
    348360    ixf(1+SUM(ndb(1:i-1)):SUM(ndb(1:i))) = i                         !--- File index for each section of the expanded list
    349361  END DO
     
    353365    fnm = fnames(ixf(idb)); snm = dBase(idb)%name                    !--- FILE AND SECTION NAMES
    354366    lerr = ANY([(dispTraSection('RAW CONTENT OF SECTION "'//TRIM(snm)//'"', snm, modname), idb=1, SIZE(dBase))])
    355     IF(test(expandSection(dBase(idb)%trac, snm, fnm), lerr)) RETURN  !--- EXPAND NAMES ;  set %parent, %type, %component
    356     IF(test(setGeneration(dBase(idb)%trac),           lerr)) RETURN  !---                 set %iGeneration,   %genOName
    357     IF(test(checkTracers (dBase(idb)%trac, snm, fnm), lerr)) RETURN !--- CHECK ORPHANS AND PHASES
    358     IF(test(checkUnique  (dBase(idb)%trac, snm, fnm), lerr)) RETURN !--- CHECK TRACERS UNIQUENESS
    359     CALL expandPhases    (dBase(idb)%trac)                           !--- EXPAND PHASES ; set %phase
    360     CALL sortTracers     (dBase(idb)%trac)                           !--- SORT TRACERS
     367    lerr = expandSection(dBase(idb)%trac, snm, fnm); IF(lerr) RETURN !--- EXPAND NAMES ;  SET parent, type, component
     368    lerr = setGeneration(dBase(idb)%trac);           IF(lerr) RETURN !---                 SET iGeneration,  genOName
     369    lerr = checkTracers (dBase(idb)%trac, snm, fnm); IF(lerr) RETURN !--- CHECK ORPHANS AND PHASES
     370    lerr = checkUnique  (dBase(idb)%trac, snm, fnm); IF(lerr) RETURN !--- CHECK TRACERS UNIQUENESS
     371    lerr = expandPhases (dBase(idb)%trac);           IF(lerr) RETURN !--- EXPAND PHASES ; set phase
     372    CALL sortTracers    (dBase(idb)%trac)                            !--- SORT TRACERS
    361373    lerr = ANY([(dispTraSection('EXPANDED CONTENT OF SECTION "'//TRIM(snm)//'"', snm, modname), idb=1, SIZE(dBase))])
    362374  !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
     
    387399  ll = strParse(snam, '|', keys = sec)                               !--- Requested sections names
    388400  ix = strIdx(dBase(:)%name, sec(:))                                 !--- Indexes of requested sections in database
    389   IF(test(checkList(sec, ix == 0, 'In file "'//TRIM(fnam)//'"','section(s)', 'missing'), lerr)) RETURN
     401  lerr = checkList(sec, ix == 0, 'In file "'//TRIM(fnam)//'"','section(s)', 'missing'); IF(lerr) RETURN
    390402  tdb = dBase(:); dBase = [tdb(1:n0-1),tdb(PACK(ix, MASK=ix/=0))]    !--- Keep requested sections only
    391403
     
    403415!------------------------------------------------------------------------------------------------------------------------------
    404416  IF(.NOT.ALLOCATED(dBase)) ALLOCATE(dBase(0))
    405   OPEN(90, FILE=fnam, FORM='formatted', STATUS='old')
     417  OPEN(90, FILE=fnam, FORM='formatted', POSITION='REWIND', STATUS='old')
    406418  DO; str=''
    407419    DO
     
    416428    IF(str(1:1)=='#') CYCLE                                          !--- Skip comments lines
    417429    CALL removeComment(str)                                          !--- Skip comments at the end of a line
     430    IF(LEN_TRIM(str) == 0) CYCLE                                     !--- Empty line (probably end of file)
    418431    IF(str     == '') CYCLE                                          !--- Skip empty line (probably at the end of the file)
    419432    IF(str(1:1)=='&') THEN                                           !=== SECTION HEADER LINE
     
    431444      ll = strParse(str,' ', s, n, v)                                !--- Parse <key>=<val> pairs
    432445      tt = dBase(ndb)%trac(:)
    433       tmp%name = s(1); tmp%keys = keys_type(s(1), s(2:n), v(2:n))    !--- Set %name and %keys
     446      v(1) = s(1); s(1) = 'name'                                     !--- Convert "name" into a regular key
     447      tmp%name = v(1); tmp%keys = keys_type(v(1), s(:), v(:))        !--- Set %name and %keys
    434448      dBase(ndb)%trac = [tt(:), tmp]
    435       DEALLOCATE(tt)
    436 !      dBase(ndb)%trac = [dBase(ndb)%trac(:), tra(name=s(1), keys=keys_type(s(1), s(2:n), v(2:n)))]
     449      DEALLOCATE(tt, tmp%keys%key, tmp%keys%val)
    437450    END IF
    438451  END DO
     
    460473  ky => t(jd)%keys
    461474  DO k = 1, SIZE(ky%key)                                             !--- Loop on the keys of the tracer named "defName"
    462 !   CALL addKey_m(ky%key(k), ky%val(k), t(:)%keys, .FALSE.)           !--- Add key to all the tracers (no overwriting)
    463     DO it = 1, SIZE(t); CALL addKey_1(ky%key(k), ky%val(k), t(it)%keys, .FALSE.); END DO
     475!   CALL addKey(ky%key(k), ky%val(k), t(:)%keys, .FALSE.)            !--- Add key to all the tracers (no overwriting)
     476    DO it = 1, SIZE(t); CALL addKey(ky%key(k), ky%val(k), t(it)%keys, .FALSE.); END DO
    464477  END DO
    465478  tt = [t(1:jd-1),t(jd+1:SIZE(t))]; CALL MOVE_ALLOC(FROM=tt, TO=t)   !--- Remove the virtual tracer named "defName"
     
    506519!------------------------------------------------------------------------------------------------------------------------------
    507520  TYPE(trac_type), ALLOCATABLE, INTENT(INOUT) :: tr(:)                 !--- Tracer derived type vector
    508   CHARACTER(LEN=*),             INTENT(IN)    :: sname
    509   CHARACTER(LEN=*), OPTIONAL,   INTENT(IN)    :: fname
     521  CHARACTER(LEN=*),             INTENT(IN)    :: sname                 !--- Current section name
     522  CHARACTER(LEN=*), OPTIONAL,   INTENT(IN)    :: fname                 !--- Tracers description file name
    510523  TYPE(trac_type),       ALLOCATABLE :: ttr(:)
    511   CHARACTER(LEN=maxlen), ALLOCATABLE :: ta(:), pa(:)
     524  CHARACTER(LEN=maxlen), ALLOCATABLE :: ta(:), pa(:), tname(:), parent(:), dType(:)
    512525  CHARACTER(LEN=maxlen) :: msg1, modname
    513526  INTEGER :: it, nt, iq, nq, itr, ntr, ipr, npr
     
    516529  lerr = .FALSE.
    517530  nt = SIZE(tr)
     531  lerr = getKey('name',   tname,  tr(:)%keys);                 IF(lerr) RETURN
     532  lerr = getKey('parent', parent, tr(:)%keys, def = tran0);    IF(lerr) RETURN
     533  lerr = getKey('type',   dType,  tr(:)%keys, def = 'tracer'); IF(lerr) RETURN
    518534  nq = 0
    519535  !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
     
    521537  !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    522538    !--- Extract useful keys: parent name, type, component name
    523     tr(it)%parent    = fgetKey(it, 'parent', tr(:)%keys,  tran0  )
    524     tr(it)%type      = fgetKey(it, 'type'  , tr(:)%keys, 'tracer')
    525539    tr(it)%component = sname
    526 !   CALL addKey_m('component', sname, tr(:)%keys)
    527     DO iq=1,SIZE(tr); CALL addKey_1('component', sname, tr(iq)%keys); END DO
     540    CALL addKey('component', sname,  tr(it)%keys)
    528541
    529542    !--- Determine the number of tracers and parents ; coherence checking
    530     ll = strCount(tr(it)%name,  ',', ntr)
    531     ll = strCount(tr(it)%parent, ',', npr)
     543    ll = strCount( tname(it), ',', ntr)
     544    ll = strCount(parent(it), ',', npr)
    532545
    533546    !--- Tagging tracers only can have multiple parents
    534     IF(test(npr/=1 .AND. TRIM(tr(it)%type)/='tag', lerr)) THEN
     547    lerr = npr /=1 .AND. TRIM(dType(it)) /= 'tag'
     548    IF(lerr) THEN
    535549      msg1 = 'Check section "'//TRIM(sname)//'"'
    536       IF(PRESENT(fname)) msg1=TRIM(msg1)//' in file "'//TRIM(fname)//'"'
    537       CALL msg(TRIM(msg1)//': "'//TRIM(tr(it)%name)//'" has several parents but is not a tag', modname); RETURN
     550      IF(PRESENT(fname)) msg1 = TRIM(msg1)//' in file "'//TRIM(fname)//'"'
     551      CALL msg(TRIM(msg1)//': "'//TRIM(tname(it))//'" has several parents but is not a tag', modname); RETURN
    538552    END IF
    539553    nq = nq + ntr*npr                 
     
    547561  DO it = 1, nt                                                      !=== EXPAND TRACERS AND PARENTS NAMES LISTS
    548562  !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    549     ll = strParse(tr(it)%name,   ',', ta, ntr)                       !--- Number of tracers
    550     ll = strParse(tr(it)%parent, ',', pa, npr)                       !--- Number of parents
    551     DO ipr=1,npr                                                     !--- Loop on parents list elts
    552       DO itr=1,ntr                                                   !--- Loop on tracers list elts
     563    ll = strParse( tname(it), ',', ta, ntr)                          !--- Number of tracers
     564    ll = strParse(parent(it), ',', pa, npr)                          !--- Number of parents
     565    DO ipr = 1, npr                                                  !--- Loop on parents list elts
     566      DO itr = 1, ntr                                                !--- Loop on tracers list elts
     567        ttr(iq)%keys%name = TRIM(ta(itr))
    553568        ttr(iq)%keys%key  = tr(it)%keys%key
    554569        ttr(iq)%keys%val  = tr(it)%keys%val
    555         ttr(iq)%keys%name = ta(itr)
    556         ttr(iq)%name      = TRIM(ta(itr));    CALL addKey_1('name',      ta(itr),          ttr(iq)%keys)
    557         ttr(iq)%parent    = TRIM(pa(ipr));    CALL addKey_1('parent',    pa(ipr),          ttr(iq)%keys)
    558         ttr(iq)%type      = tr(it)%type;      CALL addKey_1('type',      tr(it)%type,      ttr(iq)%keys)
    559         ttr(iq)%component = tr(it)%component; CALL addKey_1('component', tr(it)%component, ttr(iq)%keys)
    560         iq = iq+1
     570        ttr(iq)%name      = TRIM(ta(itr))
     571        ttr(iq)%parent    = TRIM(pa(ipr))
     572        ttr(iq)%type      = dType(it)
     573        ttr(iq)%component = sname
     574        CALL addKey('name',      ta(itr),   ttr(iq)%keys)
     575        CALL addKey('parent',    pa(ipr),   ttr(iq)%keys)
     576        CALL addKey('type',      dType(it), ttr(iq)%keys)
     577        CALL addKey('component', sname,     ttr(iq)%keys)
     578        iq = iq + 1
    561579      END DO
    562580    END DO
     
    575593!------------------------------------------------------------------------------------------------------------------------------
    576594! Purpose: Determine, for each tracer of "tr(:)":
    577 !   * %iGeneration: the generation number
    578 !   * %gen0Name:    the generation 0 ancestor name
    579 !          Check also for orphan tracers (tracers not descending on "tran0").
     595!   * iGeneration: the generation number
     596!   * gen0Name:    the generation 0 ancestor name
     597!          Check also for orphan tracers (tracers without parent).
    580598!------------------------------------------------------------------------------------------------------------------------------
    581599  TYPE(trac_type),     INTENT(INOUT) :: tr(:)                        !--- Tracer derived type vector
    582600  INTEGER                            :: iq, jq, ig
    583   CHARACTER(LEN=maxlen), ALLOCATABLE :: parent(:)
     601  CHARACTER(LEN=maxlen), ALLOCATABLE :: parent(:), tname(:)
    584602!------------------------------------------------------------------------------------------------------------------------------
    585603  CHARACTER(LEN=maxlen) :: modname
    586604  modname = 'setGeneration'
    587   IF(test(fmsg('missing "parent" attribute', modname, getKey('parent', parent, ky=tr(:)%keys)), lerr)) RETURN
     605  lerr = getKey('name',   tname,  ky=tr(:)%keys); IF(lerr) RETURN
     606  lerr = getKey('parent', parent, ky=tr(:)%keys); IF(lerr) RETURN
    588607  DO iq = 1, SIZE(tr)
    589608    jq = iq; ig = 0
    590609    DO WHILE(parent(jq) /= tran0)
    591       jq = strIdx(tr(:)%name, parent(jq))
    592       IF(test(fmsg('Orphan tracer "'//TRIM(tr(iq)%name)//'"', modname, jq == 0), lerr)) RETURN
     610      jq = strIdx(tname(:), parent(jq))
     611      lerr = jq == 0
     612      IF(fmsg('Orphan tracer "'//TRIM(tname(iq))//'"', modname, lerr)) RETURN
    593613      ig = ig + 1
    594614    END DO
    595     tr(iq)%gen0Name = tr(jq)%name; CALL addKey_1('gen0Name',    tr(iq)%gen0Name,   tr(iq)%keys)
    596     tr(iq)%iGeneration = ig;       CALL addKey_1('iGeneration', TRIM(int2str(ig)), tr(iq)%keys)
     615    tr(iq)%gen0Name = tname(jq)
     616    tr(iq)%iGeneration = ig
     617    CALL addKey('iGeneration',   ig,  tr(iq)%keys)
     618    CALL addKey('gen0Name', tname(jq), tr(iq)%keys)
    597619  END DO
    598620END FUNCTION setGeneration
     
    604626!------------------------------------------------------------------------------------------------------------------------------
    605627! Purpose:
    606 !   * check for orphan tracers (without known parent)
    607 !   * check wether the phases are known or not ("g"aseous, "l"iquid or "s"olid so far)
     628!   * check for orphan tracers (without parent)
     629!   * check wether the phases are known or not (elements of "known_phases")
    608630!------------------------------------------------------------------------------------------------------------------------------
    609631  TYPE(trac_type),            INTENT(IN) :: tr(:)                    !--- Tracer derived type vector
    610632  CHARACTER(LEN=*),           INTENT(IN) :: sname                    !--- Section name
    611633  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: fname                    !--- File name
     634  CHARACTER(LEN=1) :: p
    612635  CHARACTER(LEN=maxlen) :: mesg
    613636  CHARACTER(LEN=maxlen) :: bp(SIZE(tr, DIM=1)), pha                  !--- Bad phases list, phases of current tracer
    614   CHARACTER(LEN=1) :: p
     637  CHARACTER(LEN=maxlen), ALLOCATABLE :: tname(:)
     638  INTEGER,               ALLOCATABLE ::  iGen(:)
    615639  INTEGER :: ip, np, iq, nq
    616640!------------------------------------------------------------------------------------------------------------------------------
     641  CHARACTER(LEN=maxlen) :: modname
     642  modname = 'checkTracers'
    617643  nq = SIZE(tr,DIM=1)                                                !--- Number of tracers lines
    618644  mesg = 'Check section "'//TRIM(sname)//'"'
    619645  IF(PRESENT(fname)) mesg=TRIM(mesg)//' in file "'//TRIM(fname)//'"'
     646  lerr = getKey('iGeneration', iGen, tr(:)%keys);               IF(lerr) RETURN
     647  lerr = getKey('name',       tname, tr(:)%keys);               IF(lerr) RETURN
    620648
    621649  !=== CHECK FOR ORPHAN TRACERS
    622   IF(test(checkList(tr%name, tr%iGeneration==-1, mesg, 'tracers', 'orphan'), lerr)) RETURN
     650  lerr = checkList(tname, iGen==-1, mesg, 'tracers', 'orphan'); IF(lerr) RETURN
    623651
    624652  !=== CHECK PHASES
    625   DO iq=1,nq; IF(tr(iq)%iGeneration/=0) CYCLE                        !--- Generation O only is checked
    626     pha = fgetKey(iq, 'phases', tr(:)%keys, 'g')                     !--- Phases
     653  DO iq = 1, nq; IF(iGen(iq) /= 0) CYCLE                             !--- Generation O only is checked
     654    IF(getKey(['phases','phase '], pha, iq, tr(:)%keys, lDisp=.FALSE.)) pha = 'g'   !--- Phase
    627655    np = LEN_TRIM(pha); bp(iq)=' '
    628     DO ip=1,np; p = pha(ip:ip); IF(INDEX(known_phases,p)==0) bp(iq) = TRIM(bp(iq))//p; END DO
    629     IF(TRIM(bp(iq)) /= '') bp(iq) = TRIM(tr(iq)%name)//': '//TRIM(bp(iq))
     656    DO ip = 1, np; p = pha(ip:ip); IF(INDEX(known_phases, p) == 0) bp(iq) = TRIM(bp(iq))//p; END DO
     657    IF(TRIM(bp(iq)) /= '') bp(iq) = TRIM(tname(iq))//': '//TRIM(bp(iq))
    630658  END DO
    631   lerr = checkList(bp, tr%iGeneration==0 .AND. bp/='', mesg, 'tracers phases', 'unknown')
     659  lerr = checkList(bp, iGen == 0 .AND. bp /= '', mesg, 'tracers phases', 'unknown')
    632660END FUNCTION checkTracers
    633661!==============================================================================================================================
     
    645673  INTEGER :: ip, np, iq, nq, k
    646674  LOGICAL, ALLOCATABLE  :: ll(:)
    647   CHARACTER(LEN=maxlen) :: mesg, tnam, tdup(SIZE(tr,DIM=1))
    648   CHARACTER(LEN=1)      :: p
    649 !------------------------------------------------------------------------------------------------------------------------------
     675  CHARACTER(LEN=maxlen) :: mesg, phase, tdup(SIZE(tr,DIM=1))
     676  CHARACTER(LEN=maxlen), ALLOCATABLE :: tname(:), dType(:)
     677  INTEGER,               ALLOCATABLE :: iGen(:)
     678  CHARACTER(LEN=1) :: p
     679!------------------------------------------------------------------------------------------------------------------------------
     680  CHARACTER(LEN=maxlen) :: modname
     681  modname = 'checkUnique'
    650682  mesg = 'Check section "'//TRIM(sname)//'"'
    651683  IF(PRESENT(fname)) mesg=TRIM(mesg)//' in file "'//TRIM(fname)//'"'
    652684  nq=SIZE(tr,DIM=1); lerr=.FALSE.                                    !--- Number of lines ; error flag
    653685  tdup(:) = ''
    654   DO iq=1,nq; IF(tr(iq)%type == 'tag') CYCLE                         !--- Tags can be repeated
    655     tnam = TRIM(tr(iq)%name)
    656     ll = tr(:)%name==TRIM(tnam)                                      !--- Mask for current tracer name
    657     IF(COUNT(ll)==1 ) CYCLE                                          !--- Tracer is not repeated
    658     IF(tr(iq)%iGeneration>0) THEN
    659       tdup(iq) = tnam                                                !--- gen>0: MUST be unique
     686  lerr = getKey('name',       tname, tr%keys); IF(lerr) RETURN
     687  lerr = getKey('type',       dType, tr%keys); IF(lerr) RETURN
     688  lerr = getKey('iGeneration', iGen, tr%keys); IF(lerr) RETURN
     689  DO iq = 1, nq
     690    IF(dType(iq) == 'tag') CYCLE                                     !--- Tags can be repeated
     691    ll = tname==TRIM(tname(iq))                                      !--- Mask for current tracer name
     692    IF(COUNT(ll) == 1) CYCLE                                         !--- Tracer is not repeated
     693    IF(iGen(iq) > 0) THEN
     694      tdup(iq) = tname(iq)                                           !--- gen>0: MUST be unique
    660695    ELSE
    661       DO ip=1,nphases; p=known_phases(ip:ip)                         !--- Loop on known phases
    662         !--- Number of appearances of the current tracer with known phase "p"
    663         np = COUNT( PACK( [(INDEX(fgetKey(k, 'phases', tr(:)%keys, 'g'),p), k=1, nq)] /=0 , MASK=ll ) )
    664         IF(np <=1) CYCLE
    665         tdup(iq) = TRIM(tdup(iq))//TRIM(phases_names(ip))
     696      DO ip = 1, nphases; p = known_phases(ip:ip)                    !--- Loop on known phases
     697        np = 0
     698        DO k = 1, nq
     699          IF(.NOT.ll(k)) CYCLE                                       !--- Skip tracers different from current one
     700          IF(getKey(['phases','phase '], phase, k, tr%keys, lDisp=.FALSE.)) phase='g'!--- Get current phases
     701          IF(INDEX(phase, p) /= 0) np = np + 1                       !--- One more appearance of current tracer with phase "p"
     702        END DO
     703        IF(np <= 1) CYCLE                                            !--- Regular case: no or a single appearance
     704        tdup(iq) = TRIM(tdup(iq))//TRIM(phases_names(ip))            !--- Repeated phase
    666705        IF(ANY(tdup(1:iq-1) == tdup(iq))) tdup(iq)=''                !--- Avoid repeating same messages
    667706      END DO
    668707    END IF
    669     IF(tdup(iq) /= '') tdup(iq)=TRIM(tnam)//' in '//TRIM(tdup(iq))//' phase(s)'
     708    IF(tdup(iq) /= '') tdup(iq)=TRIM(tname(iq))//' in '//TRIM(tdup(iq))//' phase(s)'
    670709  END DO
    671710  lerr = checkList(tdup, tdup/='', mesg, 'tracers', 'duplicated')
     
    675714
    676715!==============================================================================================================================
    677 SUBROUTINE expandPhases(tr)
     716LOGICAL FUNCTION expandPhases(tr) RESULT(lerr)
    678717!------------------------------------------------------------------------------------------------------------------------------
    679718! Purpose: Expand the phases in the tracers descriptor "tr". Phases are not repeated for a tracer, thanks to "checkUnique".
     
    681720  TYPE(trac_type), ALLOCATABLE, INTENT(INOUT) :: tr(:)               !--- Tracer derived type vector
    682721!------------------------------------------------------------------------------------------------------------------------------
    683   TYPE(trac_type), ALLOCATABLE :: ttr(:)
    684   INTEGER,   ALLOCATABLE ::  i0(:)
    685   CHARACTER(LEN=maxlen)  :: nam, pha, tname
     722  TYPE(trac_type),       ALLOCATABLE :: ttr(:)
     723  INTEGER,               ALLOCATABLE ::  i0(:), iGen(:)
     724  CHARACTER(LEN=maxlen), ALLOCATABLE :: tname(:), gen0N(:), phase(:), parents(:), dType(:)
     725  CHARACTER(LEN=maxlen)              ::  nam,     gen0Nm,   pha,      parent
    686726  CHARACTER(LEN=1) :: p
    687727  INTEGER :: ip, np, iq, jq, nq, it, nt, nc, i, n
    688728  LOGICAL :: lTag, lExt
    689729!------------------------------------------------------------------------------------------------------------------------------
     730  CHARACTER(LEN=maxlen) :: modname
     731  modname = 'expandPhases'
    690732  nq = SIZE(tr, DIM=1)
    691733  nt = 0
     734  lerr = getKey('name',       tname, tr%keys); IF(lerr) RETURN       !--- Names of the tracers
     735  lerr = getKey('gen0Name',   gen0N, tr%keys); IF(lerr) RETURN       !--- Names of the tracers of first generation
     736  lerr = getKey('iGeneration', iGen, tr%keys); IF(lerr) RETURN       !--- Generation number
     737  lerr = getKey('phases',     phase, tr%keys); IF(lerr) RETURN       !--- Phases names
     738  lerr = getKey('parent',   parents, tr%keys); IF(lerr) RETURN       !--- Parents names
     739  lerr = getKey('type',       dType, tr%keys); IF(lerr) RETURN       !--- Tracers types ('tracer' or 'tag')
    692740  DO iq = 1, nq                                                      !--- GET THE NUMBER OF TRACERS
    693     IF(tr(iq)%iGeneration /= 0) CYCLE                                !--- Only deal with generation 0 tracers
    694     nc = COUNT(tr(:)%gen0Name==tr(iq)%name .AND. tr%iGeneration/=0)  !--- Number of children of tr(iq)
    695     tr(iq)%phase = fgetKey(iq, 'phases', tr(:)%keys)                 !--- Phases list        of tr(iq)
    696     np = LEN_TRIM(tr(iq)%phase)                                      !--- Number of phases   of tr(iq)
     741    IF(iGen(iq) /= 0) CYCLE                                          !--- Only deal with generation 0 tracers
     742    nc = COUNT(gen0N == tname(iq) .AND. iGen /= 0)                   !--- Number of children of tr(iq)
     743    np = LEN_TRIM(phase(iq))                                         !--- Number of phases   of tr(iq)
    697744    nt = nt + (1+nc) * np                                            !--- Number of tracers after expansion
    698745  END DO
     
    700747  it = 1                                                             !--- Current "ttr(:)" index
    701748  DO iq = 1, nq                                                      !--- Loop on "tr(:)" indexes
    702     lTag = tr(iq)%type=='tag'                                        !--- Current tracer is a tag
    703     i0 = strFind(tr(:)%name, TRIM(tr(iq)%gen0Name), n)               !--- Indexes of first generation ancestor copies
    704     np = SUM([( LEN_TRIM(tr(i0(i))%phase),i=1,n )], 1)               !--- Number of phases for current tracer tr(iq)
    705     lExt = np>1                                                      !--- Phase suffix only required if phases number is > 1
    706     IF(lTag) lExt = lExt .AND. tr(iq)%iGeneration>0                  !--- No phase suffix for generation 0 tags
    707     DO i=1,n                                                         !=== LOOP ON GENERATION 0 ANCESTORS
     749    lTag = dType(iq)=='tag'                                          !--- Current tracer is a tag
     750    i0 = strFind(tname, TRIM(gen0N(iq)), n)                          !--- Indexes of first generation ancestor copies
     751    np = SUM([( LEN_TRIM(phase(i0(i))), i = 1, n )], 1)              !--- Number of phases for current tracer tr(iq)
     752    lExt = np > 1                                                    !--- Phase suffix only required if phases number is > 1
     753    IF(lTag) lExt = lExt .AND. iGen(iq) > 0                          !--- No phase suffix for generation 0 tags
     754    DO i = 1, n                                                      !=== LOOP ON GENERATION 0 ANCESTORS
    708755      jq = i0(i)                                                     !--- tr(jq): ith tracer with same gen 0 ancestor as tr(iq)
    709       IF(tr(iq)%iGeneration==0) jq=iq                                !--- Generation 0: count the current tracer phases only
    710       pha = tr(jq)%phase                                             !--- Phases list for tr(jq)
     756      IF(iGen(iq) == 0) jq = iq                                      !--- Generation 0: count the current tracer phases only
     757      pha = phase(jq)                                                !--- Phases list for tr(jq)
    711758      DO ip = 1, LEN_TRIM(pha)                                       !=== LOOP ON PHASES LISTS
    712759        p = pha(ip:ip)
    713         tname = TRIM(tr(iq)%name); nam = tname                       !--- Tracer name (regular case)
    714         IF(lTag) nam = TRIM(tr(iq)%parent)                           !--- Parent name (tagging case)
     760        nam = tname(iq)                                              !--- Tracer name (regular case)
     761        IF(lTag) nam = TRIM(parents(iq))                             !--- Parent name (tagging case)
    715762        IF(lExt) nam = addPhase(nam, p )                             !--- Phase extension needed
    716         IF(lTag) nam = TRIM(nam)//'_'//TRIM(tname)                   !--- <parent>_<name> for tags
     763        IF(lTag) nam = TRIM(nam)//'_'//TRIM(tname(iq))               !--- <parent>_<name> for tags
    717764        ttr(it) = tr(iq)                                             !--- Same <key>=<val> pairs
    718765        ttr(it)%name      = TRIM(nam)                                !--- Name with possibly phase suffix
    719766        ttr(it)%keys%name = TRIM(nam)                                !--- Name inside the keys decriptor
    720767        ttr(it)%phase     = p                                        !--- Single phase entry
    721         CALL addKey_1('name', nam, ttr(it)%keys)
    722         CALL addKey_1('phase', p,  ttr(it)%keys)
    723         IF(lExt .AND. tr(iq)%iGeneration>0) THEN
    724           ttr(it)%parent   = addPhase(tr(iq)%parent,   p)
    725           ttr(it)%gen0Name = addPhase(tr(iq)%gen0Name, p)
    726           CALL addKey_1('parent',   ttr(it)%parent,   ttr(it)%keys)
    727           CALL addKey_1('gen0Name', ttr(it)%gen0Name, ttr(it)%keys)
     768        CALL addKey('name', nam, ttr(it)%keys)
     769        CALL addKey('phase', p,  ttr(it)%keys)
     770        IF(lExt) THEN
     771          parent = parents(iq); IF(iGen(iq) > 0) parent = addPhase(parent, p)
     772          gen0Nm =   gen0N(iq); IF(iGen(iq) > 0) gen0Nm = addPhase(gen0Nm, p)
     773          ttr(it)%parent   = parent
     774          ttr(it)%gen0Name = gen0Nm
     775          CALL addKey('parent',   parent, ttr(it)%keys)
     776          CALL addKey('gen0Name', gen0Nm, ttr(it)%keys)
    728777        END IF
    729778        it = it+1
    730779      END DO
    731       IF(tr(iq)%iGeneration==0) EXIT                                 !--- Break phase loop for gen 0
     780      IF(iGen(iq) == 0) EXIT                                         !--- Break phase loop for gen 0
    732781    END DO
    733782  END DO
     
    735784  CALL delKey(['phases'],tr)                                         !--- Remove few keys entries
    736785
    737 END SUBROUTINE expandPhases
     786END FUNCTION expandPhases
    738787!==============================================================================================================================
    739788
     
    748797!   TO BE ADDED IF NECESSARY: HIGHER MOMENTS AT THE END
    749798!------------------------------------------------------------------------------------------------------------------------------
    750   TYPE(trac_type), ALLOCATABLE, INTENT(INOUT) :: tr(:)         !--- Tracer derived type vector
    751 !------------------------------------------------------------------------------------------------------------------------------
    752   TYPE(trac_type), ALLOCATABLE        :: tr2(:)
    753   INTEGER,         ALLOCATABLE        :: iy(:), iz(:)
    754   INTEGER                             :: ig, ng, iq, jq, ip, nq, n, ix(SIZE(tr)), k
     799  TYPE(trac_type), INTENT(INOUT) :: tr(:)                            !--- Tracer derived type vector
     800!------------------------------------------------------------------------------------------------------------------------------
     801  TYPE(trac_type),       ALLOCATABLE :: tr2(:)
     802  INTEGER,               ALLOCATABLE :: iy(:), iz(:)
     803  INTEGER,               ALLOCATABLE ::  iGen(:)
     804  CHARACTER(LEN=maxlen), ALLOCATABLE :: tname(:), gen0N(:)
     805  INTEGER :: ig, ng, iq, jq, ip, nq, n, ix(SIZE(tr)), k
     806  LOGICAL :: lerr
    755807!  tr2 is introduced in order to cope with a bug in gfortran 4.8.5 compiler
    756808!------------------------------------------------------------------------------------------------------------------------------
     809  lerr = getKey('iGeneration', iGen, tr%keys); IF(lerr) RETURN       !--- Generation number
    757810  nq = SIZE(tr)
    758811  DO ip = nphases, 1, -1
    759     iq = strIdx(tr(:)%name, addPhase('H2O', ip))
     812    lerr = getKey('name',     tname, tr%keys); IF(lerr) RETURN       !--- Names of the tracers of first generation
     813    iq = strIdx(tname, addPhase('H2O', ip))
    760814    IF(iq == 0) CYCLE
    761815    tr2 = tr(:)
     
    764818  IF(lSortByGen) THEN
    765819    iq = 1
    766     ng = MAXVAL(tr(:)%iGeneration, MASK=.TRUE., DIM=1)               !--- Number of generations
     820    ng = MAXVAL(iGen, MASK=.TRUE., DIM=1)                            !--- Number of generations
    767821    DO ig = 0, ng                                                    !--- Loop on generations
    768       iy = PACK([(k, k=1, nq)], MASK=tr(:)%iGeneration==ig)          !--- Generation ig tracers indexes
     822      iy = PACK([(k, k=1, nq)], MASK=iGen(:) == ig)                  !--- Generation ig tracers indexes
    769823      n = SIZE(iy)
    770824      ix(iq:iq+n-1) = iy                                             !--- Stack growing generations idxs
     
    772826    END DO
    773827  ELSE
    774     iq = 1
     828    lerr = getKey('gen0Name',   gen0N, tr%keys); IF(lerr) RETURN     !--- Names of the tracers    iq = 1
    775829    DO jq = 1, nq                                                    !--- Loop on generation 0 tracers
    776       IF(tr(jq)%iGeneration /= 0) CYCLE                              !--- Skip generations /= 0
     830      IF(iGen(jq) /= 0) CYCLE                                        !--- Skip generations /= 0
    777831      ix(iq) = jq                                                    !--- Generation 0 ancestor index first
    778832      iq = iq + 1                                                    !--- Next "iq" for next generations tracers
    779       iy = strFind(tr(:)%gen0Name, TRIM(tr(jq)%name))                !--- Indexes of "tr(jq)" children in "tr(:)"
    780       ng = MAXVAL(tr(iy)%iGeneration, MASK=.TRUE., DIM=1)            !--- Number of generations of the "tr(jq)" family
     833      iy = strFind(gen0N(:), TRIM(tname(jq)))                        !--- Indices of "tr(jq)" children in "tr(:)"
     834      ng = MAXVAL(iGen(iy), MASK=.TRUE., DIM=1)                      !--- Number of generations of the "tr(jq)" family
    781835      DO ig = 1, ng                                                  !--- Loop   on generations of the "tr(jq)" family
    782         iz = find(tr(iy)%iGeneration, ig, n)                         !--- Indexes of the tracers "tr(iy(:))" of generation "ig"
     836        iz = find(iGen(iy), ig, n)                                   !--- Indices of the tracers "tr(iy(:))" of generation "ig"
    783837        ix(iq:iq+n-1) = iy(iz)                                       !--- Same indexes in "tr(:)"
    784838        iq = iq + n
     
    796850  TYPE(trac_type), ALLOCATABLE, INTENT(OUT) ::       tr(:)
    797851  TYPE(trac_type), POINTER ::   t1(:),   t2(:)
     852  TYPE(keys_type), POINTER ::   k1(:),   k2(:)
    798853  INTEGER,     ALLOCATABLE :: ixct(:), ixck(:)
    799   INTEGER :: is, k1, k2, nk2, i1, i2, nt2
     854  INTEGER :: is, ik, ik1, ik2, nk2, i1, i2, nt2
    800855  CHARACTER(LEN=maxlen) :: s1, v1, v2, tnam, knam, modname
     856  CHARACTER(LEN=maxlen), ALLOCATABLE :: keys(:), n1(:), n2(:)
    801857  modname = 'mergeTracers'
    802858  lerr = .FALSE.
    803   t1 => sections(1)%trac(:)                                          !--- Alias: first tracers section
     859  keys = ['parent     ', 'type       ', 'iGeneration']               !--- Mandatory keys
     860  t1 => sections(1)%trac(:); k1 => t1(:)%keys                        !--- Alias: first tracers section, corresponding keys
     861  lerr = getKey('name', n1, k1); IF(lerr) RETURN                     !--- Names of the tracers
    804862  tr = t1
    805863  !----------------------------------------------------------------------------------------------------------------------------
     
    807865  !----------------------------------------------------------------------------------------------------------------------------
    808866    t2  => sections(is)%trac(:)                                      !--- Alias: current tracers section
     867    k2  => t2(:)%keys
     868    lerr = getKey('name', n2, k2); IF(lerr) RETURN                   !--- Names of the tracers
    809869    nt2  = SIZE(t2(:), DIM=1)                                        !--- Number of tracers in section
    810     ixct = strIdx(t1(:)%name, t2(:)%name)                            !--- Indexes of common tracers
     870    ixct = strIdx(n1(:), n2(:))                                      !--- Indexes of common tracers
    811871    tr = [tr, PACK(t2, MASK= ixct==0)]                               !--- Append with new tracers
    812872    IF( ALL(ixct == 0) ) CYCLE                                       !--- No common tracers => done
    813873    CALL msg('Tracers defined in previous sections and duplicated in "'//TRIM(sections(is)%name)//'":', modname)
    814     CALL msg(t1(PACK(ixct, MASK = ixct/=0))%name, modname, nmax=128) !--- Display duplicates (the 128 first at most)
     874    CALL msg(n1(PACK(ixct, MASK = ixct/=0)), modname, nmax=128)      !--- Display duplicates (the 128 first at most)
    815875    !--------------------------------------------------------------------------------------------------------------------------
    816876    DO i2=1,nt2; tnam = TRIM(t2(i2)%name)                            !=== LOOP ON COMMON TRACERS
     
    820880      !=== CHECK WETHER ESSENTIAL KEYS ARE IDENTICAL OR NOT
    821881      s1=' of "'//TRIM(tnam)//'" in "'//TRIM(sections(is)%name)//'" not matching previous value'
    822      
    823       IF(test(fmsg('Parent name'//TRIM(s1), modname, t1(i1)%parent      /= t2(i2)%parent),      lerr)) RETURN
    824       IF(test(fmsg('Type'       //TRIM(s1), modname, t1(i1)%type        /= t2(i2)%type),        lerr)) RETURN
    825       IF(test(fmsg('Generation' //TRIM(s1), modname, t1(i1)%iGeneration /= t2(i2)%iGeneration), lerr)) RETURN
    826 
    827       !=== APPEND <key>=<val> PAIRS NOT PREVIOULSLY DEFINED
    828       nk2  = SIZE(t2(i2)%keys%key(:))                                !--- Keys number in current section
    829       ixck = strIdx(t1(i1)%keys%key(:), t2(i2)%keys%key(:))          !--- Common keys indexes
    830 
    831       !=== APPEND NEW KEYS
     882      DO ik = 1, SIZE(keys)
     883        lerr = getKey(keys(ik), v1, i1, k1)
     884        lerr = getKey(keys(ik), v2, i2, k2)
     885        lerr = v1 /= v2; IF(fmsg(TRIM(keys(ik))//TRIM(s1), modname, lerr)) RETURN
     886      END DO
     887
     888      !=== GET THE INDICES IN tr(i2)%keys%key(:) OF THE KEYS ALSO PRESENT IN tr(i1)%keys%key(:)
     889      nk2  =   SIZE(k2(i2)%key(:))                                   !--- Keys number in current section
     890      ixck = strIdx(k1(i1)%key(:), k2(i2)%key(:))                    !--- Common keys indexes
     891      !--- APPEND THE NEW KEYS PAIRS IN tr(i1)%keys%key(:)
    832892      tr(i1)%keys%key = [ tr(i1)%keys%key, PACK(tr(i2)%keys%key, MASK = ixck==0)]
    833893      tr(i1)%keys%val = [ tr(i1)%keys%val, PACK(tr(i2)%keys%val, MASK = ixck==0)]
    834894
    835       !--- KEEP TRACK OF THE COMPONENTS NAMES
    836       tr(i1)%component = TRIM(tr(i1)%component)//','//TRIM(tr(i2)%component)
    837 
    838       !--- SELECT COMMON TRACERS WITH DIFFERING KEYS VALUES (PREVIOUS VALUE IS KEPT)
    839       DO k2=1,nk2
    840         k1 = ixck(k2); IF(k1 == 0) CYCLE
    841         IF(t1(i1)%keys%val(k1) == t2(i2)%keys%val(k2)) ixck(k2)=0
     895      !=== KEEP TRACK OF THE COMPONENTS NAMES: COMA-SEPARATED LIST
     896      lerr = getKey('component', v1, i1, k1)
     897      lerr = getKey('component', v2, i2, k2)
     898      tr(i1)%component = TRIM(v1)//','//TRIM(v2)
     899      CALL addKey('component', TRIM(v1)//','//TRIM(v2), tr(i1)%keys)
     900
     901      !=== FOR TRACERS COMMON TO PREVIOUS AND CURRENT SECTIONS: CHECK WETHER SOME KEYS HAVE DIFFERENT VALUES ; KEEP OLD ONE
     902      DO ik2 = 1, nk2                                                !--- Collect the corresponding indices
     903        ik1 = ixck(ik2); IF(ik1 == 0) CYCLE
     904        IF(k1(i1)%val(ik1) == k2(i2)%val(ik2)) ixck(ik2)=0
    842905      END DO
    843       IF(ALL(ixck==0)) CYCLE                                         !--- No identical keys with /=values
    844 
    845       !--- DISPLAY INFORMATION: OLD VALUES ARE KEPT FOR THE KEYS FOUND IN PREVIOUS AND CURRENT SECTIONS
    846       CALL msg('Key(s)'//TRIM(s1), modname)
    847       DO k2 = 1, nk2                                                 !--- Loop on keys found in both t1(:) and t2(:)
    848         knam = t2(i2)%keys%key(k2)                                   !--- Name of the current key
    849         k1 = ixck(k2)                                                !--- Corresponding index in t1(:)
    850         IF(k1 == 0) CYCLE                                            !--- New keys are skipped
    851         v1 = t1(i1)%keys%val(k1); v2 = t2(i2)%keys%val(k2)           !--- Key values in t1(:) and t2(:)
     906      IF(ALL(ixck==0)) CYCLE                                         !--- No identical keys with /=values => nothing to display
     907      CALL msg('Key(s)'//TRIM(s1), modname)                          !--- Display the  keys with /=values (names list)
     908      DO ik2 = 1, nk2                                                !--- Loop on keys found in both t1(:) and t2(:)
     909        knam = k2(i2)%key(ik2)                                       !--- Name of the current key
     910        ik1 = ixck(ik2)                                              !--- Corresponding index in t1(:)
     911        IF(ik1 == 0) CYCLE                                           !--- New keys are skipped
     912        v1 = k1(i1)%val(ik1); v2 = k2(i2)%val(ik2)                   !--- Key values in t1(:) and t2(:)
    852913        CALL msg(' * '//TRIM(knam)//'='//TRIM(v2)//' ; previous value kept:'//TRIM(v1), modname)
    853914      END DO
     
    862923
    863924!==============================================================================================================================
    864 LOGICAL FUNCTION cumulTracers(sections, tr) RESULT(lerr)
     925LOGICAL FUNCTION cumulTracers(sections, tr, lRename) RESULT(lerr)
    865926  TYPE(dataBase_type),  TARGET, INTENT(IN)  :: sections(:)
    866927  TYPE(trac_type), ALLOCATABLE, INTENT(OUT) ::       tr(:)
    867   TYPE(trac_type), POINTER     :: t(:)
    868   INTEGER,   ALLOCATABLE :: nt(:)
    869   CHARACTER(LEN=maxlen)  :: tnam, tnam_new
    870   INTEGER :: iq, nq, is, ns, nsec
    871   lerr = .FALSE.                                                     !--- Can't fail ; kept to match "mergeTracer" interface.
    872   nsec =  SIZE(sections)
    873   tr = [(      sections(is)%trac(:) , is=1, nsec )]                  !--- Concatenated tracers vector
    874   nt = [( SIZE(sections(is)%trac(:)), is=1, nsec )]                  !--- Number of tracers in each section
     928  LOGICAL,            OPTIONAL, INTENT(IN)  :: lRename               !--- .TRUE.: add a section suffix to identical names
     929  CHARACTER(LEN=maxlen)  :: tnam_new, modname
     930  CHARACTER(LEN=maxlen), ALLOCATABLE :: tname(:), parent(:), comp(:)
     931  INTEGER :: iq, jq, is
     932  modname = 'cumulTracers'
     933  lerr = .FALSE.
     934  tr = [( sections(is)%trac(:), is = 1, SIZE(sections) )]            !--- Concatenated tracers vector
     935  IF(PRESENT(lRename)) THEN; IF(lRename) RETURN; END IF              !--- No renaming: finished
     936  lerr = getKey('name',     tname, tr%keys); IF(lerr) RETURN         !--- Names
     937  lerr = getKey('parent',  parent, tr%keys); IF(lerr) RETURN         !--- Parents
     938  lerr = getKey('component', comp, tr%keys); IF(lerr) RETURN         !--- Component name
    875939  !----------------------------------------------------------------------------------------------------------------------------
    876   DO is=1, nsec                                                      !=== LOOP ON SECTIONS
     940  DO iq = 1, SIZE(tr); IF(COUNT(tname == tname(iq)) == 1) CYCLE      !=== LOOP ON TRACERS
    877941  !----------------------------------------------------------------------------------------------------------------------------
    878     t => sections(is)%trac(:)
     942    tnam_new = TRIM(tname(iq))//'_'//TRIM(comp(iq))                  !--- Same with section extension
     943    CALL addKey('name', tnam_new, tr(iq)%keys)                       !--- Modify tracer name
     944    tr(iq)%name = TRIM(tnam_new)                                     !--- Modify tracer name
    879945    !--------------------------------------------------------------------------------------------------------------------------
    880     DO iq=1, nt(is)                                                  !=== LOOP ON TRACERS
     946    DO jq = 1, SIZE(tr); IF(parent(jq) /= tname(iq)) CYCLE           !=== LOOP ON TRACERS PARENTS
    881947    !--------------------------------------------------------------------------------------------------------------------------
    882       tnam = TRIM(t(iq)%name)                                        !--- Original name
    883       IF(COUNT(t%name == tnam) == 1) CYCLE                           !--- Current tracer is not duplicated: finished
    884       tnam_new = TRIM(tnam)//'_'//TRIM(sections(is)%name)            !--- Same with section extension
    885       nq = SUM(nt(1:is-1))                                           !--- Number of tracers in previous sections
    886       ns = nt(is)                                                    !--- Number of tracers in the current section
    887       tr(iq + nq)%name = TRIM(tnam_new)                              !--- Modify tracer name
    888       WHERE(tr(1+nq:ns+nq)%parent==tnam) tr(1+nq:ns+nq)%parent=tnam_new  !--- Modify parent name
     948      CALL addKey('parent', tnam_new, tr(jq)%keys)                   !--- Modify tracer name
     949      tr(jq)%parent = TRIM(tnam_new)                                 !--- Modify tracer name
    889950    !--------------------------------------------------------------------------------------------------------------------------
    890951    END DO
     
    896957!==============================================================================================================================
    897958
    898 !==============================================================================================================================
    899 SUBROUTINE setDirectKeys(tr)
     959
     960!==============================================================================================================================
     961LOGICAL  FUNCTION  dispTraSection(message, sname, modname) RESULT(lerr)
     962  CHARACTER(LEN=*), INTENT(IN) :: message, sname, modname
     963  CHARACTER(LEN=maxlen), ALLOCATABLE :: s(:,:), n(:), tmp(:)
     964  CHARACTER(LEN=maxlen) :: p
     965  INTEGER :: idb, iq, nq
     966  idb = strIdx(dBase(:)%name, sname); IF(idb == 0) RETURN
     967  nq = SIZE(dBase(idb)%trac)
     968  p = ''
     969  CALL append(['iq'],     .TRUE. ); IF(lerr) RETURN
     970  CALL append(['name'],   .TRUE. ); IF(lerr) RETURN
     971  CALL append(['phases','phase '], .FALSE., 'pha'); IF(lerr) RETURN
     972  CALL append(['hadv'],   .TRUE. ); IF(lerr) RETURN
     973  CALL append(['vadv'],   .TRUE. ); IF(lerr) RETURN
     974  CALL append(['parent'], .FALSE.); IF(lerr) RETURN
     975  CALL append(['iGen'],   .FALSE.); IF(lerr) RETURN
     976  CALL msg(TRIM(message)//':', modname)
     977  lerr = dispTable(p, n, s, nColMax=maxTableWidth, nHead=2, sub=modname); IF(lerr) RETURN
     978
     979CONTAINS
     980
     981SUBROUTINE append(nam, lMandatory, snam)
     982! Test whether key named "nam(:)" is available.
     983!  * yes: - get its value for all species in "tmp(:)" and append table "s(:,:)" with it
     984!         - append titles list with "nam(1)" (or, if specified, "snam", usually a short name).
     985!  * no:  return to calling routine with an error flag if the required key is mandatory
     986  CHARACTER(LEN=*),           INTENT(IN) :: nam(:)
     987  LOGICAL,                    INTENT(IN) :: lMandatory
     988  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: snam
     989  INTEGER :: m
     990  CHARACTER(LEN=maxlen), ALLOCATABLE :: n0(:)
     991  CHARACTER(LEN=maxlen) :: nm
     992  lerr = .FALSE.
     993  IF(nam(1) == 'iq') THEN
     994    tmp = int2str([(iq, iq=1, nq)])
     995  ELSE
     996    lerr = getKey(nam, tmp, dBase(idb)%trac(:)%keys, lDisp=lMandatory)
     997  END IF
     998  IF(lerr) THEN; lerr = lMandatory; RETURN; END IF
     999  nm = nam(1); IF(PRESENT(snam)) nm = snam
     1000  p = TRIM(p)//'s'
     1001  IF(ALLOCATED(s)) THEN; s = cat(s, tmp); ELSE; ALLOCATE(s(nq,1)); s(:,1) = tmp; END IF
     1002  IF(ALLOCATED(n)) THEN; m = SIZE(n); ALLOCATE(n0(m+1)); n0(1:m)=n; n0(m+1)=nm; CALL MOVE_ALLOC(FROM=n0, TO=n)
     1003  ELSE; n=nam(1:1); END IF
     1004END SUBROUTINE append
     1005
     1006END FUNCTION dispTraSection
     1007!==============================================================================================================================
     1008
     1009
     1010!==============================================================================================================================
     1011!=== CREATE TRACER(S) ALIAS: SCALAR/VECTOR FROM NAME(S) OR INDICE(S) ==========================================================
     1012!==============================================================================================================================
     1013LOGICAL FUNCTION aliasTracer(tname, trac, alias) RESULT(lerr)                  !=== TRACER NAMED "tname" - SCALAR
     1014  CHARACTER(LEN=*),         INTENT(IN)  :: tname
     1015  TYPE(trac_type), TARGET,  INTENT(IN)  :: trac(:)
     1016  TYPE(trac_type), POINTER, INTENT(OUT) :: alias
     1017  INTEGER :: it
     1018  CHARACTER(LEN=maxlen), ALLOCATABLE :: tnames(:)
     1019  alias => NULL()
     1020  lerr = getKey('name', tnames, trac(:)%keys)
     1021  it = strIdx(tnames, tname)
     1022  lerr = it /= 0; IF(.NOT.lerr) alias => trac(it)
     1023END FUNCTION aliasTracer
     1024!==============================================================================================================================
     1025LOGICAL FUNCTION trSubset_Indx(trac, idx, alias) RESULT(lerr)                  !=== TRACERS WITH INDICES "idx(:)" - VECTOR
     1026  TYPE(trac_type), ALLOCATABLE, INTENT(IN)  ::  trac(:)
     1027  INTEGER,                      INTENT(IN)  ::   idx(:)
     1028  TYPE(trac_type), ALLOCATABLE, INTENT(OUT) :: alias(:)
     1029  alias = trac(idx)
     1030  lerr = indexUpdate(alias)
     1031END FUNCTION trSubset_Indx
     1032!------------------------------------------------------------------------------------------------------------------------------
     1033LOGICAL FUNCTION trSubset_Name(trac, tname, alias) RESULT(lerr)                !=== TRACERS NAMED "tname(:)" - VECTOR
     1034  TYPE(trac_type), ALLOCATABLE, INTENT(IN)  ::  trac(:)
     1035  CHARACTER(LEN=*),             INTENT(IN)  :: tname(:)
     1036  TYPE(trac_type), ALLOCATABLE, INTENT(OUT) :: alias(:)
     1037  CHARACTER(LEN=maxlen), ALLOCATABLE :: tnames(:)
     1038  lerr = getKey('name', tnames, trac(:)%keys)
     1039  alias = trac(strIdx(tnames, tname))
     1040  lerr = indexUpdate(alias)
     1041END FUNCTION trSubset_Name
     1042!==============================================================================================================================
     1043LOGICAL FUNCTION trSubset_gen0Name(trac, gen0Nm, alias) RESULT(lerr)           !=== TRACERS OF COMMON 1st GENERATION ANCESTOR
     1044  TYPE(trac_type), ALLOCATABLE, INTENT(IN)  :: trac(:)
     1045  CHARACTER(LEN=*),             INTENT(IN)  :: gen0Nm
     1046  TYPE(trac_type), ALLOCATABLE, INTENT(OUT) :: alias(:)
     1047  CHARACTER(LEN=maxlen), ALLOCATABLE :: gen0N(:)
     1048  lerr = getKey('gen0Name', gen0N, trac(:)%keys)
     1049  alias = trac(strFind(delPhase(gen0N), gen0Nm))
     1050  lerr = indexUpdate(alias)
     1051END FUNCTION trSubset_gen0Name
     1052!==============================================================================================================================
     1053
     1054
     1055!==============================================================================================================================
     1056!=== UPDATE THE INDEXES iqParent, iqDescend AND iGeneration IN THE TRACERS DESCRIPTOR LIST "tr" (USEFULL FOR SUBSETS) =========
     1057!==============================================================================================================================
     1058LOGICAL FUNCTION indexUpdate(tr) RESULT(lerr)
    9001059  TYPE(trac_type), INTENT(INOUT) :: tr(:)
    901 
    902   !--- Update %iqParent, %iqDescen, %nqDescen, %nqChildren
    903   CALL indexUpdate(tr)
    904 
    905   !--- Extract some direct-access keys
    906 !  DO iq = 1, SIZE(tr)
    907 !    tr(iq)%keys%<key> = getKey_prv(it, "<key>", tr%keys, <default_value> )
    908 !  END DO
    909 END SUBROUTINE setDirectKeys
    910 !==============================================================================================================================
    911 
    912 !==============================================================================================================================
    913 LOGICAL FUNCTION dispTraSection(message, sname, modname) RESULT(lerr)
    914   CHARACTER(LEN=*), INTENT(IN) :: message, sname, modname
    915   INTEGER :: idb, iq, nq
    916   INTEGER, ALLOCATABLE :: hadv(:), vadv(:)
    917   CHARACTER(LEN=maxlen), ALLOCATABLE :: phas(:), prnt(:)
    918   TYPE(trac_type), POINTER :: tm(:)
    919   lerr = .FALSE.
    920   idb = strIdx(dBase(:)%name, sname); IF(idb == 0) RETURN
    921   tm => dBase(idb)%trac
    922   nq = SIZE(tm)
    923   !--- BEWARE ! Can't use the "getKeyByName" functions yet.
    924   !             Names must first include the phases for tracers defined on multiple lines.
    925   hadv = str2int(fgetKeys('hadv',  tm(:)%keys, '10'))
    926   vadv = str2int(fgetKeys('vadv',  tm(:)%keys, '10'))
    927   prnt =         fgetKeys('parent',tm(:)%keys,  '' )
    928   IF(getKey('phases', phas, ky=tm(:)%keys)) phas = fGetKeys('phase', tm(:)%keys, 'g')
    929   CALL msg(TRIM(message)//':', modname)
    930   IF(ALL(prnt == 'air')) THEN
    931     IF(test(dispTable('iiiss',   ['iq    ','hadv  ','vadv  ','name  ','phase '],                   cat(tm%name,       phas),  &
    932                  cat([(iq, iq=1, nq)], hadv, vadv),                 nColMax=maxTableWidth, nHead=2, sub=modname), lerr)) RETURN
    933   ELSE IF(ALL(tm%iGeneration == -1)) THEN
    934     IF(test(dispTable('iiisss', ['iq    ','hadv  ','vadv  ','name  ','parent','phase '],           cat(tm%name, prnt, phas),  &
    935                  cat([(iq, iq=1, nq)], hadv, vadv),                 nColMax=maxTableWidth, nHead=2, sub=modname), lerr)) RETURN
    936   ELSE
    937     IF(test(dispTable('iiissis', ['iq    ','hadv  ','vadv  ','name  ','parent','igen  ','phase '], cat(tm%name, prnt, phas),  &
    938                  cat([(iq, iq=1, nq)], hadv, vadv, tm%iGeneration), nColMax=maxTableWidth, nHead=2, sub=modname), lerr)) RETURN
    939   END IF
    940 END FUNCTION dispTraSection
    941 !==============================================================================================================================
    942 
    943 
    944 !==============================================================================================================================
    945 !== CREATE A SCALAR ALIAS OF THE COMPONENT OF THE TRACERS DESCRIPTOR "t" NAMED "tname" ========================================
    946 !==============================================================================================================================
    947 FUNCTION aliasTracer(tname, t) RESULT(out)
    948   TYPE(trac_type),         POINTER    :: out
    949   CHARACTER(LEN=*),        INTENT(IN) :: tname
    950   TYPE(trac_type), TARGET, INTENT(IN) :: t(:)
    951   INTEGER :: it
    952   it = strIdx(t(:)%name, tname)
    953   out => NULL(); IF(it /= 0) out => t(it)
    954 END FUNCTION aliasTracer
    955 !==============================================================================================================================
    956 
    957 
    958 !==============================================================================================================================
    959 !=== FROM A LIST OF INDEXES OR NAMES, CREATE A SUBSET OF THE TRACERS DESCRIPTORS LIST "trac" ==================================
    960 !==============================================================================================================================
    961 FUNCTION trSubset_Indx(trac,idx) RESULT(out)
    962   TYPE(trac_type), ALLOCATABLE             ::  out(:)
    963   TYPE(trac_type), ALLOCATABLE, INTENT(IN) :: trac(:)
    964   INTEGER,                      INTENT(IN) ::  idx(:)
    965   out = trac(idx)
    966   CALL indexUpdate(out)
    967 END FUNCTION trSubset_Indx
    968 !------------------------------------------------------------------------------------------------------------------------------
    969 FUNCTION trSubset_Name(trac,nam) RESULT(out)
    970   TYPE(trac_type), ALLOCATABLE             ::  out(:)
    971   TYPE(trac_type), ALLOCATABLE, INTENT(IN) :: trac(:)
    972   CHARACTER(LEN=*),             INTENT(IN) ::  nam(:)
    973   out = trac(strIdx(trac(:)%name, nam))
    974   CALL indexUpdate(out)
    975 END FUNCTION trSubset_Name
    976 !==============================================================================================================================
    977 
    978 
    979 !==============================================================================================================================
    980 !=== CREATE THE SUBSET OF THE TRACERS DESCRIPTORS LIST "trac" HAVING THE FIRST GENERATION ANCESTOR NAMED "nam" ================
    981 !==============================================================================================================================
    982 FUNCTION trSubset_gen0Name(trac,nam) RESULT(out)
    983   TYPE(trac_type), ALLOCATABLE             ::  out(:)
    984   TYPE(trac_type), ALLOCATABLE, INTENT(IN) :: trac(:)
    985   CHARACTER(LEN=*),             INTENT(IN) ::  nam
    986   out = trac(strFind(delPhase(trac(:)%gen0Name), nam))
    987   CALL indexUpdate(out)
    988 END FUNCTION trSubset_gen0Name
    989 !==============================================================================================================================
    990 
    991 
    992 !==============================================================================================================================
    993 !=== UPDATE THE INDEXES iqParent, iqDescend AND iGeneration IN THE TRACERS DESCRIPTOR LIST "tr" (USEFULL FOR SUBSETS) =========
    994 !==============================================================================================================================
    995 SUBROUTINE indexUpdate(tr)
    996   TYPE(trac_type), INTENT(INOUT) :: tr(:)
    997   INTEGER :: iq, ig, igen, ngen, ix(SIZE(tr))
    998   tr(:)%iqParent = strIdx( tr(:)%name, tr(:)%parent )                !--- Parent index
    999   DO iq = 1, SIZE(tr); CALL addKey_1('iqParent', int2str(tr(iq)%iqParent), tr(iq)%keys); END DO
    1000   ngen = MAXVAL(tr(:)%iGeneration, MASK=.TRUE.)
    1001   DO iq = 1, SIZE(tr)
    1002     ig = tr(iq)%iGeneration
    1003     IF(ALLOCATED(tr(iq)%iqDescen)) DEALLOCATE(tr(iq)%iqDescen)
    1004     ALLOCATE(tr(iq)%iqDescen(0))
    1005     CALL idxAncestor(tr, ix, ig)                                     !--- Ancestor of generation "ng" for each tr
    1006     DO igen = ig+1, ngen
    1007       tr(iq)%iqDescen = [tr(iq)%iqDescen, find(ix==iq .AND. tr%iGeneration==igen)]
    1008       tr(iq)%nqDescen = SIZE(tr(iq)%iqDescen)
    1009       IF(igen == ig+1) THEN
    1010         tr(iq)%nqChildren = tr(iq)%nqDescen
    1011         CALL addKey_1('nqChildren', int2str(tr(iq)%nqChildren), tr(iq)%keys)
    1012       END IF
     1060  INTEGER :: iq, jq, nq, ig, nGen
     1061  INTEGER,               ALLOCATABLE :: iqDescen(:), ix(:), iy(:)
     1062  CHARACTER(LEN=maxlen), ALLOCATABLE :: tnames(:), parent(:)
     1063  INTEGER,       DIMENSION(SIZE(tr)) :: iqParent, iGen
     1064  lerr = getKey('name',   tnames, tr%keys); IF(lerr) RETURN          !--- Names
     1065  lerr = getKey('parent', parent, tr%keys); IF(lerr) RETURN          !--- Parents
     1066  nq = SIZE(tr)
     1067
     1068  !=== iqParent, iGeneration
     1069  DO iq = 1, nq; iGen(iq) = 0; jq = iq
     1070    iqParent(iq) = strIdx(tnames, parent(iq))
     1071    DO; jq = strIdx(tnames, parent(jq)); IF(jq == 0) EXIT; iGen(iq) = iGen(iq) + 1; END DO
     1072    CALL addKey('iqParent',   parent(iq), tr(iq)%keys)
     1073    CALL addKey('iqGeneration', iGen(iq), tr(iq)%keys)
     1074  END DO
     1075
     1076  !=== nqChildren, iqDescen, nqDescen
     1077  nGen = MAXVAL(iGen, MASK=.TRUE.)
     1078  DO iq = 1, nq
     1079    ix = [iq]; ALLOCATE(iqDescen(0))
     1080    DO ig = iGen(iq)+1, nGen
     1081      iy = find(iqParent, ix); iqDescen = [iqDescen, iy]; ix = iy
     1082      IF(ig /= iGen(iq)+1) CYCLE
     1083      CALL addKey('nqChildren', SIZE(iqDescen), tr(iq)%keys)
     1084      tr(iq)%nqChildren = SIZE(iqDescen)
    10131085    END DO
    1014     CALL addKey_1('iqDescen', strStack(int2str(tr(iq)%iqDescen)), tr(iq)%keys)
    1015     CALL addKey_1('nqDescen',          int2str(tr(iq)%nqDescen) , tr(iq)%keys)
     1086    CALL addKey('iqDescen', strStack(int2str(iqDescen)), tr(iq)%keys)
     1087    CALL addKey('nqDescen',             SIZE(iqDescen),  tr(iq)%keys)
     1088    tr(iq)%iqDescen =      iqDescen
     1089    tr(iq)%nqDescen = SIZE(iqDescen)
     1090    DEALLOCATE(iqDescen)
    10161091  END DO
    1017 END SUBROUTINE indexUpdate
     1092END FUNCTION indexUpdate
    10181093!==============================================================================================================================
    10191094 
     
    10241099!===  * For each isotopes class, the <key>=<val> vector of each tracer is moved into the isotopes descriptor "isot"        ====
    10251100!=== NOTES:                                                                                                                ====
    1026 !===  * Most of the "isot" components have been defined in the calling routine (readIsotopes):                             ====
     1101!===  * Most of the "isot" components have been defined in the calling routine (processIsotopes):                          ====
    10271102!===      parent,  nzone, zone(:),  niso, keys(:)%name,  ntiso, trac(:),  nphas, phas,  iqIsoPha(:,:),  itZonPhi(:,:)      ====
    10281103!===  * Same syntax for isotopes file and "tracer.def": a tracers section contains one line for each of its isotopes       ====
     
    10321107!===  * The routine gives an error if a required isotope is not available in the database stored in "fnam"                 ====
    10331108!==============================================================================================================================
    1034 LOGICAL FUNCTION readIsotopesFile_prv(fnam, isot) RESULT(lerr)
     1109LOGICAL FUNCTION readIsotopesFile(fnam, isot) RESULT(lerr)
    10351110  CHARACTER(LEN=*),        INTENT(IN)    :: fnam                     !--- Input file name
    10361111  TYPE(isot_type), TARGET, INTENT(INOUT) :: isot(:)                  !--- Isotopes descriptors (field %parent must be defined!)
     
    10491124  !--- READ THE FILE SECTIONS, ONE EACH PARENT TRACER
    10501125  nb0 = SIZE(dBase, DIM=1)+1                                         !--- Next database element index
    1051   IF(test(readSections(fnam,strStack(isot(:)%parent,'|')),lerr)) RETURN !--- Read sections, one each parent tracer
     1126  lerr = readSections(fnam,strStack(isot(:)%parent,'|')); IF(lerr) RETURN !--- Read sections, one each parent tracer
    10521127  ndb = SIZE(dBase, DIM=1)                                           !--- Current database size
    10531128  DO idb = nb0, ndb
     
    10671142      is = strIdx(isot(iis)%keys(:)%name, t%name)                    !--- Index in "isot(iis)%keys(:)%name" of isotope "t%name"
    10681143      IF(is == 0) CYCLE
    1069       IF(test(ANY(reduceExpr(t%keys%val, vals)), lerr)) RETURN       !--- Reduce expressions ; detect non-numerical elements
     1144      lerr = ANY(reduceExpr(t%keys%val, vals)); IF(lerr) RETURN      !--- Reduce expressions ; detect non-numerical elements
    10701145      isot(iis)%keys(is)%key = t%keys%key
    10711146      isot(iis)%keys(is)%val = vals
     
    10731148
    10741149    !--- CHECK FOR MISSING ISOTOPES (NO KEYS ALLOCATED)
    1075     IF(test(checkList(isot(iis)%keys(:)%name, .NOT.[( ALLOCATED(isot(iis)%keys(is)%key), is=1, SIZE(isot(iis)%keys) )], &
    1076       'Check file "'//TRIM(fnam)//'" in section "'//TRIM(dBase(idb)%name)//'"', 'isotopes', 'missing'), lerr)) RETURN
     1150    lerr = checkList(isot(iis)%keys(:)%name, .NOT.[( ALLOCATED(isot(iis)%keys(is)%key), is=1, SIZE(isot(iis)%keys) )], &
     1151                     'Check file "'//TRIM(fnam)//'" in section "'//TRIM(dBase(idb)%name)//'"', 'isotopes', 'missing')
     1152    IF(lerr) RETURN
    10771153  END DO
    10781154
     
    11091185      END DO
    11101186    END DO
    1111     IF(test(fmsg('Problem with the table content', modname, dispTable(prf, ttl, val, &
    1112             cat([(it,it=1,nt)]), rFmt='(EN8.4)', nColMax=maxTableWidth, nHead=2, sub=modname)), lerr)) RETURN
     1187    lerr = dispTable(prf, ttl, val, cat([(it,it=1,nt)]), rFmt='(EN8.4)', nColMax=maxTableWidth, nHead=2, sub=modname)
     1188    IF(fmsg('Problem with the table content', modname, lerr)) RETURN
    11131189    DEALLOCATE(ttl, val)
    11141190  END DO       
     
    11161192!------------------------------------------------------------------------------------------------------------------------------
    11171193
    1118 END FUNCTION readIsotopesFile_prv
     1194END FUNCTION readIsotopesFile
    11191195!==============================================================================================================================
    11201196
     
    11241200!===    * COMPUTE MOST OF THE RELATED QUANTITIES ("isot" COMPONENTS).                                                       ===
    11251201!===    * COMPUTE FEW ISOTOPES-DEDICATED "trac" COMPONENTS                                                                  ===
    1126 !===    * CALL readIsotopesFile_prv TO GET PHYSICAL QUANTITIES (<key>=<val> PAIRS)                                          ===
     1202!===    * CALL readIsotopesFile TO GET PHYSICAL QUANTITIES (<key>=<val> PAIRS)                                              ===
    11271203!===      NOTE: THIS IS DONE HERE (IN A ROUTINE CALLED BY THE DYNAMIC), BECAUSE THE DYNAMIC NEEDS FEW PHYSICAL PARAMETERS.  ===
    11281204!==============================================================================================================================
    1129 LOGICAL FUNCTION readIsotopesFile(iNames) RESULT(lerr)
     1205LOGICAL FUNCTION processIsotopes(iNames) RESULT(lerr)
    11301206  CHARACTER(LEN=maxlen), TARGET, OPTIONAL, INTENT(IN)  :: iNames(:)
    11311207  CHARACTER(LEN=maxlen), ALLOCATABLE :: p(:), str(:)                 !--- Temporary storage
     1208  CHARACTER(LEN=maxlen), ALLOCATABLE :: tname(:), parent(:), dType(:), phase(:), gen0N(:)
    11321209  CHARACTER(LEN=maxlen) :: iName, modname
    11331210  CHARACTER(LEN=1)   :: ph                                           !--- Phase
     1211  INTEGER, ALLOCATABLE ::  iGen(:)
    11341212  INTEGER :: ic, ip, iq, it, iz
    11351213  LOGICAL, ALLOCATABLE :: ll(:)                                      !--- Mask
    11361214  TYPE(trac_type), POINTER   ::  t(:), t1
    11371215  TYPE(isot_type), POINTER   ::  i
     1216
    11381217  lerr = .FALSE.
    11391218  modname = 'readIsotopesFile'
     
    11411220  t => tracers
    11421221
     1222  lerr = getKey('name',       tname, t%keys); IF(lerr) RETURN       !--- Names
     1223  lerr = getKey('parent',    parent, t%keys); IF(lerr) RETURN       !--- Parents
     1224  lerr = getKey('type',       dType, t%keys); IF(lerr) RETURN       !--- Tracer type
     1225  lerr = getKey('phase',      phase, t%keys); IF(lerr) RETURN       !--- Phase
     1226  lerr = getKey('gen0Name',   gen0N, t%keys); IF(lerr) RETURN       !--- 1st generation ancestor name
     1227  lerr = getKey('iGeneration', iGen, t%keys); IF(lerr) RETURN       !--- Generation number
     1228
    11431229  !--- GET FROM "tracers" THE FULL LIST OF AVAILABLE ISOTOPES CLASSES
    1144   p = PACK(delPhase(t%parent), MASK = t%type=='tracer' .AND. t%iGeneration==1)
     1230  p = PACK(delPhase(parent), MASK = dType=='tracer' .AND. iGen==1)
    11451231  CALL strReduce(p, nbIso)
    11461232
     
    11481234  IF(PRESENT(iNames)) THEN
    11491235    DO it = 1, SIZE(iNames)
    1150       IF(test(fmsg('No isotopes class "'//TRIM(iNames(it))//'" found among tracers', modname, ALL(p /= iNames(it))), lerr)) RETURN
     1236      lerr = ALL(p /= iNames(it))
     1237      IF(fmsg('No isotopes class "'//TRIM(iNames(it))//'" found among tracers', modname, lerr)) RETURN
    11511238    END DO
    11521239    p = iNames; nbIso = SIZE(p)
     
    11641251
    11651252    !=== Isotopes children of tracer "iname": mask, names, number (same for each phase of "iname")
    1166     ll = t(:)%type=='tracer' .AND. delPhase(t(:)%parent) == iname .AND. t(:)%phase == 'g'
    1167     str = PACK(delPhase(t(:)%name), MASK = ll)                       !--- Effectively found isotopes of "iname"
     1253    ll = dType=='tracer' .AND. delPhase(parent) == iname .AND. phase == 'g'
     1254    str = PACK(delPhase(tname), MASK = ll)                           !--- Effectively found isotopes of "iname"
    11681255    i%niso = SIZE(str)                                               !--- Number of "effectively found isotopes of "iname"
    11691256    ALLOCATE(i%keys(i%niso))
     
    11711258
    11721259    !=== Geographic tagging tracers descending on tracer "iname": mask, names, number
    1173     ll = t(:)%type=='tag'    .AND. delPhase(t(:)%gen0Name) == iname .AND. t(:)%iGeneration == 2
    1174     i%zone = PACK(strTail(t(:)%name,'_',.TRUE.), MASK = ll)          !--- Tagging zones names  for isotopes category "iname"
     1260    ll = dType=='tag'    .AND. delPhase(gen0N) == iname .AND. iGen == 2
     1261    i%zone = PACK(strTail(tname,'_',.TRUE.), MASK = ll)              !--- Tagging zones names  for isotopes category "iname"
    11751262    CALL strReduce(i%zone)
    11761263    i%nzone = SIZE(i%zone)                                           !--- Tagging zones number for isotopes category "iname"
     
    11781265    !=== Geographic tracers of the isotopes children of tracer "iname" (same for each phase of "iname")
    11791266    !    NOTE: One might like to create a similar variable for 2nd generation tagging tracers (tagging the gen1 tracers)
    1180     str = PACK(delPhase(t(:)%name), MASK=ll)
     1267    str = PACK(delPhase(tname), MASK=ll)
    11811268    CALL strReduce(str)
    11821269    i%ntiso = i%niso + SIZE(str)                                     !--- Number of isotopes + their geographic tracers [ntiso]
     
    12051292    i%iqIsoPha = RESHAPE( [( (strIdx(t%name,  addPhase(i%trac(it),i%phase(ip:ip))),       it=1, i%ntiso), ip=1, i%nphas)], &
    12061293                         [i%ntiso, i%nphas] )
     1294    !=== Table used to get iq (index in dyn array, size nqtot) from the water and isotope and phase indexes ; the full isotopes list
     1295    !    (including tagging tracers) is sorted this way:  iso1, iso2, ..., iso1_zone1, iso2_zone1, ..., iso1_zoneN, iso2_zoneN
     1296    i%iqWIsoPha = RESHAPE( [( [strIdx(t%name,   addPhase('H2O',i%phase(ip:ip))), i%iqIsoPha(:,ip)], ip=1,i%nphas)], &
     1297                         [1+i%ntiso, i%nphas] )
    12071298    !=== Table used to get ix (index in tagging tracers isotopes list, size ntiso) from the zone and isotope indexes
    12081299    i%itZonIso = RESHAPE( [( (strIdx(i%trac(:), TRIM(i%trac(it))//'_'//TRIM(i%zone(iz))), iz=1, i%nzone), it=1, i%niso )], &
     
    12111302
    12121303  !=== READ PHYSICAL PARAMETERS FROM isoFile FILE
    1213   IF(test(readIsotopesFile_prv(isoFile, isotopes), lerr)) RETURN
     1304!  lerr = readIsotopesFile(isoFile, isotopes); IF(lerr) RETURN! on commente pour ne pas chercher isotopes_params.def
     1305
     1306  !--- GET THE isoCheck ENTRY FROM THE *.DEF FILES (MIGHT BE CHANGED TO A CLASS-DEPENDANT KEYWORD)
     1307  CALL get_in('ok_iso_verif', isoCheck, .TRUE.)
    12141308
    12151309  !=== CHECK CONSISTENCY
    1216   IF(test(testIsotopes(), lerr)) RETURN
    1217 
    1218   !=== SELECT FIRST ISOTOPES CLASS OR, IF POSSIBLE, WATER CLASS
    1219   IF(.NOT.test(isoSelect(1, .TRUE.), lerr)) THEN; IF(isotope%parent == 'H2O') iH2O = ixIso; END IF
     1310  lerr = testIsotopes(); IF(lerr) RETURN
     1311
     1312  !=== SELECT WATER ISOTOPES CLASS OR, IF UNFOUND, THE FIRST ISOTOPES CLASS
     1313  IF(isoSelect('H2O', .TRUE.)) THEN; iH2O = ixIso; ELSE; lerr = isoSelect(1, .TRUE.); END IF
    12201314
    12211315CONTAINS
     
    12241318LOGICAL FUNCTION testIsotopes() RESULT(lerr)     !--- MAKE SURE MEMBERS OF AN ISOTOPES FAMILY ARE PRESENT IN THE SAME PHASES
    12251319!------------------------------------------------------------------------------------------------------------------------------
    1226   INTEGER :: ix, it, ip, np, iz, nz
     1320  INTEGER :: ix, it, ip, np, iz, nz, npha, nzon
    12271321  TYPE(isot_type), POINTER :: i
    12281322  DO ix = 1, nbIso
    12291323    i => isotopes(ix)
    12301324    !--- Check whether each isotope and tagging isotopic tracer is present in the same number of phases
    1231     DO it = 1, i%ntiso
    1232       np = SUM([(COUNT(tracers(:)%name == addPhase(i%trac(it), i%phase(ip:ip))), ip=1, i%nphas)])
    1233       IF(test(fmsg(TRIM(int2str(np))//' phases instead of '//TRIM(int2str(i%nphas))//' for '//TRIM(i%trac(it)), &
    1234         modname, np /= i%nphas), lerr)) RETURN
     1325    DO it = 1, i%ntiso; npha = i%nphas
     1326      np = SUM([(COUNT(tracers(:)%name == addPhase(i%trac(it), i%phase(ip:ip))), ip=1, npha)])
     1327      lerr = np /= npha
     1328      CALL msg(TRIM(int2str(np))//' phases instead of '//TRIM(int2str(npha))//' for '//TRIM(i%trac(it)), modname, lerr)
     1329      IF(lerr) RETURN
    12351330    END DO
    1236     DO it = 1, i%niso
    1237       nz = SUM([(COUNT(i%trac == TRIM(i%trac(it))//'_'//i%zone(iz)), iz=1, i%nzone)])
    1238       IF(test(fmsg(TRIM(int2str(nz))//' tagging zones instead of '//TRIM(int2str(i%nzone))//' for '//TRIM(i%trac(it)), &
    1239         modname, nz /= i%nzone), lerr)) RETURN
     1331    DO it = 1, i%niso; nzon = i%nzone
     1332      nz = SUM([(COUNT(i%trac == TRIM(i%trac(it))//'_'//i%zone(iz)), iz=1, nzon)])
     1333      lerr = nz /= nzon
     1334      CALL msg(TRIM(int2str(nz))//' tagging zones instead of '//TRIM(int2str(nzon))//' for '//TRIM(i%trac(it)), modname, lerr)
     1335      IF(lerr) RETURN
    12401336    END DO
    12411337  END DO
     
    12431339!------------------------------------------------------------------------------------------------------------------------------
    12441340
    1245 END FUNCTION readIsotopesFile
     1341END FUNCTION processIsotopes
    12461342!==============================================================================================================================
    12471343
     
    12591355   lV = .FALSE.; IF(PRESENT(lVerbose)) lV = lVerbose
    12601356   iIso = strIdx(isotopes(:)%parent, iName)
    1261    IF(test(iIso == 0, lerr)) THEN
     1357   lerr = iIso == 0
     1358   IF(lerr) THEN
    12621359      niso = 0; ntiso = 0; nzone = 0; nphas = 0; isoCheck=.FALSE.
    12631360      CALL msg('no isotope family named "'//TRIM(iName)//'"', ll=lV)
     
    12871384   itZonIso => isotope%itZonIso; isoCheck = isotope%check
    12881385   iqIsoPha => isotope%iqIsoPha
     1386   iqWIsoPha => isotope%iqWIsoPha
    12891387END FUNCTION isoSelectByIndex
    12901388!==============================================================================================================================
     
    12941392!=== ADD THE <key>=<val> PAIR TO THE "ky[(:)]" KEY[S] DESCRIPTOR[S] OR THE <key>=<val(:)> PAIRS TO THE "ky(:)" KEYS DESCRIPTORS
    12951393!==============================================================================================================================
    1296 SUBROUTINE addKey_1(key, val, ky, lOverWrite)
    1297   CHARACTER(LEN=*),  INTENT(IN)    :: key, val
     1394SUBROUTINE addKey_s11(key, sval, ky, lOverWrite)
     1395  CHARACTER(LEN=*),  INTENT(IN)    :: key, sval
    12981396  TYPE(keys_type),   INTENT(INOUT) :: ky
    12991397  LOGICAL, OPTIONAL, INTENT(IN)    :: lOverWrite
     
    13051403  IF(.NOT.ALLOCATED(ky%key)) THEN
    13061404    ALLOCATE(ky%key(1)); ky%key(1)=key
    1307     ALLOCATE(ky%val(1)); ky%val(1)=val
     1405    ALLOCATE(ky%val(1)); ky%val(1)=sval
    13081406    RETURN
    13091407  END IF
     
    13111409  IF(iky == 0) THEN
    13121410    nky = SIZE(ky%key)
    1313     ALLOCATE(k(nky+1)); k(1:nky) = ky%key; k(nky+1) = key; ky%key = k
    1314     ALLOCATE(v(nky+1)); v(1:nky) = ky%val; v(nky+1) = val; ky%val = v
     1411    ALLOCATE(k(nky+1)); k(1:nky) = ky%key; k(nky+1) = key;  ky%key = k
     1412    ALLOCATE(v(nky+1)); v(1:nky) = ky%val; v(nky+1) = sval; ky%val = v
    13151413  ELSE IF(lo) THEN
    1316     ky%key(iky) = key; ky%val(iky) = val
     1414    ky%key(iky) = key; ky%val(iky) = sval
    13171415  END IF
    1318 END SUBROUTINE addKey_1
    1319 !==============================================================================================================================
    1320 SUBROUTINE addKey_m(key, val, ky, lOverWrite)
    1321   CHARACTER(LEN=*),  INTENT(IN)    :: key, val
     1416END SUBROUTINE addKey_s11
     1417!==============================================================================================================================
     1418SUBROUTINE addKey_i11(key, ival, ky, lOverWrite)
     1419  CHARACTER(LEN=*),  INTENT(IN)    :: key
     1420  INTEGER,           INTENT(IN)    :: ival
     1421  TYPE(keys_type),   INTENT(INOUT) :: ky
     1422  LOGICAL, OPTIONAL, INTENT(IN)    :: lOverWrite
     1423!------------------------------------------------------------------------------------------------------------------------------
     1424  CALL addKey_s11(key, int2str(ival), ky, lOverWrite)
     1425END SUBROUTINE addKey_i11
     1426!==============================================================================================================================
     1427SUBROUTINE addKey_r11(key, rval, ky, lOverWrite)
     1428  CHARACTER(LEN=*),  INTENT(IN)    :: key
     1429  REAL,              INTENT(IN)    :: rval
     1430  TYPE(keys_type),   INTENT(INOUT) :: ky
     1431  LOGICAL, OPTIONAL, INTENT(IN)    :: lOverWrite
     1432!------------------------------------------------------------------------------------------------------------------------------
     1433  CALL addKey_s11(key, real2str(rval), ky, lOverWrite)
     1434END SUBROUTINE addKey_r11
     1435!==============================================================================================================================
     1436SUBROUTINE addKey_l11(key, lval, ky, lOverWrite)
     1437  CHARACTER(LEN=*),  INTENT(IN)    :: key
     1438  LOGICAL,           INTENT(IN)    :: lval
     1439  TYPE(keys_type),   INTENT(INOUT) :: ky
     1440  LOGICAL, OPTIONAL, INTENT(IN)    :: lOverWrite
     1441!------------------------------------------------------------------------------------------------------------------------------
     1442  CALL addKey_s11(key, bool2str(lval), ky, lOverWrite)
     1443END SUBROUTINE addKey_l11
     1444!==============================================================================================================================
     1445!==============================================================================================================================
     1446SUBROUTINE addKey_s1m(key, sval, ky, lOverWrite)
     1447  CHARACTER(LEN=*),  INTENT(IN)    :: key, sval
    13221448  TYPE(keys_type),   INTENT(INOUT) :: ky(:)
    13231449  LOGICAL, OPTIONAL, INTENT(IN)    :: lOverWrite
    13241450!------------------------------------------------------------------------------------------------------------------------------
    13251451  INTEGER :: itr
    1326   DO itr = 1, SIZE(ky)
    1327     CALL addKey_1(key, val, ky(itr), lOverWrite)
    1328   END DO
    1329 END SUBROUTINE addKey_m
    1330 !==============================================================================================================================
    1331 SUBROUTINE addKey_mm(key, val, ky, lOverWrite)
    1332   CHARACTER(LEN=*),  INTENT(IN)    :: key, val(:)
     1452  DO itr = 1, SIZE(ky); CALL addKey_s11(key, sval, ky(itr), lOverWrite); END DO
     1453END SUBROUTINE addKey_s1m
     1454!==============================================================================================================================
     1455SUBROUTINE addKey_i1m(key, ival, ky, lOverWrite)
     1456  CHARACTER(LEN=*),  INTENT(IN)    :: key
     1457  INTEGER,           INTENT(IN)    :: ival
    13331458  TYPE(keys_type),   INTENT(INOUT) :: ky(:)
    13341459  LOGICAL, OPTIONAL, INTENT(IN)    :: lOverWrite
    13351460!------------------------------------------------------------------------------------------------------------------------------
    13361461  INTEGER :: itr
    1337   DO itr = 1, SIZE(ky); CALL addKey_1(key, val(itr), ky(itr), lOverWrite); END DO
    1338 END SUBROUTINE addKey_mm
     1462  DO itr = 1, SIZE(ky); CALL addKey_s11(key, int2str(ival), ky(itr), lOverWrite); END DO
     1463END SUBROUTINE addKey_i1m
     1464!==============================================================================================================================
     1465SUBROUTINE addKey_r1m(key, rval, ky, lOverWrite)
     1466  CHARACTER(LEN=*),  INTENT(IN)    :: key
     1467  REAL,              INTENT(IN)    :: rval
     1468  TYPE(keys_type),   INTENT(INOUT) :: ky(:)
     1469  LOGICAL, OPTIONAL, INTENT(IN)    :: lOverWrite
     1470!------------------------------------------------------------------------------------------------------------------------------
     1471  INTEGER :: itr
     1472  DO itr = 1, SIZE(ky); CALL addKey_s11(key, real2str(rval), ky(itr), lOverWrite); END DO
     1473END SUBROUTINE addKey_r1m
     1474!==============================================================================================================================
     1475SUBROUTINE addKey_l1m(key, lval, ky, lOverWrite)
     1476  CHARACTER(LEN=*),  INTENT(IN)    :: key
     1477  LOGICAL,           INTENT(IN)    :: lval
     1478  TYPE(keys_type),   INTENT(INOUT) :: ky(:)
     1479  LOGICAL, OPTIONAL, INTENT(IN)    :: lOverWrite
     1480!------------------------------------------------------------------------------------------------------------------------------
     1481  INTEGER :: itr
     1482  DO itr = 1, SIZE(ky); CALL addKey_s11(key, bool2str(lval), ky(itr), lOverWrite); END DO
     1483END SUBROUTINE addKey_l1m
     1484!==============================================================================================================================
     1485!==============================================================================================================================
     1486SUBROUTINE addKey_smm(key, sval, ky, lOverWrite)
     1487  CHARACTER(LEN=*),  INTENT(IN)    :: key, sval(:)
     1488  TYPE(keys_type),   INTENT(INOUT) :: ky(:)
     1489  LOGICAL, OPTIONAL, INTENT(IN)    :: lOverWrite
     1490!------------------------------------------------------------------------------------------------------------------------------
     1491  INTEGER :: itr
     1492  DO itr = 1, SIZE(ky); CALL addKey_s11(key, sval(itr), ky(itr), lOverWrite); END DO
     1493END SUBROUTINE addKey_smm
     1494!==============================================================================================================================
     1495SUBROUTINE addKey_imm(key, ival, ky, lOverWrite)
     1496  CHARACTER(LEN=*),  INTENT(IN)    :: key
     1497  INTEGER,           INTENT(IN)    :: ival(:)
     1498  TYPE(keys_type),   INTENT(INOUT) :: ky(:)
     1499  LOGICAL, OPTIONAL, INTENT(IN)    :: lOverWrite
     1500!------------------------------------------------------------------------------------------------------------------------------
     1501  INTEGER :: itr
     1502  DO itr = 1, SIZE(ky); CALL addKey_s11(key, int2str(ival(itr)), ky(itr), lOverWrite); END DO
     1503END SUBROUTINE addKey_imm
     1504!==============================================================================================================================
     1505SUBROUTINE addKey_rmm(key, rval, ky, lOverWrite)
     1506  CHARACTER(LEN=*),  INTENT(IN)    :: key
     1507  REAL,              INTENT(IN)    :: rval(:)
     1508  TYPE(keys_type),   INTENT(INOUT) :: ky(:)
     1509  LOGICAL, OPTIONAL, INTENT(IN)    :: lOverWrite
     1510!------------------------------------------------------------------------------------------------------------------------------
     1511  INTEGER :: itr
     1512  DO itr = 1, SIZE(ky); CALL addKey_s11(key, real2str(rval(itr)), ky(itr), lOverWrite); END DO
     1513END SUBROUTINE addKey_rmm
     1514!==============================================================================================================================
     1515SUBROUTINE addKey_lmm(key, lval, ky, lOverWrite)
     1516  CHARACTER(LEN=*),  INTENT(IN)    :: key
     1517  LOGICAL,           INTENT(IN)    :: lval(:)
     1518  TYPE(keys_type),   INTENT(INOUT) :: ky(:)
     1519  LOGICAL, OPTIONAL, INTENT(IN)    :: lOverWrite
     1520!------------------------------------------------------------------------------------------------------------------------------
     1521  INTEGER :: itr
     1522  DO itr = 1, SIZE(ky); CALL addKey_s11(key, bool2str(lval(itr)), ky(itr), lOverWrite); END DO
     1523END SUBROUTINE addKey_lmm
    13391524!==============================================================================================================================
    13401525
     
    13531538  DO ik = 1, SIZE(t(jd)%keys%key)
    13541539    CALL get_in(t(jd)%keys%key(ik), val, '*none*')
    1355     IF(val /= '*none*') CALL addKey_1(t(jd)%keys%key(ik), val, t(jd)%keys, .TRUE.)
     1540    IF(val /= '*none*') CALL addKey(t(jd)%keys%key(ik), val, t(jd)%keys, .TRUE.)
    13561541  END DO
    13571542END SUBROUTINE addKeysFromDef
     
    13871572
    13881573!==============================================================================================================================
    1389 !================ GET THE VALUE OF A KEY FROM A "keys_type" DERIVED TYPE ; THE RESULT IS THE RETURNED VALUE ===================
    1390 !==============================================================================================================================
    1391 CHARACTER(LEN=maxlen) FUNCTION fgetKeyIdx_s1(itr, keyn, ky, def_val, lerr) RESULT(val)
     1574!===   INTERNAL FUNCTION: GET THE VALUE OF A KEY FOR "itr"th TRACER FROM A "keys_type" DERIVED TYPE AND RETURN THE RESULT   ===
     1575!===   IF keyn CONTAINS SEVERAL ELEMENTS, TRY WITH EACH ELEMENT ONE AFTER THE OTHER                                         ===
     1576!==============================================================================================================================
     1577CHARACTER(LEN=maxlen) FUNCTION fgetKeyIdx(itr, keyn, ky, lerr) RESULT(val)
    13921578  INTEGER,                    INTENT(IN)  :: itr
    1393   CHARACTER(LEN=*),           INTENT(IN)  :: keyn
     1579  CHARACTER(LEN=*),           INTENT(IN)  :: keyn(:)
    13941580  TYPE(keys_type),            INTENT(IN)  :: ky(:)
    1395   CHARACTER(LEN=*), OPTIONAL, INTENT(IN)  :: def_val
    13961581  LOGICAL,          OPTIONAL, INTENT(OUT) :: lerr
    13971582!------------------------------------------------------------------------------------------------------------------------------
     1583  INTEGER :: ik
     1584  LOGICAL :: ler
     1585  ler = .TRUE.
     1586  DO ik = 1, SIZE(keyn)
     1587    CALL getKeyIdx(keyn(ik)); IF(.NOT.ler) EXIT
     1588  END DO
     1589  IF(PRESENT(lerr)) lerr = ler
     1590
     1591CONTAINS
     1592
     1593SUBROUTINE getKeyIdx(keyn)
     1594  CHARACTER(LEN=*), INTENT(IN) :: keyn
     1595!------------------------------------------------------------------------------------------------------------------------------
    13981596  INTEGER :: iky
    1399   LOGICAL :: ler
    14001597  iky = 0; val = ''
    1401   IF(.NOT.test(itr <= 0 .OR. itr > SIZE(ky), ler)) iky = strIdx(ky(itr)%key(:), keyn)    !--- Correct index
    1402   IF(.NOT.test(iky == 0, ler))                     val = ky(itr)%val(iky)                !--- Found key
    1403   IF(iky == 0) THEN
    1404     IF(.NOT.test(.NOT.PRESENT(def_val), ler))      val = def_val                         !--- Default value
    1405   END IF
    1406   IF(PRESENT(lerr)) lerr = ler
    1407 END FUNCTION fgetKeyIdx_s1
    1408 !==============================================================================================================================
    1409 CHARACTER(LEN=maxlen) FUNCTION fgetKeyNam_s1(tname, keyn, ky, def_val, lerr) RESULT(val)
    1410   CHARACTER(LEN=*),           INTENT(IN)  :: tname, keyn
    1411   TYPE(keys_type),            INTENT(IN)  :: ky(:)
    1412   CHARACTER(LEN=*), OPTIONAL, INTENT(IN)  :: def_val
    1413   LOGICAL,          OPTIONAL, INTENT(OUT) :: lerr
    1414 !------------------------------------------------------------------------------------------------------------------------------
    1415   val = fgetKeyIdx_s1(strIdx(ky(:)%name, tname), keyn, ky, def_val, lerr)
    1416 END FUNCTION fgetKeyNam_s1
    1417 !==============================================================================================================================
    1418 FUNCTION fgetKeys(keyn, ky, def_val, lerr) RESULT(val)
    1419 CHARACTER(LEN=maxlen),        ALLOCATABLE :: val(:)
    1420   CHARACTER(LEN=*),           INTENT(IN)  :: keyn
    1421   TYPE(keys_type),            INTENT(IN)  :: ky(:)
    1422   CHARACTER(LEN=*), OPTIONAL, INTENT(IN)  :: def_val
    1423   LOGICAL,          OPTIONAL, INTENT(OUT) :: lerr
    1424 !------------------------------------------------------------------------------------------------------------------------------
    1425   LOGICAL :: ler(SIZE(ky))
    1426   INTEGER :: it
    1427   val = [(fgetKeyIdx_s1(it, keyn, ky, def_val, ler(it)), it = 1, SIZE(ky))]
    1428   IF(PRESENT(lerr)) lerr = ANY(ler)
    1429 END FUNCTION fgetKeys
    1430 !==============================================================================================================================
    1431 
    1432 
    1433 !==============================================================================================================================
    1434 !========== GET THE VALUE OF A KEY FROM A "keys_type" DERIVED TYPE ; THE RETURNED VALUE IS THE ERROR CODE        ==============
    1435 !==========  The key "keyn" is searched in: 1)           "ky(:)%name" (if given)                                 ==============
    1436 !==========                                 2)      "tracers(:)%name"                                            ==============
    1437 !==========                                 3) "isotope%keys(:)%name"                                            ==============
    1438 !==========  for the tracer[s] "tname[(:)]" (if given) or all the available tracers from the used set otherwise. ==============
    1439 !==========  The type of the returned value(s) can be string, integer or real, scalar or vector                  ==============
    1440 !==============================================================================================================================
    1441 LOGICAL FUNCTION getKeyByName_s1(keyn, val, tname, ky) RESULT(lerr)
     1598  ler = itr <= 0 .OR. itr > SIZE(ky); IF(ler) RETURN
     1599  iky = strIdx(ky(itr)%key(:), keyn)
     1600  ler = iky == 0;                     IF(ler) RETURN
     1601  val = ky(itr)%val(iky)
     1602END SUBROUTINE getKeyIdx
     1603
     1604END FUNCTION fgetKeyIdx
     1605!==============================================================================================================================
     1606
     1607
     1608!==============================================================================================================================
     1609!===                                          GET KEYS VALUES FROM TRACERS INDICES                                          ===
     1610!==============================================================================================================================
     1611!=== TRY TO GET THE KEY NAMED "key" FOR THE "itr"th TRACER IN:                                                              ===
     1612!===  * ARGUMENT "ky" DATABASE IF SPECIFIED ; OTHERWISE:                                                                    ===
     1613!===  * IN INTERNAL TRACERS DATABASE "tracers(:)%keys" (IF UNFOUND, IN INTERNAL ISOTOPES DATABASE "isotope%keys(:)")        ===
     1614!=== THE RETURNED VALUE (STRING, AN INTEGER, A REAL OR A LOGICAL) CAN BE EITHER:                                            ===
     1615!===  * A SCALAR                                                                                                            ===
     1616!===  * A VECTOR, WHICH IS THE FOUND VALUE PARSED WITH THE SEPARATOR ","                                                    ===
     1617!===                                                                                                                        ===
     1618!=== SYNTAX:       lerr = getKeyByIndex_{sirl}{1m}{1m}1(keyn[(:)], val[(:)], itr[, ky(:)]          [, def][, lDisp])        ===
     1619!==============================================================================================================================
     1620!=== IF "itr" IS NOT PRESENT, VALUES FOR ALL THE TRACERS OF THE SELECTED DATABASE ARE STORED IN THE VECTOR "val(:)"         ===
     1621!=== THE NAME OF THE TRACERS FOUND IN THE EFFECTIVELY USED DATABASE CAN BE RETURNED OPTIONALLY IN "nam(:)"                  ===
     1622!=== SYNTAX        lerr = getKeyByIndex_{sirl}{1m}mm   (keyn[(:)], val (:)      [, ky(:)][, nam(:)][, def][, lDisp])        ===
     1623!==============================================================================================================================
     1624LOGICAL FUNCTION getKeyByIndex_s111(keyn, val, itr, ky, def, lDisp) RESULT(lerr)
    14421625  CHARACTER(LEN=*),          INTENT(IN)  :: keyn
    14431626  CHARACTER(LEN=maxlen),     INTENT(OUT) :: val
    1444   CHARACTER(LEN=*),          INTENT(IN)  :: tname
     1627  INTEGER,                   INTENT(IN)  :: itr
    14451628  TYPE(keys_type), OPTIONAL, INTENT(IN)  :: ky(:)
    1446 !------------------------------------------------------------------------------------------------------------------------------
    1447   CHARACTER(LEN=maxlen) :: tnam
    1448   tnam = strHead(delPhase(tname),'_',.TRUE.)                                             !--- Remove phase and tag
    1449   IF(PRESENT(ky)) THEN                                                                   !=== KEY FROM "ky"
    1450                val = fgetKeyNam_s1(tname, keyn, ky,           lerr=lerr)                 !--- "ky" and "tname"
    1451     IF( lerr ) val = fgetKeyNam_s1(tnam,  keyn, ky,           lerr=lerr)                 !--- "ky" and "tnam"
    1452   ELSE
    1453     IF(         .NOT.test(.NOT.ALLOCATED(tracers ), lerr)) lerr = SIZE(tracers ) == 0    !=== KEY FROM "tracers"
    1454     IF(.NOT.lerr) THEN
    1455                val = fgetKeyNam_s1(tname, keyn, tracers%keys, lerr=lerr)                 !--- "ky" and "tname"
    1456       IF(lerr) val = fgetKeyNam_s1(tnam,  keyn, tracers%keys, lerr=lerr)                 !--- "ky" and "tnam"
    1457     END IF
    1458     IF(lerr.AND..NOT.test(.NOT.ALLOCATED(isotopes), lerr)) lerr = SIZE(isotopes) == 0    !=== KEY FROM "isotope"
    1459     IF(.NOT.lerr) THEN
    1460                val = fgetKeyNam_s1(tname, keyn, isotope%keys, lerr=lerr)                 !--- "ky" and "tname"
    1461       IF(lerr) val = fgetKeyNam_s1(tnam,  keyn, isotope%keys, lerr=lerr)                 !--- "ky" and "tnam"
    1462     END IF
     1629  CHARACTER(LEN=*),OPTIONAL, INTENT(IN)  :: def
     1630  LOGICAL,         OPTIONAL, INTENT(IN)  :: lDisp
     1631  lerr = getKeyByIndex_sm11([keyn], val, itr, ky, def, lDisp)
     1632END FUNCTION getKeyByIndex_s111
     1633!==============================================================================================================================
     1634LOGICAL FUNCTION getKeyByIndex_i111(keyn, val, itr, ky, def, lDisp) RESULT(lerr)
     1635  CHARACTER(LEN=*),          INTENT(IN)  :: keyn
     1636  INTEGER,                   INTENT(OUT) :: val
     1637  INTEGER,                   INTENT(IN)  :: itr
     1638  TYPE(keys_type), OPTIONAL, INTENT(IN)  :: ky(:)
     1639  INTEGER,         OPTIONAL, INTENT(IN)  :: def
     1640  LOGICAL,         OPTIONAL, INTENT(IN)  :: lDisp
     1641  lerr = getKeyByIndex_im11([keyn], val, itr, ky, def, lDisp)
     1642END FUNCTION getKeyByIndex_i111
     1643!==============================================================================================================================
     1644LOGICAL FUNCTION getKeyByIndex_r111(keyn, val, itr, ky, def, lDisp) RESULT(lerr)
     1645  CHARACTER(LEN=*),          INTENT(IN)  :: keyn
     1646  REAL   ,                   INTENT(OUT) :: val
     1647  INTEGER,                   INTENT(IN)  :: itr
     1648  TYPE(keys_type), OPTIONAL, INTENT(IN)  :: ky(:)
     1649  REAL,            OPTIONAL, INTENT(IN)  :: def
     1650  LOGICAL,         OPTIONAL, INTENT(IN)  :: lDisp
     1651  lerr = getKeyByIndex_rm11([keyn], val, itr, ky, def, lDisp)
     1652END FUNCTION getKeyByIndex_r111
     1653!==============================================================================================================================
     1654LOGICAL FUNCTION getKeyByIndex_l111(keyn, val, itr, ky, def, lDisp) RESULT(lerr)
     1655  CHARACTER(LEN=*),          INTENT(IN)  :: keyn
     1656  LOGICAL,                   INTENT(OUT) :: val
     1657  INTEGER,                   INTENT(IN)  :: itr
     1658  TYPE(keys_type), OPTIONAL, INTENT(IN)  :: ky(:)
     1659  LOGICAL,         OPTIONAL, INTENT(IN)  :: def
     1660  LOGICAL,         OPTIONAL, INTENT(IN)  :: lDisp
     1661  lerr = getKeyByIndex_lm11([keyn], val, itr, ky, def, lDisp)
     1662END FUNCTION getKeyByIndex_l111
     1663!==============================================================================================================================
     1664!==============================================================================================================================
     1665LOGICAL FUNCTION getKeyByIndex_sm11(keyn, val, itr, ky, def, lDisp) RESULT(lerr)
     1666  CHARACTER(LEN=*),          INTENT(IN)  :: keyn(:)
     1667  CHARACTER(LEN=maxlen),     INTENT(OUT) :: val
     1668  INTEGER,                   INTENT(IN)  :: itr
     1669  TYPE(keys_type), OPTIONAL, INTENT(IN)  :: ky(:)
     1670  CHARACTER(LEN=*),OPTIONAL, INTENT(IN)  :: def
     1671  LOGICAL,         OPTIONAL, INTENT(IN)  :: lDisp
     1672!------------------------------------------------------------------------------------------------------------------------------
     1673  CHARACTER(LEN=maxlen) :: s
     1674  LOGICAL :: lD
     1675  lD = .TRUE.; IF(PRESENT(lDisp)) lD = lDisp
     1676  s = 'key "'//TRIM(strStack(keyn, '/'))//'" for tracer nr. '//TRIM(int2str(itr))
     1677  lerr = .TRUE.
     1678  IF(lerr .AND. PRESENT(ky))         val = fgetKey(ky)                                   !--- "ky"
     1679  IF(lerr .AND. ALLOCATED (tracers)) val = fgetKey(tracers(:)%keys)                      !--- "tracers"
     1680  IF(lerr .AND. ASSOCIATED(isotope)) val = fgetKey(isotope%keys(:))                      !--- "isotope"
     1681  IF(lerr .AND. PRESENT(def)) THEN
     1682     val = def; lerr = .NOT.PRESENT(def)
     1683     CALL msg('Using defaut value of '//TRIM(s)//': '//TRIM(def), modname, lD)
    14631684  END IF
    1464 END FUNCTION getKeyByName_s1
    1465 !==============================================================================================================================
    1466 LOGICAL FUNCTION getKeyByName_s1m(keyn, val, tname, ky) RESULT(lerr)
     1685  CALL msg('No '//TRIM(s)//' or out of bounds index', modname, lD .AND. lerr)
     1686
     1687CONTAINS
     1688
     1689CHARACTER(LEN=maxlen) FUNCTION fgetKey(ky) RESULT(val)
     1690  TYPE(keys_type),  INTENT(IN)  :: ky(:)
     1691  lerr = SIZE(ky) == 0; IF(lerr) RETURN
     1692  val = fgetKeyIdx(itr, keyn(:), ky, lerr)
     1693END FUNCTION fgetKey
     1694
     1695END FUNCTION getKeyByIndex_sm11
     1696!==============================================================================================================================
     1697LOGICAL FUNCTION getKeyByIndex_im11(keyn, val, itr, ky, def, lDisp) RESULT(lerr)
     1698  CHARACTER(LEN=*),          INTENT(IN)  :: keyn(:)
     1699  INTEGER,                   INTENT(OUT) :: val
     1700  INTEGER,                   INTENT(IN)  :: itr
     1701  TYPE(keys_type), OPTIONAL, INTENT(IN)  :: ky(:)
     1702  INTEGER,         OPTIONAL, INTENT(IN)  :: def
     1703  LOGICAL,         OPTIONAL, INTENT(IN)  :: lDisp
     1704!------------------------------------------------------------------------------------------------------------------------------
     1705  CHARACTER(LEN=maxlen) :: sval, s
     1706  IF(     PRESENT(def)) lerr = getKeyByIndex_sm11(keyn, sval, itr, ky, int2str(def), lDisp)
     1707  IF(.NOT.PRESENT(def)) lerr = getKeyByIndex_sm11(keyn, sval, itr, ky, lDisp=lDisp)
     1708  IF(lerr) RETURN
     1709  val = str2int(sval)
     1710  lerr = val == -HUGE(1)
     1711  s = 'key "'//TRIM(strStack(keyn, '/'))//'" of tracer nr. '//TRIM(int2str(itr))//' is not'
     1712  CALL msg(TRIM(s)//' an integer: '//TRIM(sval), modname, lerr)
     1713END FUNCTION getKeyByIndex_im11
     1714!==============================================================================================================================
     1715LOGICAL FUNCTION getKeyByIndex_rm11(keyn, val, itr, ky, def, lDisp) RESULT(lerr)
     1716  CHARACTER(LEN=*),          INTENT(IN)  :: keyn(:)
     1717  REAL   ,                   INTENT(OUT) :: val
     1718  INTEGER,                   INTENT(IN)  :: itr
     1719  TYPE(keys_type), OPTIONAL, INTENT(IN)  :: ky(:)
     1720  REAL,            OPTIONAL, INTENT(IN)  :: def
     1721  LOGICAL,         OPTIONAL, INTENT(IN)  :: lDisp
     1722!------------------------------------------------------------------------------------------------------------------------------
     1723  CHARACTER(LEN=maxlen) :: sval, s
     1724  IF(     PRESENT(def)) lerr = getKeyByIndex_sm11(keyn, sval, itr, ky, real2str(def), lDisp)
     1725  IF(.NOT.PRESENT(def)) lerr = getKeyByIndex_sm11(keyn, sval, itr, ky, lDisp=lDisp)
     1726  IF(lerr) RETURN
     1727  val = str2real(sval)
     1728  lerr = val == -HUGE(1.)
     1729  s = 'key "'//TRIM(strStack(keyn, '/'))//'" of tracer nr. '//TRIM(int2str(itr))//' is not'
     1730  CALL msg(TRIM(s)//' a real: '//TRIM(sval), modname, lerr)
     1731END FUNCTION getKeyByIndex_rm11
     1732!==============================================================================================================================
     1733LOGICAL FUNCTION getKeyByIndex_lm11(keyn, val, itr, ky, def, lDisp) RESULT(lerr)
     1734  CHARACTER(LEN=*),          INTENT(IN)  :: keyn(:)
     1735  LOGICAL,                   INTENT(OUT) :: val
     1736  INTEGER,                   INTENT(IN)  :: itr
     1737  TYPE(keys_type), OPTIONAL, INTENT(IN)  :: ky(:)
     1738  LOGICAL,         OPTIONAL, INTENT(IN)  :: def
     1739  LOGICAL,         OPTIONAL, INTENT(IN)  :: lDisp
     1740!------------------------------------------------------------------------------------------------------------------------------
     1741  CHARACTER(LEN=maxlen) :: sval, s
     1742  INTEGER               :: ival
     1743  IF(     PRESENT(def)) lerr = getKeyByIndex_sm11(keyn, sval, itr, ky, bool2str(def), lDisp)
     1744  IF(.NOT.PRESENT(def)) lerr = getKeyByIndex_sm11(keyn, sval, itr, ky, lDisp=lDisp)
     1745  IF(lerr) RETURN
     1746  ival = str2bool(sval)
     1747  lerr = ival == -1
     1748  s = 'key "'//TRIM(strStack(keyn, '/'))//'" of tracer nr. '//TRIM(int2str(itr))//' is not'
     1749  CALL msg(TRIM(s)//' a boolean: '//TRIM(sval), modname, lerr)
     1750  IF(.NOT.lerr) val = ival == 1
     1751END FUNCTION getKeyByIndex_lm11
     1752!==============================================================================================================================
     1753!==============================================================================================================================
     1754LOGICAL FUNCTION getKeyByIndex_s1m1(keyn, val, itr, ky, def, lDisp) RESULT(lerr)
    14671755  CHARACTER(LEN=*),                   INTENT(IN)  :: keyn
    14681756  CHARACTER(LEN=maxlen), ALLOCATABLE, INTENT(OUT) :: val(:)
    1469   CHARACTER(LEN=*),                   INTENT(IN)  :: tname
     1757  INTEGER,                            INTENT(IN)  :: itr
    14701758  TYPE(keys_type),          OPTIONAL, INTENT(IN)  :: ky(:)
     1759  CHARACTER(LEN=*),         OPTIONAL, INTENT(IN)  :: def
     1760  LOGICAL,                  OPTIONAL, INTENT(IN)  :: lDisp
     1761!------------------------------------------------------------------------------------------------------------------------------
     1762  CHARACTER(LEN=maxlen)              :: sval
     1763  lerr = getKeyByIndex_sm11([keyn], sval, itr, ky, def, lDisp); IF(lerr) RETURN
     1764  lerr = strParse(sval, ',', val)
     1765  IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN
     1766END FUNCTION getKeyByIndex_s1m1
     1767!==============================================================================================================================
     1768LOGICAL FUNCTION getKeyByIndex_i1m1(keyn, val, itr, ky, def, lDisp) RESULT(lerr)
     1769  CHARACTER(LEN=*),          INTENT(IN)  :: keyn
     1770  INTEGER,      ALLOCATABLE, INTENT(OUT) :: val(:)
     1771  INTEGER,                   INTENT(IN)  :: itr
     1772  TYPE(keys_type), OPTIONAL, INTENT(IN)  :: ky(:)
     1773  INTEGER,         OPTIONAL, INTENT(IN)  :: def
     1774  LOGICAL,         OPTIONAL, INTENT(IN)  :: lDisp
     1775!------------------------------------------------------------------------------------------------------------------------------
     1776  CHARACTER(LEN=maxlen)              :: sval, s
     1777  CHARACTER(LEN=maxlen), ALLOCATABLE :: svals(:)
     1778  IF(     PRESENT(def)) lerr = getKeyByIndex_sm11([keyn], sval, itr, ky, int2str(def), lDisp)
     1779  IF(.NOT.PRESENT(def)) lerr = getKeyByIndex_sm11([keyn], sval, itr, ky, lDisp=lDisp)
     1780  IF(lerr) RETURN
     1781  lerr = strParse(sval, ',', svals)
     1782  IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN
     1783  val = str2int(svals)
     1784  lerr = ANY(val == -HUGE(1))
     1785  s = 'key "'//TRIM(keyn)//'" of tracer nr. '//TRIM(int2str(itr))//' is not'
     1786  CALL msg(TRIM(s)//' an integer: '//TRIM(sval), modname, lerr)
     1787END FUNCTION getKeyByIndex_i1m1
     1788!==============================================================================================================================
     1789LOGICAL FUNCTION getKeyByIndex_r1m1(keyn, val, itr, ky, def, lDisp) RESULT(lerr)
     1790  CHARACTER(LEN=*),          INTENT(IN)  :: keyn
     1791  REAL,         ALLOCATABLE, INTENT(OUT) :: val(:)
     1792  INTEGER,                   INTENT(IN)  :: itr
     1793  TYPE(keys_type), OPTIONAL, INTENT(IN)  :: ky(:)
     1794  REAL,            OPTIONAL, INTENT(IN)  :: def
     1795  LOGICAL,         OPTIONAL, INTENT(IN)  :: lDisp
     1796!------------------------------------------------------------------------------------------------------------------------------
     1797  CHARACTER(LEN=maxlen)              :: sval, s
     1798  CHARACTER(LEN=maxlen), ALLOCATABLE :: svals(:)
     1799  IF(     PRESENT(def)) lerr = getKeyByIndex_sm11([keyn], sval, itr, ky, real2str(def), lDisp)
     1800  IF(.NOT.PRESENT(def)) lerr = getKeyByIndex_sm11([keyn], sval, itr, ky, lDisp=lDisp)
     1801  lerr = strParse(sval, ',', svals)
     1802  IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN
     1803  val = str2real(svals)
     1804  lerr = ANY(val == -HUGE(1.))
     1805  s = 'key "'//TRIM(keyn)//'" of tracer nr. '//TRIM(int2str(itr))//' is not'
     1806  CALL msg(TRIM(s)//' a real: '//TRIM(sval), modname, lerr)
     1807END FUNCTION getKeyByIndex_r1m1
     1808!==============================================================================================================================
     1809LOGICAL FUNCTION getKeyByIndex_l1m1(keyn, val, itr, ky, def, lDisp) RESULT(lerr)
     1810  CHARACTER(LEN=*),          INTENT(IN)  :: keyn
     1811  LOGICAL,      ALLOCATABLE, INTENT(OUT) :: val(:)
     1812  INTEGER,                   INTENT(IN)  :: itr
     1813  TYPE(keys_type), OPTIONAL, INTENT(IN)  :: ky(:)
     1814  LOGICAL,         OPTIONAL, INTENT(IN)  :: def
     1815  LOGICAL,         OPTIONAL, INTENT(IN)  :: lDisp
     1816!------------------------------------------------------------------------------------------------------------------------------
     1817  CHARACTER(LEN=maxlen)              :: sval, s
     1818  CHARACTER(LEN=maxlen), ALLOCATABLE :: svals(:)
     1819  INTEGER,               ALLOCATABLE :: ivals(:)
     1820  IF(     PRESENT(def)) lerr = getKeyByIndex_sm11([keyn], sval, itr, ky, bool2str(def), lDisp)
     1821  IF(.NOT.PRESENT(def)) lerr = getKeyByIndex_sm11([keyn], sval, itr, ky, lDisp=lDisp)
     1822  lerr = strParse(sval, ',', svals)
     1823  IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN
     1824  ivals = str2bool(svals)
     1825  lerr = ANY(ivals == -1)
     1826  s = 'key "'//TRIM(keyn)//'" of tracer nr. '//TRIM(int2str(itr))//' is not'
     1827  CALL msg(TRIM(s)//' a boolean: '//TRIM(sval), modname, lerr)
     1828  IF(.NOT.lerr) val = ivals == 1
     1829END FUNCTION getKeyByIndex_l1m1
     1830!==============================================================================================================================
     1831!==============================================================================================================================
     1832LOGICAL FUNCTION getKeyByIndex_smm1(keyn, val, itr, ky, def, lDisp) RESULT(lerr)
     1833  CHARACTER(LEN=*),                   INTENT(IN)  :: keyn(:)
     1834  CHARACTER(LEN=maxlen), ALLOCATABLE, INTENT(OUT) :: val(:)
     1835  INTEGER,                            INTENT(IN)  :: itr
     1836  TYPE(keys_type),          OPTIONAL, INTENT(IN)  :: ky(:)
     1837  CHARACTER(LEN=*),         OPTIONAL, INTENT(IN)  :: def
     1838  LOGICAL,                  OPTIONAL, INTENT(IN)  :: lDisp
    14711839!------------------------------------------------------------------------------------------------------------------------------
    14721840  CHARACTER(LEN=maxlen) :: sval
    1473   lerr = getKeyByName_s1(keyn, sval, tname, ky)
    1474   IF(test(fmsg('missing key "'//TRIM(keyn)//'" for tracer "'//TRIM(tname)//'"', modname, lerr), lerr)) RETURN
     1841  lerr = getKeyByIndex_sm11(keyn, sval, itr, ky, def, lDisp); IF(lerr) RETURN
    14751842  lerr = strParse(sval, ',', val)
    1476 END FUNCTION getKeyByName_s1m
    1477 !==============================================================================================================================
    1478 LOGICAL FUNCTION getKeyByName_sm(keyn, val, tname, ky, nam) RESULT(lerr)
     1843  IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN
     1844END FUNCTION getKeyByIndex_smm1
     1845!==============================================================================================================================
     1846LOGICAL FUNCTION getKeyByIndex_imm1(keyn, val, itr, ky, def, lDisp) RESULT(lerr)
     1847  CHARACTER(LEN=*),          INTENT(IN)  :: keyn(:)
     1848  INTEGER,      ALLOCATABLE, INTENT(OUT) :: val(:)
     1849  INTEGER,                   INTENT(IN)  :: itr
     1850  TYPE(keys_type), OPTIONAL, INTENT(IN)  :: ky(:)
     1851  INTEGER,         OPTIONAL, INTENT(IN)  :: def
     1852  LOGICAL,         OPTIONAL, INTENT(IN)  :: lDisp
     1853!------------------------------------------------------------------------------------------------------------------------------
     1854  CHARACTER(LEN=maxlen)              :: sval, s
     1855  CHARACTER(LEN=maxlen), ALLOCATABLE :: svals(:)
     1856  IF(     PRESENT(def)) lerr = getKeyByIndex_sm11(keyn, sval, itr, ky, int2str(def), lDisp)
     1857  IF(.NOT.PRESENT(def)) lerr = getKeyByIndex_sm11(keyn, sval, itr, ky, lDisp=lDisp)
     1858  IF(lerr) RETURN
     1859  lerr = strParse(sval, ',', svals)
     1860  IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN
     1861  val = str2int(svals)
     1862  lerr = ANY(val == -HUGE(1))
     1863  s = 'key "'//TRIM(strStack(keyn, '/'))//'" of tracer nr. '//TRIM(int2str(itr))//' is not'
     1864  CALL msg(TRIM(s)//' an integer: '//TRIM(sval), modname, lerr)
     1865END FUNCTION getKeyByIndex_imm1
     1866!==============================================================================================================================
     1867LOGICAL FUNCTION getKeyByIndex_rmm1(keyn, val, itr, ky, def, lDisp) RESULT(lerr)
     1868  CHARACTER(LEN=*),          INTENT(IN)  :: keyn(:)
     1869  REAL,         ALLOCATABLE, INTENT(OUT) :: val(:)
     1870  INTEGER,                   INTENT(IN)  :: itr
     1871  TYPE(keys_type), OPTIONAL, INTENT(IN)  :: ky(:)
     1872  REAL,            OPTIONAL, INTENT(IN)  :: def
     1873  LOGICAL,         OPTIONAL, INTENT(IN)  :: lDisp
     1874!------------------------------------------------------------------------------------------------------------------------------
     1875  CHARACTER(LEN=maxlen)              :: sval, s
     1876  CHARACTER(LEN=maxlen), ALLOCATABLE :: svals(:)
     1877  IF(     PRESENT(def)) lerr = getKeyByIndex_sm11(keyn, sval, itr, ky, real2str(def), lDisp)
     1878  IF(.NOT.PRESENT(def)) lerr = getKeyByIndex_sm11(keyn, sval, itr, ky, lDisp=lDisp)
     1879  IF(lerr) RETURN
     1880  lerr = strParse(sval, ',', svals)
     1881  IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN
     1882  val = str2real(svals)
     1883  lerr = ANY(val == -HUGE(1.))
     1884  s = 'key "'//TRIM(strStack(keyn, '/'))//'" of tracer nr. '//TRIM(int2str(itr))//' is not'
     1885  CALL msg(TRIM(s)//' a real: '//TRIM(sval), modname, lerr)
     1886END FUNCTION getKeyByIndex_rmm1
     1887!==============================================================================================================================
     1888LOGICAL FUNCTION getKeyByIndex_lmm1(keyn, val, itr, ky, def, lDisp) RESULT(lerr)
     1889  CHARACTER(LEN=*),          INTENT(IN)  :: keyn(:)
     1890  LOGICAL,      ALLOCATABLE, INTENT(OUT) :: val(:)
     1891  INTEGER,                   INTENT(IN)  :: itr
     1892  TYPE(keys_type), OPTIONAL, INTENT(IN)  :: ky(:)
     1893  LOGICAL,         OPTIONAL, INTENT(IN)  :: def
     1894  LOGICAL,         OPTIONAL, INTENT(IN)  :: lDisp
     1895!------------------------------------------------------------------------------------------------------------------------------
     1896  CHARACTER(LEN=maxlen)              :: sval, s
     1897  CHARACTER(LEN=maxlen), ALLOCATABLE :: svals(:)
     1898  INTEGER,               ALLOCATABLE :: ivals(:)
     1899  IF(     PRESENT(def)) lerr = getKeyByIndex_sm11(keyn, sval, itr, ky, bool2str(def), lDisp)
     1900  IF(.NOT.PRESENT(def)) lerr = getKeyByIndex_sm11(keyn, sval, itr, ky, lDisp=lDisp)
     1901  IF(lerr) RETURN
     1902  lerr = strParse(sval, ',', svals)
     1903  IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN
     1904  ivals = str2bool(svals)
     1905  lerr = ANY(ivals == -1)
     1906  s = 'key "'//TRIM(strStack(keyn, '/'))//'" of tracer nr. '//TRIM(int2str(itr))//' is not'
     1907  CALL msg(TRIM(s)//' a boolean: '//TRIM(sval), modname, lerr)
     1908  IF(.NOT.lerr) val = ivals == 1
     1909END FUNCTION getKeyByIndex_lmm1
     1910!==============================================================================================================================
     1911!==============================================================================================================================
     1912LOGICAL FUNCTION getKeyByIndex_s1mm(keyn, val, ky, nam, def, lDisp) RESULT(lerr)
    14791913  CHARACTER(LEN=*),                             INTENT(IN)  :: keyn
    14801914  CHARACTER(LEN=maxlen),           ALLOCATABLE, INTENT(OUT) :: val(:)
    1481   CHARACTER(LEN=*),                             INTENT(IN)  :: tname(:)
    1482   TYPE(keys_type),       OPTIONAL, TARGET,      INTENT(IN)  :: ky(:)
     1915  TYPE(keys_type),       OPTIONAL,              INTENT(IN)  ::  ky(:)
    14831916  CHARACTER(LEN=maxlen), OPTIONAL, ALLOCATABLE, INTENT(OUT) :: nam(:)
    1484 !------------------------------------------------------------------------------------------------------------------------------
    1485   TYPE(keys_type), POINTER ::  keys(:)
    1486   LOGICAL :: lk, lt, li
    1487   INTEGER :: iq, nq
    1488 
    1489   !--- DETERMINE THE DATABASE TO BE USED (ky, tracers or isotope)
    1490   lk = PRESENT(ky)
    1491   lt = .NOT.lk .AND. ALLOCATED(tracers);  IF(lt) lt = SIZE(tracers)  /= 0; IF(lt) lt = ANY(tracers(1)%keys%key(:) == keyn)
    1492   li = .NOT.lt .AND. ALLOCATED(isotopes); IF(li) li = SIZE(isotopes) /= 0; IF(li) li = ANY(isotope%keys(1)%key(:) == keyn)
    1493 
    1494   !--- LINK "keys" TO THE RIGHT DATABASE
    1495   IF(test(.NOT.ANY([lk,lt,li]), lerr)) RETURN
    1496   IF(lk) keys => ky(:)
    1497   IF(lt) keys => tracers(:)%keys
    1498   IF(li) keys => isotope%keys(:)
    1499 
    1500   !--- GET THE DATA
    1501   nq = SIZE(tname)
    1502   ALLOCATE(val(nq))
    1503   lerr = ANY([(getKeyByName_s1(keyn, val(iq), tname(iq), keys(:)), iq=1, nq)])
    1504   IF(PRESENT(nam)) nam = tname(:)
    1505 
    1506 END FUNCTION getKeyByName_sm
    1507 !==============================================================================================================================
    1508 LOGICAL FUNCTION getKey_sm(keyn, val, ky, nam) RESULT(lerr)
     1917  CHARACTER(LEN=*),      OPTIONAL,              INTENT(IN)  :: def
     1918  LOGICAL,               OPTIONAL,              INTENT(IN)  :: lDisp
     1919  lerr = getKeyByIndex_smmm([keyn], val, ky, nam, def, lDisp)
     1920END FUNCTION getKeyByIndex_s1mm
     1921!==============================================================================================================================
     1922LOGICAL FUNCTION getKeyByIndex_i1mm(keyn, val, ky, nam, def, lDisp) RESULT(lerr)
    15091923  CHARACTER(LEN=*),                             INTENT(IN)  :: keyn
    1510   CHARACTER(LEN=maxlen),           ALLOCATABLE, INTENT(OUT) :: val(:)
    1511   TYPE(keys_type),       OPTIONAL,              INTENT(IN)  :: ky(:)
     1924  INTEGER,                         ALLOCATABLE, INTENT(OUT) :: val(:)
     1925  TYPE(keys_type),       OPTIONAL,              INTENT(IN)  ::  ky(:)
    15121926  CHARACTER(LEN=maxlen), OPTIONAL, ALLOCATABLE, INTENT(OUT) :: nam(:)
    1513 !------------------------------------------------------------------------------------------------------------------------------
    1514 ! Note: if names are repeated, getKeyByName_sm can't be used ; this routine, using indexes, must be used instead.
    1515   IF(PRESENT(ky)) THEN                                                                   !=== KEY FROM "ky"
    1516     val = fgetKeys(keyn, ky, lerr=lerr)
    1517     IF(PRESENT(nam)) nam = ky(:)%name
    1518   ELSE
    1519     IF(         .NOT.test(.NOT.ALLOCATED(tracers ), lerr)) lerr = SIZE(tracers ) == 0    !=== KEY FROM "tracers"
    1520     IF(.NOT.lerr) val = fgetKeys(keyn, tracers%keys, lerr=lerr)
    1521     IF(.NOT.lerr.AND.PRESENT(nam)) nam = tracers(:)%keys%name
    1522     IF(lerr.AND..NOT.test(.NOT.ALLOCATED(isotopes), lerr)) lerr = SIZE(isotopes) == 0    !=== KEY FROM "isotope"
    1523     IF(.NOT.lerr) val = fgetKeys(keyn, isotope%keys, lerr=lerr)
    1524     IF(.NOT.lerr.AND.PRESENT(nam)) nam = isotope%keys(:)%name
     1927  INTEGER,               OPTIONAL,              INTENT(IN)  :: def
     1928  LOGICAL,               OPTIONAL,              INTENT(IN)  :: lDisp
     1929  lerr = getKeyByIndex_immm([keyn], val, ky, nam, def, lDisp)
     1930END FUNCTION getKeyByIndex_i1mm
     1931!==============================================================================================================================
     1932LOGICAL FUNCTION getKeyByIndex_r1mm(keyn, val, ky, nam, def, lDisp) RESULT(lerr)
     1933  CHARACTER(LEN=*),                             INTENT(IN)  :: keyn
     1934  REAL,                            ALLOCATABLE, INTENT(OUT) :: val(:)
     1935  TYPE(keys_type),       OPTIONAL,              INTENT(IN)  ::  ky(:)
     1936  CHARACTER(LEN=maxlen), OPTIONAL, ALLOCATABLE, INTENT(OUT) :: nam(:)
     1937  REAL,                  OPTIONAL,              INTENT(IN)  :: def
     1938  LOGICAL,               OPTIONAL,              INTENT(IN)  :: lDisp
     1939  lerr = getKeyByIndex_rmmm([keyn], val, ky, nam, def, lDisp)
     1940END FUNCTION getKeyByIndex_r1mm
     1941!==============================================================================================================================
     1942LOGICAL FUNCTION getKeyByIndex_l1mm(keyn, val, ky, nam, def, lDisp) RESULT(lerr)
     1943  CHARACTER(LEN=*),                             INTENT(IN)  :: keyn
     1944  LOGICAL,                         ALLOCATABLE, INTENT(OUT) :: val(:)
     1945  TYPE(keys_type),       OPTIONAL,              INTENT(IN)  ::  ky(:)
     1946  CHARACTER(LEN=maxlen), OPTIONAL, ALLOCATABLE, INTENT(OUT) :: nam(:)
     1947  LOGICAL,               OPTIONAL,              INTENT(IN)  :: def
     1948  LOGICAL,               OPTIONAL,              INTENT(IN)  :: lDisp
     1949  lerr = getKeyByIndex_lmmm([keyn], val, ky, nam, def, lDisp)
     1950END FUNCTION getKeyByIndex_l1mm
     1951!==============================================================================================================================
     1952!==============================================================================================================================
     1953LOGICAL FUNCTION getKeyByIndex_smmm(keyn, val, ky, nam, def, lDisp) RESULT(lerr)
     1954  CHARACTER(LEN=*),                             INTENT(IN)  :: keyn(:)
     1955  CHARACTER(LEN=maxlen),           ALLOCATABLE, INTENT(OUT) ::  val(:)
     1956  TYPE(keys_type),       OPTIONAL,              INTENT(IN)  ::   ky(:)
     1957  CHARACTER(LEN=maxlen), OPTIONAL, ALLOCATABLE, INTENT(OUT) ::  nam(:)
     1958  CHARACTER(LEN=*),      OPTIONAL,              INTENT(IN)  ::  def
     1959  LOGICAL,               OPTIONAL,              INTENT(IN)  :: lDisp
     1960!------------------------------------------------------------------------------------------------------------------------------
     1961  CHARACTER(LEN=maxlen) :: s
     1962  CHARACTER(LEN=maxlen), ALLOCATABLE :: tname(:)
     1963  INTEGER :: iq, nq(3), k
     1964  LOGICAL :: lD, l(3)
     1965  lD = .TRUE.; IF(PRESENT(lDisp)) lD = lDisp
     1966  s = 'key "'//TRIM(strStack(keyn, '/'))//'"'
     1967  lerr = .TRUE.
     1968  IF(PRESENT(ky)) THEN;                 val = fgetKey(ky)                                !--- "ky"
     1969  ELSE IF(ALLOCATED(tracers)) THEN;     val = fgetKey(tracers(:)%keys)                   !--- "tracers"
     1970     IF(lerr .AND. ASSOCIATED(isotope)) val = fgetKey(isotope%keys(:))                   !--- "isotope"
    15251971  END IF
    1526 END FUNCTION getKey_sm
    1527 !==============================================================================================================================
    1528 LOGICAL FUNCTION getKeyByName_i1(keyn, val, tname, ky) RESULT(lerr)
    1529   CHARACTER(LEN=*),          INTENT(IN)  :: keyn
    1530   INTEGER,                   INTENT(OUT) :: val
    1531   CHARACTER(LEN=*),          INTENT(IN)  :: tname
    1532   TYPE(keys_type), OPTIONAL, INTENT(IN)  :: ky(:)
    1533 !------------------------------------------------------------------------------------------------------------------------------
    1534   CHARACTER(LEN=maxlen) :: sval
    1535   INTEGER :: ierr
    1536   lerr = getKeyByName_s1(keyn, sval, tname, ky)
    1537   IF(test(fmsg('key "'//TRIM(keyn)//'" or tracer "'//TRIM(tname)//'" is missing', modname, lerr), lerr)) RETURN
    1538   READ(sval, *, IOSTAT=ierr) val
    1539   IF(test(fmsg('key "'//TRIM(keyn)//'" of tracer "'//TRIM(tname)//'" is not an integer', modname, ierr/=0), lerr)) RETURN
    1540 END FUNCTION getKeyByName_i1
    1541 !==============================================================================================================================
    1542 LOGICAL FUNCTION getKeyByName_i1m(keyn, val, tname, ky) RESULT(lerr)
    1543   CHARACTER(LEN=*),          INTENT(IN)  :: keyn
    1544   INTEGER,      ALLOCATABLE, INTENT(OUT) :: val(:)
    1545   CHARACTER(LEN=*),          INTENT(IN)  :: tname
    1546   TYPE(keys_type), OPTIONAL, INTENT(IN)  ::  ky(:)
    1547 !------------------------------------------------------------------------------------------------------------------------------
    1548   CHARACTER(LEN=maxlen), ALLOCATABLE :: sval(:)
    1549   INTEGER :: ierr, iq, nq
    1550   IF(test(getKeyByName_s1m(keyn, sval, tname, ky), lerr)) RETURN
    1551   nq = SIZE(sval); ALLOCATE(val(nq))
    1552   lerr = .FALSE.; DO iq=1, nq; READ(sval(iq), *, IOSTAT=ierr) val(iq); lerr = lerr .OR. ierr /= 0; END DO
    1553   IF(test(fmsg('key "'//TRIM(keyn)//'" of tracer "'//TRIM(tname)//'" is not an integer', modname, lerr), lerr)) RETURN
    1554 END FUNCTION getKeyByName_i1m
    1555 !==============================================================================================================================
    1556 LOGICAL FUNCTION getKeyByName_im(keyn, val, tname, ky, nam) RESULT(lerr)
    1557   CHARACTER(LEN=*),                             INTENT(IN)  ::  keyn
    1558   INTEGER,                         ALLOCATABLE, INTENT(OUT) ::   val(:)
    1559   CHARACTER(LEN=*),                             INTENT(IN)  :: tname(:)
    1560   TYPE(keys_type),       OPTIONAL,              INTENT(IN)  ::    ky(:)
    1561   CHARACTER(LEN=maxlen), OPTIONAL, ALLOCATABLE, INTENT(OUT) ::   nam(:)
    1562 !------------------------------------------------------------------------------------------------------------------------------
    1563   CHARACTER(LEN=maxlen), ALLOCATABLE :: sval(:), names(:)
    1564   INTEGER :: ierr, iq, nq
    1565   IF(test(getKeyByName_sm(keyn, sval, tname, ky, names), lerr)) RETURN
    1566   nq = SIZE(sval); ALLOCATE(val(nq))
    1567   DO iq = 1, nq                                                      !--- CONVERT THE KEYS TO INTEGERS
    1568     READ(sval(iq), *, IOSTAT=ierr) val(iq)
    1569     IF(test(fmsg('key "'//TRIM(keyn)//'" of tracer "'//TRIM(names(iq))//'" is not an integer', modname, ierr/=0), lerr)) RETURN
    1570   END DO
    1571   IF(PRESENT(nam)) nam = names(:)
    1572 END FUNCTION getKeyByName_im
    1573 !==============================================================================================================================
    1574 LOGICAL FUNCTION getKey_im(keyn, val, ky, nam) RESULT(lerr)
    1575   CHARACTER(LEN=*),                             INTENT(IN)  :: keyn
     1972  IF(.NOT.lerr) THEN; IF(PRESENT(nam)) nam = tname; RETURN; END IF
     1973  IF(.NOT.PRESENT(def)) THEN; CALL msg('No '//TRIM(s)//' found', modname, lD); RETURN; END IF
     1974
     1975  !--- DEFAULT VALUE
     1976  l = [PRESENT(ky), ALLOCATED(tracers), ASSOCIATED(isotope)]; nq(:) = 0
     1977  IF(l(1)) nq(1) = SIZE(ky)
     1978  IF(l(2)) nq(2) = SIZE(tracers)
     1979  IF(l(3)) nq(3) = SIZE(isotope%keys)
     1980  DO k = 1, 3; IF(l(k) .AND. nq(k) /= 0) THEN; val = [(def, iq = 1, nq(k))]; EXIT; END IF; END DO
     1981  lerr = k == 4
     1982  CALL msg('Using defaut value for '//TRIM(s)//': '//TRIM(def), modname, lD .AND. .NOT.lerr)
     1983  CALL msg('No '//TRIM(s), modname, lD .AND. lerr)
     1984
     1985CONTAINS
     1986
     1987FUNCTION fgetKey(ky) RESULT(val)
     1988  CHARACTER(LEN=maxlen), ALLOCATABLE :: val(:)
     1989  TYPE(keys_type),       INTENT(IN)  :: ky(:)
     1990  LOGICAL :: ler(SIZE(ky))
     1991  INTEGER :: iq
     1992  lerr = SIZE(ky) == 0; IF(lerr) RETURN
     1993  tname = ky%name
     1994  val = [(fgetKeyIdx(iq, keyn(:), ky, ler(iq)), iq = 1, SIZE(ky))]
     1995  lerr = ANY(ler)
     1996END FUNCTION fgetKey
     1997
     1998END FUNCTION getKeyByIndex_smmm
     1999!==============================================================================================================================
     2000LOGICAL FUNCTION getKeyByIndex_immm(keyn, val, ky, nam, def, lDisp) RESULT(lerr)
     2001  CHARACTER(LEN=*),                             INTENT(IN)  :: keyn(:)
    15762002  INTEGER,                         ALLOCATABLE, INTENT(OUT) ::  val(:)
    15772003  TYPE(keys_type),       OPTIONAL,              INTENT(IN)  ::   ky(:)
    15782004  CHARACTER(LEN=maxlen), OPTIONAL, ALLOCATABLE, INTENT(OUT) ::  nam(:)
    1579 !------------------------------------------------------------------------------------------------------------------------------
    1580   CHARACTER(LEN=maxlen), ALLOCATABLE :: sval(:), names(:)
    1581   INTEGER :: ierr, iq, nq
    1582   IF(test(getKey_sm(keyn, sval, ky, names), lerr)) RETURN
    1583   nq = SIZE(sval); ALLOCATE(val(nq))
    1584   DO iq = 1, nq
    1585     READ(sval(iq), *, IOSTAT=ierr) val(iq)
    1586     IF(test(fmsg('key "'//TRIM(keyn)//'" of tracer "'//TRIM(names(iq))//'" is not an integer', modname, ierr/=0), lerr)) RETURN
    1587   END DO
    1588   IF(PRESENT(nam)) nam = names
    1589 END FUNCTION getKey_im
    1590 !==============================================================================================================================
    1591 LOGICAL FUNCTION getKeyByName_r1(keyn, val, tname, ky) RESULT(lerr)
    1592   CHARACTER(LEN=*),          INTENT(IN)  :: keyn
    1593   REAL,                      INTENT(OUT) :: val
    1594   CHARACTER(LEN=*),          INTENT(IN)  :: tname
    1595   TYPE(keys_type), OPTIONAL, INTENT(IN)  :: ky(:)
    1596 !------------------------------------------------------------------------------------------------------------------------------
    1597   CHARACTER(LEN=maxlen) :: sval
    1598   INTEGER :: ierr
    1599   lerr = getKeyByName_s1(keyn, sval, tname, ky)
    1600   IF(test(fmsg('key "'//TRIM(keyn)//'" or tracer "'//TRIM(tname)//'" is missing',    modname, lerr), lerr)) RETURN
    1601   READ(sval, *, IOSTAT=ierr) val
    1602   IF(test(fmsg('key "'//TRIM(keyn)//'" of tracer "'//TRIM(tname)//'" is not a real', modname, ierr/=0), lerr)) RETURN
    1603 END FUNCTION getKeyByName_r1
    1604 !==============================================================================================================================
    1605 LOGICAL FUNCTION getKeyByName_r1m(keyn, val, tname, ky) RESULT(lerr)
    1606   CHARACTER(LEN=*),           INTENT(IN)  :: keyn
    1607   REAL,          ALLOCATABLE, INTENT(OUT) :: val(:)
    1608   CHARACTER(LEN=*),           INTENT(IN)  :: tname
    1609   TYPE(keys_type),  OPTIONAL, INTENT(IN)  ::  ky(:)
    1610 !------------------------------------------------------------------------------------------------------------------------------
    1611   CHARACTER(LEN=maxlen), ALLOCATABLE :: sval(:)
    1612   INTEGER :: ierr, iq, nq
    1613   IF(test(getKeyByName_s1m(keyn, sval, tname, ky), lerr)) RETURN
    1614   nq = SIZE(sval); ALLOCATE(val(nq))
    1615   lerr = .FALSE.; DO iq=1, nq; READ(sval(iq), *, IOSTAT=ierr) val(iq); lerr = lerr .OR. ierr /= 0; END DO
    1616   IF(test(fmsg('key "'//TRIM(keyn)//'" of tracer "'//TRIM(tname)//'" is not a vector of reals', modname, lerr), lerr)) RETURN
    1617 END FUNCTION getKeyByName_r1m
    1618 !==============================================================================================================================
    1619 LOGICAL FUNCTION getKeyByName_rm(keyn, val, tname, ky, nam) RESULT(lerr)
    1620   CHARACTER(LEN=*),                             INTENT(IN)  ::  keyn
    1621   REAL,                            ALLOCATABLE, INTENT(OUT) ::   val(:)
    1622   CHARACTER(LEN=*),                             INTENT(IN)  :: tname(:)
    1623   TYPE(keys_type),       OPTIONAL,              INTENT(IN)  ::    ky(:)
    1624   CHARACTER(LEN=maxlen), OPTIONAL, ALLOCATABLE, INTENT(OUT) ::   nam(:)
    1625 !------------------------------------------------------------------------------------------------------------------------------
    1626   CHARACTER(LEN=maxlen), ALLOCATABLE :: sval(:), names(:)
    1627   INTEGER :: ierr, iq, nq
    1628   IF(test(getKeyByName_sm(keyn, sval, tname, ky, names), lerr)) RETURN
    1629   nq = SIZE(sval); ALLOCATE(val(nq))
    1630   DO iq = 1, nq                                                      !--- CONVERT THE KEYS TO INTEGERS
    1631     READ(sval(iq), *, IOSTAT=ierr) val(iq)
    1632     IF(test(fmsg('key "'//TRIM(keyn)//'" of tracer "'//TRIM(names(iq))//'" is not a real', modname, ierr/=0), lerr)) RETURN
    1633   END DO
    1634   IF(PRESENT(nam)) nam = names
    1635 END FUNCTION getKeyByName_rm
    1636 !==============================================================================================================================
    1637 LOGICAL FUNCTION getKey_rm(keyn, val, ky, nam) RESULT(lerr)
    1638   CHARACTER(LEN=*),                             INTENT(IN)  :: keyn
     2005  INTEGER,               OPTIONAL,              INTENT(IN)  ::  def
     2006  LOGICAL,               OPTIONAL,              INTENT(IN)  :: lDisp
     2007!------------------------------------------------------------------------------------------------------------------------------
     2008  CHARACTER(LEN=maxlen) :: s
     2009  CHARACTER(LEN=maxlen), ALLOCATABLE :: svals(:), tname(:)
     2010  LOGICAL,               ALLOCATABLE ::    ll(:)
     2011  IF(     PRESENT(def)) lerr = getKeyByIndex_smmm(keyn, svals, ky, tname, int2str(def), lDisp)
     2012  IF(.NOT.PRESENT(def)) lerr = getKeyByIndex_smmm(keyn, svals, ky, tname, lDisp=lDisp)
     2013  IF(lerr) RETURN
     2014  val = str2int(svals)
     2015  ll = val == -HUGE(1)
     2016  lerr = ANY(ll); IF(.NOT.lerr) THEN; IF(PRESENT(nam)) nam = tname; RETURN; END IF
     2017  s = 'key "'//TRIM(strStack(keyn, '/'))//'" of '//TRIM(strStack(PACK(tname, MASK=ll)))//' is not'
     2018  CALL msg(TRIM(s)//' an integer: '//TRIM(strStack(svals, MASK=ll)), modname, lerr)
     2019  IF(.NOT.lerr .AND. PRESENT(nam)) nam = tname
     2020END FUNCTION getKeyByIndex_immm
     2021!==============================================================================================================================
     2022LOGICAL FUNCTION getKeyByIndex_rmmm(keyn, val, ky, nam, def, lDisp) RESULT(lerr)
     2023  CHARACTER(LEN=*),                             INTENT(IN)  :: keyn(:)
    16392024  REAL,                            ALLOCATABLE, INTENT(OUT) ::  val(:)
    16402025  TYPE(keys_type),       OPTIONAL,              INTENT(IN)  ::   ky(:)
    16412026  CHARACTER(LEN=maxlen), OPTIONAL, ALLOCATABLE, INTENT(OUT) ::  nam(:)
    1642 !------------------------------------------------------------------------------------------------------------------------------
    1643   CHARACTER(LEN=maxlen), ALLOCATABLE :: sval(:), names(:)
    1644   INTEGER :: ierr, iq, nq
    1645   IF(test(getKey_sm(keyn, sval, ky, names), lerr)) RETURN
    1646   nq = SIZE(sval); ALLOCATE(val(nq))
    1647   DO iq = 1, nq                                                      !--- CONVERT THE KEYS TO INTEGERS
    1648     READ(sval(iq), *, IOSTAT=ierr) val(iq)
    1649     IF(test(fmsg('key "'//TRIM(keyn)//'" of tracer "'//TRIM(names(iq))//'" is not a real', modname, ierr/=0), lerr)) RETURN
    1650   END DO
    1651   IF(PRESENT(nam)) nam = names
    1652 END FUNCTION getKey_rm
    1653 !==============================================================================================================================
    1654 LOGICAL FUNCTION getKeyByName_l1(keyn, val, tname, ky) RESULT(lerr)
    1655   USE strings_mod, ONLY: str2bool
    1656   CHARACTER(LEN=*),          INTENT(IN)  :: keyn
    1657   LOGICAL,                   INTENT(OUT) :: val
    1658   CHARACTER(LEN=*),          INTENT(IN)  :: tname
    1659   TYPE(keys_type), OPTIONAL, INTENT(IN)  :: ky(:)
    1660 !------------------------------------------------------------------------------------------------------------------------------
    1661   CHARACTER(LEN=maxlen) :: sval
    1662   lerr = getKeyByName_s1(keyn, sval, tname, ky)
    1663   IF(test(fmsg('key "'//TRIM(keyn)//'" or tracer "'//TRIM(tname)//'" is missing', modname, lerr), lerr)) RETURN
    1664   val = str2bool(sval)
    1665 END FUNCTION getKeyByName_l1
    1666 !==============================================================================================================================
    1667 LOGICAL FUNCTION getKeyByName_l1m(keyn, val, tname, ky) RESULT(lerr)
    1668   USE strings_mod, ONLY: str2bool
    1669   CHARACTER(LEN=*),           INTENT(IN)  :: keyn
    1670   LOGICAL,       ALLOCATABLE, INTENT(OUT) :: val(:)
    1671   CHARACTER(LEN=*),           INTENT(IN)  :: tname
    1672   TYPE(keys_type),  OPTIONAL, INTENT(IN)  ::  ky(:)
    1673 !------------------------------------------------------------------------------------------------------------------------------
    1674   CHARACTER(LEN=maxlen), ALLOCATABLE :: sval(:)
    1675   INTEGER :: iq, nq
    1676   IF(test(getKeyByName_s1m(keyn, sval, tname, ky), lerr)) RETURN
    1677   nq = SIZE(sval); ALLOCATE(val(nq))
    1678   lerr = .FALSE.; DO iq=1, nq; val(iq)=str2bool(sval(iq)); END DO
    1679 END FUNCTION getKeyByName_l1m
    1680 !==============================================================================================================================
    1681 LOGICAL FUNCTION getKeyByName_lm(keyn, val, tname, ky, nam) RESULT(lerr)
    1682   USE strings_mod, ONLY: str2bool
    1683   CHARACTER(LEN=*),                             INTENT(IN)  ::  keyn
    1684   LOGICAL,                         ALLOCATABLE, INTENT(OUT) ::   val(:)
    1685   CHARACTER(LEN=*),                             INTENT(IN)  :: tname(:)
    1686   TYPE(keys_type),       OPTIONAL,              INTENT(IN)  ::    ky(:)
    1687   CHARACTER(LEN=maxlen), OPTIONAL, ALLOCATABLE, INTENT(OUT) ::   nam(:)
    1688 !------------------------------------------------------------------------------------------------------------------------------
    1689   CHARACTER(LEN=maxlen), ALLOCATABLE :: sval(:)
    1690   INTEGER :: iq, nq
    1691   IF(test(getKeyByName_sm(keyn, sval, tname, ky, nam), lerr)) RETURN
    1692   nq = SIZE(sval); ALLOCATE(val(nq))
    1693   lerr = .FALSE.; DO iq=1, nq; val(iq)=str2bool(sval(iq)); END DO
    1694 END FUNCTION getKeyByName_lm
    1695 !==============================================================================================================================
    1696 LOGICAL FUNCTION getKey_lm(keyn, val, ky, nam) RESULT(lerr)
    1697   USE strings_mod, ONLY: str2bool
    1698   CHARACTER(LEN=*),                             INTENT(IN)  :: keyn
     2027  REAL,                  OPTIONAL,              INTENT(IN)  ::  def
     2028  LOGICAL,               OPTIONAL,              INTENT(IN)  :: lDisp
     2029!------------------------------------------------------------------------------------------------------------------------------
     2030  CHARACTER(LEN=maxlen) :: s
     2031  CHARACTER(LEN=maxlen), ALLOCATABLE :: svals(:), tname(:)
     2032  LOGICAL,               ALLOCATABLE ::    ll(:)
     2033  IF(     PRESENT(def)) lerr = getKeyByIndex_smmm(keyn, svals, ky, tname, real2str(def), lDisp)
     2034  IF(.NOT.PRESENT(def)) lerr = getKeyByIndex_smmm(keyn, svals, ky, tname, lDisp=lDisp)
     2035  IF(lerr) RETURN
     2036  val = str2real(svals)
     2037  ll = val == -HUGE(1.)
     2038  lerr = ANY(ll); IF(.NOT.lerr) THEN; IF(PRESENT(nam)) nam = tname; RETURN; END IF
     2039  s = 'key "'//TRIM(strStack(keyn, '/'))//'" of '//TRIM(strStack(PACK(tname, MASK=ll)))//' is not a'
     2040  CALL msg(TRIM(s)//' a real: '//TRIM(strStack(svals, MASK=ll)), modname)
     2041END FUNCTION getKeyByIndex_rmmm
     2042!==============================================================================================================================
     2043LOGICAL FUNCTION getKeyByIndex_lmmm(keyn, val, ky, nam, def, lDisp) RESULT(lerr)
     2044  CHARACTER(LEN=*),                             INTENT(IN)  :: keyn(:)
    16992045  LOGICAL,                         ALLOCATABLE, INTENT(OUT) ::  val(:)
    17002046  TYPE(keys_type),       OPTIONAL,              INTENT(IN)  ::   ky(:)
    17012047  CHARACTER(LEN=maxlen), OPTIONAL, ALLOCATABLE, INTENT(OUT) ::  nam(:)
    1702 !------------------------------------------------------------------------------------------------------------------------------
    1703   CHARACTER(LEN=maxlen), ALLOCATABLE :: sval(:)
     2048  LOGICAL,               OPTIONAL,              INTENT(IN)  ::  def
     2049  LOGICAL,               OPTIONAL,              INTENT(IN)  :: lDisp
     2050!------------------------------------------------------------------------------------------------------------------------------
     2051  CHARACTER(LEN=maxlen) :: s
     2052  CHARACTER(LEN=maxlen), ALLOCATABLE :: svals(:), tname(:)
     2053  LOGICAL,               ALLOCATABLE ::    ll(:)
     2054  INTEGER,               ALLOCATABLE :: ivals(:)
     2055  IF(     PRESENT(def)) lerr = getKeyByIndex_smmm(keyn, svals, ky, tname, bool2str(def), lDisp)
     2056  IF(.NOT.PRESENT(def)) lerr = getKeyByIndex_smmm(keyn, svals, ky, tname, lDisp=lDisp)
     2057  IF(lerr) RETURN
     2058  ivals = str2bool(svals)
     2059  ll = ivals == -1
     2060  lerr = ANY(ll); IF(.NOT.lerr) THEN; val = ivals == 1; IF(PRESENT(nam)) nam = tname; RETURN; END IF
     2061  s = 'key "'//TRIM(strStack(keyn, '/'))//'" of '//TRIM(strStack(tname, MASK=ll))//' is not'
     2062  CALL msg(TRIM(s)//' a boolean: '//TRIM(strStack(svals, MASK=ll)), modname)
     2063END FUNCTION getKeyByIndex_lmmm
     2064!==============================================================================================================================
     2065
     2066
     2067
     2068!==============================================================================================================================
     2069!===                                           GET KEYS VALUES FROM TRACERS NAMES                                           ===
     2070!==============================================================================================================================
     2071!=== TRY TO GET THE KEY NAMED "key" FOR THE TRACER NAMED "tname" IN:                                                        ===
     2072!===  * ARGUMENT "ky" DATABASE IF SPECIFIED ; OTHERWISE:                                                                    ===
     2073!===  * IN INTERNAL TRACERS DATABASE "tracers(:)%keys" (IF UNFOUND, IN INTERNAL ISOTOPES DATABASE "isotope%keys(:)")        ===
     2074!=== THE RETURNED VALUE (STRING, AN INTEGER, A REAL OR A LOGICAL) CAN BE EITHER:                                            ===
     2075!===  * A SCALAR                                                                                                            ===
     2076!===  * A VECTOR, WHICH IS THE FOUND VALUE PARSED WITH THE SEPARATOR ","                                                    ===
     2077!===                                                                                                                        ===
     2078!=== SYNTAX:       lerr = getKeyByName_{sirl}{1m}{1m}1(keyn[(:)], val[(:)], tname  [, ky(:)][, def][, lDisp])               ===
     2079!==============================================================================================================================
     2080!=== IF "tname(:)" IS A VECTOR, THE RETURNED VALUES (ONE EACH "tname(:)" ELEMENT) ARE STORED IN THE VECTOR "val(:)"         ===
     2081!===                                                                                                                        ===
     2082!=== SYNTAX        lerr = getKeyByName_{sirl}{1m}mm   (keyn[(:)], val (:), tname(:)[, ky(:)][, def][, lDisp])               ===
     2083!==============================================================================================================================
     2084LOGICAL FUNCTION getKeyByName_s111(keyn, val, tname, ky, def, lDisp) RESULT(lerr)
     2085  CHARACTER(LEN=*),          INTENT(IN)  :: keyn, tname
     2086  CHARACTER(LEN=maxlen),     INTENT(OUT) :: val
     2087  TYPE(keys_type), OPTIONAL, INTENT(IN)  :: ky(:)
     2088  CHARACTER(LEN=*),OPTIONAL, INTENT(IN)  :: def
     2089  LOGICAL,         OPTIONAL, INTENT(IN)  :: lDisp
     2090  lerr = getKeyByName_sm11([keyn], val, tname, ky, def, lDisp)
     2091END FUNCTION getKeyByName_s111
     2092!==============================================================================================================================
     2093LOGICAL FUNCTION getKeyByName_i111(keyn, val, tname, ky, def, lDisp) RESULT(lerr)
     2094  CHARACTER(LEN=*),          INTENT(IN)  :: keyn, tname
     2095  INTEGER,                   INTENT(OUT) :: val
     2096  TYPE(keys_type), OPTIONAL, INTENT(IN)  :: ky(:)
     2097  INTEGER,         OPTIONAL, INTENT(IN)  :: def
     2098  LOGICAL,         OPTIONAL, INTENT(IN)  :: lDisp
     2099  lerr = getKeyByName_im11([keyn], val, tname, ky, def, lDisp)
     2100END FUNCTION getKeyByName_i111
     2101!==============================================================================================================================
     2102LOGICAL FUNCTION getKeyByName_r111(keyn, val, tname, ky, def, lDisp) RESULT(lerr)
     2103  CHARACTER(LEN=*),          INTENT(IN)  :: keyn, tname
     2104  REAL   ,                   INTENT(OUT) :: val
     2105  TYPE(keys_type), OPTIONAL, INTENT(IN)  :: ky(:)
     2106  REAL,            OPTIONAL, INTENT(IN)  :: def
     2107  LOGICAL,         OPTIONAL, INTENT(IN)  :: lDisp
     2108  lerr = getKeyByName_rm11([keyn], val, tname, ky, def, lDisp)
     2109END FUNCTION getKeyByName_r111
     2110!==============================================================================================================================
     2111LOGICAL FUNCTION getKeyByName_l111(keyn, val, tname, ky, def, lDisp) RESULT(lerr)
     2112  CHARACTER(LEN=*),          INTENT(IN)  :: keyn, tname
     2113  LOGICAL,                   INTENT(OUT) :: val
     2114  TYPE(keys_type), OPTIONAL, INTENT(IN)  :: ky(:)
     2115  LOGICAL,         OPTIONAL, INTENT(IN)  :: def
     2116  LOGICAL,         OPTIONAL, INTENT(IN)  :: lDisp
     2117  lerr = getKeyByName_lm11([keyn], val, tname, ky, def, lDisp)
     2118END FUNCTION getKeyByName_l111
     2119!==============================================================================================================================
     2120!==============================================================================================================================
     2121LOGICAL FUNCTION getKeyByName_sm11(keyn, val, tname, ky, def, lDisp) RESULT(lerr)
     2122  CHARACTER(LEN=*),          INTENT(IN)  :: keyn(:), tname
     2123  CHARACTER(LEN=maxlen),     INTENT(OUT) :: val
     2124  TYPE(keys_type), OPTIONAL, INTENT(IN)  :: ky(:)
     2125  CHARACTER(LEN=*),OPTIONAL, INTENT(IN)  :: def
     2126  LOGICAL,         OPTIONAL, INTENT(IN)  :: lDisp
     2127!------------------------------------------------------------------------------------------------------------------------------
     2128  CHARACTER(LEN=maxlen) :: s, tnam
     2129  LOGICAL :: lD
     2130  lD = .TRUE.; IF(PRESENT(lDisp)) lD = lDisp
     2131  s = 'key "'//TRIM(strStack(keyn, '/'))//'" for "'//TRIM(tname)//'"'
     2132  lerr = .TRUE.
     2133  tnam = strHead(delPhase(tname),'_',.TRUE.)                                             !--- Remove phase and tag
     2134  IF(lerr .AND. PRESENT(ky))         val = fgetKey(ky)                                   !--- "ky"
     2135  IF(lerr .AND. ALLOCATED (tracers)) val = fgetKey(tracers(:)%keys)                      !--- "tracers"
     2136  IF(lerr .AND. ASSOCIATED(isotope)) val = fgetKey(isotope%keys(:))                      !--- "isotope"
     2137  IF(lerr .AND. PRESENT(def)) THEN
     2138     val = def; lerr = .NOT.PRESENT(def)
     2139     CALL msg('Using defaut value of '//TRIM(s)//': '//TRIM(def), modname, lD)
     2140  END IF
     2141  CALL msg('No '//TRIM(s)//' or out of bounds index', modname, lD .AND. lerr)
     2142
     2143CONTAINS
     2144
     2145 CHARACTER(LEN=maxlen) FUNCTION fgetKey(ky) RESULT(val)
     2146  TYPE(keys_type),  INTENT(IN)  :: ky(:)
     2147  lerr = SIZE(ky) == 0
     2148  IF(lerr) RETURN
     2149           val = fgetKeyIdx(strIdx(ky%name, tname), [keyn], ky, lerr)
     2150  IF(lerr) val = fgetKeyIdx(strIdx(ky%name, tnam ), [keyn], ky, lerr)
     2151
     2152END FUNCTION fgetKey
     2153
     2154END FUNCTION getKeyByName_sm11
     2155!==============================================================================================================================
     2156LOGICAL FUNCTION getKeyByName_im11(keyn, val, tname, ky, def, lDisp) RESULT(lerr)
     2157  CHARACTER(LEN=*),          INTENT(IN)  :: keyn(:), tname
     2158  INTEGER,                   INTENT(OUT) :: val
     2159  TYPE(keys_type), OPTIONAL, INTENT(IN)  :: ky(:)
     2160  INTEGER,         OPTIONAL, INTENT(IN)  :: def
     2161  LOGICAL,         OPTIONAL, INTENT(IN)  :: lDisp
     2162!------------------------------------------------------------------------------------------------------------------------------
     2163  CHARACTER(LEN=maxlen) :: sval, s
     2164  IF(     PRESENT(def)) lerr = getKeyByName_sm11(keyn, sval, tname, ky, int2str(def), lDisp)
     2165  IF(.NOT.PRESENT(def)) lerr = getKeyByName_sm11(keyn, sval, tname, ky, lDisp=lDisp)
     2166  IF(lerr) RETURN
     2167  val = str2int(sval)
     2168  lerr = val == -HUGE(1)
     2169  s = 'key "'//TRIM(strStack(keyn, '/'))//'" of '//TRIM(tname)//' is not'
     2170  CALL msg(TRIM(s)//' an integer: '//TRIM(sval), modname, lerr)
     2171END FUNCTION getKeyByName_im11
     2172!==============================================================================================================================
     2173LOGICAL FUNCTION getKeyByName_rm11(keyn, val, tname, ky, def, lDisp) RESULT(lerr)
     2174  CHARACTER(LEN=*),          INTENT(IN)  :: keyn(:), tname
     2175  REAL   ,                   INTENT(OUT) :: val
     2176  TYPE(keys_type), OPTIONAL, INTENT(IN)  :: ky(:)
     2177  REAL,            OPTIONAL, INTENT(IN)  :: def
     2178  LOGICAL,         OPTIONAL, INTENT(IN)  :: lDisp
     2179!------------------------------------------------------------------------------------------------------------------------------
     2180  CHARACTER(LEN=maxlen) :: sval, s
     2181  IF(     PRESENT(def)) lerr = getKeyByName_sm11(keyn, sval, tname, ky, real2str(def), lDisp)
     2182  IF(.NOT.PRESENT(def)) lerr = getKeyByName_sm11(keyn, sval, tname, ky, lDisp=lDisp)
     2183  IF(lerr) RETURN
     2184  val = str2real(sval)
     2185  lerr = val == -HUGE(1.)
     2186  s = 'key "'//TRIM(strStack(keyn, '/'))//'" of '//TRIM(tname)//' is not'
     2187  CALL msg(TRIM(s)//' a real: '//TRIM(sval), modname, lerr)
     2188END FUNCTION getKeyByName_rm11
     2189!==============================================================================================================================
     2190LOGICAL FUNCTION getKeyByName_lm11(keyn, val, tname, ky, def, lDisp) RESULT(lerr)
     2191  CHARACTER(LEN=*),          INTENT(IN)  :: keyn(:), tname
     2192  LOGICAL,                   INTENT(OUT) :: val
     2193  TYPE(keys_type), OPTIONAL, INTENT(IN)  :: ky(:)
     2194  LOGICAL,         OPTIONAL, INTENT(IN)  :: def
     2195  LOGICAL,         OPTIONAL, INTENT(IN)  :: lDisp
     2196!------------------------------------------------------------------------------------------------------------------------------
     2197  CHARACTER(LEN=maxlen) :: sval, s
     2198  INTEGER               :: ival
     2199  IF(     PRESENT(def)) lerr = getKeyByName_sm11(keyn, sval, tname, ky, bool2str(def), lDisp)
     2200  IF(.NOT.PRESENT(def)) lerr = getKeyByName_sm11(keyn, sval, tname, ky, lDisp=lDisp)
     2201  IF(lerr) RETURN
     2202  ival = str2bool(sval)
     2203  lerr = ival == -1
     2204  s = 'key "'//TRIM(strStack(keyn, '/'))//'" of '//TRIM(tname)//' is not'
     2205  CALL msg(TRIM(s)//' a boolean: '//TRIM(sval), modname, lerr)
     2206  IF(.NOT.lerr) val = ival == 1
     2207END FUNCTION getKeyByName_lm11
     2208!==============================================================================================================================
     2209!==============================================================================================================================
     2210LOGICAL FUNCTION getKeyByName_s1m1(keyn, val, tname, ky, def, lDisp) RESULT(lerr)
     2211  CHARACTER(LEN=*),                   INTENT(IN)  :: keyn, tname
     2212  CHARACTER(LEN=maxlen), ALLOCATABLE, INTENT(OUT) :: val(:)
     2213  TYPE(keys_type),          OPTIONAL, INTENT(IN)  :: ky(:)
     2214  CHARACTER(LEN=*),         OPTIONAL, INTENT(IN)  :: def
     2215  LOGICAL,                  OPTIONAL, INTENT(IN)  :: lDisp
     2216!------------------------------------------------------------------------------------------------------------------------------
     2217  CHARACTER(LEN=maxlen)              :: sval
     2218  lerr = getKeyByName_sm11([keyn], sval, tname, ky, def, lDisp); IF(lerr) RETURN
     2219  lerr = strParse(sval, ',', val)
     2220  IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN
     2221END FUNCTION getKeyByName_s1m1
     2222!==============================================================================================================================
     2223LOGICAL FUNCTION getKeyByName_i1m1(keyn, val, tname, ky, def, lDisp) RESULT(lerr)
     2224  CHARACTER(LEN=*),          INTENT(IN)  :: keyn, tname
     2225  INTEGER,      ALLOCATABLE, INTENT(OUT) :: val(:)
     2226  TYPE(keys_type), OPTIONAL, INTENT(IN)  :: ky(:)
     2227  INTEGER,         OPTIONAL, INTENT(IN)  :: def
     2228  LOGICAL,         OPTIONAL, INTENT(IN)  :: lDisp
     2229!------------------------------------------------------------------------------------------------------------------------------
     2230  CHARACTER(LEN=maxlen)              :: sval, s
     2231  CHARACTER(LEN=maxlen), ALLOCATABLE :: svals(:)
     2232  IF(     PRESENT(def)) lerr = getKeyByName_sm11([keyn], sval, tname, ky, int2str(def), lDisp)
     2233  IF(.NOT.PRESENT(def)) lerr = getKeyByName_sm11([keyn], sval, tname, ky, lDisp=lDisp)
     2234  IF(lerr) RETURN
     2235  lerr = strParse(sval, ',', svals)
     2236  IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN
     2237  val = str2int(svals)
     2238  lerr = ANY(val == -HUGE(1))
     2239  s = 'key "'//TRIM(keyn)//'" of '//TRIM(tname)//' is not'
     2240  CALL msg(TRIM(s)//' an integer: '//TRIM(sval), modname, lerr)
     2241END FUNCTION getKeyByName_i1m1
     2242!==============================================================================================================================
     2243LOGICAL FUNCTION getKeyByName_r1m1(keyn, val, tname, ky, def, lDisp) RESULT(lerr)
     2244  CHARACTER(LEN=*),          INTENT(IN)  :: keyn, tname
     2245  REAL,         ALLOCATABLE, INTENT(OUT) :: val(:)
     2246  TYPE(keys_type), OPTIONAL, INTENT(IN)  :: ky(:)
     2247  REAL,            OPTIONAL, INTENT(IN)  :: def
     2248  LOGICAL,         OPTIONAL, INTENT(IN)  :: lDisp
     2249!------------------------------------------------------------------------------------------------------------------------------
     2250  CHARACTER(LEN=maxlen)              :: sval, s
     2251  CHARACTER(LEN=maxlen), ALLOCATABLE :: svals(:)
     2252  IF(     PRESENT(def)) lerr = getKeyByName_sm11([keyn], sval, tname, ky, real2str(def), lDisp)
     2253  IF(.NOT.PRESENT(def)) lerr = getKeyByName_sm11([keyn], sval, tname, ky, lDisp=lDisp)
     2254  IF(lerr) RETURN
     2255  lerr = strParse(sval, ',', svals)
     2256  IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN
     2257  val = str2real(svals)
     2258  lerr = ANY(val == -HUGE(1.))
     2259  s = 'key "'//TRIM(keyn)//'" of '//TRIM(tname)//' is not'
     2260  CALL msg(TRIM(s)//' a real: '//TRIM(sval), modname, lerr)
     2261END FUNCTION getKeyByName_r1m1
     2262!==============================================================================================================================
     2263LOGICAL FUNCTION getKeyByName_l1m1(keyn, val, tname, ky, def, lDisp) RESULT(lerr)
     2264  CHARACTER(LEN=*),          INTENT(IN)  :: keyn, tname
     2265  LOGICAL,      ALLOCATABLE, INTENT(OUT) :: val(:)
     2266  TYPE(keys_type), OPTIONAL, INTENT(IN)  :: ky(:)
     2267  LOGICAL,         OPTIONAL, INTENT(IN)  :: def
     2268  LOGICAL,         OPTIONAL, INTENT(IN)  :: lDisp
     2269!------------------------------------------------------------------------------------------------------------------------------
     2270  CHARACTER(LEN=maxlen)              :: sval, s
     2271  CHARACTER(LEN=maxlen), ALLOCATABLE :: svals(:)
     2272  INTEGER,               ALLOCATABLE :: ivals(:)
     2273  IF(     PRESENT(def)) lerr = getKeyByName_sm11([keyn], sval, tname, ky, bool2str(def), lDisp)
     2274  IF(.NOT.PRESENT(def)) lerr = getKeyByName_sm11([keyn], sval, tname, ky, lDisp=lDisp)
     2275  IF(lerr) RETURN
     2276  lerr = strParse(sval, ',', svals)
     2277  IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN
     2278  ivals = str2bool(svals)
     2279  lerr = ANY(ivals == -1)
     2280  s = 'key "'//TRIM(keyn)//'" of '//TRIM(tname)//' is not'
     2281  CALL msg(TRIM(s)//' a boolean: '//TRIM(sval), modname, lerr)
     2282  IF(.NOT.lerr) val = ivals == 1
     2283END FUNCTION getKeyByName_l1m1
     2284!==============================================================================================================================
     2285!==============================================================================================================================
     2286LOGICAL FUNCTION getKeyByName_smm1(keyn, val, tname, ky, def, lDisp) RESULT(lerr)
     2287  CHARACTER(LEN=*),                   INTENT(IN)  :: keyn(:), tname
     2288  CHARACTER(LEN=maxlen), ALLOCATABLE, INTENT(OUT) :: val(:)
     2289  TYPE(keys_type),          OPTIONAL, INTENT(IN)  :: ky(:)
     2290  CHARACTER(LEN=*),         OPTIONAL, INTENT(IN)  :: def
     2291  LOGICAL,                  OPTIONAL, INTENT(IN)  :: lDisp
     2292!------------------------------------------------------------------------------------------------------------------------------
     2293  CHARACTER(LEN=maxlen) :: sval
     2294  lerr = getKeyByName_sm11(keyn, sval, tname, ky, def, lDisp); IF(lerr) RETURN
     2295  lerr = strParse(sval, ',', val)
     2296  IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN
     2297END FUNCTION getKeyByName_smm1
     2298!==============================================================================================================================
     2299LOGICAL FUNCTION getKeyByName_imm1(keyn, val, tname, ky, def, lDisp) RESULT(lerr)
     2300  CHARACTER(LEN=*),          INTENT(IN)  :: keyn(:), tname
     2301  INTEGER,      ALLOCATABLE, INTENT(OUT) :: val(:)
     2302  TYPE(keys_type), OPTIONAL, INTENT(IN)  :: ky(:)
     2303  INTEGER,         OPTIONAL, INTENT(IN)  :: def
     2304  LOGICAL,         OPTIONAL, INTENT(IN)  :: lDisp
     2305!------------------------------------------------------------------------------------------------------------------------------
     2306  CHARACTER(LEN=maxlen)              :: sval, s
     2307  CHARACTER(LEN=maxlen), ALLOCATABLE :: svals(:)
     2308  IF(     PRESENT(def)) lerr = getKeyByName_sm11(keyn, sval, tname, ky, int2str(def), lDisp)
     2309  IF(.NOT.PRESENT(def)) lerr = getKeyByName_sm11(keyn, sval, tname, ky, lDisp=lDisp)
     2310  IF(lerr) RETURN
     2311  lerr = strParse(sval, ',', svals)
     2312  IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN
     2313  val = str2int(svals)
     2314  lerr = ANY(val == -HUGE(1))
     2315  s = 'key "'//TRIM(strStack(keyn, '/'))//'" of '//TRIM(tname)//' is not'
     2316  CALL msg(TRIM(s)//' an integer: '//TRIM(sval), modname, lerr)
     2317END FUNCTION getKeyByName_imm1
     2318!==============================================================================================================================
     2319LOGICAL FUNCTION getKeyByName_rmm1(keyn, val, tname, ky, def, lDisp) RESULT(lerr)
     2320  CHARACTER(LEN=*),          INTENT(IN)  :: keyn(:), tname
     2321  REAL,         ALLOCATABLE, INTENT(OUT) :: val(:)
     2322  TYPE(keys_type), OPTIONAL, INTENT(IN)  :: ky(:)
     2323  REAL,            OPTIONAL, INTENT(IN)  :: def
     2324  LOGICAL,         OPTIONAL, INTENT(IN)  :: lDisp
     2325!------------------------------------------------------------------------------------------------------------------------------
     2326  CHARACTER(LEN=maxlen)              :: sval, s
     2327  CHARACTER(LEN=maxlen), ALLOCATABLE :: svals(:)
     2328  IF(     PRESENT(def)) lerr = getKeyByName_sm11(keyn, sval, tname, ky, real2str(def), lDisp)
     2329  IF(.NOT.PRESENT(def)) lerr = getKeyByName_sm11(keyn, sval, tname, ky, lDisp=lDisp)
     2330  IF(lerr) RETURN
     2331  lerr = strParse(sval, ',', svals)
     2332  IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN
     2333  val = str2real(svals)
     2334  lerr = ANY(val == -HUGE(1.))
     2335  s = 'key "'//TRIM(strStack(keyn, '/'))//'" of '//TRIM(tname)//' is not'
     2336  CALL msg(TRIM(s)//' a real: '//TRIM(sval), modname, lerr)
     2337END FUNCTION getKeyByName_rmm1
     2338!==============================================================================================================================
     2339LOGICAL FUNCTION getKeyByName_lmm1(keyn, val, tname, ky, def, lDisp) RESULT(lerr)
     2340  CHARACTER(LEN=*),          INTENT(IN)  :: keyn(:), tname
     2341  LOGICAL,      ALLOCATABLE, INTENT(OUT) :: val(:)
     2342  TYPE(keys_type), OPTIONAL, INTENT(IN)  :: ky(:)
     2343  LOGICAL,         OPTIONAL, INTENT(IN)  :: def
     2344  LOGICAL,         OPTIONAL, INTENT(IN)  :: lDisp
     2345!------------------------------------------------------------------------------------------------------------------------------
     2346  CHARACTER(LEN=maxlen)              :: sval, s
     2347  CHARACTER(LEN=maxlen), ALLOCATABLE :: svals(:)
     2348  INTEGER,               ALLOCATABLE :: ivals(:)
     2349  IF(     PRESENT(def)) lerr = getKeyByName_sm11(keyn, sval, tname, ky, bool2str(def), lDisp)
     2350  IF(.NOT.PRESENT(def)) lerr = getKeyByName_sm11(keyn, sval, tname, ky, lDisp=lDisp)
     2351  IF(lerr) RETURN
     2352  lerr = strParse(sval, ',', svals)
     2353  IF(fmsg('can''t parse '//TRIM(sval), modname, lerr)) RETURN
     2354  ivals = str2bool(svals)
     2355  lerr = ANY(ivals == -1)
     2356  s = 'key "'//TRIM(strStack(keyn, '/'))//'" of '//TRIM(tname)//' is not'
     2357  CALL msg(TRIM(s)//' a boolean: '//TRIM(sval), modname, lerr)
     2358  IF(.NOT.lerr) val = ivals == 1
     2359END FUNCTION getKeyByName_lmm1
     2360!==============================================================================================================================
     2361!==============================================================================================================================
     2362LOGICAL FUNCTION getKeyByName_s1mm(keyn, val, tname, ky, def, lDisp) RESULT(lerr)
     2363  CHARACTER(LEN=*),                   INTENT(IN)  :: keyn, tname(:)
     2364  CHARACTER(LEN=maxlen), ALLOCATABLE, INTENT(OUT) :: val(:)
     2365  TYPE(keys_type),       OPTIONAL,    INTENT(IN)  ::  ky(:)
     2366  CHARACTER(LEN=*),      OPTIONAL,    INTENT(IN)  :: def
     2367  LOGICAL,               OPTIONAL,    INTENT(IN)  :: lDisp
     2368  lerr = getKeyByName_smmm([keyn], val, tname, ky, def, lDisp)
     2369END FUNCTION getKeyByName_s1mm
     2370!==============================================================================================================================
     2371LOGICAL FUNCTION getKeyByName_i1mm(keyn, val, tname, ky, def, lDisp) RESULT(lerr)
     2372  CHARACTER(LEN=*),          INTENT(IN)  :: keyn, tname(:)
     2373  INTEGER,      ALLOCATABLE, INTENT(OUT) :: val(:)
     2374  TYPE(keys_type), OPTIONAL, INTENT(IN)  ::  ky(:)
     2375  INTEGER,         OPTIONAL, INTENT(IN)  :: def
     2376  LOGICAL,         OPTIONAL, INTENT(IN)  :: lDisp
     2377  lerr = getKeyByName_immm([keyn], val, tname, ky, def, lDisp)
     2378END FUNCTION getKeyByName_i1mm
     2379!==============================================================================================================================
     2380LOGICAL FUNCTION getKeyByName_r1mm(keyn, val, tname, ky, def, lDisp) RESULT(lerr)
     2381  CHARACTER(LEN=*),          INTENT(IN)  :: keyn, tname(:)
     2382  REAL,         ALLOCATABLE, INTENT(OUT) :: val(:)
     2383  TYPE(keys_type), OPTIONAL, INTENT(IN)  ::  ky(:)
     2384  REAL,            OPTIONAL, INTENT(IN)  :: def
     2385  LOGICAL,         OPTIONAL, INTENT(IN)  :: lDisp
     2386  lerr = getKeyByName_rmmm([keyn], val, tname, ky, def, lDisp)
     2387END FUNCTION getKeyByName_r1mm
     2388!==============================================================================================================================
     2389LOGICAL FUNCTION getKeyByName_l1mm(keyn, val, tname, ky, def, lDisp) RESULT(lerr)
     2390  CHARACTER(LEN=*),          INTENT(IN)  :: keyn, tname(:)
     2391  LOGICAL,      ALLOCATABLE, INTENT(OUT) :: val(:)
     2392  TYPE(keys_type), OPTIONAL, INTENT(IN)  ::  ky(:)
     2393  LOGICAL,         OPTIONAL, INTENT(IN)  :: def
     2394  LOGICAL,         OPTIONAL, INTENT(IN)  :: lDisp
     2395  lerr = getKeyByName_lmmm([keyn], val, tname, ky, def, lDisp)
     2396END FUNCTION getKeyByName_l1mm
     2397!==============================================================================================================================
     2398!==============================================================================================================================
     2399LOGICAL FUNCTION getKeyByName_smmm(keyn, val, tname, ky, def, lDisp) RESULT(lerr)
     2400  CHARACTER(LEN=*),                   INTENT(IN)  :: keyn(:), tname(:)
     2401  CHARACTER(LEN=maxlen), ALLOCATABLE, INTENT(OUT) ::  val(:)
     2402  TYPE(keys_type),       OPTIONAL,    INTENT(IN)  ::   ky(:)
     2403  CHARACTER(LEN=*),      OPTIONAL,    INTENT(IN)  ::   def
     2404  LOGICAL,               OPTIONAL,    INTENT(IN)  :: lDisp
     2405!------------------------------------------------------------------------------------------------------------------------------
     2406  CHARACTER(LEN=maxlen) :: s
    17042407  INTEGER :: iq, nq
    1705   IF(test(getKey_sm(keyn, sval, ky, nam), lerr)) RETURN
    1706   nq = SIZE(sval); ALLOCATE(val(nq))
    1707   lerr = .FALSE.; DO iq=1, nq; val(iq)=str2bool(sval(iq)); END DO
    1708 END FUNCTION getKey_lm
     2408  LOGICAL :: lD
     2409  nq = SIZE(tname); ALLOCATE(val(nq))
     2410  lD = .TRUE.; IF(PRESENT(lDisp)) lD = lDisp
     2411  s = 'key "'//TRIM(strStack(keyn, '/'))//'"'
     2412  lerr = .TRUE.
     2413  IF(PRESENT(ky)) THEN;                 val = fgetKey(ky)                                !--- "ky"
     2414  ELSE IF(ALLOCATED(tracers)) THEN;     val = fgetKey(tracers(:)%keys)                   !--- "tracers"
     2415     IF(lerr .AND. ASSOCIATED(isotope)) val = fgetKey(isotope%keys(:))                   !--- "isotope"
     2416  END IF
     2417  IF(.NOT.PRESENT(def)) THEN; CALL msg('No '//TRIM(s)//' found', modname, lD); RETURN; END IF
     2418
     2419  !--- DEFAULT VALUE
     2420  val = [(def, iq = 1, SIZE(tname))]
     2421  CALL msg('Using defaut value for '//TRIM(s)//': '//TRIM(def), modname, lD)
     2422
     2423CONTAINS
     2424
     2425FUNCTION fgetKey(ky) RESULT(val)
     2426  CHARACTER(LEN=maxlen), ALLOCATABLE :: val(:)
     2427  TYPE(keys_type),       INTENT(IN)  :: ky(:)
     2428  LOGICAL,               ALLOCATABLE :: ler(:)
     2429  lerr = SIZE(ky) == 0; IF(lerr) RETURN
     2430  ALLOCATE(ler(SIZE(tname)))
     2431  val = [(fgetKeyIdx(strIdx(ky(:)%name, tname(iq)), keyn, ky, ler(iq)), iq = 1, SIZE(tname))]
     2432  lerr = ANY(ler)
     2433END FUNCTION fgetKey
     2434
     2435END FUNCTION getKeyByName_smmm
     2436!==============================================================================================================================
     2437LOGICAL FUNCTION getKeyByName_immm(keyn, val, tname, ky, def, lDisp) RESULT(lerr)
     2438  CHARACTER(LEN=*),          INTENT(IN)  :: keyn(:), tname(:)
     2439  INTEGER,      ALLOCATABLE, INTENT(OUT) ::  val(:)
     2440  TYPE(keys_type), OPTIONAL, INTENT(IN)  ::   ky(:)
     2441  INTEGER,         OPTIONAL, INTENT(IN)  ::  def
     2442  LOGICAL,         OPTIONAL, INTENT(IN)  :: lDisp
     2443!------------------------------------------------------------------------------------------------------------------------------
     2444  CHARACTER(LEN=maxlen) :: s
     2445  CHARACTER(LEN=maxlen), ALLOCATABLE :: svals(:)
     2446  LOGICAL,               ALLOCATABLE ::    ll(:)
     2447  IF(     PRESENT(def)) lerr = getKeyByName_smmm(keyn, svals, tname, ky, int2str(def), lDisp)
     2448  IF(.NOT.PRESENT(def)) lerr = getKeyByName_smmm(keyn, svals, tname, ky, lDisp=lDisp)
     2449  IF(lerr) RETURN
     2450  val = str2int(svals)
     2451  ll = val == -HUGE(1)
     2452  lerr = ANY(ll); IF(.NOT.lerr) RETURN
     2453  s = 'key "'//TRIM(strStack(keyn, '/'))//'" of '//TRIM(strStack(tname, MASK=ll))//' is not'
     2454  CALL msg(TRIM(s)//' an integer: '//TRIM(strStack(svals, MASK=ll)), modname)
     2455END FUNCTION getKeyByName_immm
     2456!==============================================================================================================================
     2457LOGICAL FUNCTION getKeyByName_rmmm(keyn, val, tname, ky, def, lDisp) RESULT(lerr)
     2458  CHARACTER(LEN=*),          INTENT(IN)  :: keyn(:), tname(:)
     2459  REAL,         ALLOCATABLE, INTENT(OUT) ::  val(:)
     2460  TYPE(keys_type), OPTIONAL, INTENT(IN)  ::   ky(:)
     2461  REAL,            OPTIONAL, INTENT(IN)  ::  def
     2462  LOGICAL,         OPTIONAL, INTENT(IN)  :: lDisp
     2463!------------------------------------------------------------------------------------------------------------------------------
     2464  CHARACTER(LEN=maxlen) :: s
     2465  CHARACTER(LEN=maxlen), ALLOCATABLE :: svals(:)
     2466  LOGICAL,               ALLOCATABLE ::    ll(:)
     2467  IF(     PRESENT(def)) lerr = getKeyByName_smmm(keyn, svals, tname, ky, real2str(def), lDisp)
     2468  IF(.NOT.PRESENT(def)) lerr = getKeyByName_smmm(keyn, svals, tname, ky, lDisp=lDisp)
     2469  IF(lerr) RETURN
     2470  val = str2real(svals)
     2471  ll = val == -HUGE(1.)
     2472  lerr = ANY(ll); IF(.NOT.lerr) RETURN
     2473  s = 'key "'//TRIM(strStack(keyn, '/'))//'" of '//TRIM(strStack(tname, MASK=ll))//' is not'
     2474  CALL msg(TRIM(s)//' a real: '//TRIM(strStack(svals, MASK=ll)), modname)
     2475END FUNCTION getKeyByName_rmmm
     2476!==============================================================================================================================
     2477LOGICAL FUNCTION getKeyByName_lmmm(keyn, val, tname, ky, def, lDisp) RESULT(lerr)
     2478  CHARACTER(LEN=*),          INTENT(IN)  :: keyn(:), tname(:)
     2479  LOGICAL,      ALLOCATABLE, INTENT(OUT) ::  val(:)
     2480  TYPE(keys_type), OPTIONAL, INTENT(IN)  ::   ky(:)
     2481  LOGICAL,         OPTIONAL, INTENT(IN)  ::  def
     2482  LOGICAL,         OPTIONAL, INTENT(IN)  :: lDisp
     2483!------------------------------------------------------------------------------------------------------------------------------
     2484  CHARACTER(LEN=maxlen) :: s
     2485  CHARACTER(LEN=maxlen), ALLOCATABLE :: svals(:)
     2486  LOGICAL,               ALLOCATABLE ::    ll(:)
     2487  INTEGER,               ALLOCATABLE :: ivals(:)
     2488  IF(     PRESENT(def)) lerr = getKeyByName_smmm(keyn, svals, tname, ky, bool2str(def), lDisp)
     2489  IF(.NOT.PRESENT(def)) lerr = getKeyByName_smmm(keyn, svals, tname, ky, lDisp=lDisp)
     2490  IF(lerr) RETURN
     2491  ivals = str2bool(svals)
     2492  ll = ivals == -1
     2493  lerr = ANY(ll); IF(.NOT.lerr) THEN; val = ivals == 1; RETURN; END IF
     2494  s = 'key "'//TRIM(strStack(keyn, '/'))//'" of '//TRIM(strStack(tname, MASK=ll))//' is not'
     2495  CALL msg(TRIM(s)//' a boolean: '//TRIM(strStack(svals, MASK=ll)), modname)
     2496END FUNCTION getKeyByName_lmmm
    17092497!==============================================================================================================================
    17102498
     
    18082596  IF(.NOT.PRESENT(phases)) out = [( addPhase_i1(s(k), ipha, known_phases), k=1, SIZE(s) )]
    18092597END FUNCTION addPhase_im
     2598!==============================================================================================================================
     2599
     2600
     2601!==============================================================================================================================
     2602!=== APPEND TRACERS DATABASE "tracs" WITH TRACERS/KEYS "tname"/"keys" ; SAME FOR INTERNAL DATABASE "tracers" ==================
     2603!==============================================================================================================================
     2604LOGICAL FUNCTION addTracer_1(tname, keys, tracs) RESULT(lerr)
     2605  CHARACTER(LEN=*),             INTENT(IN)    :: tname
     2606  TYPE(keys_type),              INTENT(IN)    ::  keys
     2607  TYPE(trac_type), ALLOCATABLE, INTENT(INOUT) :: tracs(:)
     2608  TYPE(trac_type), ALLOCATABLE :: tr(:)
     2609  CHARACTER(LEN=maxlen), ALLOCATABLE :: tnames(:)
     2610  INTEGER :: nt, ix
     2611  IF(ALLOCATED(tracs)) THEN
     2612     lerr = getKey('name', tnames, ky=tracs(:)%keys); IF(lerr) RETURN
     2613     nt = SIZE(tracs)
     2614     ix = strIdx(tnames, tname)
     2615     CALL msg('Modifying existing tracer "'//TRIM(tname)//'"', modname, ix /= 0)
     2616     CALL msg('Appending with tracer "'    //TRIM(tname)//'"', modname, ix == 0)
     2617     IF(ix == 0) THEN
     2618        ix = nt+1; ALLOCATE(tr(nt+1)); tr(1:nt) = tracs(1:nt); CALL MOVE_ALLOC(FROM=tr, TO=tracs)
     2619     END IF
     2620  ELSE
     2621     CALL msg('Creating a tracer descriptor with tracer "'//TRIM(tname)//'"', modname)
     2622     ix = 1; ALLOCATE(tracs(1))
     2623  END IF
     2624  CALL addKey('name', tname, tracs(ix)%keys)
     2625  tracs(ix)%name = tname
     2626  tracs(ix)%keys = keys
     2627
     2628END FUNCTION addTracer_1
     2629!==============================================================================================================================
     2630LOGICAL FUNCTION addTracer_1def(tname, keys) RESULT(lerr)
     2631  CHARACTER(LEN=*),             INTENT(IN)    :: tname
     2632  TYPE(keys_type),              INTENT(IN)    ::  keys
     2633  lerr = addTracer_1(tname, keys, tracers)
     2634END FUNCTION addTracer_1def
     2635!==============================================================================================================================
     2636
     2637
     2638!==============================================================================================================================
     2639LOGICAL FUNCTION delTracer_1(tname, tracs) RESULT(lerr)
     2640  CHARACTER(LEN=*),                     INTENT(IN)    :: tname
     2641  TYPE(trac_type), ALLOCATABLE, TARGET, INTENT(INOUT) :: tracs(:)
     2642  TYPE(trac_type), ALLOCATABLE :: tr(:)
     2643  CHARACTER(LEN=maxlen), ALLOCATABLE :: tnames(:)
     2644  INTEGER :: nt, ix
     2645  lerr = .NOT.ALLOCATED(tracs)
     2646  IF(fmsg('Can''t remove tracer "'//TRIM(tname)//'" from an empty tracers descriptor', modname, lerr)) RETURN
     2647  nt = SIZE(tracs)
     2648  lerr = getKey('name', tnames, ky=tracs(:)%keys); IF(lerr) RETURN
     2649  ix = strIdx(tnames, tname)
     2650  CALL msg('Removing tracer "'             //TRIM(tname)//'"', modname, ix /= 0)
     2651  CALL msg('Can''t remove unknown tracer "'//TRIM(tname)//'"', modname, ix == 0)
     2652  IF(ix /= 0) THEN
     2653     ALLOCATE(tr(nt-1)); tr(1:ix-1) = tracs(1:ix-1); tr(ix:nt-1) = tracs(ix+1:nt); CALL MOVE_ALLOC(FROM=tr, TO=tracs)
     2654  END IF
     2655END FUNCTION delTracer_1
     2656!==============================================================================================================================
     2657LOGICAL FUNCTION delTracer_1def(tname) RESULT(lerr)
     2658  CHARACTER(LEN=*), INTENT(IN) :: tname
     2659  lerr = delTracer(tname, tracers)
     2660END FUNCTION delTracer_1def
    18102661!==============================================================================================================================
    18112662
     
    19082759!==============================================================================================================================
    19092760
    1910 
    1911 !==============================================================================================================================
    1912 !=== GET THE NAME(S) OF THE ANCESTOR(S) OF TRACER(S) "tname" AT GENERATION "igen"  IN THE TRACERS DESCRIPTORS LIST "tr" =======
    1913 !==============================================================================================================================
    1914 SUBROUTINE ancestor_1(t, out, tname, igen)
    1915   TYPE(trac_type),       INTENT(IN)  :: t(:)
    1916   CHARACTER(LEN=maxlen), INTENT(OUT) :: out
    1917   CHARACTER(LEN=*),      INTENT(IN)  :: tname
    1918   INTEGER,     OPTIONAL, INTENT(IN)  :: igen
    1919 !------------------------------------------------------------------------------------------------------------------------------
    1920   INTEGER :: ix
    1921   CALL idxAncestor_1(t, ix, tname, igen)
    1922   out = ''; IF(ix /= 0) out = t(ix)%name
    1923 END SUBROUTINE ancestor_1
    1924 !==============================================================================================================================
    1925 SUBROUTINE ancestor_mt(t, out, tname, igen)
    1926   TYPE(trac_type),       INTENT(IN)  :: t(:)
    1927   CHARACTER(LEN=*),      INTENT(IN)  :: tname(:)
    1928   CHARACTER(LEN=maxlen), INTENT(OUT) :: out(SIZE(tname))
    1929   INTEGER,     OPTIONAL, INTENT(IN)  :: igen
    1930 !------------------------------------------------------------------------------------------------------------------------------
    1931   INTEGER :: ix(SIZE(tname))
    1932   CALL idxAncestor_mt(t, ix, tname, igen)
    1933   out(:) = ''; WHERE(ix /= 0) out = t(ix)%name
    1934 END SUBROUTINE ancestor_mt
    1935 !==============================================================================================================================
    1936 SUBROUTINE ancestor_m(t, out, igen)
    1937   TYPE(trac_type),       INTENT(IN)  :: t(:)
    1938   CHARACTER(LEN=maxlen), INTENT(OUT) :: out(SIZE(t))
    1939   INTEGER,     OPTIONAL, INTENT(IN)  :: igen
    1940 !------------------------------------------------------------------------------------------------------------------------------
    1941   INTEGER :: ix(SIZE(t))
    1942   CALL idxAncestor_m(t, ix, igen)
    1943   out(:) = ''; WHERE(ix /= 0) out = t(ix)%name
    1944 END SUBROUTINE ancestor_m
    1945 !==============================================================================================================================
    1946 
    1947 
    1948 !==============================================================================================================================
    1949 !=== GET THE INDEX(ES) OF THE GENERATION "igen" ANCESTOR(S) OF "tname" (t%name IF UNSPECIFIED) IN THE "t" LIST ================
    1950 !==============================================================================================================================
    1951 SUBROUTINE idxAncestor_1(t, idx, tname, igen)
    1952   TYPE(trac_type),   INTENT(IN)  :: t(:)
    1953   INTEGER,           INTENT(OUT) :: idx
    1954   CHARACTER(LEN=*),  INTENT(IN)  :: tname
    1955   INTEGER, OPTIONAL, INTENT(IN)  :: igen
    1956   INTEGER :: ig
    1957   ig = 0; IF(PRESENT(igen)) ig = igen
    1958   idx = strIdx(t(:)%name, tname)
    1959   IF(idx == 0)                 RETURN            !--- Tracer not found
    1960   IF(t(idx)%iGeneration <= ig) RETURN            !--- Tracer has a lower generation number than asked generation 'igen"
    1961   DO WHILE(t(idx)%iGeneration > ig); idx = strIdx(t(:)%name, t(idx)%parent); END DO
    1962 END SUBROUTINE idxAncestor_1
    1963 !------------------------------------------------------------------------------------------------------------------------------
    1964 SUBROUTINE idxAncestor_mt(t, idx, tname, igen)
    1965   TYPE(trac_type),   INTENT(IN)  :: t(:)
    1966   CHARACTER(LEN=*),  INTENT(IN)  :: tname(:)
    1967   INTEGER,           INTENT(OUT) :: idx(SIZE(tname))
    1968   INTEGER, OPTIONAL, INTENT(IN)  :: igen
    1969   INTEGER :: ix
    1970   DO ix = 1, SIZE(tname); CALL idxAncestor_1(t, idx(ix), tname(ix), igen); END DO
    1971 END SUBROUTINE idxAncestor_mt
    1972 !------------------------------------------------------------------------------------------------------------------------------
    1973 SUBROUTINE idxAncestor_m(t, idx, igen)
    1974   TYPE(trac_type),   INTENT(IN)  :: t(:)
    1975   INTEGER,           INTENT(OUT) :: idx(SIZE(t))
    1976   INTEGER, OPTIONAL, INTENT(IN)  :: igen
    1977   INTEGER :: ix
    1978   DO ix = 1, SIZE(t); CALL idxAncestor_1(t, idx(ix), t(ix)%name, igen); END DO
    1979 END SUBROUTINE idxAncestor_m
    1980 !==============================================================================================================================
    1981 
    1982 
    19832761END MODULE readTracFiles_mod
  • LMDZ6/branches/cirrus/libf/misc/strings_mod.F90

    r4454 r5202  
    1010  PUBLIC :: is_numeric, bool2str, int2str, real2str, dble2str
    1111  PUBLIC :: reduceExpr, str2bool, str2int, str2real, str2dble
    12   PUBLIC :: addQuotes, checkList, removeComment, test
     12  PUBLIC :: addQuotes, checkList, removeComment
    1313
    1414  INTERFACE get_in;     MODULE PROCEDURE getin_s,  getin_i,  getin_r,  getin_l;  END INTERFACE get_in
     
    2222  INTERFACE strCount;   MODULE PROCEDURE  strCount_m1, strCount_11, strCount_1m; END INTERFACE strCount
    2323  INTERFACE strReplace; MODULE PROCEDURE strReplace_1,             strReplace_m; END INTERFACE strReplace
    24   INTERFACE cat;        MODULE PROCEDURE   horzcat_s1,  horzcat_i1,  horzcat_r1, &
    25 !                 horzcat_d1,  horzcat_dm,
    26                                            horzcat_sm,  horzcat_im,  horzcat_rm; END INTERFACE cat
    27   INTERFACE find;         MODULE PROCEDURE    strFind,    find_int,    find_boo; END INTERFACE find
     24  INTERFACE cat;        MODULE PROCEDURE  horzcat_s00, horzcat_i00, horzcat_r00,  & !horzcat_d00, &
     25                                          horzcat_s10, horzcat_i10, horzcat_r10,  & !horzcat_d10, &
     26                                          horzcat_s11, horzcat_i11, horzcat_r11,  & !horzcat_d11, &
     27                                          horzcat_s21, horzcat_i21, horzcat_r21; END INTERFACE cat !horzcat_d21
     28  INTERFACE strFind;      MODULE PROCEDURE strFind_1, strFind_m;                 END INTERFACE strFind
     29  INTERFACE find;         MODULE PROCEDURE strFind_1, strFind_m, intFind_1, intFind_m, booFind; END INTERFACE find
    2830  INTERFACE dispOutliers; MODULE PROCEDURE dispOutliers_1, dispOutliers_2; END INTERFACE dispOutliers
    2931  INTERFACE reduceExpr;   MODULE PROCEDURE   reduceExpr_1,   reduceExpr_m; END INTERFACE reduceExpr
     
    3638CONTAINS
    3739
    38 !==============================================================================================================================
    39 LOGICAL FUNCTION test(lcond, lout) RESULT(lerr)
    40   LOGICAL, INTENT(IN)  :: lcond
    41   LOGICAL, INTENT(OUT) :: lout
    42   lerr = lcond; lout = lcond
    43 END FUNCTION test
    44 !==============================================================================================================================
    45 
    4640
    4741!==============================================================================================================================
    4842SUBROUTINE init_printout(lunout_, prt_level_)
     43  IMPLICIT NONE
    4944  INTEGER, INTENT(IN) :: lunout_, prt_level_
    5045  lunout    = lunout_
     
    5853!==============================================================================================================================
    5954SUBROUTINE getin_s(nam, val, def)
    60 USE ioipsl_getincom, ONLY: getin
     55  USE ioipsl_getincom, ONLY: getin
     56  IMPLICIT NONE
    6157  CHARACTER(LEN=*), INTENT(IN)    :: nam
    6258  CHARACTER(LEN=*), INTENT(INOUT) :: val
     
    6763!==============================================================================================================================
    6864SUBROUTINE getin_i(nam, val, def)
    69 USE ioipsl_getincom, ONLY: getin
     65  USE ioipsl_getincom, ONLY: getin
     66  IMPLICIT NONE
    7067  CHARACTER(LEN=*), INTENT(IN)    :: nam
    7168  INTEGER,          INTENT(INOUT) :: val
     
    7673!==============================================================================================================================
    7774SUBROUTINE getin_r(nam, val, def)
    78 USE ioipsl_getincom, ONLY: getin
     75  USE ioipsl_getincom, ONLY: getin
     76  IMPLICIT NONE
    7977  CHARACTER(LEN=*), INTENT(IN)    :: nam
    8078  REAL,             INTENT(INOUT) :: val
     
    8583!==============================================================================================================================
    8684SUBROUTINE getin_l(nam, val, def)
    87 USE ioipsl_getincom, ONLY: getin
     85  USE ioipsl_getincom, ONLY: getin
     86  IMPLICIT NONE
    8887  CHARACTER(LEN=*), INTENT(IN)    :: nam
    8988  LOGICAL,          INTENT(INOUT) :: val
     
    9998!==============================================================================================================================
    10099SUBROUTINE msg_1(str, modname, ll, unit)
     100  IMPLICIT NONE
    101101  !--- Display a simple message "str". Optional parameters:
    102102  !    * "modname": module name, displayed in front of the message (with ": " separator) if present.
     
    118118!==============================================================================================================================
    119119SUBROUTINE msg_m(str, modname, ll, unit, nmax)
     120  IMPLICIT NONE
    120121  !--- Same as msg_1 with multiple strings that are stacked (separator: coma) on up to "nmax" full lines.
    121122  CHARACTER(LEN=*),           INTENT(IN) :: str(:)
     
    138139!==============================================================================================================================
    139140LOGICAL FUNCTION fmsg_1(str, modname, ll, unit) RESULT(l)
     141  IMPLICIT NONE
    140142  CHARACTER(LEN=*),           INTENT(IN) :: str
    141143  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: modname
     
    152154!==============================================================================================================================
    153155LOGICAL FUNCTION fmsg_m(str, modname, ll, unit, nmax) RESULT(l)
     156  IMPLICIT NONE
    154157  CHARACTER(LEN=*),           INTENT(IN)  :: str(:)
    155158  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: modname
     
    173176!==============================================================================================================================
    174177ELEMENTAL CHARACTER(LEN=maxlen) FUNCTION strLower(str) RESULT(out)
     178  IMPLICIT NONE
    175179  CHARACTER(LEN=*), INTENT(IN) :: str
    176180  INTEGER :: k
     
    182186!==============================================================================================================================
    183187ELEMENTAL CHARACTER(LEN=maxlen) FUNCTION strUpper(str) RESULT(out)
     188  IMPLICIT NONE
    184189  CHARACTER(LEN=*), INTENT(IN) :: str
    185190  INTEGER :: k
     
    199204!==============================================================================================================================
    200205CHARACTER(LEN=maxlen) FUNCTION strHead_1(str, sep, lBackward) RESULT(out)
     206  IMPLICIT NONE
    201207  CHARACTER(LEN=*),           INTENT(IN) :: str
    202208  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: sep
     
    214220!==============================================================================================================================
    215221FUNCTION strHead_m(str, sep, lBackward) RESULT(out)
     222  IMPLICIT NONE
    216223  CHARACTER(LEN=maxlen),     ALLOCATABLE :: out(:)
    217224  CHARACTER(LEN=*),           INTENT(IN) :: str(:)
     
    235242!==============================================================================================================================
    236243CHARACTER(LEN=maxlen) FUNCTION strTail_1(str, sep, lBackWard) RESULT(out)
     244  IMPLICIT NONE
    237245  CHARACTER(LEN=*),           INTENT(IN) :: str
    238246  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: sep
     
    250258!==============================================================================================================================
    251259FUNCTION strTail_m(str, sep, lBackWard) RESULT(out)
     260  IMPLICIT NONE
    252261  CHARACTER(LEN=maxlen),     ALLOCATABLE :: out(:)
    253262  CHARACTER(LEN=*),           INTENT(IN) :: str(:)
     
    271280!==============================================================================================================================
    272281FUNCTION strStack(str, sep, mask) RESULT(out)
     282  IMPLICIT NONE
    273283  CHARACTER(LEN=:),          ALLOCATABLE :: out
    274284  CHARACTER(LEN=*),           INTENT(IN) :: str(:)
     
    292302!==============================================================================================================================
    293303FUNCTION strStackm(str, sep, nmax) RESULT(out)
     304  IMPLICIT NONE
    294305  CHARACTER(LEN=maxlen),     ALLOCATABLE :: out(:)
    295306  CHARACTER(LEN=*),           INTENT(IN) :: str(:)
     
    324335!==============================================================================================================================
    325336SUBROUTINE strClean_1(str)
     337  IMPLICIT NONE
    326338  CHARACTER(LEN=*), INTENT(INOUT) :: str
    327339  INTEGER :: k, n, m
     
    337349!==============================================================================================================================
    338350SUBROUTINE strClean_m(str)
     351  IMPLICIT NONE
    339352  CHARACTER(LEN=*), INTENT(INOUT) :: str(:)
    340353  INTEGER :: k
     
    349362!==============================================================================================================================
    350363SUBROUTINE strReduce_1(str, nb)
     364  IMPLICIT NONE
    351365  CHARACTER(LEN=*), ALLOCATABLE, INTENT(INOUT) :: str(:)
    352366  INTEGER,          OPTIONAL,    INTENT(OUT)   :: nb
     
    366380!==============================================================================================================================
    367381SUBROUTINE strReduce_2(str1, str2)
     382  IMPLICIT NONE
    368383  CHARACTER(LEN=*),   ALLOCATABLE, INTENT(INOUT) :: str1(:)
    369384  CHARACTER(LEN=*),                INTENT(IN)    :: str2(:)
     
    392407!==============================================================================================================================
    393408INTEGER FUNCTION strIdx_1(str, s) RESULT(out)
     409  IMPLICIT NONE
    394410  CHARACTER(LEN=*), INTENT(IN) :: str(:), s
    395411  DO out = 1, SIZE(str); IF(str(out) == s) EXIT; END DO
     
    398414!==============================================================================================================================
    399415FUNCTION strIdx_m(str, s, n) RESULT(out)
     416  IMPLICIT NONE
    400417  CHARACTER(LEN=*),  INTENT(IN)  :: str(:), s(:)
    401418  INTEGER, OPTIONAL, INTENT(OUT) :: n
     
    412429!=== GET THE INDEX LIST OF THE ELEMENTS OF "str(:)" EQUAL TO "s" AND OPTIONALY, ITS LENGTH "n" ================================
    413430!==============================================================================================================================
    414 FUNCTION strFind(str, s, n) RESULT(out)
     431FUNCTION strFind_1(str, s, n) RESULT(out)
     432  IMPLICIT NONE
    415433  CHARACTER(LEN=*),  INTENT(IN)  :: str(:), s
    416434  INTEGER, OPTIONAL, INTENT(OUT) :: n
     
    420438  out = PACK( [(k, k=1, SIZE(str(:), DIM=1))], MASK = str(:) == s )
    421439  IF(PRESENT(n)) n = SIZE(out(:), DIM=1)
    422 END FUNCTION strFind
    423 !==============================================================================================================================
    424 FUNCTION find_int(i,j,n) RESULT(out)
     440END FUNCTION strFind_1
     441!==============================================================================================================================
     442FUNCTION strFind_m(str, s, n) RESULT(out)
     443  IMPLICIT NONE
     444  CHARACTER(LEN=*),  INTENT(IN)  :: str(:), s(:)
     445  INTEGER, OPTIONAL, INTENT(OUT) :: n
     446  INTEGER,           ALLOCATABLE :: out(:)
     447!------------------------------------------------------------------------------------------------------------------------------
     448  INTEGER :: k
     449  out = [(strFind_1(str, s(k)), k=1, SIZE(s))]
     450  IF(PRESENT(n)) n = SIZE(out(:), DIM=1)
     451END FUNCTION strFind_m
     452!==============================================================================================================================
     453FUNCTION intFind_1(i,j,n) RESULT(out)
     454  IMPLICIT NONE
    425455  INTEGER,           INTENT(IN)  :: i(:), j
    426456  INTEGER, OPTIONAL, INTENT(OUT) :: n
     
    430460  out = PACK( [(k, k=1, SIZE(i(:), DIM=1))], MASK = i(:) == j )
    431461  IF(PRESENT(n)) n = SIZE(out(:), DIM=1)
    432 END FUNCTION find_int
    433 !==============================================================================================================================
    434 FUNCTION find_boo(l,n) RESULT(out)
    435   LOGICAL,           INTENT(IN)  :: l(:)
     462END FUNCTION intFind_1
     463!==============================================================================================================================
     464FUNCTION intFind_m(i,j,n) RESULT(out)
     465  IMPLICIT NONE
     466  INTEGER,           INTENT(IN)  :: i(:), j(:)
     467  INTEGER, OPTIONAL, INTENT(OUT) :: n
     468  INTEGER,           ALLOCATABLE :: out(:)
     469!------------------------------------------------------------------------------------------------------------------------------
     470  INTEGER :: k
     471  out = [(intFind_1(i, j(k)), k=1, SIZE(j))]
     472  IF(PRESENT(n)) n = SIZE(out(:), DIM=1)
     473END FUNCTION intFind_m
     474!==============================================================================================================================
     475FUNCTION booFind(l,n) RESULT(out)
     476   IMPLICIT NONE
     477 LOGICAL,           INTENT(IN)  :: l(:)
    436478  INTEGER, OPTIONAL, INTENT(OUT) :: n
    437479  INTEGER,           ALLOCATABLE :: out(:)
     
    440482  out = PACK( [(k, k=1, SIZE(l(:), DIM=1))], MASK = l(:) )
    441483  IF(PRESENT(n)) n = SIZE(out(:), DIM=1)
    442 END FUNCTION find_boo
     484END FUNCTION booFind
    443485!==============================================================================================================================
    444486
     
    450492!==============================================================================================================================
    451493LOGICAL FUNCTION strIdx_prv(rawList, del, ibeg, idx, idel, lSc) RESULT(lerr)
     494  IMPLICIT NONE
    452495  CHARACTER(LEN=*),  INTENT(IN)  :: rawList                          !--- String in which delimiters have to be identified
    453496  CHARACTER(LEN=*),  INTENT(IN)  :: del(:)                           !--- List of delimiters
     
    469512  END IF
    470513
    471   IF(test(idx == 1 .AND. INDEX('+-',del(idel)) /= 0, lerr)) RETURN   !--- The front delimiter is different from +/-: error
    472   IF(     idx /= 1 .AND. is_numeric(rawList(ibeg:idx-1)))   RETURN   !--- The input string head is a valid number
     514  lerr = idx == 1 .AND. INDEX('+-',del(idel)) /= 0; IF(lerr) RETURN  !--- The front delimiter is different from +/-: error
     515  IF(    idx /= 1 .AND. is_numeric(rawList(ibeg:idx-1)))     RETURN  !--- The input string head is a valid number
    473516
    474517  !=== The string part in front of the 1st delimiter is not a valid number: search for next delimiter index "idx"
     
    503546!==============================================================================================================================
    504547LOGICAL FUNCTION strCount_11(rawList, delimiter, nb, lSc) RESULT(lerr)
     548  IMPLICIT NONE
    505549  CHARACTER(LEN=*),  INTENT(IN)  :: rawList
    506550  CHARACTER(LEN=*),  INTENT(IN)  :: delimiter
     
    514558!==============================================================================================================================
    515559LOGICAL FUNCTION strCount_m1(rawList, delimiter, nb, lSc) RESULT(lerr)
     560  IMPLICIT NONE
    516561  CHARACTER(LEN=*),     INTENT(IN)  :: rawList(:)
    517562  CHARACTER(LEN=*),     INTENT(IN)  :: delimiter
     
    530575!==============================================================================================================================
    531576LOGICAL FUNCTION strCount_1m(rawList, delimiter, nb, lSc) RESULT(lerr)
     577  IMPLICIT NONE
    532578  CHARACTER(LEN=*),  INTENT(IN)  :: rawList
    533579  CHARACTER(LEN=*),  INTENT(IN)  :: delimiter(:)
     
    560606!==============================================================================================================================
    561607LOGICAL FUNCTION strParse(rawList, delimiter, keys, n, vals) RESULT(lerr)
     608  IMPLICIT NONE
    562609  CHARACTER(LEN=*),                             INTENT(IN)  :: rawList, delimiter
    563610  CHARACTER(LEN=maxlen), ALLOCATABLE,           INTENT(OUT) :: keys(:)
     
    570617  r  = TRIM(ADJUSTL(rawList))
    571618  nr = LEN_TRIM(r); IF(nr == 0) THEN; keys = ['']; RETURN; END IF
    572   CALL strParse_prv(nk)                                              !--- COUNT THE ELEMENTS
    573   ALLOCATE(keys(nk))
    574   IF(PRESENT(vals)) THEN
    575     ALLOCATE(vals(nk)); CALL strParse_prv(nk, keys, vals)            !--- PARSE THE KEYS
    576   ELSE
    577     CALL strParse_prv(nk, keys)                                      !--- PARSE THE KEYS
    578   END IF
    579   IF(PRESENT(n)) n = nk
     619  nk = countK()                                                      !--- COUNT THE ELEMENTS
     620  CALL parseK(keys)                                                  !--- PARSE THE KEYS
     621  IF(PRESENT(vals)) CALL parseV(vals)                                !--- PARSE <key>=<val> PAIRS
     622  IF(PRESENT(n)) n = nk                                              !--- RETURN THE NUMBER OF KEYS
    580623
    581624CONTAINS
    582625
    583626!------------------------------------------------------------------------------------------------------------------------------
    584 SUBROUTINE strParse_prv(nkeys, keys, vals)
    585 !--- * Get the number of elements after parsing ("nkeys" only is present)
    586 !--- * Parse the <key>=<val> pairs and store result in "keys" and "vals" (already allocated)
    587   IMPLICIT NONE
    588   INTEGER,                         INTENT(OUT) :: nkeys
    589   CHARACTER(LEN=maxlen), OPTIONAL, INTENT(OUT) :: keys(:)
    590   CHARACTER(LEN=maxlen), OPTIONAL, INTENT(OUT) :: vals(:)
    591 !------------------------------------------------------------------------------------------------------------------------------
    592   INTEGER :: ib, ie
    593   nkeys = 1; ib = 1
     627INTEGER FUNCTION countK() RESULT(nkeys)
     628!--- Get the number of elements after parsing.
     629  IMPLICIT NONE
     630!------------------------------------------------------------------------------------------------------------------------------
     631  INTEGER :: ib, ie, nl
     632  nkeys = 1; ib = 1; nl = LEN(delimiter)
    594633  DO
    595634    ie = INDEX(rawList(ib:nr), delimiter)+ib-1                       !--- Determine the next separator start index
    596635    IF(ie == ib-1) EXIT
    597     IF(PRESENT(keys)) keys(nkeys) = r(ib:ie-1)                       !--- Get the ikth key
    598     IF(PRESENT(vals)) CALL parseKeys(keys(nkeys), vals(nkeys))       !--- Parse the ikth <key>=<val> pair
     636    ib = ie + nl
     637    DO WHILE(ANY([0, 9, 32] == IACHAR(r(ib:ib))) .AND. ib < nr)      !--- Skip blanks (ascii): NULL (0), TAB (9), SPACE (32)
     638      ib = ib + 1
     639    END DO     !--- Skip spaces before next chain
     640    nkeys = nkeys+1
     641  END DO
     642END FUNCTION countK
     643
     644!------------------------------------------------------------------------------------------------------------------------------
     645SUBROUTINE parseK(keys)
     646!--- Parse the string separated by "delimiter" from "rawList" into "keys(:)"
     647  IMPLICIT NONE
     648  CHARACTER(LEN=maxlen), ALLOCATABLE, INTENT(OUT) :: keys(:)
     649!------------------------------------------------------------------------------------------------------------------------------
     650  INTEGER :: ib, ie, ik
     651  ALLOCATE(keys(nk))
     652  ib = 1
     653  DO ik = 1, nk
     654    ie = INDEX(rawList(ib:nr), delimiter)+ib-1                       !--- Determine the next separator start index
     655    IF(ie == ib-1) EXIT
     656    keys(ik) = r(ib:ie-1)                                            !--- Get the ikth key
    599657    ib = ie + LEN(delimiter)
    600658    DO WHILE(r(ib:ib) == ' ' .AND. ib < nr); ib = ib + 1; END DO     !--- Skip spaces before next chain
    601     nkeys = nkeys+1
    602   END DO
    603   IF(PRESENT(keys)) keys(nkeys) = r(ib:nr)                           !--- Get the last key
    604   IF(PRESENT(vals)) CALL parseKeys(keys(nkeys), vals(nkeys))         !--- Parse the last <key>=<val> pair
    605 END SUBROUTINE strParse_prv
    606 
    607 !------------------------------------------------------------------------------------------------------------------------------
    608 SUBROUTINE parseKeys(key, val)
    609   CHARACTER(LEN=*), INTENT(INOUT) :: key
    610   CHARACTER(LEN=*), INTENT(OUT)   :: val
    611 !------------------------------------------------------------------------------------------------------------------------------
    612   INTEGER :: ix
    613   ix = INDEX(key, '='); IF(ix == 0) RETURN                           !--- First "=" index in "key"
    614   val = ADJUSTL(key(ix+1:LEN_TRIM(key)))
    615   key = ADJUSTL(key(1:ix-1))
    616 END SUBROUTINE parseKeys
     659  END DO
     660  keys(ik) = r(ib:nr)                                                !--- Get the last key
     661END SUBROUTINE parseK
     662
     663!------------------------------------------------------------------------------------------------------------------------------
     664SUBROUTINE parseV(vals)
     665!--- Parse the <key>=<val> pairs in "keys(:)" into "keys" and "vals"
     666  IMPLICIT NONE
     667  CHARACTER(LEN=maxlen), ALLOCATABLE, INTENT(OUT) :: vals(:)
     668!------------------------------------------------------------------------------------------------------------------------------
     669  CHARACTER(LEN=maxlen) :: key
     670  INTEGER :: ik, ix
     671  ALLOCATE(vals(nk))
     672  DO ik = 1, nk; key = keys(ik)
     673    vals(ik) = ''
     674    ix = INDEX(key, '='); IF(ix == 0) CYCLE                          !--- First "=" index in "key"
     675    vals(ik) = ADJUSTL(key(ix+1:LEN_TRIM(key)))
     676    keys(ik) = ADJUSTL(key(1:ix-1))
     677  END DO
     678END SUBROUTINE parseV
    617679
    618680END FUNCTION strParse
    619681!==============================================================================================================================
    620682LOGICAL FUNCTION strParse_m(rawList, delimiter, keys, n, vals, lSc, id) RESULT(lerr)
     683  IMPLICIT NONE
    621684  CHARACTER(LEN=*),                             INTENT(IN)  :: rawList, delimiter(:)
    622685  CHARACTER(LEN=maxlen),           ALLOCATABLE, INTENT(OUT) :: keys(:)  !--- Parsed keys vector
     
    630693  LOGICAL :: ll
    631694  ll = .FALSE.; IF(PRESENT(lSc)) ll = lSc
    632   IF(test(fmsg("Couldn't parse list: non-numerical strings were found", ll=strCount_1m(rawList, delimiter, nk, ll)),lerr)) RETURN
     695  lerr = strCount_1m(rawList, delimiter, nk, ll)
     696  CALL msg("Couldn't parse list: non-numerical strings were found", ll=lerr); IF(lerr) RETURN
    633697
    634698  !--- FEW ALLOCATIONS
     
    643707  ib = 1
    644708  DO ik = 1, nk-1
    645     IF(test(fmsg('Non-numeric values found', ll=strIdx_prv(r, delimiter, ib, ie, jd, ll)),lerr)) RETURN
     709    lerr = strIdx_prv(r, delimiter, ib, ie, jd, ll)
     710    CALL msg('Non-numeric values found', ll=lerr); IF(lerr) RETURN
    646711    keys(ik) = r(ib:ie-1)
    647712    IF(PRESENT(vals)) CALL parseKeys(keys(ik), vals(ik))             !--- Parse a <key>=<val> pair
     
    657722!------------------------------------------------------------------------------------------------------------------------------
    658723SUBROUTINE parseKeys(key, val)
     724  IMPLICIT NONE
    659725  CHARACTER(LEN=*), INTENT(INOUT) :: key
    660726  CHARACTER(LEN=*), INTENT(OUT)   :: val
     
    674740!==============================================================================================================================
    675741SUBROUTINE strReplace_1(str, key, val, lsurr)
     742  IMPLICIT NONE
    676743  CHARACTER(LEN=*),  INTENT(INOUT) :: str        !--- Main string
    677744  CHARACTER(LEN=*),  INTENT(IN)    :: key, val   !--- "key" will be replaced by "val"
     
    700767!==============================================================================================================================
    701768SUBROUTINE strReplace_m(str, key, val, lsurr)
     769  IMPLICIT NONE
    702770  CHARACTER(LEN=*),  INTENT(INOUT) :: str(:)     !--- Main strings vector
    703771  CHARACTER(LEN=*),  INTENT(IN)    :: key, val   !--- "key" will be replaced by "val"
     
    714782!=== Contatenate horizontally scalars/vectors of strings/integers/reals into a vector/array ===================================
    715783!==============================================================================================================================
    716 FUNCTION horzcat_s1(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9) RESULT(out)
    717   CHARACTER(LEN=*),           TARGET, INTENT(IN) :: s0
     784FUNCTION horzcat_s00(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9) RESULT(out)
     785  IMPLICIT NONE
     786  CHARACTER(LEN=*),                   INTENT(IN) :: s0
    718787  CHARACTER(LEN=*), OPTIONAL, TARGET, INTENT(IN) :: s1, s2, s3, s4, s5, s6, s7, s8, s9
    719788  CHARACTER(LEN=maxlen), ALLOCATABLE :: out(:)
    720 !------------------------------------------------------------------------------------------------------------------------------
    721789  CHARACTER(LEN=maxlen), POINTER     :: s
    722   LOGICAL :: lv(10)
    723   INTEGER :: iv
    724   lv = [   .TRUE.   , PRESENT(s1), PRESENT(s2), PRESENT(s3), PRESENT(s4) , &
    725          PRESENT(s5), PRESENT(s6), PRESENT(s7), PRESENT(s8), PRESENT(s9) ]
    726   ALLOCATE(out(COUNT(lv)))
    727   DO iv=1, COUNT(lv)
    728     SELECT CASE(iv)
    729       CASE(1); s=> s0; CASE(2); s=> s1; CASE(3); s=> s2; CASE(4); s=> s3; CASE(5); s=> s4
    730       CASE(6); s=> s5; CASE(7); s=> s6; CASE(8); s=> s7; CASE(9); s=> s8; CASE(10);s=> s9
     790  INTEGER                            :: nrow, iv
     791  LOGICAL                            :: pre(9)
     792!------------------------------------------------------------------------------------------------------------------------------
     793  pre(:) = [PRESENT(s1),PRESENT(s2),PRESENT(s3),PRESENT(s4),PRESENT(s5),PRESENT(s6),PRESENT(s7),PRESENT(s8),PRESENT(s9)]
     794  nrow = 1+COUNT(pre)
     795  ALLOCATE(out(nrow))
     796  out(1) = s0
     797  DO iv = 2, nrow; IF(.NOT.pre(iv-1)) CYCLE
     798    SELECT CASE(iv-1)
     799      CASE(1); s=> s1; CASE(2); s=> s2; CASE(3); s=> s3; CASE(4); s=> s4; CASE(5); s=> s5
     800      CASE(6); s=> s6; CASE(7); s=> s7; CASE(8); s=> s8; CASE(9); s=> s9
    731801    END SELECT
    732802    out(iv) = s
    733803  END DO
    734 END FUNCTION horzcat_s1
    735 !==============================================================================================================================
    736 FUNCTION horzcat_sm(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9) RESULT(out)
    737   CHARACTER(LEN=*),           TARGET, DIMENSION(:), INTENT(IN) :: s0
    738   CHARACTER(LEN=*), OPTIONAL, TARGET, DIMENSION(:), INTENT(IN) :: s1, s2, s3, s4, s5, s6, s7, s8, s9
     804END FUNCTION horzcat_s00
     805!==============================================================================================================================
     806FUNCTION horzcat_s10(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9) RESULT(out)
     807  IMPLICIT NONE
     808  CHARACTER(LEN=*),           INTENT(IN) :: s0(:), s1
     809  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: s2, s3, s4, s5, s6, s7, s8, s9
     810  CHARACTER(LEN=maxlen), ALLOCATABLE :: out(:), tmp(:)
     811  INTEGER :: nc
     812  nc = SIZE(s0)
     813  tmp = horzcat_s00(s0(nc), s1, s2, s3, s4, s5, s6, s7, s8, s9)
     814  IF(nc == 1) out = tmp
     815  IF(nc /= 1) out = [s0(1:nc-1), tmp]
     816END FUNCTION horzcat_s10
     817!==============================================================================================================================
     818FUNCTION horzcat_s11(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9) RESULT(out)
     819  IMPLICIT NONE
     820  CHARACTER(LEN=*),                   INTENT(IN) :: s0(:)
     821  CHARACTER(LEN=*), OPTIONAL, TARGET, INTENT(IN) :: s1(:), s2(:), s3(:), s4(:), s5(:), s6(:), s7(:), s8(:), s9(:)
    739822  CHARACTER(LEN=maxlen), ALLOCATABLE :: out(:,:)
    740 !------------------------------------------------------------------------------------------------------------------------------
    741823  CHARACTER(LEN=maxlen), POINTER     :: s(:)
    742   LOGICAL :: lv(10)
    743   INTEGER :: nrow, ncol, iv, n
    744   lv = [   .TRUE.   , PRESENT(s1), PRESENT(s2), PRESENT(s3), PRESENT(s4) , &
    745          PRESENT(s5), PRESENT(s6), PRESENT(s7), PRESENT(s8), PRESENT(s9) ]
    746   nrow = SIZE(s0); ncol=COUNT(lv)
     824  INTEGER                            :: nrow, ncol, iv, n
     825  LOGICAL                            :: pre(9)
     826!------------------------------------------------------------------------------------------------------------------------------
     827  pre(:) = [PRESENT(s1),PRESENT(s2),PRESENT(s3),PRESENT(s4),PRESENT(s5),PRESENT(s6),PRESENT(s7),PRESENT(s8),PRESENT(s9)]
     828  nrow = SIZE(s0)
     829  ncol = 1+COUNT(pre)
    747830  ALLOCATE(out(nrow, ncol))
    748   DO iv=1, ncol
    749     SELECT CASE(iv)
    750       CASE(1); s=> s0; CASE(2); s=> s1; CASE(3); s=> s2; CASE(4); s=> s3; CASE(5); s=> s4
    751       CASE(6); s=> s5; CASE(7); s=> s6; CASE(8); s=> s7; CASE(9); s=> s8; CASE(10);s=> s9
     831  out(:,1) = s0
     832  DO iv = 2, ncol; IF(.NOT.pre(iv-1)) CYCLE
     833    SELECT CASE(iv-1)
     834      CASE(1); s=> s1; CASE(2); s=> s2; CASE(3); s=> s3; CASE(4); s=> s4; CASE(5); s=> s5
     835      CASE(6); s=> s6; CASE(7); s=> s7; CASE(8); s=> s8; CASE(9); s=> s9
    752836    END SELECT
    753837    n = SIZE(s, DIM=1)
    754     IF(n/=nrow) THEN; CALL msg("Can't concatenate vectors of differing lengths"); STOP; END IF
     838    IF(n /= nrow) THEN; CALL msg("Can't concatenate vectors of differing lengths"); STOP; END IF
    755839    out(:,iv) = s(:)
    756840  END DO
    757 END FUNCTION horzcat_sm
    758 !==============================================================================================================================
    759 FUNCTION horzcat_i1(i0, i1, i2, i3, i4, i5, i6, i7, i8, i9) RESULT(out)
    760   INTEGER,           TARGET, INTENT(IN) :: i0
     841END FUNCTION horzcat_s11
     842!==============================================================================================================================
     843FUNCTION horzcat_s21(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9) RESULT(out)
     844  IMPLICIT NONE
     845  CHARACTER(LEN=*),           INTENT(IN) :: s0(:,:), s1(:)
     846  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: s2(:), s3(:), s4(:), s5(:), s6(:), s7(:), s8(:), s9(:)
     847  CHARACTER(LEN=maxlen), ALLOCATABLE :: out(:,:), tmp(:,:)
     848  INTEGER :: nc
     849  nc  = SIZE(s0, 2)
     850  tmp = horzcat_s11(s0(:,nc), s1, s2, s3, s4, s5, s6, s7, s8, s9)
     851  IF(nc == 1) out = tmp
     852  IF(nc /= 1) out = RESHAPE([PACK(s0(:,1:nc-1), .TRUE.), PACK(tmp, .TRUE.)], SHAPE=[SIZE(s0, 1), nc + SIZE(tmp, 2)-1])
     853END FUNCTION horzcat_s21
     854!==============================================================================================================================
     855FUNCTION horzcat_i00(i0, i1, i2, i3, i4, i5, i6, i7, i8, i9) RESULT(out)
     856  IMPLICIT NONE
     857  INTEGER,                   INTENT(IN) :: i0
    761858  INTEGER, OPTIONAL, TARGET, INTENT(IN) :: i1, i2, i3, i4, i5, i6, i7, i8, i9
    762859  INTEGER, ALLOCATABLE :: out(:)
    763 !------------------------------------------------------------------------------------------------------------------------------
    764860  INTEGER, POINTER     :: i
    765   LOGICAL :: lv(10)
    766   INTEGER :: iv
    767   lv = [   .TRUE.   , PRESENT(i1), PRESENT(i2), PRESENT(i3), PRESENT(i4) , &
    768          PRESENT(i5), PRESENT(i6), PRESENT(i7), PRESENT(i8), PRESENT(i9) ]
    769   ALLOCATE(out(COUNT(lv)))
    770   DO iv=1, COUNT(lv)
    771     SELECT CASE(iv)
    772       CASE(1); i=> i0; CASE(2); i=> i1; CASE(3); i=> i2; CASE(4); i=> i3; CASE(5); i=> i4
    773       CASE(6); i=> i5; CASE(7); i=> i6; CASE(8); i=> i7; CASE(9); i=> i8; CASE(10);i=> i9
     861  INTEGER              :: ncol, iv
     862  LOGICAL              :: pre(9)
     863!------------------------------------------------------------------------------------------------------------------------------
     864  pre(:) = [PRESENT(i1),PRESENT(i2),PRESENT(i3),PRESENT(i4),PRESENT(i5),PRESENT(i6),PRESENT(i7),PRESENT(i8),PRESENT(i9)]
     865  ncol = SIZE(pre)
     866  ALLOCATE(out(ncol))
     867  out(1) = i0
     868  DO iv = 2, ncol; IF(.NOT.pre(iv-1)) CYCLE
     869    SELECT CASE(iv-1)
     870      CASE(1); i=> i1; CASE(2); i=> i2; CASE(3); i=> i3; CASE(4); i=> i4; CASE(5); i=> i5
     871      CASE(6); i=> i6; CASE(7); i=> i7; CASE(8); i=> i8; CASE(9); i=> i9
    774872    END SELECT
    775873    out(iv) = i
    776874  END DO
    777 END FUNCTION horzcat_i1
    778 !==============================================================================================================================
    779 FUNCTION horzcat_im(i0, i1, i2, i3, i4, i5, i6, i7, i8, i9) RESULT(out)
    780   INTEGER,           TARGET, DIMENSION(:), INTENT(IN) :: i0
    781   INTEGER, OPTIONAL, TARGET, DIMENSION(:), INTENT(IN) :: i1, i2, i3, i4, i5, i6, i7, i8, i9
     875END FUNCTION horzcat_i00
     876!==============================================================================================================================
     877FUNCTION horzcat_i10(i0, i1, i2, i3, i4, i5, i6, i7, i8, i9) RESULT(out)
     878  IMPLICIT NONE
     879  INTEGER,           INTENT(IN) :: i0(:), i1
     880  INTEGER, OPTIONAL, INTENT(IN) :: i2, i3, i4, i5, i6, i7, i8, i9
     881  INTEGER, ALLOCATABLE :: out(:), tmp(:)
     882  INTEGER :: nc
     883  nc = SIZE(i0)
     884  tmp = horzcat_i00(i0(nc), i1, i2, i3, i4, i5, i6, i7, i8, i9)
     885  IF(nc == 1) out = tmp
     886  IF(nc /= 1) out = [i0(1:nc-1), tmp]
     887END FUNCTION horzcat_i10
     888!==============================================================================================================================
     889FUNCTION horzcat_i11(i0, i1, i2, i3, i4, i5, i6, i7, i8, i9) RESULT(out)
     890  IMPLICIT NONE
     891  INTEGER,                   INTENT(IN) :: i0(:)
     892  INTEGER, OPTIONAL, TARGET, INTENT(IN) :: i1(:), i2(:), i3(:), i4(:), i5(:), i6(:), i7(:), i8(:), i9(:)
    782893  INTEGER, ALLOCATABLE :: out(:,:)
    783 !------------------------------------------------------------------------------------------------------------------------------
    784894  INTEGER, POINTER     :: i(:)
    785   LOGICAL :: lv(10)
    786   INTEGER :: nrow, ncol, iv, n
    787   lv = [   .TRUE.   , PRESENT(i1), PRESENT(i2), PRESENT(i3), PRESENT(i4) , &
    788          PRESENT(i5), PRESENT(i6), PRESENT(i7), PRESENT(i8), PRESENT(i9) ]
    789   nrow = SIZE(i0); ncol=COUNT(lv)
     895  INTEGER              :: nrow, ncol, iv, n
     896  LOGICAL              :: pre(9)
     897!------------------------------------------------------------------------------------------------------------------------------
     898  pre(:) = [PRESENT(i1),PRESENT(i2),PRESENT(i3),PRESENT(i4),PRESENT(i5),PRESENT(i6),PRESENT(i7),PRESENT(i8),PRESENT(i9)]
     899  nrow = SIZE(i0)
     900  ncol = 1+COUNT(pre)
    790901  ALLOCATE(out(nrow, ncol))
    791   DO iv=1, ncol
    792     SELECT CASE(iv)
    793       CASE(1); i=> i0; CASE(2); i=> i1; CASE(3); i=> i2; CASE(4); i=> i3; CASE(5); i=> i4
    794       CASE(6); i=> i5; CASE(7); i=> i6; CASE(8); i=> i7; CASE(9); i=> i8; CASE(10);i=> i9
     902  out(:,1) = i0
     903  DO iv = 2, ncol; IF(.NOT.pre(iv-1)) CYCLE
     904    SELECT CASE(iv-1)
     905      CASE(1); i=> i1; CASE(2); i=> i2; CASE(3); i=> i3; CASE(4); i=> i4; CASE(5); i=> i5
     906      CASE(6); i=> i6; CASE(7); i=> i7; CASE(8); i=> i8; CASE(9); i=> i9
    795907    END SELECT
    796908    n = SIZE(i, DIM=1)
    797     IF(n/=nrow) THEN; CALL msg("Can't concatenate vectors of differing lengths"); STOP; END IF
     909    IF(n /= nrow) THEN; CALL msg("Can't concatenate vectors of differing lengths"); STOP; END IF
    798910    out(:,iv) = i(:)
    799911  END DO
    800 END FUNCTION horzcat_im
    801 !==============================================================================================================================
    802 FUNCTION horzcat_r1(r0, r1, r2, r3, r4, r5, r6, r7, r8, r9) RESULT(out)
    803   REAL,           TARGET, INTENT(IN) :: r0
     912END FUNCTION horzcat_i11
     913!==============================================================================================================================
     914FUNCTION horzcat_i21(i0, i1, i2, i3, i4, i5, i6, i7, i8, i9) RESULT(out)
     915  IMPLICIT NONE
     916  INTEGER,           INTENT(IN) :: i0(:,:), i1(:)
     917  INTEGER, OPTIONAL, INTENT(IN) :: i2(:), i3(:), i4(:), i5(:), i6(:), i7(:), i8(:), i9(:)
     918  INTEGER, ALLOCATABLE :: out(:,:), tmp(:,:)
     919  INTEGER :: nc
     920  nc  = SIZE(i0, 2)
     921  tmp = horzcat_i11(i0(:,nc), i1, i2, i3, i4, i5, i6, i7, i8, i9)
     922  IF(nc == 1) out = tmp
     923  IF(nc /= 1) out = RESHAPE([PACK(i0(:,1:nc-1), .TRUE.), PACK(tmp, .TRUE.)], SHAPE=[SIZE(i0, 1), nc + SIZE(tmp, 2)-1])
     924END FUNCTION horzcat_i21
     925!==============================================================================================================================
     926FUNCTION horzcat_r00(r0, r1, r2, r3, r4, r5, r6, r7, r8, r9) RESULT(out)
     927  IMPLICIT NONE
     928  REAL,                   INTENT(IN) :: r0
    804929  REAL, OPTIONAL, TARGET, INTENT(IN) :: r1, r2, r3, r4, r5, r6, r7, r8, r9
    805930  REAL, ALLOCATABLE :: out(:)
    806 !------------------------------------------------------------------------------------------------------------------------------
    807931  REAL, POINTER     :: r
    808   LOGICAL :: lv(10)
    809   INTEGER :: iv
    810   lv = [   .TRUE.   , PRESENT(r1), PRESENT(r2), PRESENT(r3), PRESENT(r4) , &
    811          PRESENT(r5), PRESENT(r6), PRESENT(r7), PRESENT(r8), PRESENT(r9) ]
    812   ALLOCATE(out(COUNT(lv)))
    813   DO iv=1, COUNT(lv)
    814     SELECT CASE(iv)
    815       CASE(1); r=> r0; CASE(2); r=> r1; CASE(3); r=> r2; CASE(4); r=> r3; CASE(5); r=> r4
    816       CASE(6); r=> r5; CASE(7); r=> r6; CASE(8); r=> r7; CASE(9); r=> r8; CASE(10);r=> r9
     932  INTEGER           :: ncol, iv
     933  LOGICAL           :: pre(9)
     934!------------------------------------------------------------------------------------------------------------------------------
     935  pre(:) = [PRESENT(r1),PRESENT(r2),PRESENT(r3),PRESENT(r4),PRESENT(r5),PRESENT(r6),PRESENT(r7),PRESENT(r8),PRESENT(r9)]
     936  ncol = 1+COUNT(pre)
     937  ALLOCATE(out(ncol))
     938  out(1) = r0
     939  DO iv = 2, ncol; IF(.NOT.pre(iv-1)) CYCLE
     940    SELECT CASE(iv-1)
     941      CASE(1); r=> r1; CASE(2); r=> r2; CASE(3); r=> r3; CASE(4); r=> r4; CASE(5); r=> r5
     942      CASE(6); r=> r6; CASE(7); r=> r7; CASE(8); r=> r8; CASE(9); r=> r9
    817943    END SELECT
    818944    out(iv) = r
    819945  END DO
    820 END FUNCTION horzcat_r1
    821 !==============================================================================================================================
    822 FUNCTION horzcat_rm(r0, r1, r2, r3, r4, r5, r6, r7, r8, r9) RESULT(out)
    823   REAL,           TARGET, DIMENSION(:), INTENT(IN) :: r0
    824   REAL, OPTIONAL, TARGET, DIMENSION(:), INTENT(IN) :: r1, r2, r3, r4, r5, r6, r7, r8, r9
     946END FUNCTION horzcat_r00
     947!==============================================================================================================================
     948FUNCTION horzcat_r10(r0, r1, r2, r3, r4, r5, r6, r7, r8, r9) RESULT(out)
     949  IMPLICIT NONE
     950  REAL,           INTENT(IN) :: r0(:), r1
     951  REAL, OPTIONAL, INTENT(IN) :: r2, r3, r4, r5, r6, r7, r8, r9
     952  REAL, ALLOCATABLE :: out(:), tmp(:)
     953  INTEGER :: nc
     954  nc  = SIZE(r0)
     955  tmp = horzcat_r00(r0(nc), r1, r2, r3, r4, r5, r6, r7, r8, r9)
     956  IF(nc == 1) out = tmp
     957  IF(nc /= 1) out = [r0(1:nc-1), tmp]
     958END FUNCTION horzcat_r10
     959!==============================================================================================================================
     960FUNCTION horzcat_r11(r0, r1, r2, r3, r4, r5, r6, r7, r8, r9) RESULT(out)
     961  IMPLICIT NONE
     962  REAL,                   INTENT(IN) :: r0(:)
     963  REAL, OPTIONAL, TARGET, INTENT(IN) :: r1(:), r2(:), r3(:), r4(:), r5(:), r6(:), r7(:), r8(:), r9(:)
    825964  REAL, ALLOCATABLE :: out(:,:)
    826 !------------------------------------------------------------------------------------------------------------------------------
    827965  REAL, POINTER     :: r(:)
    828   LOGICAL :: lv(10)
    829   INTEGER :: nrow, ncol, iv, n
    830   lv = [   .TRUE.   , PRESENT(r1), PRESENT(r2), PRESENT(r3), PRESENT(r4) , &
    831          PRESENT(r5), PRESENT(r6), PRESENT(r7), PRESENT(r8), PRESENT(r9) ]
    832   nrow = SIZE(r0); ncol=COUNT(lv)
     966  INTEGER           :: nrow, ncol, iv, n
     967  LOGICAL           :: pre(9)
     968!------------------------------------------------------------------------------------------------------------------------------
     969  pre(:) = [PRESENT(r1),PRESENT(r2),PRESENT(r3),PRESENT(r4),PRESENT(r5),PRESENT(r6),PRESENT(r7),PRESENT(r8),PRESENT(r9)]
     970  nrow = SIZE(r0)
     971  ncol = 1+COUNT(pre)
    833972  ALLOCATE(out(nrow, ncol))
    834   DO iv=1, ncol
    835     SELECT CASE(iv)
    836       CASE(1); r=> r0; CASE(2); r=> r1; CASE(3); r=> r2; CASE(4); r=> r3; CASE(5); r=> r4
    837       CASE(6); r=> r5; CASE(7); r=> r6; CASE(8); r=> r7; CASE(9); r=> r8; CASE(10);r=> r9
     973  out(:,1) = r0
     974  DO iv = 2, ncol; IF(.NOT.pre(iv-1)) CYCLE
     975    SELECT CASE(iv-1)
     976      CASE(1); r=> r1; CASE(2); r=> r2; CASE(3); r=> r3; CASE(4); r=> r4; CASE(5); r=> r5
     977      CASE(6); r=> r5; CASE(7); r=> r7; CASE(8); r=> r8; CASE(9); r=> r9
    838978    END SELECT
    839979    n = SIZE(r, DIM=1)
    840     IF(n/=nrow) THEN; CALL msg("Can't concatenate vectors of differing lengths"); STOP; END IF
     980    IF(n /= nrow) THEN; CALL msg("Can't concatenate vectors of differing lengths"); STOP; END IF
    841981    out(:,iv) = r(:)
    842982  END DO
    843 END FUNCTION horzcat_rm
    844 !==============================================================================================================================
    845 FUNCTION horzcat_d1(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9) RESULT(out)
    846   DOUBLE PRECISION,           TARGET, INTENT(IN) :: d0
     983END FUNCTION horzcat_r11
     984!==============================================================================================================================
     985FUNCTION horzcat_r21(r0, r1, r2, r3, r4, r5, r6, r7, r8, r9) RESULT(out)
     986  IMPLICIT NONE
     987  REAL,           INTENT(IN) :: r0(:,:), r1(:)
     988  REAL, OPTIONAL, INTENT(IN) :: r2(:), r3(:), r4(:), r5(:), r6(:), r7(:), r8(:), r9(:)
     989  REAL, ALLOCATABLE :: out(:,:), tmp(:,:)
     990  INTEGER :: nc
     991  nc  = SIZE(r0, 2)
     992  tmp = horzcat_r11(r0(:,nc), r1, r2, r3, r4, r5, r6, r7, r8, r9)
     993  IF(nc == 1) out = tmp
     994  IF(nc /= 1) out = RESHAPE([PACK(r0(:,1:nc-1), .TRUE.), PACK(tmp, .TRUE.)], SHAPE=[SIZE(r0, 1), nc + SIZE(tmp, 2)-1])
     995END FUNCTION horzcat_r21
     996!==============================================================================================================================
     997FUNCTION horzcat_d00(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9) RESULT(out)
     998  IMPLICIT NONE
     999  DOUBLE PRECISION,                   INTENT(IN) :: d0
    8471000  DOUBLE PRECISION, OPTIONAL, TARGET, INTENT(IN) :: d1, d2, d3, d4, d5, d6, d7, d8, d9
    8481001  DOUBLE PRECISION, ALLOCATABLE :: out(:)
    849 !------------------------------------------------------------------------------------------------------------------------------
    8501002  DOUBLE PRECISION, POINTER     :: d
    851   LOGICAL :: lv(10)
    852   INTEGER :: iv
    853   lv = [   .TRUE.   , PRESENT(d1), PRESENT(d2), PRESENT(d3), PRESENT(d4) , &
    854          PRESENT(d5), PRESENT(d6), PRESENT(d7), PRESENT(d8), PRESENT(d9) ]
    855   ALLOCATE(out(COUNT(lv)))
    856   DO iv=1, COUNT(lv)
    857     SELECT CASE(iv)
    858       CASE(1); d=> d0; CASE(2); d=> d1; CASE(3); d=> d2; CASE(4); d=> d3; CASE(5); d=> d4
    859       CASE(6); d=> d5; CASE(7); d=> d6; CASE(8); d=> d7; CASE(9); d=> d8; CASE(10);d=> d9
     1003  INTEGER                       :: ncol, iv
     1004  LOGICAL                       :: pre(9)
     1005!------------------------------------------------------------------------------------------------------------------------------
     1006  pre(:) = [PRESENT(d1),PRESENT(d2),PRESENT(d3),PRESENT(d4),PRESENT(d5),PRESENT(d6),PRESENT(d7),PRESENT(d8),PRESENT(d9)]
     1007  ncol = 1+COUNT(pre)
     1008  ALLOCATE(out(ncol))
     1009  out(1) = d0
     1010  DO iv = 2, ncol; IF(.NOT.pre(iv-1)) CYCLE
     1011    SELECT CASE(iv-1)
     1012      CASE(1); d=> d1; CASE(2); d=> d2; CASE(3); d=> d3; CASE(4); d=> d4; CASE(5); d=> d5
     1013      CASE(6); d=> d6; CASE(7); d=> d7; CASE(8); d=> d8; CASE(9); d=> d9
    8601014    END SELECT
    8611015    out(iv) = d
    8621016  END DO
    863 END FUNCTION horzcat_d1
    864 !==============================================================================================================================
    865 FUNCTION horzcat_dm(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9) RESULT(out)
    866   DOUBLE PRECISION,           TARGET, DIMENSION(:), INTENT(IN) :: d0
    867   DOUBLE PRECISION, OPTIONAL, TARGET, DIMENSION(:), INTENT(IN) :: d1, d2, d3, d4, d5, d6, d7, d8, d9
     1017END FUNCTION horzcat_d00
     1018!==============================================================================================================================
     1019FUNCTION horzcat_d10(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9) RESULT(out)
     1020  IMPLICIT NONE
     1021  DOUBLE PRECISION,           INTENT(IN) :: d0(:), d1
     1022  DOUBLE PRECISION, OPTIONAL, INTENT(IN) :: d2, d3, d4, d5, d6, d7, d8, d9
     1023  DOUBLE PRECISION, ALLOCATABLE :: out(:), tmp(:)
     1024  INTEGER :: nc
     1025  nc = SIZE(d0)
     1026  tmp = horzcat_d00(d0(nc), d1, d2, d3, d4, d5, d6, d7, d8, d9)
     1027  IF(nc == 1) out = tmp
     1028  IF(nc /= 1) out = [d0(1:nc-1), tmp]
     1029END FUNCTION horzcat_d10
     1030!==============================================================================================================================
     1031FUNCTION horzcat_d11(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9) RESULT(out)
     1032  IMPLICIT NONE
     1033  DOUBLE PRECISION,                   INTENT(IN) :: d0(:)
     1034  DOUBLE PRECISION, OPTIONAL, TARGET, INTENT(IN) :: d1(:), d2(:), d3(:), d4(:), d5(:), d6(:), d7(:), d8(:), d9(:)
    8681035  DOUBLE PRECISION, ALLOCATABLE :: out(:,:)
    869 !------------------------------------------------------------------------------------------------------------------------------
    8701036  DOUBLE PRECISION, POINTER     :: d(:)
    871   LOGICAL :: lv(10)
    872   INTEGER :: nrow, ncol, iv, n
    873   lv = [   .TRUE.   , PRESENT(d1), PRESENT(d2), PRESENT(d3), PRESENT(d4) , &
    874          PRESENT(d5), PRESENT(d6), PRESENT(d7), PRESENT(d8), PRESENT(d9) ]
    875   nrow = SIZE(d0); ncol=COUNT(lv)
     1037  INTEGER                       :: nrow, ncol, iv, n
     1038  LOGICAL                       :: pre(9)
     1039!------------------------------------------------------------------------------------------------------------------------------
     1040  nrow = SIZE(d0)
     1041  pre(:) = [PRESENT(d1),PRESENT(d2),PRESENT(d3),PRESENT(d4),PRESENT(d5),PRESENT(d6),PRESENT(d7),PRESENT(d8),PRESENT(d9)]
     1042  ncol = 1+COUNT(pre)
    8761043  ALLOCATE(out(nrow, ncol))
    877   DO iv=1, ncol
    878     SELECT CASE(iv)
    879       CASE(1); d=> d0; CASE(2); d=> d1; CASE(3); d=> d2; CASE(4); d=> d3; CASE(5); d=> d4
    880       CASE(6); d=> d5; CASE(7); d=> d6; CASE(8); d=> d7; CASE(9); d=> d8; CASE(10);d=> d9
     1044  DO iv = 2, ncol; IF(.NOT.pre(iv-1)) CYCLE
     1045    SELECT CASE(iv-1)
     1046      CASE(1); d=> d1; CASE(2); d=> d2; CASE(3); d=> d3; CASE(4); d=> d4; CASE(5); d=> d5
     1047      CASE(6); d=> d6; CASE(7); d=> d7; CASE(8); d=> d8; CASE(9); d=> d9
    8811048    END SELECT
    8821049    n = SIZE(d, DIM=1)
    883     IF(n/=nrow) THEN; CALL msg("Can't concatenate vectors of differing lengths"); STOP; END IF
     1050    IF(n /= nrow) THEN; CALL msg("Can't concatenate vectors of differing lengths"); STOP; END IF
    8841051    out(:,iv) = d(:)
    8851052  END DO
    886 END FUNCTION horzcat_dm
     1053END FUNCTION horzcat_d11
     1054!==============================================================================================================================
     1055FUNCTION horzcat_d21(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9) RESULT(out)
     1056  IMPLICIT NONE
     1057  DOUBLE PRECISION,           INTENT(IN) :: d0(:,:), d1(:)
     1058  DOUBLE PRECISION, OPTIONAL, INTENT(IN) :: d2(:), d3(:), d4(:), d5(:), d6(:), d7(:), d8(:), d9(:)
     1059  DOUBLE PRECISION, ALLOCATABLE :: out(:,:), tmp(:,:)
     1060  INTEGER :: nc
     1061  nc  = SIZE(d0, 2)
     1062  tmp = horzcat_d11(d0(:,nc), d1, d2, d3, d4, d5, d6, d7, d8, d9)
     1063  IF(nc == 1) out = tmp
     1064  IF(nc /= 1) out = RESHAPE([PACK(d0(:,1:nc-1), .TRUE.), PACK(tmp, .TRUE.)], SHAPE=[SIZE(d0, 1), nc + SIZE(tmp, 2)-1])
     1065END FUNCTION horzcat_d21
    8871066!==============================================================================================================================
    8881067
     
    8961075!==============================================================================================================================
    8971076LOGICAL FUNCTION dispTable(p, titles, s, i, r, rFmt, nRowMax, nColMax, nHead, unit, sub) RESULT(lerr)
     1077  IMPLICIT NONE
    8981078  CHARACTER(LEN=*),           INTENT(IN)  :: p             !--- DISPLAY MAP: s/i/r
    8991079  CHARACTER(LEN=*),           INTENT(IN)  :: titles(:)     !--- TITLES (ONE EACH COLUMN)
     
    10041184!==============================================================================================================================
    10051185LOGICAL FUNCTION dispNamelist(unt, p, titles, s, i, r, rFmt, llast) RESULT(lerr)
     1186  IMPLICIT NONE
    10061187  INTEGER,                    INTENT(IN)  :: unt           !--- Output unit
    10071188  CHARACTER(LEN=*),           INTENT(IN)  :: p             !--- DISPLAY MAP: s/i/r
     
    10861267!==============================================================================================================================
    10871268LOGICAL FUNCTION dispOutliers_1(ll, a, n, err_msg, nam, subn, nRowmax, nColMax, nHead, unit) RESULT(lerr)
     1269  IMPLICIT NONE
    10881270! Display outliers list in tables
    10891271! If "nam" is supplied, it means the last index is for tracers => one table each tracer for rank > 2.
     
    11151297
    11161298  rk = SIZE(n); nv = SIZE(vnm)
    1117   IF(test(fmsg('SIZE(nam) /= 1 and /= last "n" element', sub, nv /= 1 .AND. nv /= n(rk), unt),lerr)) RETURN
    1118   IF(test(fmsg('ll" and "a" sizes mismatch',             sub, SIZE(a) /= SIZE(ll),       unt),lerr)) RETURN
    1119   IF(test(fmsg('profile "n" does not match "a" and "ll', sub, SIZE(a) /= PRODUCT(n),     unt),lerr)) RETURN
     1299  lerr = nv/=1 .AND. nv/=n(rk); CALL msg('SIZE(nam) /= 1 and /= last "n" element', sub, lerr); IF(lerr) RETURN
     1300  lerr = SIZE(a) /=   SIZE(ll); CALL msg('ll" and "a" sizes mismatch',             sub, lerr); IF(lerr) RETURN
     1301  lerr = SIZE(a) /= PRODUCT(n); CALL msg('profile "n" does not match "a" and "ll', sub, lerr); IF(lerr) RETURN
    11201302  CALL msg(mes, sub, unit=unt)
    11211303
     
    11641346!==============================================================================================================================
    11651347LOGICAL FUNCTION dispOutliers_2(ll, a, n, err_msg, nam, subn, nRowMax, nColMax, nHead, unit) RESULT(lerr)
     1348  IMPLICIT NONE
    11661349! Display outliers list in tables
    11671350! If "nam" is supplied and, it means the last index is for tracers => one table each tracer for rank > 2.
     
    12211404!==============================================================================================================================
    12221405LOGICAL FUNCTION reduceExpr_1(str, val) RESULT(lerr)
     1406  IMPLICIT NONE
    12231407  CHARACTER(LEN=*),      INTENT(IN)  :: str
    12241408  CHARACTER(LEN=maxlen), INTENT(OUT) :: val
     
    12541438  DO WHILE(nl > 1)
    12551439    i = 1; DO WHILE(ip(i) /= 1 .OR. ip(i+1) /= 2); i = i + 1; END DO !IF(i > SIZE(ip)+1) EXIT;END DO
    1256     IF(test(reduceExpr_basic(vl(i+1), v), lerr)) RETURN
     1440    lerr = reduceExpr_basic(vl(i+1), v); IF(lerr) RETURN
    12571441    v = TRIM(vl(i))//TRIM(v); IF(i+2<=nl) v=TRIM(v)//TRIM(vl(i+2))
    12581442    vv = v//REPEAT(' ',768)
     
    12701454!==============================================================================================================================
    12711455LOGICAL FUNCTION reduceExpr_basic(str, val) RESULT(lerr)
     1456  IMPLICIT NONE
    12721457  CHARACTER(LEN=*),      INTENT(IN)  :: str
    12731458  CHARACTER(LEN=*),      INTENT(OUT) :: val
     
    12841469  op = ['^','/','*','+','-']                                                   !--- List of recognized operations
    12851470  s = str
    1286   IF(test(strParse_m(s, op, ky, lSc=.TRUE., id = id), lerr)) RETURN            !--- Parse the values
     1471  lerr = strParse_m(s, op, ky, lSc=.TRUE., id = id)                            !--- Parse the values
     1472  IF(lerr) RETURN                                                              !--- Problem with the parsing
    12871473  vl = str2dble(ky)                                                            !--- Conversion to doubles
    12881474  lerr = ANY(vl >= HUGE(1.d0))
    1289   IF(fmsg('Some values are non-numeric in: '//TRIM(s), ll=lerr)) RETURN        !--- Non-numerical values found
     1475  CALL msg('Some values are non-numeric in: '//TRIM(s), ll=lerr)
     1476  IF(lerr) RETURN                                                              !--- Non-numerical values found
    12901477  DO io = 1, SIZE(op)                                                          !--- Loop on known operators (order matters !)
    12911478    DO i = SIZE(id), 1, -1                                                     !--- Loop on found operators
     
    12931480      IF(id(i) /= io) CYCLE                                                    !--- Current found operator is not op(io)
    12941481      vm = vl(i); vp = vl(i+1)                                                 !--- Couple of values used for current operation
    1295       SELECT CASE(op(io))                                                          !--- Perform operation on the two values
     1482      SELECT CASE(op(io))                                                      !--- Perform operation on the two values
    12961483        CASE('^'); v = vm**vp
    12971484        CASE('/'); v = vm/vp
     
    13111498!==============================================================================================================================
    13121499FUNCTION reduceExpr_m(str, val) RESULT(lerr)
     1500  IMPLICIT NONE
    13131501  LOGICAL,               ALLOCATABLE              :: lerr(:)
    13141502  CHARACTER(LEN=*),                   INTENT(IN)  :: str(:)
     
    13261514!==============================================================================================================================
    13271515ELEMENTAL LOGICAL FUNCTION is_numeric(str) RESULT(out)
     1516  IMPLICIT NONE
    13281517  CHARACTER(LEN=*), INTENT(IN) :: str
    13291518  REAL    :: x
     
    13411530!=== Convert a string into a logical/integer integer or an integer/real into a string =========================================
    13421531!==============================================================================================================================
    1343 ELEMENTAL LOGICAL FUNCTION str2bool(str) RESULT(out)
     1532ELEMENTAL INTEGER FUNCTION str2bool(str) RESULT(out)  !--- Result: 0/1 for .FALSE./.TRUE., -1 if not a valid boolean
     1533  IMPLICIT NONE
    13441534  CHARACTER(LEN=*), INTENT(IN) :: str
    13451535  INTEGER :: ierr
    1346   READ(str,*,IOSTAT=ierr) out
    1347   IF(ierr==0) RETURN
    1348   out = ANY(['t     ','true  ','.true.','y     ','yes   ']==strLower(str))
     1536  LOGICAL :: lout
     1537  READ(str,*,IOSTAT=ierr) lout
     1538  out = -HUGE(1)
     1539  IF(ierr /= 0) THEN
     1540    IF(ANY(['.false.', 'false  ', 'no     ', 'f      ', 'n      '] == strLower(str))) out = 0
     1541    IF(ANY(['.true. ', 'true   ', 'yes    ', 't      ', 'y      '] == strLower(str))) out = 1
     1542  ELSE
     1543    out = 0; IF(lout) out = 1
     1544  END IF
    13491545END FUNCTION str2bool
    13501546!==============================================================================================================================
    13511547ELEMENTAL INTEGER FUNCTION str2int(str) RESULT(out)
     1548  IMPLICIT NONE
    13521549  CHARACTER(LEN=*), INTENT(IN) :: str
    13531550  INTEGER :: ierr
     
    13571554!==============================================================================================================================
    13581555ELEMENTAL REAL FUNCTION str2real(str) RESULT(out)
     1556  IMPLICIT NONE
    13591557  CHARACTER(LEN=*), INTENT(IN) :: str
    13601558  INTEGER :: ierr
     
    13641562!==============================================================================================================================
    13651563ELEMENTAL DOUBLE PRECISION FUNCTION str2dble(str) RESULT(out)
     1564  IMPLICIT NONE
    13661565  CHARACTER(LEN=*), INTENT(IN) :: str
    13671566  INTEGER :: ierr
     
    13711570!==============================================================================================================================
    13721571ELEMENTAL CHARACTER(LEN=maxlen) FUNCTION bool2str(b) RESULT(out)
     1572  IMPLICIT NONE
    13731573  LOGICAL, INTENT(IN) :: b
    13741574  WRITE(out,*)b
     
    13771577!==============================================================================================================================
    13781578ELEMENTAL CHARACTER(LEN=maxlen) FUNCTION int2str(i, nDigits) RESULT(out)
     1579  IMPLICIT NONE
    13791580  INTEGER,           INTENT(IN) :: i
    13801581  INTEGER, OPTIONAL, INTENT(IN) :: nDigits
     
    13871588!==============================================================================================================================
    13881589ELEMENTAL CHARACTER(LEN=maxlen) FUNCTION real2str(r,fmt) RESULT(out)
     1590  IMPLICIT NONE
    13891591  REAL,                       INTENT(IN) :: r
    13901592  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: fmt
     
    13961598!==============================================================================================================================
    13971599ELEMENTAL CHARACTER(LEN=maxlen) FUNCTION dble2str(d,fmt) RESULT(out)
     1600  IMPLICIT NONE
    13981601  DOUBLE PRECISION,           INTENT(IN) :: d
    13991602  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: fmt
     
    14051608!==============================================================================================================================
    14061609ELEMENTAL SUBROUTINE cleanZeros(s)
     1610  IMPLICIT NONE
    14071611  CHARACTER(LEN=*), INTENT(INOUT) :: s
    14081612  INTEGER :: ls, ix, i
     
    14221626!==============================================================================================================================
    14231627FUNCTION addQuotes_1(s) RESULT(out)
     1628  IMPLICIT NONE
    14241629  CHARACTER(LEN=*), INTENT(IN)  :: s
    14251630  CHARACTER(LEN=:), ALLOCATABLE :: out
     
    14281633!==============================================================================================================================
    14291634FUNCTION addQuotes_m(s) RESULT(out)
     1635  IMPLICIT NONE
    14301636  CHARACTER(LEN=*), INTENT(IN)  :: s(:)
    14311637  CHARACTER(LEN=:), ALLOCATABLE :: out(:)
     
    14401646!==============================================================================================================================
    14411647ELEMENTAL LOGICAL FUNCTION needQuotes(s) RESULT(out)
     1648  IMPLICIT NONE
    14421649  CHARACTER(LEN=*), INTENT(IN) :: s
    14431650  CHARACTER(LEN=1) :: b, e
     
    14541661!==============================================================================================================================
    14551662LOGICAL FUNCTION checkList(str, lerr, message, items, reason, nmax) RESULT(out)
     1663  IMPLICIT NONE
    14561664! Purpose: Messages in case a list contains wrong elements (indicated by lerr boolean vector).
    14571665! Note:    Return value "out" is .TRUE. if there are errors (ie at least one element of "lerr" is TRUE).
     
    14761684!==============================================================================================================================
    14771685SUBROUTINE removeComment(str)
     1686  IMPLICIT NONE
    14781687  CHARACTER(LEN=*), INTENT(INOUT) :: str
    14791688  INTEGER :: ix
  • LMDZ6/branches/cirrus/libf/phylmd/Dust/phys_output_write_spl_mod.F90

    r4619 r5202  
    325325         sissnow, runoff, albsol3_lic, evap_pot, &
    326326         t2m, fluxt, fluxlat, fsollw, fsolsw, &
    327          wfbils, wfbilo, cdragm, cdragh, cldl, cldm, &
     327         wfbils, cdragm, cdragh, cldl, cldm, &
    328328         cldh, cldt, JrNt, &
    329329         ! cldljn, cldmjn, cldhjn, cldtjn &
     
    353353         toplwad_aero, toplwad0_aero, sollwad_aero, &
    354354         sollwad0_aero, toplwai_aero, sollwai_aero, &
    355          scdnc, cldncl, reffclws, reffclwc, cldnvi, &
    356          lcc, lcc3d, lcc3dcon, lcc3dstra, reffclwtop, &
     355         !scdnc, cldncl, reffclws, reffclwc, cldnvi, &
     356         !lcc, lcc3d, lcc3dcon, lcc3dstra, reffclwtop, &
    357357         ec550aer, flwc, fiwc, t_seri, theta, q_seri, &
    358358!jyg<
     
    377377    USE phys_output_var_mod, ONLY: vars_defined, snow_o, zfra_o, bils_diss, &
    378378         bils_ec,bils_ech, bils_tke, bils_kinetic, bils_latent, bils_enthalp, &
    379          itau_con, nfiles, clef_files, nid_files, zvstr_gwd_rando
     379         itau_con, nfiles, clef_files, nid_files, zvstr_gwd_rando, &
     380         scdnc, cldncl, reffclws, reffclwc, cldnvi, &
     381         lcc, lcc3d, lcc3dcon, lcc3dstra, reffclwtop
    380382    USE ocean_slab_mod, ONLY: tslab, slab_bilg, tice, seaice
    381383    USE pbl_surface_mod, ONLY: snow
     
    721723          IF (vars_defined)         zx_tmp_fi2d(1 : klon) = wfbils( 1 : klon, nsrf)
    722724          CALL histwrite_phy(o_wbils_srf(nsrf), zx_tmp_fi2d)
    723           IF (vars_defined)         zx_tmp_fi2d(1 : klon) = wfbilo( 1 : klon, nsrf)
    724           CALL histwrite_phy(o_wbilo_srf(nsrf), zx_tmp_fi2d)
    725725
    726726          IF (iflag_pbl > 1) THEN
  • LMDZ6/branches/cirrus/libf/phylmd/StratAer/aer_sedimnt.F90

    r3677 r5202  
    1717!-----------------------------------------------------------------------
    1818
    19   USE phys_local_var_mod, ONLY: mdw, budg_sed_part, DENSO4, f_r_wet, vsed_aer
     19  USE phys_local_var_mod, ONLY: mdw, budg_sed_part, DENSO4, DENSO4B, f_r_wet, f_r_wetB, vsed_aer
     20  USE strataer_local_var_mod, ONLY: flag_new_strat_compo
    2021  USE dimphy, ONLY : klon,klev
    2122  USE infotrac_phy
     
    8990
    9091      ! stokes-velocity with cunnigham slip- flow correction
    91       ZVAER(JL,JK,nb) = 2./9.*(DENSO4(JL,JK)*1000.-ZRHO)*RG/zvis(JL,JK)*(f_r_wet(JL,JK)*mdw(nb)/2.)**2.* &
    92          (1.+ 2.*zlair(JL,JK)/(f_r_wet(JL,JK)*mdw(nb))*(1.257+0.4*EXP(-0.55*f_r_wet(JL,JK)*mdw(nb)/zlair(JL,JK))))
    93 
     92      IF(flag_new_strat_compo) THEN
     93         ! stokes-velocity with cunnigham slip- flow correction
     94         ZVAER(JL,JK,nb) = 2./9.*(DENSO4B(JL,JK,nb)*1000.-ZRHO)*RG/zvis(JL,JK)*(f_r_wetB(JL,JK,nb)*mdw(nb)/2.)**2.* &
     95              (1.+ 2.*zlair(JL,JK)/(f_r_wetB(JL,JK,nb)*mdw(nb))*(1.257+0.4*EXP(-0.55*f_r_wetB(JL,JK,nb)*mdw(nb)/zlair(JL,JK))))
     96      ELSE
     97         ZVAER(JL,JK,nb) = 2./9.*(DENSO4(JL,JK)*1000.-ZRHO)*RG/zvis(JL,JK)*(f_r_wet(JL,JK)*mdw(nb)/2.)**2.* &
     98              (1.+ 2.*zlair(JL,JK)/(f_r_wet(JL,JK)*mdw(nb))*(1.257+0.4*EXP(-0.55*f_r_wet(JL,JK)*mdw(nb)/zlair(JL,JK))))
     99      ENDIF
     100     
    94101      ZSEDFLX(JL,nb)=ZVAER(JL,JK,nb)*ZRHO
    95102      ZSOLAERB(nb)=ZSOLAERB(nb)+ZDTGDP*ZSEDFLX(JL,nb)
  • LMDZ6/branches/cirrus/libf/phylmd/StratAer/aerophys.F90

    r4601 r5202  
    55  IMPLICIT NONE
    66!
    7   REAL,PARAMETER                         :: ropx=1500.0              ! default aerosol particle mass density [kg/m3]
    8   REAL,PARAMETER                         :: dens_aer_dry=1848.682308 ! dry aerosol particle mass density at T_0=293K[kg/m3]
    9   REAL,PARAMETER                         :: dens_aer_ref=1483.905336 ! aerosol particle mass density with 75% H2SO4 at T_0=293K[kg/m3]
    10   REAL,PARAMETER                         :: mdwmin=0.002e-6          ! dry diameter of smallest aerosol particles [m]
    11   REAL,PARAMETER                         :: V_rat=2.0                ! volume ratio of neighboring size bins
    12   REAL,PARAMETER                         :: mfrac_H2SO4=0.75         ! default mass fraction of H2SO4 in the aerosol
    13   REAL, PARAMETER                        :: mAIRmol=28.949*1.66E-27  ! Average mass of an air molecule [kg]
    14   REAL, PARAMETER                        :: mH2Omol=18.016*1.66E-27  ! Mass of an H2O molecule [kg]
    15   REAL, PARAMETER                        :: mH2SO4mol=98.082*1.66E-27! Mass of an H2SO4 molecule [kg]
    16   REAL, PARAMETER                        :: mSO2mol=64.06*1.66E-27   ! Mass of an SO2 molecule [kg]
    17   REAL, PARAMETER                        :: mSatom=32.06*1.66E-27    ! Mass of a S atom [kg]
    18   REAL, PARAMETER                        :: mOCSmol=60.07*1.66E-27   ! Mass of an OCS molecule [kg]
    19   REAL, PARAMETER                        :: mClatom=35.45*1.66E-27   ! Mass of an Cl atom [kg]
    20   REAL, PARAMETER                        :: mHClmol=36.46*1.66E-27   ! Mass of an HCl molecule [kg]
    21   REAL, PARAMETER                        :: mBratom=79.90*1.66E-27   ! Mass of an Br atom [kg]
    22   REAL, PARAMETER                        :: mHBrmol=80.92*1.66E-27   ! Mass of an HBr molecule [kg]
    23   REAL, PARAMETER                        :: mNOmol=30.01*1.66E-27    ! Mass of an NO molecule [kg]
    24   REAL, PARAMETER                        :: mNO2mol=46.01*1.66E-27   ! Mass of an NO2 molecule [kg]
    25   REAL, PARAMETER                        :: mNatome=14.0067*1.66E-27 ! Mass of an N atome [kg]
     7  REAL,PARAMETER    :: ropx=1500.0              ! default aerosol particle mass density [kg/m3]
     8  REAL,PARAMETER    :: dens_aer_dry=1848.682308 ! dry aerosol particle mass density at T_0=293K[kg/m3]
     9  REAL,PARAMETER    :: dens_aer_ref=1483.905336 ! aerosol particle mass density with 75% H2SO4 at T_0=293K[kg/m3]
     10  REAL,PARAMETER    :: mdwmin=0.002e-6          ! dry diameter of smallest aerosol particles [m]
     11  REAL,PARAMETER    :: V_rat=2.0                ! volume ratio of neighboring size bins
     12  REAL,PARAMETER    :: mfrac_H2SO4=0.75         ! default mass fraction of H2SO4 in the aerosol
     13  REAL, PARAMETER   :: mAIRmol=28.949*1.66E-27  ! Average mass of an air molecule [kg]
     14  REAL, PARAMETER   :: mH2Omol=18.016*1.66E-27  ! Mass of an H2O molecule [kg]
     15  REAL, PARAMETER   :: mH2SO4mol=98.082*1.66E-27! Mass of an H2SO4 molecule [kg]
     16  REAL, PARAMETER   :: mSO2mol=64.06*1.66E-27   ! Mass of an SO2 molecule [kg]
     17  REAL, PARAMETER   :: mSatom=32.06*1.66E-27    ! Mass of a S atom [kg]
     18  REAL, PARAMETER   :: mOCSmol=60.07*1.66E-27   ! Mass of an OCS molecule [kg]
     19  REAL, PARAMETER   :: mClatom=35.45*1.66E-27   ! Mass of an Cl atom [kg]
     20  REAL, PARAMETER   :: mHClmol=36.46*1.66E-27   ! Mass of an HCl molecule [kg]
     21  REAL, PARAMETER   :: mBratom=79.90*1.66E-27   ! Mass of an Br atom [kg]
     22  REAL, PARAMETER   :: mHBrmol=80.92*1.66E-27   ! Mass of an HBr molecule [kg]
     23  REAL, PARAMETER   :: mNOmol=30.01*1.66E-27    ! Mass of an NO molecule [kg]
     24  REAL, PARAMETER   :: mNO2mol=46.01*1.66E-27   ! Mass of an NO2 molecule [kg]
     25  REAL, PARAMETER   :: mNatome=14.0067*1.66E-27 ! Mass of an N atome [kg]
     26  REAL, PARAMETER   :: rgas=8.3145 ! molar gas cste (J⋅K−1⋅mol−1=m3⋅Pa⋅K−1⋅mol−1=kg⋅m2⋅s−2⋅K−1⋅mol−1)
     27  !
     28  REAL, PARAMETER   :: MH2O  =1000.*mH2Omol     ! Mass of 1 molec [g] (18.016*1.66E-24)
     29  REAL, PARAMETER   :: MH2SO4=1000.*mH2SO4mol   ! Mass of 1 molec [g] (98.082*1.66E-24)
     30  REAL, PARAMETER   :: BOLZ  =1.381E-16         ! Boltzmann constant [dyn.cm/K]
    2631!
    2732END MODULE aerophys
  • LMDZ6/branches/cirrus/libf/phylmd/StratAer/coagulate.F90

    r4762 r5202  
    2626  USE aerophys
    2727  USE infotrac_phy
    28   USE phys_local_var_mod, ONLY: DENSO4, f_r_wet
    29 
     28  USE phys_local_var_mod, ONLY: DENSO4, DENSO4B, f_r_wet, f_r_wetB
     29  USE strataer_local_var_mod, ONLY: flag_new_strat_compo
     30 
    3031  IMPLICIT NONE
    3132
     
    4344  ! local variables in coagulation routine
    4445  INTEGER                                       :: i,j,k,nb,ilon,ilev
    45   REAL, DIMENSION(nbtr_bin)                     :: radius ! aerosol particle radius in each bin [m]
     46  REAL, DIMENSION(nbtr_bin)                     :: radiusdry ! dry aerosol particle radius in each bin [m]
     47  REAL, DIMENSION(nbtr_bin)                     :: radiuswet ! wet aerosol particle radius in each bin [m]
    4648  REAL, DIMENSION(klon,klev,nbtr_bin)           :: tr_t ! Concentration Traceur at time t [U/KgA]
    4749  REAL, DIMENSION(klon,klev,nbtr_bin)           :: tr_tp1 ! Concentration Traceur at time t+1 [U/KgA]
    4850  REAL, DIMENSION(nbtr_bin,nbtr_bin,nbtr_bin)   :: ff   ! Volume fraction of intermediate particles
    49   REAL, DIMENSION(nbtr_bin)                     :: V    ! Volume of bins
     51  REAL, DIMENSION(nbtr_bin)                     :: Vdry ! Volume dry of bins
     52  REAL, DIMENSION(nbtr_bin)                     :: Vwet ! Volume wet of bins
    5053  REAL, DIMENSION(nbtr_bin,nbtr_bin)            :: Vij  ! Volume sum of i and j
    5154  REAL                                          :: eta  ! Dynamic viscosity of air
     
    8285  include "YOMCST.h"
    8386
    84   DO i=1, nbtr_bin
    85    radius(i)=mdw(i)/2.
    86    V(i)= radius(i)**3.  !neglecting factor 4*RPI/3
    87   ENDDO
    88 
    89   DO j=1, nbtr_bin
    90   DO i=1, nbtr_bin
    91    Vij(i,j)= V(i)+V(j)
    92   ENDDO
    93   ENDDO
    94 
     87! ff(i,j,k): Volume fraction of Vi,j that is partitioned to each model bin k
     88! just need to be calculated in model initialization because mdw(:) size is fixed
     89! no need to recalculate radius, Vdry, Vij, and ff every timestep because it is for 
     90! dry aerosols
     91  DO i=1, nbtr_bin
     92     radiusdry(i)=mdw(i)/2.
     93     Vdry(i)=radiusdry(i)**3.  !neglecting factor 4*RPI/3
     94     Vwet(i)=0.0
     95  ENDDO
     96
     97  DO j=1, nbtr_bin
     98     DO i=1, nbtr_bin
     99        Vij(i,j)= Vdry(i)+Vdry(j)
     100     ENDDO
     101  ENDDO
     102 
    95103!--pre-compute the f(i,j,k) from Jacobson equation 13
    96104  ff=0.0
     
    100108    IF (k.EQ.1) THEN
    101109      ff(i,j,k)= 0.0
    102     ELSEIF (k.GT.1.AND.V(k-1).LT.Vij(i,j).AND.Vij(i,j).LT.V(k)) THEN
     110    ELSEIF (k.GT.1.AND.Vdry(k-1).LT.Vij(i,j).AND.Vij(i,j).LT.Vdry(k)) THEN
    103111      ff(i,j,k)= 1.-ff(i,j,k-1)
    104112    ELSEIF (k.EQ.nbtr_bin) THEN
    105       IF (Vij(i,j).GE.v(k)) THEN
     113      IF (Vij(i,j).GE.Vdry(k)) THEN
    106114        ff(i,j,k)= 1.
    107115      ELSE
    108116        ff(i,j,k)= 0.0
    109117      ENDIF
    110     ELSEIF (k.LE.(nbtr_bin-1).AND.V(k).LE.Vij(i,j).AND.Vij(i,j).LT.V(k+1)) THEN
    111       ff(i,j,k)= V(k)/Vij(i,j)*(V(k+1)-Vij(i,j))/(V(k+1)-V(k))
     118    ELSEIF (k.LE.(nbtr_bin-1).AND.Vdry(k).LE.Vij(i,j).AND.Vij(i,j).LT.Vdry(k+1)) THEN
     119      ff(i,j,k)= Vdry(k)/Vij(i,j)*(Vdry(k+1)-Vij(i,j))/(Vdry(k+1)-Vdry(k))
    112120    ENDIF
    113121  ENDDO
    114122  ENDDO
    115123  ENDDO
    116 
     124! End of just need to be calculated at initialization because mdw(:) size is fixed
     125 
    117126  DO ilon=1, klon
    118127  DO ilev=1, klev
     
    120129  IF (is_strato(ilon,ilev)) THEN
    121130  !compute actual wet particle radius & volume for every grid box
    122   DO i=1, nbtr_bin
    123    radius(i)=f_r_wet(ilon,ilev)*mdw(i)/2.
    124    V(i)= radius(i)**3.  !neglecting factor 4*RPI/3
    125   ENDDO
    126 
     131  IF(flag_new_strat_compo) THEN
     132     DO i=1, nbtr_bin
     133        radiuswet(i)=f_r_wetB(ilon,ilev,i)*mdw(i)/2.
     134        Vwet(i)= radiuswet(i)**3.  !neglecting factor 4*RPI/3
     135!!      Vwet(i)= Vdry(i)*(f_r_wetB(ilon,ilev,i)**3)
     136     ENDDO
     137  ELSE
     138     DO i=1, nbtr_bin
     139        radiuswet(i)=f_r_wet(ilon,ilev)*mdw(i)/2.
     140        Vwet(i)= radiuswet(i)**3.  !neglecting factor 4*RPI/3
     141!!      Vwet(i)= Vdry(i)*(f_r_wet(ilon,ilev)**3)
     142     ENDDO
     143  ENDIF
     144 
    127145!--Calculations for the coagulation kernel---------------------------------------------------------
    128146
     
    150168  Di=0.0
    151169  DO i=1, nbtr_bin
    152    Kn(i)=mnfrpth/radius(i)
    153    Di(i)=RKBOL*t_seri(ilon,ilev)/(6.*RPI*radius(i)*eta)*(1.+Kn(i)*(1.249+0.42*exp(-0.87/Kn(i))))
     170      Kn(i)=mnfrpth/radiuswet(i)
     171      Di(i)=RKBOL*t_seri(ilon,ilev)/(6.*RPI*radiuswet(i)*eta)*(1.+Kn(i)*(1.249+0.42*exp(-0.87/Kn(i))))
    154172  ENDDO
    155173
    156174!--pre-compute the thermal velocity of a particle thvelpar(i) from equation 20
    157175  thvelpar=0.0
    158   DO i=1, nbtr_bin
    159    m_par(i)=4./3.*RPI*radius(i)**3.*DENSO4(ilon,ilev)*1000.
    160    thvelpar(i)=sqrt(8.*RKBOL*t_seri(ilon,ilev)/(RPI*m_par(i)))
    161   ENDDO
     176  IF(flag_new_strat_compo) THEN
     177     DO i=1, nbtr_bin
     178        m_par(i)=4./3.*RPI*radiuswet(i)**3.*DENSO4B(ilon,ilev,i)*1000.
     179        thvelpar(i)=sqrt(8.*RKBOL*t_seri(ilon,ilev)/(RPI*m_par(i)))
     180     ENDDO
     181  ELSE
     182     DO i=1, nbtr_bin
     183        m_par(i)=4./3.*RPI*radiuswet(i)**3.*DENSO4(ilon,ilev)*1000.
     184        thvelpar(i)=sqrt(8.*RKBOL*t_seri(ilon,ilev)/(RPI*m_par(i)))
     185     ENDDO
     186  ENDIF
    162187
    163188!--pre-compute the particle mean free path mfppar(i) from equation 22
     
    171196  delta=0.0
    172197  DO i=1, nbtr_bin
    173    delta(i)=((2.*radius(i)+mfppar(i))**3.-(4.*radius(i)**2.+mfppar(i)**2.)**1.5)/ &
    174            & (6.*radius(i)*mfppar(i))-2.*radius(i)
    175   ENDDO
    176 
     198      delta(i)=((2.*radiuswet(i)+mfppar(i))**3.-(4.*radiuswet(i)**2.+mfppar(i)**2.)**1.5)/ &
     199           & (6.*radiuswet(i)*mfppar(i))-2.*radiuswet(i)
     200  ENDDO
     201
     202!   beta(i,j): coagulation kernel (rate coefficient) of 2 colliding particles i,j
    177203!--pre-compute the beta(i,j) from equation 17 in Jacobson
    178204  num=0.0
     
    180206  DO i=1, nbtr_bin
    181207!
    182    num=4.*RPI*(radius(i)+radius(j))*(Di(i)+Di(j))
    183    denom=(radius(i)+radius(j))/(radius(i)+radius(j)+sqrt(delta(i)**2.+delta(j)**2.))+ &
    184         & 4.*(Di(i)+Di(j))/(sqrt(thvelpar(i)**2.+thvelpar(j)**2.)*(radius(i)+radius(j)))
    185    beta(i,j)=num/denom
     208     num=4.*RPI*(radiuswet(i)+radiuswet(j))*(Di(i)+Di(j))
     209     denom=(radiuswet(i)+radiuswet(j))/(radiuswet(i)+radiuswet(j)+sqrt(delta(i)**2.+delta(j)**2.))+ &
     210          & 4.*(Di(i)+Di(j))/(sqrt(thvelpar(i)**2.+thvelpar(j)**2.)*(radiuswet(i)+radiuswet(j)))
     211     beta(i,j)=num/denom
    186212!
    187213!--compute enhancement factor due to van der Waals forces
    188214   IF (ok_vdw .EQ. 0) THEN      !--no enhancement factor
    189      Evdw=1.0
     215      Evdw=1.0
    190216   ELSEIF (ok_vdw .EQ. 1) THEN  !--E(0) case
    191      AvdWi = AvdW/(RKBOL*t_seri(ilon,ilev))*(4.*radius(i)*radius(j))/(radius(i)+radius(j))**2.
    192      xvdW = LOG(1.+AvdWi)
    193      EvdW = 1. + avdW1*xvdW + avdW3*xvdW**3
     217      AvdWi = AvdW/(RKBOL*t_seri(ilon,ilev))*(4.*radiuswet(i)*radiuswet(j))/(radiuswet(i)+radiuswet(j))**2.
     218      xvdW = LOG(1.+AvdWi)
     219      EvdW = 1. + avdW1*xvdW + avdW3*xvdW**3
    194220   ELSEIF (ok_vdw .EQ. 2) THEN  !--E(infinity) case
    195      AvdWi = AvdW/(RKBOL*t_seri(ilon,ilev))*(4.*radius(i)*radius(j))/(radius(i)+radius(j))**2.
    196      xvdW = LOG(1.+AvdWi)
    197      EvdW = 1. + SQRT(AvdWi/3.)/(1.+bvdW0*SQRT(AvdWi)) + bvdW1*xvdW + bvdW3*xvdW**3.
     221      AvdWi = AvdW/(RKBOL*t_seri(ilon,ilev))*(4.*radiuswet(i)*radiuswet(j))/(radiuswet(i)+radiuswet(j))**2.
     222      xvdW = LOG(1.+AvdWi)
     223      EvdW = 1. + SQRT(AvdWi/3.)/(1.+bvdW0*SQRT(AvdWi)) + bvdW1*xvdW + bvdW3*xvdW**3.
    198224   ENDIF
    199225!
     
    209235  denom=0.0
    210236  DO j=1, nbtr_bin
    211   denom=denom+(1.-ff(k,j,k))*beta(k,j)*tr_t(ilon,ilev,j)
     237     !    fraction of coagulation of k and j that is not giving k
     238     denom=denom+(1.-ff(k,j,k))*beta(k,j)*tr_t(ilon,ilev,j)
    212239  ENDDO
    213240
     
    219246    num=0.0
    220247    DO j=1, k
    221     numi=0.0
    222     DO i=1, k-1
    223     numi=numi+ff(i,j,k)*beta(i,j)*V(i)*tr_tp1(ilon,ilev,i)*tr_t(ilon,ilev,j)
     248       numi=0.0
     249       DO i=1, k-1
     250!           
     251!           see Jacobson: " In order to conserve volume and volume concentration (which
     252!           coagulation physically does) while giving up some accuracy in number concentration"
     253!
     254!           Coagulation of i and j giving k
     255!           with V(i) and then V(j) because it considers i,j and j,i with the double loop
     256!
     257!           BUT WHY WET VOLUME V(i) in old STRATAER? tracers are already dry aerosols and coagulation
     258!           kernel beta(i,j) accounts for wet aerosols -> reply below
     259!
     260!             numi=numi+ff(i,j,k)*beta(i,j)*V(i)*tr_tp1(ilon,ilev,i)*tr_t(ilon,ilev,j)
     261            numi=numi+ff(i,j,k)*beta(i,j)*Vdry(i)*tr_tp1(ilon,ilev,i)*tr_t(ilon,ilev,j)
     262       ENDDO
     263       num=num+numi
    224264    ENDDO
    225     num=num+numi
    226     ENDDO
    227265
    228266!--calculate new concentration of other bins
    229     tr_tp1(ilon,ilev,k)=(V(k)*tr_t(ilon,ilev,k)+pdtcoag*num)/(1.+pdtcoag*denom)/V(k)
     267!      tr_tp1(ilon,ilev,k)=(V(k)*tr_t(ilon,ilev,k)+pdtcoag*num)/( (1.+pdtcoag*denom)*V(k) )
     268    tr_tp1(ilon,ilev,k)=(Vdry(k)*tr_t(ilon,ilev,k)+pdtcoag*num)/( (1.+pdtcoag*denom)*Vdry(k) )
     269!
     270!       In constant composition (no dependency on aerosol size because no kelvin effect)
     271!       V(l)= (f_r_wet(ilon,ilev)**3)*((mdw(l)/2.)**3) = (f_r_wet(ilon,ilev)**3)*Vdry(i)
     272!       so numi and num are proportional (f_r_wet(ilon,ilev)**3)
     273!       and so
     274!        tr_tp1(ilon,ilev,k)=(V(k)*tr_t(ilon,ilev,k)+pdtcoag*num)/( (1.+pdtcoag*denom)*V(k) )
     275!                     =(Vdry(k)*tr_t(ilon,ilev,k)+pdtcoag*num_dry)/( (1.+pdtcoag*denom)*Vdry(k) )
     276!          with num_dry=...beta(i,j)*Vdry(i)*....
     277!       so in old STRATAER (.not.flag_new_strat_compo), it was correct
    230278  ENDIF
    231279
     
    234282!--convert tracer concentration back from [number/m3] to [number/KgA] and write into tr_seri
    235283  DO i=1, nbtr_bin
    236    tr_seri(ilon,ilev,i+nbtr_sulgas) = tr_tp1(ilon,ilev,i) / zrho
     284     tr_seri(ilon,ilev,i+nbtr_sulgas) = tr_tp1(ilon,ilev,i) / zrho
    237285  ENDDO
    238286
     
    240288  ENDDO !--end of loop klev
    241289  ENDDO !--end of loop klon
     290! *********************************************
    242291
    243292END SUBROUTINE COAGULATE
  • LMDZ6/branches/cirrus/libf/phylmd/StratAer/cond_evap_tstep_mod.F90

    r3677 r5202  
    99CONTAINS
    1010
     11      SUBROUTINE condens_evapor_rate_kelvin(R2SO4G,t_seri,pplay,R2SO4, &
     12          & DENSO4,f_r_wet,R2SO4ik,DENSO4ik,f_r_wetik,FL,ASO4,DNDR)
     13!
     14!     INPUT:
     15!     R2SO4G: number density of gaseous H2SO4 [molecules/cm3]
     16!     t_seri: temperature (K)
     17!     pplay: pressure (Pa)
     18!     R2SO4: aerosol H2SO4 weight fraction (percent) - flat surface (does not depend on aerosol size)
     19!     DENSO4: aerosol density (gr/cm3)
     20!     f_r_wet: factor for converting dry to wet radius
     21!        assuming 'flat surface' composition (does not depend on aerosol size)
     22!     variables that depends on aerosol size because of Kelvin effect
     23!     R2SO4Gik: number density of gaseous H2SO4 [molecules/cm3] - depends on aerosol size
     24!     DENSO4ik: aerosol density (gr/cm3) - depends on aerosol size
     25!     f_r_wetik: factor for converting dry to wet radius - depends on aerosol size
     26!     RRSI: radius [cm]
     27
     28      USE aerophys
     29      USE infotrac_phy
     30      USE YOMCST, ONLY : RPI
     31      USE sulfate_aer_mod, ONLY : wph2so4, surftension, solh2so4, rpmvh2so4
     32      USE strataer_local_var_mod, ONLY : ALPH2SO4, RRSI
     33     
     34      IMPLICIT NONE
     35     
     36      REAL, PARAMETER :: third=1./3.
     37     
     38      ! input variables
     39      REAL            :: R2SO4G !H2SO4 number density [molecules/cm3]
     40      REAL            :: t_seri
     41      REAL            :: pplay
     42      REAL            :: R2SO4
     43      REAL            :: DENSO4
     44      REAL            :: f_r_wet
     45      REAL            :: R2SO4ik(nbtr_bin), DENSO4ik(nbtr_bin), f_r_wetik(nbtr_bin)
     46     
     47      ! output variables
     48      REAL            :: FL(nbtr_bin)
     49      REAL            :: ASO4(nbtr_bin)
     50      REAL            :: DNDR(nbtr_bin)
     51     
     52      ! local variables
     53      INTEGER            :: IK
     54      REAL            :: ALPHA,CST
     55      REAL            :: WH2(nbtr_bin)
     56      REAL            :: RP,VTK,AA,FL1,RKNUD
     57      REAL            :: DND
     58      REAL            :: ATOT,AH2O
     59      REAL            :: RRSI_wet(nbtr_bin)
     60      REAL            :: FPATH, WPP, XA, FKELVIN
     61      REAL            :: surtens, mvh2so4, temp
     62     
     63! ///    MOLEC CONDENSATION GROWTH (DUE TO CHANGES IN H2SO4 AND SO H2O)
     64!    ------------------------------------------------------------------
     65!                                  EXCEPT CN
     66!       RK:H2SO4 WEIGHT PERCENT DOESN'T CHANGE
     67!     BE CAREFUL,H2SO4 WEIGHT PERCENTAGE
     68
     69!                   MOLECULAR ACCOMODATION OF H2SO4
     70!     H2SO4 accommodation  coefficient [condensation/evaporation]
     71      ALPHA = ALPH2SO4
     72!      FPLAIR=(2.281238E-5)*TAIR/PAIR
     73!     1.E2 (m to cm),
     74      CST=1.E2*2.281238E-5
     75!     same expression as in coagulate
     76!     in coagulate: mean free path of air (Pruppacher and Klett, 2010, p.417) [m]
     77!     mnfrpth=6.6E-8*(1.01325E+5/pplay(ilon,ilev))*(t_seri(ilon,ilev)/293.15)
     78!     mnfrpth=2.28E-5*t_seri/pplay
     79     
     80      temp = min( max(t_seri, 190.), 300.) ! 190K <= temp <= 300K
     81     
     82      RRSI_wet(:)=RRSI(:)*f_r_wetik(:)
     83
     84!     Pruppa and Klett
     85      FPATH=CST*t_seri/pplay
     86   
     87!     H2SO4 mass fraction in aerosol
     88      WH2(:)=R2SO4ik(:)*1.0E-2
     89
     90!                               ACTIVITY COEFFICIENT(SEE GIAUQUE,1951)
     91!                               AYERS ET AL (1980)
     92!                                  (MU-MU0)
     93!      RP=-10156.0/t_seri +16.259-(ACTSO4*4.184)/(8.31441*t_seri)
     94!                                  DROPLET H2SO4 PRESSURE IN DYN.CM-2
     95!      RP=EXP(RP)*1.01325E6/0.086
     96!!      RP=EXP(RP)*1.01325E6
     97!                                  H2SO4 NUMBER DENSITY NEAR DROPLET
     98
     99!      DND=RP*6.02E23/(8.31E7*t_seri)
     100
     101!                                 KELVIN EFFECT FACTOR
     102!CK 20160613: bug fix, removed factor 250 (from original code by S. Bekki)
     103!!      AA =2.0*MH2O*72.0/(DENSO4*BOLZ*t_seri*250.0)
     104!      AA =2.0*MH2O*72.0/(DENSO4*BOLZ*t_seri)
     105
     106!                                  MEAN KINETIC VELOCITY
     107!     DYN*CM*K/(K*GR)=(CM/SEC2)*CM
     108!                                  IN CM/SEC
     109      VTK=SQRT(8.0*BOLZ*t_seri/(RPI*MH2SO4))
     110!                                 KELVIN EFFECT FACTOR
     111
     112!     Loop on bin radius (RRSI in cm)
     113      DO IK=1,nbtr_bin
     114
     115      IF(R2SO4ik(IK) > 0.0) THEN
     116
     117!       h2so4 mass fraction (0<wpp<1)
     118        wpp=R2SO4ik(IK)*1.e-2   
     119        xa=18.*wpp/(18.*wpp+98.*(1.-wpp))
     120!       equilibrium h2so4 number density over H2SO4/H2O solution (molec/cm3)
     121        DND=solh2so4(t_seri,xa)
     122!          KELVIN EFFECT: 
     123!       surface tension (mN/m=1.e-3.kg/s2) = f(T,h2so4 mole fraction)
     124        surtens=surftension(temp,xa)
     125!       partial molar volume of h2so4 (cm3.mol-1 =1.e-6.m3.mol-1)
     126        mvh2so4= rpmvh2so4(temp,R2SO4ik(IK))
     127!       Kelvin factor (MKS)
     128        fkelvin=exp( 2.*1.e-3*surtens*1.e-6*mvh2so4/ (1.e-2*RRSI_wet(IK)*rgas*temp) )
     129!                             
     130        DNDR(IK) =DND*fkelvin
     131
     132        FL1=RPI*ALPHA*VTK*(R2SO4G-DNDR(IK))
     133
     134!       TURCO(1979) FOR HNO3:ALH2SO4 CONDENSATION= ALH2SO4 EVAPORATION
     135!       RPI*R2*VTK IS EQUIVALENT TO DIFFUSION COEFFICIENT
     136!       EXTENSION OF THE RELATION FOR DIFFUSION KINETICS
     137!       KNUDSEN NUMBER FPATH/RRSI
     138!       NEW VERSION (SEE NOTES)
     139        RKNUD=FPATH/RRSI_wet(IK)
     140!       SENFELD
     141        FL(IK)=FL1*RRSI_wet(IK)**2*( 1.0 +RKNUD ) &
     142     &     /( 1.0 +ALPHA/(2.0*RKNUD) +RKNUD )
     143!       TURCO
     144!        RL= (4.0/3.0 +0.71/RKNUD)/(1.0+1.0/RKNUD)
     145!     *         +4.0*(1.0-ALPHA)/(3.0*ALPHA)
     146!        FL=FL1*RRSI(IK)*RRSI(IK)
     147!     *         /( (3.0*ALPHA/4.0)*(1.0/RKNUD+RL*ALPHA) )
     148
     149!                         INITIAL NUMBER OF H2SO4 MOLEC OF 1 DROPLET
     150        ATOT=4.0*RPI*DENSO4ik(IK)*(RRSI_wet(IK)**3)/3.0 !attention: g and cm
     151        ASO4(IK)=WH2(IK)*ATOT/MH2SO4 !attention: g
     152!        ATOT=4.0*RPI*dens_aer(I,J)/1000.*(RRSI(IK)**3)/3.0
     153!        ASO4=mfrac_H2SO4*ATOT/MH2SO4
     154!                        INITIAL NUMBER OF H2O MOLEC OF 1 DROPLET
     155        AH2O=(1.0-WH2(IK))*ATOT/MH2O !attention: g
     156
     157!       CHANGE OF THE NUMBER OF H2SO4 MOLEC OF 1 DROPLET DURING DT
     158!       IT IS FOR KEM BUT THERE ARE OTHER WAYS
     159
     160      ENDIF 
     161
     162      ENDDO !loop over bins
     163
     164      END SUBROUTINE condens_evapor_rate_kelvin
     165     
     166!********************************************************************
    11167      SUBROUTINE condens_evapor_rate(R2SO4G,t_seri,pplay,ACTSO4,R2SO4, &
    12                    & DENSO4,f_r_wet,RRSI,Vbin,FL,ASO4,DNDR)
     168                   & DENSO4,f_r_wet,FL,ASO4,DNDR)
    13169!
    14170!     INPUT:
     
    22178      USE infotrac_phy
    23179      USE YOMCST, ONLY : RPI
     180      USE strataer_local_var_mod, ONLY : ALPH2SO4, RRSI
    24181
    25182      IMPLICIT NONE
     
    33190      REAL DENSO4
    34191      REAL f_r_wet
    35       REAL RRSI(nbtr_bin)
    36       REAL Vbin(nbtr_bin)
    37 
     192     
    38193      ! output variables
    39194      REAL FL(nbtr_bin)
     
    48203      REAL ATOT,AH2O
    49204      REAL RRSI_wet(nbtr_bin)
    50       REAL Vbin_wet(nbtr_bin)
    51       REAL MH2SO4,MH2O,BOLZ,FPATH
     205      REAL FPATH
    52206
    53207! ///    MOLEC CONDENSATION GROWTH (DUE TO CHANGES IN H2SO4 AND SO H2O)
     
    57211!     BE CAREFUL,H2SO4 WEIGHT PERCENTAGE
    58212
    59 !                   WEIGHT OF 1 MOLEC IN G
    60       MH2O  =1000.*mH2Omol !18.016*1.66E-24
    61       MH2SO4=1000.*mH2SO4mol !98.082*1.66E-24
    62 !                   BOLTZMANN CONSTANTE IN DYN.CM/K
    63       BOLZ  =1.381E-16
    64213!                   MOLECULAR ACCOMODATION OF H2SO4
    65 !     raes and van dingen
    66       ALPHA =0.1   
     214!     H2SO4 accommodation coefficient [condensation/evaporation]
     215      ALPHA = ALPH2SO4
    67216!      FPLAIR=(2.281238E-5)*TAIR/PAIR
    68217!     1.E2 (m to cm),
    69218      CST=1.E2*2.281238E-5
    70219
    71       ! compute local wet particle radius and volume
     220      ! compute local wet particle radius [cm]
    72221      RRSI_wet(:)=RRSI(:)*f_r_wet
    73       Vbin_wet(:)=Vbin(:)*f_r_wet**3
    74 
     222     
    75223!     Pruppa and Klett
    76224      FPATH=CST*t_seri/pplay
     
    138286
    139287!********************************************************************
    140       SUBROUTINE cond_evap_part(dt,FL,ASO4,f_r_wet,RRSI,Vbin,tr_seri)
     288      SUBROUTINE condens_evapor_part(dt,FL,ASO4,f_r_wet,tr_seri)
    141289
    142290      USE aerophys
    143291      USE infotrac_phy
    144292      USE YOMCST, ONLY : RPI
    145 
     293      USE strataer_local_var_mod, ONLY : RRSI,Vbin
     294     
    146295      IMPLICIT NONE
    147296
     
    151300      REAL ASO4(nbtr_bin)
    152301      REAL f_r_wet
    153       REAL RRSI(nbtr_bin)
    154       REAL Vbin(nbtr_bin)
    155 
     302     
    156303      ! output variables
    157304      REAL tr_seri(nbtr)
    158 
     305     
    159306      ! local variables
    160307      REAL tr_seri_new(nbtr)
     
    211358      tr_seri(:)=tr_seri_new(:)
    212359
    213       END SUBROUTINE cond_evap_part
     360      END SUBROUTINE condens_evapor_part
    214361
    215362END MODULE cond_evap_tstep_mod
  • LMDZ6/branches/cirrus/libf/phylmd/StratAer/micphy_tstep.F90

    r4601 r5202  
    88  USE aerophys
    99  USE infotrac_phy, ONLY : nbtr_bin, nbtr_sulgas, nbtr, id_H2SO4_strat
    10   USE phys_local_var_mod, ONLY: mdw, budg_3D_nucl, budg_3D_cond_evap, budg_h2so4_to_part, R2SO4, DENSO4, f_r_wet
     10  USE phys_local_var_mod, ONLY: mdw, budg_3D_nucl, budg_3D_cond_evap, budg_h2so4_to_part, R2SO4, DENSO4, &
     11       f_r_wet, R2SO4B, DENSO4B, f_r_wetB
    1112  USE nucleation_tstep_mod
    1213  USE cond_evap_tstep_mod
     
    1415  USE YOMCST, ONLY : RPI, RD, RG
    1516  USE print_control_mod, ONLY: lunout
    16   USE strataer_local_var_mod
     17  USE strataer_local_var_mod ! contains also RRSI and Vbin
    1718 
    1819  IMPLICIT NONE
     
    3536  REAL                      :: ntot !total number of molecules in the critical cluster (ntot>4)
    3637  REAL                      :: x    ! molefraction of H2SO4 in the critical cluster     
    37   REAL Vbin(nbtr_bin)
    3838  REAL a_xm, b_xm, c_xm
    3939  REAL PDT, dt
    4040  REAL H2SO4_init
    4141  REAL ACTSO4(klon,klev)
    42   REAL RRSI(nbtr_bin)
    4342  REAL nucl_rate
    4443  REAL cond_evap_rate
     
    4847  REAL DNDR(nbtr_bin)
    4948  REAL H2SO4_sat
    50 
    51   DO it=1,nbtr_bin
    52     Vbin(it)=4.0*RPI*((mdw(it)/2.)**3)/3.0
    53   ENDDO
    54 
     49  REAL R2SO4ik(nbtr_bin), DENSO4ik(nbtr_bin), f_r_wetik(nbtr_bin)
     50 
    5551  !coefficients for H2SO4 density parametrization used for nucleation if ntot<4
    5652  a_xm = 0.7681724 + 1.*(2.1847140 + 1.*(7.1630022 + 1.*(-44.31447 + &
     
    6157       & 1.*(7.990811e-4 + 1.*(-7.458060e-4 + 1.*2.58139e-4 )))))
    6258
    63   ! STRAACT (R2SO4, t_seri -> H2SO4 activity coefficient (ACTSO4)) for cond/evap
    64   CALL STRAACT(ACTSO4)
    65 
    66   ! compute particle radius in cm RRSI from diameter in m
    67   DO it=1,nbtr_bin
    68     RRSI(it)=mdw(it)/2.*100.
    69   ENDDO
    70 
     59  IF(.not.flag_new_strat_compo) THEN
     60     ! STRAACT (R2SO4, t_seri -> H2SO4 activity coefficient (ACTSO4)) for cond/evap
     61     CALL STRAACT(ACTSO4)
     62  ENDIF
     63 
    7164  DO ilon=1, klon
    7265!
     
    10497      ENDIF
    10598      ! compute cond/evap rate in kg(H2SO4)/kgA/s
    106       CALL condens_evapor_rate(rhoa,t_seri(ilon,ilev),pplay(ilon,ilev), &
    107              & ACTSO4(ilon,ilev),R2SO4(ilon,ilev),DENSO4(ilon,ilev),f_r_wet(ilon,ilev), &
    108              & RRSI,Vbin,FL,ASO4,DNDR)
     99      IF(flag_new_strat_compo) THEN
     100         R2SO4ik(:)   = R2SO4B(ilon,ilev,:)
     101         DENSO4ik(:)  = DENSO4B(ilon,ilev,:)
     102         f_r_wetik(:) = f_r_wetB(ilon,ilev,:)
     103         CALL condens_evapor_rate_kelvin(rhoa,t_seri(ilon,ilev),pplay(ilon,ilev), &
     104              & R2SO4(ilon,ilev),DENSO4(ilon,ilev),f_r_wet(ilon,ilev), &
     105              & R2SO4ik,DENSO4ik,f_r_wetik,FL,ASO4,DNDR)
     106      ELSE
     107         CALL condens_evapor_rate(rhoa,t_seri(ilon,ilev),pplay(ilon,ilev), &
     108              & ACTSO4(ilon,ilev),R2SO4(ilon,ilev),DENSO4(ilon,ilev),f_r_wet(ilon,ilev), &
     109              & FL,ASO4,DNDR)
     110      ENDIF
    109111      ! Compute H2SO4 saturate vapor for big particules
    110112      H2SO4_sat = DNDR(nbtr_bin)/(pplay(ilon,ilev)/t_seri(ilon,ilev)/RD/1.E6/mH2SO4mol)
     
    127129      tr_seri(ilon,ilev,id_H2SO4_strat)=MAX(0.,tr_seri(ilon,ilev,id_H2SO4_strat)-(nucl_rate+cond_evap_rate)*dt)
    128130      ! apply cond to bins
    129       CALL cond_evap_part(dt,FL,ASO4,f_r_wet(ilon,ilev),RRSI,Vbin,tr_seri(ilon,ilev,:))
     131      CALL condens_evapor_part(dt,FL,ASO4,f_r_wet(ilon,ilev),tr_seri(ilon,ilev,:))
    130132      ! apply nucl. to bins
    131       CALL nucleation_part(nucl_rate,ntot,x,dt,Vbin,tr_seri(ilon,ilev,:))
     133      CALL nucleation_part(nucl_rate,ntot,x,dt,tr_seri(ilon,ilev,:))
    132134      ! compute fluxes as diagnostic in [kg(S)/m2/layer/s] (now - for evap and + for cond)
    133135      budg_3D_cond_evap(ilon,ilev)=budg_3D_cond_evap(ilon,ilev)+mSatom/mH2SO4mol &
     
    142144        & *pplay(ilon,ilev)/t_seri(ilon,ilev)/RD/1.E6/mH2SO4mol
    143145    ! compute cond/evap rate in kg(H2SO4)/kgA/s (now only evap for pdtphys)
    144     CALL condens_evapor_rate(rhoa,t_seri(ilon,ilev),pplay(ilon,ilev), &
    145            & ACTSO4(ilon,ilev),R2SO4(ilon,ilev),DENSO4(ilon,ilev),f_r_wet(ilon,ilev), &
    146            & RRSI,Vbin,FL,ASO4,DNDR)
     146    IF(flag_new_strat_compo) THEN
     147       CALL condens_evapor_rate_kelvin(rhoa,t_seri(ilon,ilev),pplay(ilon,ilev), &
     148            & R2SO4(ilon,ilev),DENSO4(ilon,ilev),f_r_wet(ilon,ilev), &
     149            & R2SO4ik,DENSO4ik,f_r_wetik,FL,ASO4,DNDR)
     150    ELSE
     151       CALL condens_evapor_rate(rhoa,t_seri(ilon,ilev),pplay(ilon,ilev), &
     152            & ACTSO4(ilon,ilev),R2SO4(ilon,ilev),DENSO4(ilon,ilev),f_r_wet(ilon,ilev), &
     153            & FL,ASO4,DNDR)
     154    ENDIF
    147155    ! limit evaporation (negative FL) over one physics time step to H2SO4 content of the droplet
    148156    DO it=1,nbtr_bin
     
    159167    tr_seri(ilon,ilev,id_H2SO4_strat)=MAX(0.,tr_seri(ilon,ilev,id_H2SO4_strat)-evap_rate*pdtphys)
    160168    ! apply evap to bins
    161     CALL cond_evap_part(pdtphys,FL,ASO4,f_r_wet(ilon,ilev),RRSI,Vbin,tr_seri(ilon,ilev,:))
     169    CALL condens_evapor_part(pdtphys,FL,ASO4,f_r_wet(ilon,ilev),tr_seri(ilon,ilev,:))
    162170    ! compute fluxes as diagnostic in [kg(S)/m2/layer/s] (now - for evap and + for cond)
    163171    budg_3D_cond_evap(ilon,ilev)=budg_3D_cond_evap(ilon,ilev)+mSatom/mH2SO4mol &
  • LMDZ6/branches/cirrus/libf/phylmd/StratAer/miecalc_aer.F90

    r3677 r5202  
    1616
    1717  USE phys_local_var_mod, ONLY: tr_seri, mdw, alpha_bin, piz_bin, cg_bin
    18   USE aerophys
     18  USE aerophys, ONLY: dens_aer_dry, dens_aer_ref, V_rat
    1919  USE aero_mod
    2020  USE infotrac_phy, ONLY : nbtr, nbtr_bin, nbtr_sulgas, id_SO2_strat
     
    226226    40000.000,    0.2500,   1.48400,   1.0000E-08, &
    227227    50000.000,    0.2000,   1.49800,   1.0000E-08 /), (/nb_lambda_h2so4,4/), order=(/2,1/) )
    228 
    229   !--initialising dry diameters to geometrically spaced mass/volume (see Jacobson 1994)
    230     mdw(1)=mdwmin
    231     IF (V_rat.LT.1.62) THEN ! compensate for dip in second bin for lower volume ratio
    232       mdw(2)=mdw(1)*2.**(1./3.)
    233       DO it=3, nbtr_bin
    234         mdw(it)=mdw(it-1)*V_rat**(1./3.)
    235       ENDDO
    236     ELSE
    237       DO it=2, nbtr_bin
    238         mdw(it)=mdw(it-1)*V_rat**(1./3.)
    239       ENDDO
    240     ENDIF
    241     WRITE(lunout,*) 'init mdw=', mdw
    242 
     228     
    243229    !--compute particle radius for a composition of 75% H2SO4 / 25% H2O at T=293K
    244230    DO bin_number=1, nbtr_bin
  • LMDZ6/branches/cirrus/libf/phylmd/StratAer/nucleation_tstep_mod.F90

    r4912 r5202  
    7070!--------------------------------------------------------------------------------------------------
    7171
    72 SUBROUTINE nucleation_part(nucl_rate,ntot,x,dt,Vbin,tr_seri)
     72SUBROUTINE nucleation_part(nucl_rate,ntot,x,dt,tr_seri)
    7373
    7474  USE aerophys
    7575  USE infotrac_phy
    76 
     76  USE strataer_local_var_mod, ONLY : Vbin
     77 
    7778  IMPLICIT NONE
    7879
     
    8283  REAL x    ! mole raction of H2SO4 in the critical cluster
    8384  REAL dt
    84   REAL Vbin(nbtr_bin)
    85 
     85 
    8686  ! output variable
    8787  REAL tr_seri(nbtr)
  • LMDZ6/branches/cirrus/libf/phylmd/StratAer/strataer_local_var_mod.F90

    r4767 r5202  
    5151 
    5252  !============= NUCLEATION VARS =============
     53  ! MOLECULAR ACCOMODATION OF H2SO4 (Raes and Van Dingen)
     54  REAL,SAVE    :: ALPH2SO4               ! H2SO4 accommodation  coefficient [condensation/evaporation]
     55  !$OMP THREADPRIVATE(ALPH2SO4)
     56 
    5357  ! flag to constraint nucleation rate in a lat/pres box
    5458  LOGICAL,SAVE :: flag_nuc_rate_box      ! Nucleation rate limit or not to a lat/pres
     
    6468  INTEGER,SAVE :: flh2o  ! ds stratemit : flh2o =0 (tr_seri), flh2o=1 (dq)
    6569  !$OMP THREADPRIVATE(flh2o)
    66 !  REAL,ALLOCATABLE,SAVE    :: d_q_emiss(:,:)
    67 !  !$OMP THREADPRIVATE(d_q_emiss)
    6870 
    6971  REAL,ALLOCATABLE,SAVE    :: budg_emi(:,:)            !DIMENSION(klon,n)
     
    144146  !$OMP THREADPRIVATE(day_emit_roc)
    145147 
     148  REAL,ALLOCATABLE,SAVE    :: RRSI(:) ! radius [cm] for each aerosol size
     149  REAL,ALLOCATABLE,SAVE    :: Vbin(:) ! volume [m3] for each aerosol size 
     150  !$OMP THREADPRIVATE(RRSI, Vbin)
    146151  REAL,SAVE    :: dlat, dlon             ! delta latitude and d longitude of grid in degree
    147152  !$OMP THREADPRIVATE(dlat, dlon)
     
    153158    USE print_control_mod, ONLY : lunout
    154159    USE mod_phys_lmdz_para, ONLY : is_master
    155     USE infotrac_phy, ONLY: id_OCS_strat,id_SO2_strat,id_H2SO4_strat,nbtr_sulgas
     160    USE infotrac_phy, ONLY: id_OCS_strat,id_SO2_strat,id_H2SO4_strat,nbtr_sulgas,nbtr_bin
     161    USE phys_local_var_mod, ONLY : mdw
     162    USE aerophys, ONLY: mdwmin, V_rat
     163    USE YOMCST  , ONLY : RPI
     164   
     165    INTEGER :: it
    156166   
    157167    WRITE(lunout,*) 'IN STRATAER_LOCAL_VAR INIT WELCOME!'
     
    185195   
    186196    ! nuc init
     197    ALPH2SO4 = 0.1
    187198    flag_nuc_rate_box = .FALSE.
    188199    nuclat_min=0  ; nuclat_max=0
     
    238249    ENDIF ! if master
    239250   
     251    !--initialising dry diameters to geometrically spaced mass/volume (see Jacobson 1994)
     252    mdw(1)=mdwmin
     253    IF (V_rat.LT.1.62) THEN ! compensate for dip in second bin for lower volume ratio
     254       mdw(2)=mdw(1)*2.**(1./3.)
     255       DO it=3, nbtr_bin
     256          mdw(it)=mdw(it-1)*V_rat**(1./3.)
     257       ENDDO
     258    ELSE
     259       DO it=2, nbtr_bin
     260          mdw(it)=mdw(it-1)*V_rat**(1./3.)
     261       ENDDO
     262    ENDIF
     263    IF (is_master) WRITE(lunout,*) 'init mdw=', mdw
     264   
     265    !   compute particle radius RRSI [cm] and volume Vbin [m3] from diameter mdw [m]
     266    ALLOCATE(RRSI(nbtr_bin), Vbin(nbtr_bin))
     267   
     268    DO it=1,nbtr_bin
     269       !     [cm]
     270       RRSI(it)=mdw(it)/2.*100.
     271       !     [m3]
     272       Vbin(it)=4.0*RPI*((mdw(it)/2.)**3)/3.0
     273    ENDDO
     274   
     275    IF (is_master) THEN
     276       WRITE(lunout,*) 'init RRSI=', RRSI
     277       WRITE(lunout,*) 'init Vbin=', Vbin
     278    ENDIF
     279   
    240280    WRITE(lunout,*) 'IN STRATAER INIT END'
    241281   
  • LMDZ6/branches/cirrus/libf/phylmd/StratAer/strataer_nuc_mod.F90

    r4601 r5202  
    1313    USE print_control_mod, ONLY : lunout
    1414    USE mod_phys_lmdz_para, ONLY : is_master
    15     USE strataer_local_var_mod, ONLY: flag_nuc_rate_box,nuclat_min,nuclat_max,nucpres_min,nucpres_max
     15    USE strataer_local_var_mod, ONLY: ALPH2SO4,flag_nuc_rate_box,nuclat_min,nuclat_max, &
     16         nucpres_min,nucpres_max
    1617   
    1718    !Config Key  = flag_nuc_rate_box
     
    3031    CALL getin_p('nucpres_max',nucpres_max)
    3132   
     33    ! Read argument H2SO4 accommodation  coefficient [condensation/evaporation]
     34    CALL getin_p('alph2so4',ALPH2SO4)
     35   
    3236    !============= Print params =============
    3337    IF (is_master) THEN
     38       WRITE(lunout,*) 'IN STRATAER_NUC : ALPH2SO4 = ',alph2so4
    3439       WRITE(lunout,*) 'IN STRATAER_NUC : flag_nuc_rate_box = ',flag_nuc_rate_box
    3540       IF (flag_nuc_rate_box) THEN
  • LMDZ6/branches/cirrus/libf/phylmd/StratAer/sulfate_aer_mod.F90

    r4750 r5202  
    77
    88!*******************************************************************
    9   SUBROUTINE STRACOMP_BIN(sh,t_seri,pplay)
    10 !
    11 !   Aerosol H2SO4 weight fraction as a function of PH2O and temperature
    12 !   INPUT:
    13 !   sh: VMR of H2O
    14 !   t_seri: temperature (K)
    15 !   pplay: middle layer pression (Pa)
    16 !
    17 !   OUTPUT:
    18 !   R2SO4: aerosol H2SO4 weight fraction (percent)
     9      SUBROUTINE STRACOMP_KELVIN(sh,t_seri,pplay)
     10!
     11!     Aerosol H2SO4 weight fraction as a function of PH2O and temperature
     12!     INPUT:
     13!     sh: MMR of H2O
     14!     t_seri: temperature (K)
     15!     pplay: middle layer pression (Pa)
     16!
     17!     Modified in modules:
     18!     R2SO4: aerosol H2SO4 weight fraction (percent)
     19!     R2SO4B: aerosol H2SO4 weight fraction (percent) for each aerosol bin
     20!     DENSO4: aerosol density (gr/cm3)
     21!     DENSO4B: aerosol density (gr/cm3)for each aerosol bin
     22!     f_r_wet: factor for converting dry to wet radius
     23!        assuming 'flat surface' composition (does not depend on aerosol size)
     24!     f_r_wetB: factor for converting dry to wet radius
     25!        assuming 'curved surface' composition (depends on aerosol size)
    1926   
    20     USE dimphy, ONLY : klon,klev ! nb of longitude and altitude bands
    21     USE aerophys
    22     USE phys_local_var_mod, ONLY: R2SO4
     27      USE dimphy, ONLY : klon,klev ! nb of longitude and altitude bands
     28      USE infotrac_phy, ONLY : nbtr_bin
     29      USE aerophys
     30      USE phys_local_var_mod, ONLY: R2SO4, R2SO4B, DENSO4, DENSO4B, f_r_wet, f_r_wetB
     31      USE strataer_local_var_mod, ONLY: RRSI
     32!     WARNING: in phys_local_var_mod R2SO4B, DENSO4B, f_r_wetB (klon,klev,nbtr_bin)
     33!          and dens_aer_dry must be declared somewhere
    2334   
    24     IMPLICIT NONE
     35      IMPLICIT NONE
    2536   
    26     REAL,DIMENSION(klon,klev),INTENT(IN)          :: t_seri  ! Temperature
    27     REAL,DIMENSION(klon,klev),INTENT(IN)          :: pplay   ! pression in the middle of each layer (Pa)
    28     REAL,DIMENSION(klon,klev),INTENT(IN)          :: sh      ! specific humidity
     37      REAL,DIMENSION(klon,klev),INTENT(IN)    :: t_seri  ! Temperature
     38      REAL,DIMENSION(klon,klev),INTENT(IN)    :: pplay   ! pression in the middle of each layer (Pa)
     39      REAL,DIMENSION(klon,klev),INTENT(IN)    :: sh      ! specific humidity (kg h2o/kg air)
     40     
     41!     local variables
     42      integer         :: ilon,ilev,ik
     43      real, parameter :: rath2oair = mAIRmol/mH2Omol 
     44      real, parameter :: third = 1./3.
     45      real            :: pph2ogas(klon,klev)
     46      real            :: temp, wpp, xa, surtens, mvh2o, radwet, fkelvin, pph2okel, r2so4ik, denso4ik
     47!----------------------------------------
     48 
     49!     gas-phase h2o partial pressure (Pa)
     50!                                vmr=sh*rath2oair
     51      pph2ogas(:,:) = pplay(:,:)*sh(:,:)*rath2oair
    2952   
    30     REAL ks(7)
    31     REAL t,qh2o,ptot,pw
    32     REAL a,b,c,det
    33     REAL xsb,msb
     53      DO ilon=1,klon
     54      DO ilev=1,klev
     55         
     56        temp = max(t_seri(ilon,ilev),190.)
     57        temp = min(temp,300.)
     58
     59!    ***   H2SO4-H2O flat surface ***
     60!!       equilibrium H2O pressure over pure flat liquid water (Pa)
     61!!        pflath2o=psh2o(temp)
     62!       h2so4 weight percent(%) = f(P_h2o(Pa),T)
     63        R2SO4(ilon,ilev)=wph2so4(pph2ogas(ilon,ilev),temp) 
     64!       h2so4 mass fraction (0<wpp<1)
     65        wpp=R2SO4(ilon,ilev)*1.e-2     
     66!       mole fraction
     67        xa=18.*wpp/(18.*wpp+98.*(1.-wpp))
     68
     69!        CHECK:compare h2so4 sat/ pressure (see Marti et al., 97 & reef. therein)
     70!               R2SO4(ilon,ilev)=70.    temp=298.15
     71!        equilibrium h2so4 number density over H2SO4/H2O solution (molec/cm3)
     72!        include conversion from molec/cm3 to Pa
     73!        ph2so4=solh2so4(temp,xa)*(1.38065e-16*temp)/10.
     74!        print*,' ph2so4=',ph2so4,temp,R2SO4(ilon,ilev)
     75!        good match with Martin, et Ayers, not with Gmitro (the famous 0.086)
     76
     77!       surface tension (mN/m=1.e-3.kg/s2) = f(T,h2so4 mole fraction)
     78        surtens=surftension(temp,xa)
     79!       molar volume of pure h2o (cm3.mol-1 =1.e-6.m3.mol-1)
     80        mvh2o= rmvh2o(temp)
     81!       aerosol density (gr/cm3) = f(T,h2so4 mass fraction)
     82        DENSO4(ilon,ilev)=density(temp,wpp)
     83!           ->x1000., to have it in kg/m3
     84!       factor for converting dry to wet radius
     85        f_r_wet(ilon,ilev) = (dens_aer_dry/(DENSO4(ilon,ilev)*1.e3)/ &
     86                   &    (R2SO4(ilon,ilev)*1.e-2))**third
     87!    ***   End of H2SO4-H2O flat surface ***
     88
     89
     90!          Loop on bin radius (RRSI in cm)
     91           DO IK=1,nbtr_bin
     92 
     93!      ***   H2SO4-H2O curved surface - Kelvin effect factor ***
     94!            wet radius (m) (RRSI(IK) in [cm])
     95             if (f_r_wetB(ilon,ilev,IK) .gt. 1.0) then
     96               radwet = 1.e-2*RRSI(IK)*f_r_wetB(ilon,ilev,IK)
     97             else
     98!              H2SO4-H2O flat surface, only on the first timestep
     99               radwet = 1.e-2*RRSI(IK)*f_r_wet(ilon,ilev)
     100             endif
     101!            Kelvin factor:
     102!            surface tension (mN/m=1.e-3.kg/s2)
     103!            molar volume of pure h2o (cm3.mol-1 =1.e-6.m3.mol-1)
     104             fkelvin=exp( 2.*1.e-3*surtens*1.e-6*mvh2o/ (radwet*rgas*temp) )
     105!            equilibrium: pph2o(gas) = pph2o(liq) = pph2o(liq_flat) * fkelvin
     106!            equilibrium: pph2o(liq_flat) = pph2o(gas) / fkelvin
     107!            h2o liquid partial pressure before Kelvin effect (Pa)
     108             pph2okel = pph2ogas(ilon,ilev) / fkelvin
     109!            h2so4 weight percent(%) = f(P_h2o(Pa),temp)
     110             r2so4ik=wph2so4(pph2okel,temp)
     111!            h2so4 mass fraction (0<wpp<1)
     112             wpp=r2so4ik*1.e-2   
     113!            mole fraction
     114             xa=18.*wpp/(18.*wpp+98.*(1.-wpp))
     115!            aerosol density (gr/cm3) = f(T,h2so4 mass fraction)
     116             denso4ik=density(temp,wpp)
     117!           
     118!            recalculate Kelvin factor with surface tension and radwet
     119!                              with new R2SO4B and DENSO4B
     120             surtens=surftension(temp,xa)
     121!            wet radius (m)
     122             radwet = 1.e-2*RRSI(IK)*(dens_aer_dry/(denso4ik*1.e3)/ &
     123                   &    (r2so4ik*1.e-2))**third
     124             fkelvin=exp( 2.*1.e-3*surtens*1.e-6*mvh2o / (radwet*rgas*temp) )
     125             pph2okel=pph2ogas(ilon,ilev) / fkelvin
     126!            h2so4 weight percent(%) = f(P_h2o(Pa),temp)
     127             R2SO4B(ilon,ilev,IK)=wph2so4(pph2okel,temp)
     128!            h2so4 mass fraction (0<wpp<1)
     129             wpp=R2SO4B(ilon,ilev,IK)*1.e-2   
     130             xa=18.*wpp/(18.*wpp+98.*(1.-wpp))
     131!            aerosol density (gr/cm3) = f(T,h2so4 mass fraction)
     132             DENSO4B(ilon,ilev,IK)=density(temp,wpp)
     133!            factor for converting dry to wet radius
     134             f_r_wetB(ilon,ilev,IK) = (dens_aer_dry/(DENSO4B(ilon,ilev,IK)*1.e3)/ &
     135                   &    (R2SO4B(ilon,ilev,IK)*1.e-2))**third
     136!
     137!             print*,'R,Rwet(m),kelvin,h2so4(%),ro=',RRSI(ik),radwet,fkelvin, &
     138!              &  R2SO4B(ilon,ilev,IK),DENSO4B(ilon,ilev,IK)
     139!             print*,' equil.h2so4(molec/cm3), &
     140!              & sigma',solh2so4(temp,xa),surftension(temp,xa)
     141
     142           ENDDO
     143
     144      ENDDO
     145      ENDDO
     146
     147      RETURN
    34148   
    35     INTEGER ilon,ilev
    36     DATA ks/-21.661,2724.2,51.81,-15732.0,47.004,-6969.0,-4.6183/
    37    
    38 !*******************************************************************
    39 !***     liquid aerosols process
    40 !*******************************************************************
    41 !        BINARIES LIQUID AEROROLS:
    42    
    43     DO ilon=1,klon
    44        DO ilev=1,klev
    45          
    46           t = max(t_seri(ilon,ilev),185.)
    47           qh2o=sh(ilon,ilev)/18.*28.9
    48           ptot=pplay(ilon,ilev)/100.
    49           pw = qh2o*ptot/1013.0
    50           pw = min(pw,2.e-3/1013.)
    51           pw = max(pw,2.e-5/1013.)
    52          
    53 !*******************************************************************
    54 !***     binaries aerosols h2so4/h2o
    55 !*******************************************************************
    56           a = ks(3) + ks(4)/t
    57           b = ks(1) + ks(2)/t
    58           c = ks(5) + ks(6)/t + ks(7)*log(t) - log(pw)
    59          
    60           det = b**2 - 4.*a*c
    61          
    62           IF (det > 0.) THEN
    63              xsb = (-b - sqrt(det))/(2.*a)
    64              msb = 55.51*xsb/(1.0 - xsb)
    65           ELSE
    66              msb = 0.
    67           ENDIF
    68           R2SO4(ilon,ilev) = 100*msb*0.098076/(1.0 + msb*0.098076)
    69          
    70           ! H2SO4 min dilution: 0.5%
    71           R2SO4(ilon,ilev) = max( R2SO4(ilon,ilev), 0.005 )
    72        ENDDO
    73     ENDDO
    74 100 RETURN
    75    
    76   END SUBROUTINE STRACOMP_BIN
    77 
     149  END SUBROUTINE STRACOMP_KELVIN
    78150!********************************************************************
    79151    SUBROUTINE STRACOMP(sh,t_seri,pplay)
     
    544616
    545617    END SUBROUTINE
    546 
    547 !****************************************************************
    548     SUBROUTINE DENH2SA_TABA(t_seri)
    549 
    550 !   AERSOL DENSITY AS A FUNCTION OF H2SO4 WEIGHT PERCENT AND T
    551 !   from Tabazadeh et al. (1994) abaques
    552 !   ---------------------------------------------
    553 
    554 !   
    555 !   INPUT:
    556 !   R2SO4: aerosol H2SO4 weight fraction (percent)
    557 !   t_seri: temperature (K)
    558 !   klon: number of latitude bands in the model domain
    559 !   klev: number of altitude bands in the model domain
    560 !   for IFS: perhaps add another dimension for longitude
    561 !
    562 !   OUTPUT:
    563 !   DENSO4: aerosol mass density (gr/cm3 = aerosol mass/aerosol volume)
    564 !   
    565     USE dimphy, ONLY : klon,klev
    566     USE phys_local_var_mod, ONLY: R2SO4, DENSO4
    567    
    568     IMPLICIT NONE
    569    
    570     REAL,DIMENSION(klon,klev),INTENT(IN)   :: t_seri  ! Temperature
    571        
    572     INTEGER i,j
    573    
    574 !----------------------------------------------------------------------
    575 !       ... Local variables
    576 !----------------------------------------------------------------------
    577       real, parameter :: a9 = -268.2616e4, a10 = 576.4288e3
    578      
    579       real :: a0, a1, a2, a3, a4, a5, a6, a7 ,a8
    580       real :: c1, c2, c3, c4, w
    581      
    582      
    583 !   Loop on model domain (2 dimension for UPMC model; 3 for IFS)
    584     DO i=1,klon
    585        DO j=1,klev
    586 !----------------------------------------------------------------------
    587 !       ... Temperature variables
    588 !----------------------------------------------------------------------
    589           c1 = t_seri(I,J)- 273.15
    590           c2 = c1**2
    591           c3 = c1*c2
    592           c4 = c1*c3
    593 !----------------------------------------------------------------------
    594 !       Polynomial Coefficients
    595 !----------------------------------------------------------------------
    596           a0 = 999.8426 + 334.5402e-4*c1 - 569.1304e-5*c2
    597           a1 = 547.2659 - 530.0445e-2*c1 + 118.7671e-4*c2 + 599.0008e-6*c3
    598           a2 = 526.295e1 + 372.0445e-1*c1 + 120.1909e-3*c2 - 414.8594e-5*c3 + 119.7973e-7*c4
    599           a3 = -621.3958e2 - 287.7670*c1 - 406.4638e-3*c2 + 111.9488e-4*c3 + 360.7768e-7*c4
    600           a4 = 409.0293e3 + 127.0854e1*c1 + 326.9710e-3*c2 - 137.7435e-4*c3 - 263.3585e-7*c4
    601           a5 = -159.6989e4 - 306.2836e1*c1 + 136.6499e-3*c2 + 637.3031e-5*c3
    602           a6 = 385.7411e4 + 408.3717e1*c1 - 192.7785e-3*c2
    603           a7 = -580.8064e4 - 284.4401e1*c1
    604           a8 = 530.1976e4 + 809.1053*c1
    605 !----------------------------------------------------------------------
    606 !       ... Summation
    607 !----------------------------------------------------------------------
    608 !     w : H2SO4 Weight fraction
    609           w=r2SO4(i,j)*0.01
    610           DENSO4(i,j) = 0.001*(a0 + w*(a1 + w*(a2 + w*(a3 + w*(a4 +  &
    611                w*(a5 + w*(a6 + w*(a7 + w*(a8 + w*(a9 + w*a10))))))))))
    612           DENSO4(i,j) = max (0.0, DENSO4(i,j) )
    613 
    614        ENDDO
    615     ENDDO
    616 
    617   END SUBROUTINE DENH2SA_TABA
    618618 
    619619!****************************************************************
     
    764764       RETURN
    765765       END SUBROUTINE
    766 
     766!********************************************************************
     767!-----------------------------------------------------------------------
     768      real function psh2so4(T) result(psh2so4_out)
     769!     equilibrium H2SO4 pressure over pure H2SO4 solution (Pa)
     770!
     771!---->Ayers et.al. (1980), GRL (7) pp 433-436
     772!     plus corrections for lower temperatures by Kulmala and Laaksonen (1990)
     773!     and Noppel et al. (1990)
     774
     775      implicit none
     776      real, intent(in) :: T
     777      real, parameter ::      &
     778              &  b1=1.01325e5, &
     779              &  b2=11.5,  &
     780              &  b3=1.0156e4,  &
     781              &  b4=0.38/545., &
     782              &  tref=360.15
     783
     784!     saturation vapor pressure ( N/m2 = Pa = kg/(m.s2) )
     785      psh2so4_out=b1*exp(  -b2 +b3*( 1./tref-1./T  &
     786           &  +b4*(1.+log(tref/T)-tref/T) )   ) 
     787
     788       return
     789    end function psh2so4
     790!-----------------------------------------------------------------------
     791    real function ndsh2so4(T) result(ndsh2so4_out)
     792!     equilibrium H2SO4 number density over pure H2SO4 (molec/cm3)
     793
     794      implicit none
     795      real, intent(in) :: T
     796      real :: presat
     797
     798!     Boltzmann constant ( 1.38065e-23 J/K = m2⋅kg/(s2⋅K) )
     799!      akb idem in cm2⋅g/(s2⋅K)
     800      real, parameter :: akb=1.38065e-16
     801
     802!     pure h2so4 saturation vapor pressure (Pa)
     803      presat=psh2so4(T)
     804!     saturation number density (1/cm3) - (molec/cm3)
     805      ndsh2so4_out=presat*10./(akb*T)
     806
     807       return
     808     end function ndsh2so4
     809!-----------------------------------------------------------------------
     810     real function psh2o(T) result(psh2o_out)
     811!     equilibrium H2O pressure over pure liquid water (Pa)
     812!
     813      implicit none
     814      real, intent(in) :: T
     815
     816      if(T.gt.229.) then
     817!        Preining et al., 1981 (from Kulmala et al., 1998)
     818!        saturation vapor pressure (N/m2 = 1 Pa = 1 kg/(m·s2))
     819         psh2o_out=exp( 77.34491296  -7235.424651/T &
     820             &                 -8.2*log(T) + 5.7133e-3*T )
     821      else
     822!        Tabazadeh et al., 1997, parameterization for 185<T<260
     823!        saturation water vapor partial pressure (mb = hPa =1.E2 kg/(m·s2))
     824!        or from Clegg and Brimblecombe , J. Chem. Eng., p43, 1995.
     825;
     826         psh2o_out=18.452406985 -3505.1578807/T &
     827              &    -330918.55082/(T*T)             &
     828              &    +12725068.262/(T*T*T)
     829!        in Pa
     830         psh2o_out=100.*exp(psh2o_out)
     831      end if
     832!      print*,psh2o_out
     833     
     834       return
     835     end function psh2o
     836!-----------------------------------------------------------------------
     837     real function density(T,so4mfrac) result(density_out)
     838!        calculation of particle density (gr/cm3)
     839
     840!        requires Temperature (T) and acid mass fraction (so4mfrac)
     841!---->Vehkamaeki et al. (2002)
     842
     843      implicit none
     844      real, intent(in) :: T, so4mfrac
     845      real, parameter :: &
     846           &      a1= 0.7681724,&
     847           &      a2= 2.184714, &
     848           &      a3= 7.163002, &
     849           &      a4=-44.31447, &
     850           &      a5= 88.74606, &
     851           &      a6=-75.73729, &
     852           &      a7= 23.43228
     853      real, parameter :: &
     854           &      b1= 1.808225e-3, &
     855           &      b2=-9.294656e-3, &
     856           &      b3=-3.742148e-2, &
     857           &      b4= 2.565321e-1, &
     858           &      b5=-5.362872e-1, &
     859           &      b6= 4.857736e-1, &
     860           &      b7=-1.629592e-1
     861      real, parameter :: &
     862           &      c1=-3.478524e-6, &
     863           &      c2= 1.335867e-5, &
     864           &      c3= 5.195706e-5, &
     865           &      c4=-3.717636e-4, &
     866           &      c5= 7.990811e-4, &
     867           &      c6=-7.458060e-4, &
     868           &      c7= 2.581390e-4
     869      real :: a,b,c,so4m2,so4m3,so4m4,so4m5,so4m6
     870     
     871      so4m2=so4mfrac*so4mfrac
     872      so4m3=so4mfrac*so4m2
     873      so4m4=so4mfrac*so4m3
     874      so4m5=so4mfrac*so4m4
     875      so4m6=so4mfrac*so4m5
     876
     877      a=+a1+a2*so4mfrac+a3*so4m2+a4*so4m3 &
     878         &     +a5*so4m4+a6*so4m5+a7*so4m6
     879      b=+b1+b2*so4mfrac+b3*so4m2+b4*so4m3 &
     880         &     +b5*so4m4+b6*so4m5+b7*so4m6
     881      c=+c1+c2*so4mfrac+c3*so4m2+c4*so4m3 &
     882         &     +c5*so4m4+c6*so4m5+c7*so4m6
     883      density_out=(a+b*T+c*T*T) ! units are gm/cm**3
     884
     885       return
     886     end function density
     887!-----------------------------------------------------------------------
     888     real function surftension(T,so4frac) result(surftension_out)
     889!        calculation of surface tension (mN/meter)
     890!        requires Temperature (T) and acid mole fraction (so4frac)
     891!---->Vehkamaeki et al. (2002)
     892
     893      implicit none
     894      real,intent(in) :: T, so4frac
     895      real :: a,b,so4mfrac,so4m2,so4m3,so4m4,so4m5,so4sig
     896      real, parameter :: &
     897            &     a1= 0.11864, &
     898            &     a2=-0.11651, &
     899            &     a3= 0.76852, &
     900            &     a4=-2.40909, &
     901            &     a5= 2.95434, &
     902            &     a6=-1.25852
     903      real, parameter :: &
     904            &     b1=-1.5709e-4, &
     905            &     b2= 4.0102e-4, &
     906            &     b3=-2.3995e-3, &
     907            &     b4= 7.611235e-3, &
     908            &     b5=-9.37386e-3, &
     909            &     b6= 3.89722e-3
     910      real, parameter :: convfac=1.e3  ! convert from newton/m to dyne/cm
     911      real, parameter :: Mw=18.01528, Ma=98.079
     912
     913!     so4 mass fraction
     914      so4mfrac=Ma*so4frac/( Ma*so4frac+Mw*(1.-so4frac) )
     915      so4m2=so4mfrac*so4mfrac
     916      so4m3=so4mfrac*so4m2
     917      so4m4=so4mfrac*so4m3
     918      so4m5=so4mfrac*so4m4
     919
     920      a=+a1+a2*so4mfrac+a3*so4m2+a4*so4m3+a5*so4m4+a6*so4m5
     921      b=+b1+b2*so4mfrac+b3*so4m2+b4*so4m3+b5*so4m4+b6*so4m5
     922      so4sig=a+b*T
     923      surftension_out=so4sig*convfac
     924
     925       return
     926     end function surftension
     927!-----------------------------------------------------------------------
     928     real function wph2so4(pph2o,T) result(wph2so4_out)
     929!     Calculates the equilibrium composition of h2so4 aerosols
     930!     as a function of temperature and  H2O pressure, using
     931!     the parameterization of Tabazadeh et al., GRL, p1931, 1997.
     932!
     933!   Parameters
     934!
     935!    input:
     936!      T.....temperature (K)
     937!      pph2o..... amhbiant 2o pressure (Pa)
     938!
     939!    output:
     940!      wph2so4......sulfuric acid composition (weight percent wt % h2so4)
     941!                     = h2so4 mass fraction*100.
     942!
     943      implicit none
     944      real, intent(in) :: pph2o, T
     945     
     946      real :: aw, rh, y1, y2, sulfmolal
     947 
     948!       psh2o(T): equilibrium H2O pressure over pure liquid water (Pa)
     949!       relative humidity
     950        rh=pph2o/psh2o(T)
     951!       water activity
     952!        aw=min( 0.999,max(1.e-3,rh) )
     953        aw=min( 0.999999999,max(1.e-8,rh) )
     954
     955!       composition
     956!       calculation of h2so4 molality
     957            if(aw .le. 0.05 .and. aw .gt. 0.) then
     958               y1=12.372089320*aw**(-0.16125516114) &
     959                 &  -30.490657554*aw -2.1133114241
     960               y2=13.455394705*aw**(-0.19213122550) &
     961                 &  -34.285174607*aw -1.7620073078
     962            else if(aw .le. 0.85 .and. aw .gt. 0.05) then
     963               y1=11.820654354*aw**(-0.20786404244) &
     964                 &  -4.8073063730*aw -5.1727540348
     965               y2=12.891938068*aw**(-0.23233847708) &
     966                 &  -6.4261237757*aw -4.9005471319
     967            else
     968               y1=-180.06541028*aw**(-0.38601102592) &
     969                 &  -93.317846778*aw +273.88132245
     970               y2=-176.95814097*aw**(-0.36257048154) &
     971                 &  -90.469744201*aw +267.45509988
     972            end if
     973!        h2so4 molality (m=moles of h2so4 (solute)/ kg of h2o(solvent))
     974         sulfmolal = y1+((T-190.)*(y2-y1)/70.)
     975
     976!        for a solution containing mh2so4 and mh2o:
     977!        sulfmolal = (mh2so4(gr)/h2so4_molar_mass(gr/mole)) / (mh2o(gr)*1.e-3)
     978!        mh2o=1.e3*(mh2so4/Mh2so4)/sulfmolal=1.e3*mh2so4/(Mh2so4*sulfmolal)
     979!        h2so4_mass_fraction = mfh2so4 = mh2so4/(mh2o + mh2so4)
     980!        mh2o=mh2so4*(1-mfh2so4)/mfh2so4
     981!        combining the 2 equations
     982!        1.e3*mh2so4/(Mh2so4*sulfmolal) = mh2so4*(1-mfh2so4)/mfh2so4
     983!        1.e3/(Mh2so4*sulfmolal) = (1-mfh2so4)/mfh2so4
     984!        1000*mfh2so4 = (1-mfh2so4)*Mh2so4*sulfmolal
     985!        mfh2so4*(1000.+Mh2so4*sulfmolal) = Mh2so4*sulfmolal
     986!        mfh2so4 = Mh2so4*sulfmolal / (1000.+Mh2so4*sulfmolal)
     987!        wph2so4 (% mass fraction)= 100.*Mh2so4*sulfmolal / (1000.+Mh2so4*sulfmolal)
     988!        recall activity of i = a_i = P_i/P_pure_i and
     989!          activity coefficient of i = gamma_i = a_i/X_i (X_i: mole fraction of i)
     990!        so  P_i = gamma_i*X_i*P_pure_i
     991!        if ideal solution, gamma_i=1, P_i = X_i*P_pure_i
     992
     993!        h2so4 weight precent
     994         wph2so4_out = 9800.*sulfmolal/(98.*sulfmolal+1000.)
     995!         print*,rh,pph2o,psh2o(T),vpice(T)
     996!         print*,T,aw,sulfmolal,wph2so4_out
     997         wph2so4_out = max(wph2so4_out,15.)
     998         wph2so4_out = min(wph2so4_out,99.999)
     999
     1000       return
     1001     end function wph2so4
     1002!-----------------------------------------------------------------------
     1003     real function solh2so4(T,xa) result(solh2so4_out)
     1004!     equilibrium h2so4 number density over H2SO4/H2O solution (molec/cm3)
     1005
     1006      implicit none
     1007      real, intent(in) :: T, xa       ! T(K)  xa(H2SO4 mass fraction)
     1008     
     1009      real :: xw, a12,b12, cacta, presat
     1010     
     1011      xw=1.0-xa
     1012
     1013!     pure h2so4 saturation number density (molec/cm3)
     1014      presat=ndsh2so4(T)
     1015!     compute activity of acid
     1016      a12=5.672E3 -4.074E6/T +4.421E8/(T*T)
     1017      b12=1./0.527
     1018      cacta=10.**(a12*xw*xw/(xw+b12*xa)**2/T)
     1019!     h2so4 saturation number density over H2SO4/H2O solution (molec/cm3)
     1020      solh2so4_out=cacta*xa*presat
     1021
     1022       return
     1023     end function solh2so4
     1024!-----------------------------------------------------------------------     
     1025     real function rpmvh2so4(T,ws) result(rpmvh2so4_out)
     1026!     partial molar volume of h2so4 in h2so4/h2o solution (cm3/mole)
     1027
     1028      implicit none
     1029      real, intent(in) :: T, ws
     1030      real, dimension(22),parameter :: x=(/  &
     1031       & 2.393284E-02,-4.359335E-05,7.961181E-08,0.0,-0.198716351, &
     1032       & 1.39564574E-03,-2.020633E-06,0.51684706,-3.0539E-03,4.505475E-06, &
     1033       & -0.30119511,1.840408E-03,-2.7221253742E-06,-0.11331674116, &
     1034       & 8.47763E-04,-1.22336185E-06,0.3455282,-2.2111E-03,3.503768245E-06, &
     1035       & -0.2315332,1.60074E-03,-2.5827835E-06/)
     1036     
     1037      real :: w
     1038
     1039        w=ws*0.01
     1040        rpmvh2so4_out=x(5)+x(6)*T+x(7)*T*T+(x(8)+x(9)*T+x(10)*T*T)*w &
     1041          +(x(11)+x(12)*T+x(13)*T*T)*w*w
     1042!       h2so4 partial molar volume in h2so4/h2o solution (cm3/mole)
     1043        rpmvh2so4_out=rpmvh2so4_out*1000.
     1044       
     1045       return
     1046     end function rpmvh2so4
     1047!-----------------------------------------------------------------------
     1048     real function rmvh2o(T) result(rmvh2o_out)
     1049!     molar volume of pure h2o (cm3/mole)
     1050
     1051       implicit none
     1052       real, intent(in) :: T
     1053       real, parameter :: x1=2.393284E-02,x2=-4.359335E-05,x3=7.961181E-08
     1054
     1055!      1000: L/mole ->  cm3/mole
     1056!      pure h2o molar volume (cm3/mole)
     1057       rmvh2o_out=(x1+x2*T+x3*T*T)*1000.
     1058       
     1059       return
     1060     end function rmvh2o
     1061!
    7671062END MODULE sulfate_aer_mod
  • LMDZ6/branches/cirrus/libf/phylmd/StratAer/traccoag_mod.F90

    r4769 r5202  
    99       presnivs, xlat, xlon, pphis, pphi, &
    1010       t_seri, pplay, paprs, sh, rh, tr_seri)
    11 
     11   
    1212    USE phys_local_var_mod, ONLY: mdw, R2SO4, DENSO4, f_r_wet, surf_PM25_sulf, &
    13         & budg_emi_ocs, budg_emi_so2, budg_emi_h2so4, budg_emi_part
    14 
     13        & budg_emi_ocs, budg_emi_so2, budg_emi_h2so4, budg_emi_part, &
     14        & R2SO4B, DENSO4B, f_r_wetB, sulfmmr, SAD_sulfate, sulfmmr_mode, nd_mode, reff_sulfate
     15   
    1516    USE dimphy
    1617    USE infotrac_phy, ONLY : nbtr_bin, nbtr_sulgas, nbtr, id_SO2_strat
     
    5657    REAL                                   :: m_aer_emiss_vol_daily ! daily injection mass emission
    5758    REAL                                   :: m_aer               ! aerosol mass
    58     INTEGER                                :: it, k, i, ilon, ilev, itime, i_int, ieru
     59    INTEGER                                :: it, k, i, j, ilon, ilev, itime, i_int, ieru
    5960    LOGICAL,DIMENSION(klon,klev)           :: is_strato           ! true = above tropopause, false = below
    6061    REAL,DIMENSION(klon,klev)              :: m_air_gridbox       ! mass of air in every grid box [kg]
     
    8283    INTEGER                                :: injdur_sai          ! injection duration for SAI case [days]
    8384    INTEGER                                :: yr, is_bissext
     85    REAL                                   :: samoment2, samoment3! 2nd and 3rd order moments of size distribution
    8486
    8587    IF (is_mpi_root .AND. flag_verbose_strataer) THEN
     
    8890    ENDIF
    8991   
     92    !   radius [m]
    9093    DO it=1, nbtr_bin
    9194      r_bin(it)=mdw(it)/2.
     
    117120
    118121    IF(flag_new_strat_compo) THEN
    119        IF(debutphy) WRITE(lunout,*) 'traccoag: USE STRAT COMPO from Tabazadeh 1994', flag_new_strat_compo
    120        ! STRACOMP (H2O, P, t_seri -> aerosol composition (R2SO4)) : binary routine (from reprobus)
    121        ! H2SO4 mass fraction in aerosol (%) from Tabazadeh et al. (1994).
    122        CALL stracomp_bin(sh,t_seri,pplay)
    123        
    124        ! aerosol density (gr/cm3) - from Tabazadeh
    125        CALL denh2sa_taba(t_seri)
     122       IF(debutphy) WRITE(lunout,*) 'traccoag: COMPO/DENSITY (Tabazadeh 97) + H2O kelvin effect', flag_new_strat_compo
     123       ! STRACOMP (H2O, P, t_seri, R -> R2SO4 + Kelvin effect) : Taba97, Socol, etc...
     124       CALL stracomp_kelvin(sh,t_seri,pplay)
    126125    ELSE
    127        IF(debutphy) WRITE(lunout,*) 'traccoag: USE STRAT COMPO from Bekki 2D model', flag_new_strat_compo
     126       IF(debutphy) WRITE(lunout,*) 'traccoag: COMPO from Bekki 2D model', flag_new_strat_compo
    128127       ! STRACOMP (H2O, P, t_seri -> aerosol composition (R2SO4))
    129128       ! H2SO4 mass fraction in aerosol (%)
     
    132131       ! aerosol density (gr/cm3)
    133132       CALL denh2sa(t_seri)
     133       
     134       ! compute factor for converting dry to wet radius (for every grid box)
     135       f_r_wet(:,:) = (dens_aer_dry/(DENSO4(:,:)*1000.)/(R2SO4(:,:)/100.))**(1./3.)
    134136    ENDIF
    135137   
    136 ! compute factor for converting dry to wet radius (for every grid box)
    137     f_r_wet(:,:) = (dens_aer_dry/(DENSO4(:,:)*1000.)/(R2SO4(:,:)/100.))**(1./3.)
    138 
    139138!--calculate mass of air in every grid box
    140139    DO ilon=1, klon
     
    348347    ENDDO
    349348   
     349!--compute
     350!     sulfmmr: Sulfate aerosol concentration (dry mixing ratio) (condensed H2SO4 mmr)
     351!     SAD_sulfate: SAD all aerosols (cm2/cm3) (must be WET)
     352!     sulfmmr_mode: sulfate(=H2SO4 if dry) MMR in different modes (ambiguous but based on sulfmmr, it mus be DRY(?) mmr)
     353!     nd_mode: DRY(?) particle concentration in different modes (part/m3)
     354     sulfmmr(:,:)=0.0
     355     SAD_sulfate(:,:)=0.0
     356     sulfmmr_mode(:,:,:)=0.0
     357     nd_mode(:,:,:)=0.0
     358     reff_sulfate(:,:)=0.0
     359     
     360     DO i=1,klon
     361        DO j=1,klev
     362           samoment2=0.0
     363           samoment3=0.0
     364           DO it=1, nbtr_bin
     365              !surf_PM25_sulf(i)=surf_PM25_sulf(i)+tr_seri(i,1,it+nbtr_sulgas)*m_part(i,1,it) &
     366              !assume that particles consist of ammonium sulfate at the surface (132g/mol)
     367              !and are dry at T = 20 deg. C and 50 perc. humidity
     368             
     369              !     sulfmmr_mode: sulfate(=H2SO4 if dry) MMR in different modes (based on sulfmmr, it must be DRY mmr)
     370              !     equivalent to condensed H2SO4 mmr= H2SO4 kg / kgA in bin it
     371              sulfmmr_mode(i,j,it) = tr_seri(i,j,it+nbtr_sulgas) &        ! [DRY part/kgA in bin it]
     372                   &  *(4./3.)*RPI*(mdw(it)/2.)**3.   &                   ! [mdw: dry diameter in m]
     373                   &  *dens_aer_dry                                       ! [dry aerosol mass density in kg/m3]
     374             
     375              !     sulfmmr: Sulfate aerosol concentration (dry mass mixing ratio)
     376              !     equivalent to total condensed H2SO4 mmr (H2SO4 kg / kgA
     377              sulfmmr(i,j) = sulfmmr(i,j) + sulfmmr_mode(i,j,it)
     378             
     379              !     nd_mode: particle concentration in different modes (DRY part/m3)
     380              nd_mode(i,j,it) = tr_seri(i,j,it+nbtr_sulgas) &             ! [DRY part/kgA in bin it]
     381                   & *pplay(i,j)/t_seri(i,j)/RD                           ! [air mass concentration in kg air /m3A]
     382             
     383              IF(flag_new_strat_compo) THEN
     384                 !     SAD_sulfate: SAD WET sulfate aerosols (cm2/cm3)
     385                 SAD_sulfate(i,j) = SAD_sulfate(i,j) + nd_mode(i,j,it) &     ! [DRY part/m3A (in bin it)]
     386                      &  *4.*RPI*( mdw(it)*f_r_wetB(i,j,it)/2. )**2. &       ! [WET SA of part it in m2]
     387                      &  *1.e-2                                              ! conversion from m2/m3 to cm2/cm3A
     388!    samoment2 : 2nd order moment of WET sulfate aerosols (m2/m3)
     389                 samoment2 = samoment2 + nd_mode(i,j,it) &     ! [DRY part/m3A (in bin it)]
     390                      &  *( mdw(it)*f_r_wetB(i,j,it)/2. )**2.                     ! [WET SA of part it in m2]
     391!    samoment3 : 3nd order moment of WET sulfate aerosols (cm2/cm3)
     392                 samoment3 = samoment3 + nd_mode(i,j,it) &     ! [DRY part/m3A (in bin it)]
     393                      &  *( mdw(it)*f_r_wetB(i,j,it)/2. )**3.                     ! [WET SA of part it in m2]
     394              ELSE
     395!     SAD_sulfate: SAD WET sulfate aerosols (cm2/cm3)
     396                 SAD_sulfate(i,j) = SAD_sulfate(i,j) + nd_mode(i,j,it) &     ! [DRY part/m3A (in bin it)]
     397                      &  *4.*RPI*( mdw(it)*f_r_wet(i,j)/2. )**2. &           ! [WET SA of part it in m2]
     398                      &  *1.e-2                                              ! conversion from m2/m3 to cm2/cm3A
     399!    samoment2 : 2nd order moment of WET sulfate aerosols (m2/m3)
     400                 samoment2 = samoment2 + nd_mode(i,j,it) &     ! [DRY part/m3A (in bin it)]
     401                      &  *( mdw(it)*f_r_wet(i,j)/2. )**2.                          ! [WET SA of part it in m2]
     402!    samoment3 : 3nd order moment of WET sulfate aerosols (cm2/cm3)
     403                 samoment3 = samoment3 + nd_mode(i,j,it) &     ! [DRY part/m3A (in bin it)]
     404                      &  *( mdw(it)*f_r_wet(i,j)/2. )**3.                          ! [WET SA of part it in m2]
     405              ENDIF
     406           ENDDO
     407!     reff_sulfate: effective radius of WET sulfate aerosols (cm)
     408           reff_sulfate(i,j) = (samoment3 / samoment2) &
     409                & *1.e2                                              ! conversion from m to cm
     410        ENDDO
     411     ENDDO
     412     
    350413  END SUBROUTINE traccoag
    351414
  • LMDZ6/branches/cirrus/libf/phylmd/add_phys_tend_mod.F90

    r4738 r5202  
    774774      bilh_bnd = (-(rcw-rcpd)*t_seri(1,1) + rlvtt) * rain_lsc(1) &
    775775    &         + (-(rcs-rcpd)*t_seri(1,1) + rlstt) * snow_lsc(1)
    776   CASE("bs") param
     776  CASE("bsss") param
    777777      bilq_bnd = - bs_fall(1)
    778778      bilh_bnd = (-(rcs-rcpd)*t_seri(1,1) + rlstt) * bs_fall(1)
  • LMDZ6/branches/cirrus/libf/phylmd/cdrag_mod.F90

    r4777 r5202  
    2323
    2424  USE dimphy
     25  USE coare_cp_mod, ONLY: coare_cp
     26  USE coare30_flux_cnrm_mod, ONLY: coare30_flux_cnrm
    2527  USE indice_sol_mod
    2628  USE print_control_mod, ONLY: lunout, prt_level
     
    341343         LPWG    = .false.
    342344         call ini_csts
    343          call coare30_flux_cnrm(z_0m,t1(i),tsurf(i), q1(i),  &
    344              sqrt(zdu2),zgeop1(i)/RG,zgeop1(i)/RG,psol(i),qsurf(i),PQSAT, &
    345              PSFTH,PFSTQ,PUSTAR,PCD,PCDN,PCH,PCE,PRI, &
    346              PRESA,prain,pat1(i),z_0h, LPRECIP, LPWG, coeffs)
     345         block
     346           real, dimension(1) :: z0m_1d, z_0h_1d, sqrt_zdu2_1d, zgeop1_rg_1d  ! convert scalar to 1D for call
     347           z0m_1d = z0m
     348           z_0h_1d = z0h
     349           sqrt_zdu2_1d = sqrt(zdu2)
     350           zgeop1_rg_1d=zgeop1(i)/RG
     351           call coare30_flux_cnrm(z0m_1d,t1(i),tsurf(i), q1(i),  &
     352               sqrt_zdu2_1d,zgeop1_rg_1d,zgeop1_rg_1d,psol(i),qsurf(i),PQSAT, &
     353               PSFTH,PFSTQ,PUSTAR,PCD,PCDN,PCH,PCE,PRI, &
     354               PRESA,prain,pat1(i),z_0h_1d, LPRECIP, LPWG, coeffs)
     355
     356         end block
    347357         cdmm(i) = coeffs(1)
    348358         cdhh(i) = coeffs(2)
  • LMDZ6/branches/cirrus/libf/phylmd/clesphys.h

    r4951 r5202  
    110110       LOGICAL :: ok_3Deffect
    111111
     112!OB flag to activate water mass fixer in physiq
     113       LOGICAL :: ok_water_mass_fixer
     114
    112115       COMMON/clesphys/                                                 &
    113116! REAL FIRST
     
    161164     &     , iflag_phytrac, ok_new_lscp, ok_bs, ok_rad_bs               &
    162165     &     ,  iflag_thermals,nsplit_thermals, tau_thermals              &
    163      &     , iflag_physiq, ok_3Deffect
     166     &     , iflag_physiq, ok_3Deffect, ok_water_mass_fixer
    164167       save /clesphys/
    165168!$OMP THREADPRIVATE(/clesphys/)
  • LMDZ6/branches/cirrus/libf/phylmd/ecrad/lmdz/calcul_cloud_overlap_decorr_len.F90

    r4911 r5202  
    146146!  ENDIF
    147147ENDIF
    148 CALL writefield_phy('latitude',latitude_deg,1)
    149 CALL writefield_phy('pressure_hl',pressure_hl,klev+1)
    150 CALL writefield_phy('Ldecorel',PDECORR_LEN_EDGES_M,klev)
     148!CALL writefield_phy('latitude',latitude_deg,1)
     149!CALL writefield_phy('pressure_hl',pressure_hl,klev+1)
     150!CALL writefield_phy('Ldecorel',PDECORR_LEN_EDGES_M,klev)
    151151! -------------------------------------------------------------------
    152152
  • LMDZ6/branches/cirrus/libf/phylmd/ecrad/lmdz/radiation_setup.F90

    r4867 r5202  
    141141           &  -9, &
    142142           &   4 /)
    143 !   rad_config%aerosol_optics_override_file_name = 'aerosol_optics_lmdz.nc'
    144143
    145144
  • LMDZ6/branches/cirrus/libf/phylmd/ecrad/lmdz/readaerosol_optic_ecrad.F90

    r4853 r5202  
    44     flag_aerosol, flag_bc_internal_mixture, itap, rjourvrai, &
    55     pdtphys, pplay, paprs, t_seri, rhcl, presnivs, &
    6      tr_seri, mass_solu_aero, mass_solu_aero_pi)
     6     tr_seri, mass_solu_aero, mass_solu_aero_pi, m_allaer)
    77!     tau_aero, piz_aero, cg_aero, &
    88!     tausum_aero, drytausum_aero, tau3d_aero )
     
    1818       concso4,concno3,concoa,concbc,concss,concdust,loadso4,loadoa,loadbc,loadss,loaddust, &
    1919       loadno3,load_tmp1,load_tmp2,load_tmp3,load_tmp4,load_tmp5,load_tmp6,load_tmp7, &
    20        load_tmp8,load_tmp9,load_tmp10,m_allaer
     20       load_tmp8,load_tmp9,load_tmp10
    2121
    2222  USE infotrac_phy, ONLY: tracers, nqtot, nbtr
     
    4949  REAL, DIMENSION(klon,klev), INTENT(OUT)     :: mass_solu_aero    ! Total mass for all soluble aerosols
    5050  REAL, DIMENSION(klon,klev), INTENT(OUT)     :: mass_solu_aero_pi !     -"-     preindustrial values
     51  REAL, DIMENSION(klon,klev,naero_tot), INTENT(OUT) :: m_allaer
     52  ! AI a passer par la suite en argument si besoin pour ecrad
     53  !REAL, DIMENSION(klon,klev,naero_tot), INTENT(OUT) :: m_allaer_pi !RAF
     54
    5155!  REAL, DIMENSION(klon,klev,2,NSW), INTENT(OUT) :: tau_aero    ! Aerosol optical thickness
    5256!  REAL, DIMENSION(klon,klev,2,NSW), INTENT(OUT) :: piz_aero    ! Single scattering albedo aerosol
     
    8690  REAL, DIMENSION(klon,klev)   :: nitrinscoarse_pi
    8791  REAL, DIMENSION(klon,klev)   :: pdel, zrho
    88 !  REAL, DIMENSION(klon,klev,naero_tot) :: m_allaer
    89   REAL, DIMENSION(klon,klev,naero_tot) :: m_allaer_pi !RAF 
     92  REAL, DIMENSION(klon,klev,naero_tot) :: m_allaer_pi
    9093
    9194  integer :: id_ASBCM, id_ASPOMM, id_ASSO4M, id_ASMSAM, id_CSSO4M, id_CSMSAM, id_SSSSM
  • LMDZ6/branches/cirrus/libf/phylmd/ecrad/radiation/radiation_mcica_lw.F90

    r4853 r5202  
    1818!   2017-07-12  R. Hogan  Call fast adding method if only clouds scatter
    1919!   2017-10-23  R. Hogan  Renamed single-character variables
    20 
    21 #include "ecrad_config.h"
    2220
    2321module radiation_mcica_lw
     
    126124    ! Identify clear-sky layers
    127125    logical :: is_clear_sky_layer(nlev)
    128 
    129     ! Temporary storage for more efficient summation
    130 #ifdef DWD_REDUCTION_OPTIMIZATIONS
    131     real(jprb), dimension(nlev+1,2) :: sum_aux
    132 #else
    133     real(jprb) :: sum_up, sum_dn
    134 #endif
    135126
    136127    ! Index of the highest cloudy layer
     
    188179
    189180      ! Sum over g-points to compute broadband fluxes
    190 #ifdef DWD_REDUCTION_OPTIMIZATIONS
    191       sum_aux(:,:) = 0.0_jprb
    192       do jg = 1,ng
    193         do jlev = 1,nlev+1
    194           sum_aux(jlev,1) = sum_aux(jlev,1) + flux_up_clear(jg,jlev)
    195           sum_aux(jlev,2) = sum_aux(jlev,2) + flux_dn_clear(jg,jlev)
    196         end do
    197       end do
    198       flux%lw_up_clear(jcol,:) = sum_aux(:,1)
    199       flux%lw_dn_clear(jcol,:) = sum_aux(:,2)
    200 #else
    201       do jlev = 1,nlev+1
    202         sum_up = 0.0_jprb
    203         sum_dn = 0.0_jprb
    204         !$omp simd reduction(+:sum_up, sum_dn)
    205         do jg = 1,ng
    206           sum_up = sum_up + flux_up_clear(jg,jlev)
    207           sum_dn = sum_dn + flux_dn_clear(jg,jlev)
    208         end do
    209         flux%lw_up_clear(jcol,jlev) = sum_up
    210         flux%lw_dn_clear(jcol,jlev) = sum_dn
    211       end do
    212 #endif
    213 
     181      flux%lw_up_clear(jcol,:) = sum(flux_up_clear,1)
     182      flux%lw_dn_clear(jcol,:) = sum(flux_dn_clear,1)
    214183      ! Store surface spectral downwelling fluxes
    215184      flux%lw_dn_surf_clear_g(:,jcol) = flux_dn_clear(:,nlev+1)
     
    310279          else
    311280            ! Clear-sky layer: copy over clear-sky values
    312             do jg = 1,ng
    313               reflectance(jg,jlev) = ref_clear(jg,jlev)
    314               transmittance(jg,jlev) = trans_clear(jg,jlev)
    315               source_up(jg,jlev) = source_up_clear(jg,jlev)
    316               source_dn(jg,jlev) = source_dn_clear(jg,jlev)
    317             end do
     281            reflectance(:,jlev) = ref_clear(:,jlev)
     282            transmittance(:,jlev) = trans_clear(:,jlev)
     283            source_up(:,jlev) = source_up_clear(:,jlev)
     284            source_dn(:,jlev) = source_dn_clear(:,jlev)
    318285          end if
    319286        end do
     
    340307       
    341308        ! Store overcast broadband fluxes
    342 #ifdef DWD_REDUCTION_OPTIMIZATIONS
    343         sum_aux(:,:) = 0._jprb
    344         do jg = 1, ng
    345           do jlev = 1, nlev+1
    346             sum_aux(jlev,1) = sum_aux(jlev,1) + flux_up(jg,jlev)
    347             sum_aux(jlev,2) = sum_aux(jlev,2) + flux_dn(jg,jlev)
    348           end do
    349         end do
    350         flux%lw_up(jcol,:) = sum_aux(:,1)
    351         flux%lw_dn(jcol,:) = sum_aux(:,2)
    352 #else
    353         do jlev = 1,nlev+1
    354           sum_up = 0.0_jprb
    355           sum_dn = 0.0_jprb
    356           !$omp simd reduction(+:sum_up, sum_dn)
    357           do jg = 1,ng
    358             sum_up = sum_up + flux_up(jg,jlev)
    359             sum_dn = sum_dn + flux_dn(jg,jlev)
    360           end do
    361           flux%lw_up(jcol,jlev) = sum_up
    362           flux%lw_dn(jcol,jlev) = sum_dn
    363         end do
    364 #endif
     309        flux%lw_up(jcol,:) = sum(flux_up,1)
     310        flux%lw_dn(jcol,:) = sum(flux_dn,1)
    365311
    366312        ! Cloudy flux profiles currently assume completely overcast
    367313        ! skies; perform weighted average with clear-sky profile
    368         do jlev = 1,nlev+1
    369           flux%lw_up(jcol,jlev) =  total_cloud_cover *flux%lw_up(jcol,jlev) &
    370              &       + (1.0_jprb - total_cloud_cover)*flux%lw_up_clear(jcol,jlev)
    371           flux%lw_dn(jcol,jlev) =  total_cloud_cover *flux%lw_dn(jcol,jlev) &
    372              &       + (1.0_jprb - total_cloud_cover)*flux%lw_dn_clear(jcol,jlev)
    373         end do
     314        flux%lw_up(jcol,:) =  total_cloud_cover *flux%lw_up(jcol,:) &
     315             &  + (1.0_jprb - total_cloud_cover)*flux%lw_up_clear(jcol,:)
     316        flux%lw_dn(jcol,:) =  total_cloud_cover *flux%lw_dn(jcol,:) &
     317             &  + (1.0_jprb - total_cloud_cover)*flux%lw_dn_clear(jcol,:)
    374318        ! Store surface spectral downwelling fluxes
    375319        flux%lw_dn_surf_g(:,jcol) = total_cloud_cover*flux_dn(:,nlev+1) &
     
    391335        ! No cloud in profile and clear-sky fluxes already
    392336        ! calculated: copy them over
    393         do jlev = 1,nlev+1
    394           flux%lw_up(jcol,jlev) = flux%lw_up_clear(jcol,jlev)
    395           flux%lw_dn(jcol,jlev) = flux%lw_dn_clear(jcol,jlev)
    396         end do
     337        flux%lw_up(jcol,:) = flux%lw_up_clear(jcol,:)
     338        flux%lw_dn(jcol,:) = flux%lw_dn_clear(jcol,:)
    397339        flux%lw_dn_surf_g(:,jcol) = flux%lw_dn_surf_clear_g(:,jcol)
    398340        if (config%do_lw_derivatives) then
  • LMDZ6/branches/cirrus/libf/phylmd/ecrad/radiation/radiation_mcica_sw.F90

    r4853 r5202  
    1717!   2017-04-22  R. Hogan  Store surface fluxes at all g-points
    1818!   2017-10-23  R. Hogan  Renamed single-character variables
    19 
    20 #include "ecrad_config.h"
    2119
    2220module radiation_mcica_sw
     
    121119    ! Total cloud cover output from the cloud generator
    122120    real(jprb) :: total_cloud_cover
    123 
    124     ! Temporary storage for more efficient summation
    125 #ifdef DWD_REDUCTION_OPTIMIZATIONS
    126     real(jprb), dimension(nlev+1,3) :: sum_aux
    127 #else
    128     real(jprb) :: sum_up, sum_dn_diff, sum_dn_dir
    129 #endif
    130121
    131122    ! Number of g points
     
    184175       
    185176        ! Sum over g-points to compute and save clear-sky broadband
    186         ! fluxes. Note that the built-in "sum" function is very slow,
    187         ! and before being replaced by the alternatives below
    188         ! accounted for around 40% of the total cost of this routine.
    189 #ifdef DWD_REDUCTION_OPTIMIZATIONS
    190         ! Optimized summation for the NEC architecture
    191         sum_aux(:,:) = 0.0_jprb
    192         do jg = 1,ng
    193           do jlev = 1,nlev+1
    194             sum_aux(jlev,1) = sum_aux(jlev,1) + flux_up(jg,jlev)
    195             sum_aux(jlev,2) = sum_aux(jlev,2) + flux_dn_direct(jg,jlev)
    196             sum_aux(jlev,3) = sum_aux(jlev,3) + flux_dn_diffuse(jg,jlev)
    197           end do
    198         end do
    199         flux%sw_up_clear(jcol,:) = sum_aux(:,1)
    200         flux%sw_dn_clear(jcol,:) = sum_aux(:,2) + sum_aux(:,3)
     177        ! fluxes
     178        flux%sw_up_clear(jcol,:) = sum(flux_up,1)
    201179        if (allocated(flux%sw_dn_direct_clear)) then
    202           flux%sw_dn_direct_clear(jcol,:) = sum_aux(:,2)
     180          flux%sw_dn_direct_clear(jcol,:) &
     181               &  = sum(flux_dn_direct,1)
     182          flux%sw_dn_clear(jcol,:) = sum(flux_dn_diffuse,1) &
     183               &  + flux%sw_dn_direct_clear(jcol,:)
     184        else
     185          flux%sw_dn_clear(jcol,:) = sum(flux_dn_diffuse,1) &
     186               &  + sum(flux_dn_direct,1)
    203187        end if
    204 #else
    205         ! Optimized summation for the x86-64 architecture
    206         do jlev = 1,nlev+1
    207           sum_up      = 0.0_jprb
    208           sum_dn_diff = 0.0_jprb
    209           sum_dn_dir  = 0.0_jprb
    210           !$omp simd reduction(+:sum_up, sum_dn_diff, sum_dn_dir)
    211           do jg = 1,ng
    212             sum_up      = sum_up      + flux_up(jg,jlev)
    213             sum_dn_diff = sum_dn_diff + flux_dn_diffuse(jg,jlev)
    214             sum_dn_dir  = sum_dn_dir  + flux_dn_direct(jg,jlev)
    215           end do
    216           flux%sw_up_clear(jcol,jlev) = sum_up
    217           flux%sw_dn_clear(jcol,jlev) = sum_dn_diff + sum_dn_dir
    218           if (allocated(flux%sw_dn_direct_clear)) then
    219             flux%sw_dn_direct_clear(jcol,jlev) = sum_dn_dir
    220           end if
    221         end do
    222 #endif
    223        
    224188        ! Store spectral downwelling fluxes at surface
    225         do jg = 1,ng
    226           flux%sw_dn_diffuse_surf_clear_g(jg,jcol) = flux_dn_diffuse(jg,nlev+1)
    227           flux%sw_dn_direct_surf_clear_g(jg,jcol)  = flux_dn_direct(jg,nlev+1)
    228         end do
     189        flux%sw_dn_diffuse_surf_clear_g(:,jcol) = flux_dn_diffuse(:,nlev+1)
     190        flux%sw_dn_direct_surf_clear_g(:,jcol)  = flux_dn_direct(:,nlev+1)
    229191
    230192        ! Do cloudy-sky calculation
     
    287249            else
    288250              ! Clear-sky layer: copy over clear-sky values
    289               do jg = 1,ng
    290                 reflectance(jg,jlev) = ref_clear(jg,jlev)
    291                 transmittance(jg,jlev) = trans_clear(jg,jlev)
    292                 ref_dir(jg,jlev) = ref_dir_clear(jg,jlev)
    293                 trans_dir_diff(jg,jlev) = trans_dir_diff_clear(jg,jlev)
    294                 trans_dir_dir(jg,jlev) = trans_dir_dir_clear(jg,jlev)
    295               end do
     251              reflectance(:,jlev) = ref_clear(:,jlev)
     252              transmittance(:,jlev) = trans_clear(:,jlev)
     253              ref_dir(:,jlev) = ref_dir_clear(:,jlev)
     254              trans_dir_diff(:,jlev) = trans_dir_diff_clear(:,jlev)
     255              trans_dir_dir(:,jlev) = trans_dir_dir_clear(:,jlev)
    296256            end if
    297257          end do
     
    304264         
    305265          ! Store overcast broadband fluxes
    306 #ifdef DWD_REDUCTION_OPTIMIZATIONS
    307           sum_aux(:,:) = 0.0_jprb
    308           do jg = 1,ng
    309             do jlev = 1,nlev+1
    310               sum_aux(jlev,1) = sum_aux(jlev,1) + flux_up(jg,jlev)
    311               sum_aux(jlev,2) = sum_aux(jlev,2) + flux_dn_direct(jg,jlev)
    312               sum_aux(jlev,3) = sum_aux(jlev,3) + flux_dn_diffuse(jg,jlev)
    313             end do
    314           end do
    315           flux%sw_up(jcol,:) = sum_aux(:,1)
    316           flux%sw_dn(jcol,:) = sum_aux(:,2) + sum_aux(:,3)
     266          flux%sw_up(jcol,:) = sum(flux_up,1)
    317267          if (allocated(flux%sw_dn_direct)) then
    318             flux%sw_dn_direct(jcol,:) = sum_aux(:,2)
     268            flux%sw_dn_direct(jcol,:) = sum(flux_dn_direct,1)
     269            flux%sw_dn(jcol,:) = sum(flux_dn_diffuse,1) &
     270                 &  + flux%sw_dn_direct(jcol,:)
     271          else
     272            flux%sw_dn(jcol,:) = sum(flux_dn_diffuse,1) &
     273                 &  + sum(flux_dn_direct,1)
    319274          end if
    320 #else
    321           do jlev = 1,nlev+1
    322             sum_up      = 0.0_jprb
    323             sum_dn_diff = 0.0_jprb
    324             sum_dn_dir  = 0.0_jprb
    325             !$omp simd reduction(+:sum_up, sum_dn_diff, sum_dn_dir)
    326             do jg = 1,ng
    327               sum_up      = sum_up      + flux_up(jg,jlev)
    328               sum_dn_diff = sum_dn_diff + flux_dn_diffuse(jg,jlev)
    329               sum_dn_dir  = sum_dn_dir  + flux_dn_direct(jg,jlev)
    330             end do
    331             flux%sw_up(jcol,jlev) = sum_up
    332             flux%sw_dn(jcol,jlev) = sum_dn_diff + sum_dn_dir
    333             if (allocated(flux%sw_dn_direct)) then
    334               flux%sw_dn_direct(jcol,jlev) = sum_dn_dir
    335             end if
    336           end do
    337 #endif
    338          
     275
    339276          ! Cloudy flux profiles currently assume completely overcast
    340277          ! skies; perform weighted average with clear-sky profile
    341           do jlev = 1, nlev+1
    342             flux%sw_up(jcol,jlev) =  total_cloud_cover *flux%sw_up(jcol,jlev) &
    343                  &     + (1.0_jprb - total_cloud_cover)*flux%sw_up_clear(jcol,jlev)
    344             flux%sw_dn(jcol,jlev) =  total_cloud_cover *flux%sw_dn(jcol,jlev) &
    345                  &     + (1.0_jprb - total_cloud_cover)*flux%sw_dn_clear(jcol,jlev)
    346             if (allocated(flux%sw_dn_direct)) then
    347               flux%sw_dn_direct(jcol,jlev) = total_cloud_cover *flux%sw_dn_direct(jcol,jlev) &
    348                    &  + (1.0_jprb - total_cloud_cover)*flux%sw_dn_direct_clear(jcol,jlev)
    349             end if
    350           end do
     278          flux%sw_up(jcol,:) =  total_cloud_cover *flux%sw_up(jcol,:) &
     279               &  + (1.0_jprb - total_cloud_cover)*flux%sw_up_clear(jcol,:)
     280          flux%sw_dn(jcol,:) =  total_cloud_cover *flux%sw_dn(jcol,:) &
     281               &  + (1.0_jprb - total_cloud_cover)*flux%sw_dn_clear(jcol,:)
     282          if (allocated(flux%sw_dn_direct)) then
     283            flux%sw_dn_direct(jcol,:) = total_cloud_cover *flux%sw_dn_direct(jcol,:) &
     284                 &  + (1.0_jprb - total_cloud_cover)*flux%sw_dn_direct_clear(jcol,:)
     285          end if
    351286          ! Likewise for surface spectral fluxes
    352           do jg = 1,ng
    353             flux%sw_dn_diffuse_surf_g(jg,jcol) = flux_dn_diffuse(jg,nlev+1)
    354             flux%sw_dn_direct_surf_g(jg,jcol)  = flux_dn_direct(jg,nlev+1)
    355             flux%sw_dn_diffuse_surf_g(jg,jcol) = total_cloud_cover *flux%sw_dn_diffuse_surf_g(jg,jcol) &
    356                  &                 + (1.0_jprb - total_cloud_cover)*flux%sw_dn_diffuse_surf_clear_g(jg,jcol)
    357             flux%sw_dn_direct_surf_g(jg,jcol)  = total_cloud_cover *flux%sw_dn_direct_surf_g(jg,jcol) &
    358                  &                 + (1.0_jprb - total_cloud_cover)*flux%sw_dn_direct_surf_clear_g(jg,jcol)
    359           end do
    360 
     287          flux%sw_dn_diffuse_surf_g(:,jcol) = flux_dn_diffuse(:,nlev+1)
     288          flux%sw_dn_direct_surf_g(:,jcol)  = flux_dn_direct(:,nlev+1)
     289          flux%sw_dn_diffuse_surf_g(:,jcol) = total_cloud_cover *flux%sw_dn_diffuse_surf_g(:,jcol) &
     290               &     + (1.0_jprb - total_cloud_cover)*flux%sw_dn_diffuse_surf_clear_g(:,jcol)
     291          flux%sw_dn_direct_surf_g(:,jcol) = total_cloud_cover *flux%sw_dn_direct_surf_g(:,jcol) &
     292               &     + (1.0_jprb - total_cloud_cover)*flux%sw_dn_direct_surf_clear_g(:,jcol)
     293         
    361294        else
    362295          ! No cloud in profile and clear-sky fluxes already
    363296          ! calculated: copy them over
    364           do jlev = 1, nlev+1
    365             flux%sw_up(jcol,jlev) = flux%sw_up_clear(jcol,jlev)
    366             flux%sw_dn(jcol,jlev) = flux%sw_dn_clear(jcol,jlev)
    367             if (allocated(flux%sw_dn_direct)) then
    368               flux%sw_dn_direct(jcol,jlev) = flux%sw_dn_direct_clear(jcol,jlev)
    369             end if
    370           end do
    371           do jg = 1,ng
    372             flux%sw_dn_diffuse_surf_g(jg,jcol) = flux%sw_dn_diffuse_surf_clear_g(jg,jcol)
    373             flux%sw_dn_direct_surf_g(jg,jcol)  = flux%sw_dn_direct_surf_clear_g(jg,jcol)
    374           end do
     297          flux%sw_up(jcol,:) = flux%sw_up_clear(jcol,:)
     298          flux%sw_dn(jcol,:) = flux%sw_dn_clear(jcol,:)
     299          if (allocated(flux%sw_dn_direct)) then
     300            flux%sw_dn_direct(jcol,:) = flux%sw_dn_direct_clear(jcol,:)
     301          end if
     302          flux%sw_dn_diffuse_surf_g(:,jcol) = flux%sw_dn_diffuse_surf_clear_g(:,jcol)
     303          flux%sw_dn_direct_surf_g(:,jcol)  = flux%sw_dn_direct_surf_clear_g(:,jcol)
    375304
    376305        end if ! Cloud is present in profile
     
    378307      else
    379308        ! Set fluxes to zero if sun is below the horizon
    380         do jlev = 1, nlev+1
    381           flux%sw_up(jcol,jlev) = 0.0_jprb
    382           flux%sw_dn(jcol,jlev) = 0.0_jprb
    383           if (allocated(flux%sw_dn_direct)) then
    384             flux%sw_dn_direct(jcol,jlev) = 0.0_jprb
    385           end if
    386           flux%sw_up_clear(jcol,jlev) = 0.0_jprb
    387           flux%sw_dn_clear(jcol,jlev) = 0.0_jprb
    388           if (allocated(flux%sw_dn_direct_clear)) then
    389             flux%sw_dn_direct_clear(jcol,jlev) = 0.0_jprb
    390           end if
    391         end do
    392         do jg = 1,ng
    393           flux%sw_dn_diffuse_surf_g(jg,jcol) = 0.0_jprb
    394           flux%sw_dn_direct_surf_g(jg,jcol)  = 0.0_jprb
    395           flux%sw_dn_diffuse_surf_clear_g(jg,jcol) = 0.0_jprb
    396           flux%sw_dn_direct_surf_clear_g(jg,jcol)  = 0.0_jprb
    397         end do
     309        flux%sw_up(jcol,:) = 0.0_jprb
     310        flux%sw_dn(jcol,:) = 0.0_jprb
     311        if (allocated(flux%sw_dn_direct)) then
     312          flux%sw_dn_direct(jcol,:) = 0.0_jprb
     313        end if
     314        flux%sw_up_clear(jcol,:) = 0.0_jprb
     315        flux%sw_dn_clear(jcol,:) = 0.0_jprb
     316        if (allocated(flux%sw_dn_direct_clear)) then
     317          flux%sw_dn_direct_clear(jcol,:) = 0.0_jprb
     318        end if
     319        flux%sw_dn_diffuse_surf_g(:,jcol) = 0.0_jprb
     320        flux%sw_dn_direct_surf_g(:,jcol)  = 0.0_jprb
     321        flux%sw_dn_diffuse_surf_clear_g(:,jcol) = 0.0_jprb
     322        flux%sw_dn_direct_surf_clear_g(:,jcol)  = 0.0_jprb
    398323      end if ! Sun above horizon
    399324
  • LMDZ6/branches/cirrus/libf/phylmd/ecrad/radiation/radiation_tripleclouds_lw.F90

    r4853 r5202  
    170170    logical :: is_clear_sky_layer(0:nlev+1)
    171171
    172     ! Temporaries to speed up summations
    173     real(jprb) :: sum_dn, sum_up
    174    
    175172    ! Index of the highest cloudy layer
    176173    integer :: i_cloud_top
     
    264261      if (config%do_clear) then
    265262        ! Sum over g-points to compute broadband fluxes
    266         do jlev = 1,nlev+1
    267           sum_up = 0.0_jprb
    268           sum_dn = 0.0_jprb
    269           !$omp simd reduction(+:sum_up, sum_dn)
    270           do jg = 1,ng
    271             sum_up = sum_up + flux_up_clear(jg,jlev)
    272             sum_dn = sum_dn + flux_dn_clear(jg,jlev)
    273           end do
    274           flux%lw_up_clear(jcol,jlev) = sum_up
    275           flux%lw_dn_clear(jcol,jlev) = sum_dn
    276         end do
    277 
     263        flux%lw_up_clear(jcol,:) = sum(flux_up_clear,1)
     264        flux%lw_dn_clear(jcol,:) = sum(flux_dn_clear,1)
    278265        ! Store surface spectral downwelling fluxes / TOA upwelling
    279         do jg = 1,ng
    280           flux%lw_dn_surf_clear_g(jg,jcol) = flux_dn_clear(jg,nlev+1)
    281           flux%lw_up_toa_clear_g (jg,jcol) = flux_up_clear(jg,1)
    282         end do
     266        flux%lw_dn_surf_clear_g(:,jcol) = flux_dn_clear(:,nlev+1)
     267        flux%lw_up_toa_clear_g (:,jcol) = flux_up_clear(:,1)
    283268        ! Save the spectral fluxes if required
    284269        if (config%do_save_spectral_flux) then
     
    468453          end if
    469454        else
    470           sum_dn = 0.0_jprb
    471           !$omp simd reduction(+:sum_dn)
    472           do jg = 1,ng
    473             sum_dn = sum_dn + flux_dn_clear(jg,jlev)
    474           end do
    475           flux%lw_dn(jcol,jlev) = sum_dn
     455          flux%lw_dn(jcol,:) = sum(flux_dn_clear(:,jlev))
    476456          if (config%do_save_spectral_flux) then
    477457            call indexed_sum(flux_dn_clear(:,jlev), &
     
    490470           &  + total_albedo(:,1,i_cloud_top)*flux_dn_clear(:,i_cloud_top)
    491471      flux_up(:,2:) = 0.0_jprb
    492 
    493       sum_up = 0.0_jprb
    494       !$omp simd reduction(+:sum_up)
    495       do jg = 1,ng
    496         sum_up = sum_up + flux_up(jg,1)
    497       end do
    498       flux%lw_up(jcol,i_cloud_top) = sum_up
    499 
     472      flux%lw_up(jcol,i_cloud_top) = sum(flux_up(:,1))
    500473      if (config%do_save_spectral_flux) then
    501474        call indexed_sum(flux_up(:,1), &
     
    505478      do jlev = i_cloud_top-1,1,-1
    506479        flux_up(:,1) = trans_clear(:,jlev)*flux_up(:,1) + source_up_clear(:,jlev)
    507         sum_up = 0.0_jprb
    508         !$omp simd reduction(+:sum_up)
    509         do jg = 1,ng
    510           sum_up = sum_up + flux_up(jg,1)
    511         end do
    512         flux%lw_up(jcol,jlev) = sum_up
     480        flux%lw_up(jcol,jlev) = sum(flux_up(:,1))
    513481        if (config%do_save_spectral_flux) then
    514482          call indexed_sum(flux_up(:,1), &
     
    560528
    561529        ! Store the broadband fluxes
    562         sum_up = 0.0_jprb
    563         sum_dn = 0.0_jprb
    564         do jreg = 1,nregions
    565           !$omp simd reduction(+:sum_up, sum_dn)
    566           do jg = 1,ng
    567             sum_up = sum_up + flux_up(jg,jreg)
    568             sum_dn = sum_dn + flux_dn(jg,jreg)
    569           end do
    570         end do
    571         flux%lw_up(jcol,jlev+1) = sum_up
    572         flux%lw_dn(jcol,jlev+1) = sum_dn
     530        flux%lw_up(jcol,jlev+1) = sum(sum(flux_up,1))
     531        flux%lw_dn(jcol,jlev+1) = sum(sum(flux_dn,1))
    573532
    574533        ! Save the spectral fluxes if required
  • LMDZ6/branches/cirrus/libf/phylmd/ecrad/radiation/radiation_tripleclouds_lw.F90.or

    r4773 r5202  
    170170    logical :: is_clear_sky_layer(0:nlev+1)
    171171
     172    ! Temporaries to speed up summations
     173    real(jprb) :: sum_dn, sum_up
     174   
    172175    ! Index of the highest cloudy layer
    173176    integer :: i_cloud_top
     
    249252        call calc_ref_trans_lw(ng*nlev, &
    250253             &  od(:,:,jcol), ssa(:,:,jcol), g(:,:,jcol), &
    251              &  planck_hl(:,1:jlev,jcol), planck_hl(:,2:jlev+1,jcol), &
     254             &  planck_hl(:,1:nlev,jcol), planck_hl(:,2:nlev+1,jcol), &
    252255             &  ref_clear, trans_clear, &
    253256             &  source_up_clear, source_dn_clear)
     
    261264      if (config%do_clear) then
    262265        ! Sum over g-points to compute broadband fluxes
    263         flux%lw_up_clear(jcol,:) = sum(flux_up_clear,1)
    264         flux%lw_dn_clear(jcol,:) = sum(flux_dn_clear,1)
     266        do jlev = 1,nlev+1
     267          sum_up = 0.0_jprb
     268          sum_dn = 0.0_jprb
     269          !$omp simd reduction(+:sum_up, sum_dn)
     270          do jg = 1,ng
     271            sum_up = sum_up + flux_up_clear(jg,jlev)
     272            sum_dn = sum_dn + flux_dn_clear(jg,jlev)
     273          end do
     274          flux%lw_up_clear(jcol,jlev) = sum_up
     275          flux%lw_dn_clear(jcol,jlev) = sum_dn
     276        end do
     277
    265278        ! Store surface spectral downwelling fluxes / TOA upwelling
    266         flux%lw_dn_surf_clear_g(:,jcol) = flux_dn_clear(:,nlev+1)
    267         flux%lw_up_toa_clear_g (:,jcol) = flux_up_clear(:,1)
     279        do jg = 1,ng
     280          flux%lw_dn_surf_clear_g(jg,jcol) = flux_dn_clear(jg,nlev+1)
     281          flux%lw_up_toa_clear_g (jg,jcol) = flux_up_clear(jg,1)
     282        end do
    268283        ! Save the spectral fluxes if required
    269284        if (config%do_save_spectral_flux) then
     
    453468          end if
    454469        else
    455           flux%lw_dn(jcol,:) = sum(flux_dn_clear(:,jlev))
     470          sum_dn = 0.0_jprb
     471          !$omp simd reduction(+:sum_dn)
     472          do jg = 1,ng
     473            sum_dn = sum_dn + flux_dn_clear(jg,jlev)
     474          end do
     475          flux%lw_dn(jcol,jlev) = sum_dn
    456476          if (config%do_save_spectral_flux) then
    457477            call indexed_sum(flux_dn_clear(:,jlev), &
     
    470490           &  + total_albedo(:,1,i_cloud_top)*flux_dn_clear(:,i_cloud_top)
    471491      flux_up(:,2:) = 0.0_jprb
    472       flux%lw_up(jcol,i_cloud_top) = sum(flux_up(:,1))
     492
     493      sum_up = 0.0_jprb
     494      !$omp simd reduction(+:sum_up)
     495      do jg = 1,ng
     496        sum_up = sum_up + flux_up(jg,1)
     497      end do
     498      flux%lw_up(jcol,i_cloud_top) = sum_up
     499
    473500      if (config%do_save_spectral_flux) then
    474501        call indexed_sum(flux_up(:,1), &
     
    478505      do jlev = i_cloud_top-1,1,-1
    479506        flux_up(:,1) = trans_clear(:,jlev)*flux_up(:,1) + source_up_clear(:,jlev)
    480         flux%lw_up(jcol,jlev) = sum(flux_up(:,1))
     507        sum_up = 0.0_jprb
     508        !$omp simd reduction(+:sum_up)
     509        do jg = 1,ng
     510          sum_up = sum_up + flux_up(jg,1)
     511        end do
     512        flux%lw_up(jcol,jlev) = sum_up
    481513        if (config%do_save_spectral_flux) then
    482514          call indexed_sum(flux_up(:,1), &
     
    528560
    529561        ! Store the broadband fluxes
    530         flux%lw_up(jcol,jlev+1) = sum(sum(flux_up,1))
    531         flux%lw_dn(jcol,jlev+1) = sum(sum(flux_dn,1))
     562        sum_up = 0.0_jprb
     563        sum_dn = 0.0_jprb
     564        do jreg = 1,nregions
     565          !$omp simd reduction(+:sum_up, sum_dn)
     566          do jg = 1,ng
     567            sum_up = sum_up + flux_up(jg,jreg)
     568            sum_dn = sum_dn + flux_dn(jg,jreg)
     569          end do
     570        end do
     571        flux%lw_up(jcol,jlev+1) = sum_up
     572        flux%lw_dn(jcol,jlev+1) = sum_dn
    532573
    533574        ! Save the spectral fluxes if required
  • LMDZ6/branches/cirrus/libf/phylmd/ecrad/radiation/radiation_tripleclouds_sw.F90

    r4853 r5202  
    7474    ! Gas and aerosol optical depth, single-scattering albedo and
    7575    ! asymmetry factor at each shortwave g-point
    76     real(jprb), intent(in), dimension(config%n_g_sw,nlev,istartcol:iendcol) &
    77          &  :: od, ssa, g
     76!    real(jprb), intent(in), dimension(istartcol:iendcol,nlev,config%n_g_sw) :: &
     77    real(jprb), intent(in), dimension(config%n_g_sw,nlev,istartcol:iendcol) :: &
     78         &  od, ssa, g
    7879
    7980    ! Cloud and precipitation optical depth, single-scattering albedo and
    8081    ! asymmetry factor in each shortwave band
    81     real(jprb), intent(in), dimension(config%n_bands_sw,nlev,istartcol:iendcol) &
    82          &  :: od_cloud, ssa_cloud, g_cloud
     82    real(jprb), intent(in), dimension(config%n_bands_sw,nlev,istartcol:iendcol) :: &
     83         &  od_cloud, ssa_cloud, g_cloud
    8384
    8485    ! Optical depth, single scattering albedo and asymmetry factor in
     
    9192    ! flux into a plane perpendicular to the incoming radiation at
    9293    ! top-of-atmosphere in each of the shortwave g points
    93     real(jprb), intent(in), dimension(config%n_g_sw,istartcol:iendcol) &
    94          &  :: albedo_direct, albedo_diffuse, incoming_sw
     94    real(jprb), intent(in), dimension(config%n_g_sw,istartcol:iendcol) :: &
     95         &  albedo_direct, albedo_diffuse, incoming_sw
    9596
    9697    ! Output
     
    165166    real(jprb) :: scat_od, scat_od_cloud
    166167
    167     ! Temporaries to speed up summations
    168     real(jprb) :: sum_dn_diff, sum_dn_dir, sum_up
    169 
    170     ! Local cosine of solar zenith angle
    171168    real(jprb) :: mu0
    172169
     
    447444      end if
    448445     
    449       ! Store the TOA broadband fluxes, noting that there is no
    450       ! diffuse downwelling at TOA. The intrinsic "sum" command has
    451       ! been found to be very slow; better performance is found on
    452       ! x86-64 architecture with explicit loops and the "omp simd
    453       ! reduction" directive.
    454       sum_up     = 0.0_jprb
    455       sum_dn_dir = 0.0_jprb
    456       do jreg = 1,nregions
    457         !$omp simd reduction(+:sum_up, sum_dn_dir)
    458         do jg = 1,ng
    459           sum_up     = sum_up     + flux_up(jg,jreg)
    460           sum_dn_dir = sum_dn_dir + direct_dn(jg,jreg)
    461         end do
    462       end do
    463       flux%sw_up(jcol,1) = sum_up
    464       flux%sw_dn(jcol,1) = mu0 * sum_dn_dir
     446      ! Store the TOA broadband fluxes
     447      flux%sw_up(jcol,1) = sum(sum(flux_up,1))
     448      flux%sw_dn(jcol,1) = mu0 * sum(sum(direct_dn,1))
    465449      if (allocated(flux%sw_dn_direct)) then
    466450        flux%sw_dn_direct(jcol,1) = flux%sw_dn(jcol,1)
    467451      end if
    468452      if (config%do_clear) then
    469         sum_up     = 0.0_jprb
    470         sum_dn_dir = 0.0_jprb
    471         !$omp simd reduction(+:sum_up, sum_dn_dir)
    472         do jg = 1,ng
    473           sum_up     = sum_up     + flux_up_clear(jg)
    474           sum_dn_dir = sum_dn_dir + direct_dn_clear(jg)
    475         end do
    476         flux%sw_up_clear(jcol,1) = sum_up
    477         flux%sw_dn_clear(jcol,1) = mu0 * sum_dn_dir
     453        flux%sw_up_clear(jcol,1) = sum(flux_up_clear)
     454        flux%sw_dn_clear(jcol,1) = mu0 * sum(direct_dn_clear)
    478455        if (allocated(flux%sw_dn_direct_clear)) then
    479456          flux%sw_dn_direct_clear(jcol,1) = flux%sw_dn_clear(jcol,1)
     
    490467             &           config%i_spec_from_reordered_g_sw, &
    491468             &           flux%sw_dn_band(:,jcol,1))
    492         flux%sw_dn_band(:,jcol,1) = mu0 * flux%sw_dn_band(:,jcol,1)
     469        flux%sw_dn_band(:,jcol,1) = &
     470             &  mu0 * flux%sw_dn_band(:,jcol,1)
    493471        if (allocated(flux%sw_dn_direct_band)) then
    494472          flux%sw_dn_direct_band(:,jcol,1) = flux%sw_dn_band(:,jcol,1)
     
    571549               ! nothing to do
    572550
    573         ! Store the broadband fluxes. The intrinsic "sum" command has
    574         ! been found to be very slow; better performance is found on
    575         ! x86-64 architecture with explicit loops and the "omp simd
    576         ! reduction" directive.
    577         sum_up      = 0.0_jprb
    578         sum_dn_dir  = 0.0_jprb
    579         sum_dn_diff = 0.0_jprb
    580         do jreg = 1,nregions
    581           !$omp simd reduction(+:sum_up, sum_dn_diff, sum_dn_dir)
    582           do jg = 1,ng
    583             sum_up      = sum_up      + flux_up(jg,jreg)
    584             sum_dn_diff = sum_dn_diff + flux_dn(jg,jreg)
    585             sum_dn_dir  = sum_dn_dir  + direct_dn(jg,jreg)
    586           end do
    587         end do
    588         flux%sw_up(jcol,jlev+1) = sum_up
    589         flux%sw_dn(jcol,jlev+1) = mu0 * sum_dn_dir + sum_dn_diff
     551        ! Store the broadband fluxes
     552        flux%sw_up(jcol,jlev+1) = sum(sum(flux_up,1))
    590553        if (allocated(flux%sw_dn_direct)) then
    591           flux%sw_dn_direct(jcol,jlev+1) = mu0 * sum_dn_dir
     554          flux%sw_dn_direct(jcol,jlev+1) = mu0 * sum(sum(direct_dn,1))
     555          flux%sw_dn(jcol,jlev+1) &
     556               &  = flux%sw_dn_direct(jcol,jlev+1) + sum(sum(flux_dn,1))
     557        else
     558          flux%sw_dn(jcol,jlev+1) = mu0 * sum(sum(direct_dn,1)) + sum(sum(flux_dn,1))   
    592559        end if
    593560        if (config%do_clear) then
    594           sum_up      = 0.0_jprb
    595           sum_dn_dir  = 0.0_jprb
    596           sum_dn_diff = 0.0_jprb
    597           !$omp simd reduction(+:sum_up, sum_dn_diff, sum_dn_dir)
    598           do jg = 1,ng
    599             sum_up      = sum_up      + flux_up_clear(jg)
    600             sum_dn_diff = sum_dn_diff + flux_dn_clear(jg)
    601             sum_dn_dir  = sum_dn_dir  + direct_dn_clear(jg)
    602           end do
    603           flux%sw_up_clear(jcol,jlev+1) = sum_up
    604           flux%sw_dn_clear(jcol,jlev+1) = mu0 * sum_dn_dir + sum_dn_diff
     561          flux%sw_up_clear(jcol,jlev+1) = sum(flux_up_clear)
    605562          if (allocated(flux%sw_dn_direct_clear)) then
    606             flux%sw_dn_direct_clear(jcol,jlev+1) = mu0 * sum_dn_dir
     563            flux%sw_dn_direct_clear(jcol,jlev+1) = mu0 * sum(direct_dn_clear)
     564            flux%sw_dn_clear(jcol,jlev+1) &
     565                 &  = flux%sw_dn_direct_clear(jcol,jlev+1) + sum(flux_dn_clear)
     566          else
     567            flux%sw_dn_clear(jcol,jlev+1) = mu0 * sum(direct_dn_clear) &
     568                 &  + sum(flux_dn_clear)
    607569          end if
    608570        end if
     
    643605          end if
    644606        end if
     607
    645608      end do ! Final loop over levels
    646609     
  • LMDZ6/branches/cirrus/libf/phylmd/fonte_neige_mod.F90

    r4523 r5202  
    3636  REAL, ALLOCATABLE, DIMENSION(:)             :: runofflic_global
    3737  !$OMP THREADPRIVATE(runofflic_global)
     38#ifdef ISO
     39  REAL, ALLOCATABLE, DIMENSION(:,:), PRIVATE  :: xtrun_off_ter
     40  !$OMP THREADPRIVATE(xtrun_off_ter)
     41  REAL, ALLOCATABLE, DIMENSION(:,:)           :: xtrun_off_lic
     42  !$OMP THREADPRIVATE(xtrun_off_lic)
     43  REAL, ALLOCATABLE, DIMENSION(:,:), PRIVATE  :: xtrun_off_lic_0
     44  !$OMP THREADPRIVATE(xtrun_off_lic_0)
     45  REAL, ALLOCATABLE, DIMENSION(:,:,:), PRIVATE:: fxtfonte_global
     46  !$OMP THREADPRIVATE(fxtfonte_global)
     47  REAL, ALLOCATABLE, DIMENSION(:,:,:), PRIVATE:: fxtcalving_global
     48  !$OMP THREADPRIVATE(fxtcalving_global)
     49  REAL, ALLOCATABLE, DIMENSION(:,:), PRIVATE  :: xtrunofflic_global
     50  !$OMP THREADPRIVATE(xtrunofflic_global)
     51#endif
    3852
    3953CONTAINS
     
    123137
    124138  END SUBROUTINE fonte_neige_init
     139
     140#ifdef ISO
     141  SUBROUTINE fonte_neige_init_iso(xtrestart_runoff)
     142
     143! This subroutine allocates and initialize variables in the module.
     144! The variable run_off_lic_0 is initialized to the field read from
     145! restart file. The other variables are initialized to zero.
     146
     147    USE infotrac_phy, ONLY: niso
     148#ifdef ISOVERIF
     149    USE isotopes_mod, ONLY: iso_eau,iso_HDO
     150    USE isotopes_verif_mod
     151#endif
     152!
     153!****************************************************************************************
     154! Input argument
     155    REAL, DIMENSION(niso,klon), INTENT(IN) :: xtrestart_runoff
     156
     157! Local variables
     158    INTEGER                           :: error
     159    CHARACTER (len = 80)              :: abort_message
     160    CHARACTER (len = 20)              :: modname = 'fonte_neige_init'
     161    INTEGER                           :: i
     162
     163
     164!****************************************************************************************
     165! Allocate run-off at landice and initilize with field read from restart
     166!
     167!****************************************************************************************
     168
     169    ALLOCATE(xtrun_off_lic_0(niso,klon), stat = error)
     170    IF (error /= 0) THEN
     171       abort_message='Pb allocation run_off_lic'
     172       CALL abort_gcm(modname,abort_message,1)
     173    ENDIF   
     174   
     175    xtrun_off_lic_0(:,:) = xtrestart_runoff(:,:)       
     176
     177#ifdef ISOVERIF
     178      IF (iso_eau > 0) THEN   
     179        CALL iso_verif_egalite_vect1D( &
     180     &           xtrun_off_lic_0,run_off_lic_0,'fonte_neige 100', &
     181     &           niso,klon)
     182      ENDIF !IF (iso_eau > 0) THEN
     183#endif       
     184
     185!****************************************************************************************
     186! Allocate other variables and initilize to zero
     187!
     188!****************************************************************************************
     189
     190    ALLOCATE(xtrun_off_ter(niso,klon), stat = error)
     191    IF (error /= 0) THEN
     192       abort_message='Pb allocation xtrun_off_ter'
     193       CALL abort_gcm(modname,abort_message,1)
     194    ENDIF
     195    xtrun_off_ter(:,:) = 0.
     196   
     197    ALLOCATE(xtrun_off_lic(niso,klon), stat = error)
     198    IF (error /= 0) THEN
     199       abort_message='Pb allocation xtrun_off_lic'
     200       CALL abort_gcm(modname,abort_message,1)
     201    ENDIF
     202    xtrun_off_lic(:,:) = 0.
     203
     204    ALLOCATE(fxtfonte_global(niso,klon,nbsrf))
     205    IF (error /= 0) THEN
     206       abort_message='Pb allocation fxtfonte_global'
     207       CALL abort_gcm(modname,abort_message,1)
     208    ENDIF
     209    fxtfonte_global(:,:,:) = 0.0
     210
     211    ALLOCATE(fxtcalving_global(niso,klon,nbsrf))
     212    IF (error /= 0) THEN
     213       abort_message='Pb allocation fxtcalving_global'
     214       CALL abort_gcm(modname,abort_message,1)
     215    ENDIF
     216    fxtcalving_global(:,:,:) = 0.0
     217
     218    ALLOCATE(xtrunofflic_global(niso,klon))
     219    IF (error /= 0) THEN
     220       abort_message='Pb allocation xtrunofflic_global'
     221       CALL abort_gcm(modname,abort_message,1)
     222    ENDIF
     223    xtrunofflic_global(:,:) = 0.0
     224
     225  END SUBROUTINE fonte_neige_init_iso
     226#endif
     227
    125228!
    126229!****************************************************************************************
     
    128231  SUBROUTINE fonte_neige( knon, nisurf, knindex, dtime, &
    129232       tsurf, precip_rain, precip_snow, &
    130        snow, qsol, tsurf_new, evap)
    131 
    132   USE indice_sol_mod
     233       snow, qsol, tsurf_new, evap &
     234#ifdef ISO   
     235     & ,fq_fonte_diag,fqfonte_diag,snow_evap_diag,fqcalving_diag   &
     236     & ,max_eau_sol_diag,runoff_diag,run_off_lic_diag,coeff_rel_diag   &
     237#endif
     238     &   )
     239
     240    USE indice_sol_mod
     241#ifdef ISO
     242    USE infotrac_phy, ONLY: niso
     243    !use isotopes_mod, ONLY: ridicule_snow,iso_eau,iso_HDO
     244#ifdef ISOVERIF
     245    USE isotopes_verif_mod
     246#endif
     247#endif
    133248       
    134249! Routine de traitement de la fonte de la neige dans le cas du traitement
     
    172287    REAL, DIMENSION(klon), INTENT(INOUT) :: tsurf_new
    173288    REAL, DIMENSION(klon), INTENT(INOUT) :: evap
     289
     290#ifdef ISO   
     291        ! sortie de quelques diagnostiques
     292    REAL, DIMENSION(klon), INTENT(OUT) :: fq_fonte_diag
     293    REAL, DIMENSION(klon), INTENT(OUT) :: fqfonte_diag
     294    REAL, DIMENSION(klon), INTENT(OUT) ::  snow_evap_diag
     295    REAL, DIMENSION(klon), INTENT(OUT) ::  fqcalving_diag 
     296    REAL,                  INTENT(OUT) :: max_eau_sol_diag 
     297    REAL, DIMENSION(klon), INTENT(OUT) ::  runoff_diag   
     298    REAL, DIMENSION(klon), INTENT(OUT) :: run_off_lic_diag 
     299    REAL,                  INTENT(OUT) :: coeff_rel_diag
     300#endif
    174301
    175302! Local variables
     
    193320
    194321    LOGICAL               :: neige_fond
     322
     323#ifdef ISO
     324        max_eau_sol_diag=max_eau_sol
     325#endif
     326
    195327
    196328!****************************************************************************************
     
    231363   
    232364    bil_eau_s(:) = (precip_rain(:) * dtime) - (evap(:) - snow_evap(:)) * dtime
     365#ifdef ISO
     366    snow_evap_diag(:) = snow_evap(:)
     367    coeff_rel_diag    = coeff_rel
     368#endif
     369
    233370
    234371
     
    254391          bil_eau_s(i) = bil_eau_s(i) + fq_fonte
    255392          tsurf_new(i) = tsurf_new(i) - fq_fonte * chasno 
     393#ifdef ISO
     394          fq_fonte_diag(i) = fq_fonte
     395#endif
     396
    256397
    257398!IM cf JLD OK     
     
    273414       snow(i)=MIN(snow(i),snow_max)
    274415    ENDDO
     416#ifdef ISO
     417    DO i = 1, knon
     418       fqcalving_diag(i) = fqcalving(i)
     419       fqfonte_diag(i)   = fqfonte(i)
     420    ENDDO !DO i = 1, knon
     421#endif
     422
    275423
    276424    IF (nisurf == is_ter) THEN
     
    278426          qsol(i) = qsol(i) + bil_eau_s(i)
    279427          run_off_ter(i) = run_off_ter(i) + MAX(qsol(i) - max_eau_sol, 0.0)
     428#ifdef ISO
     429          runoff_diag(i) = MAX(qsol(i) - max_eau_sol, 0.0)
     430#endif
    280431          qsol(i) = MIN(qsol(i), max_eau_sol)
    281432       ENDDO
     
    290441       ENDDO
    291442    ENDIF
     443
     444#ifdef ISO
     445    DO i = 1, klon   
     446      run_off_lic_diag(i) = run_off_lic(i)
     447    ENDDO ! DO i = 1, knon   
     448#endif
    292449   
    293450!****************************************************************************************
     
    312469!****************************************************************************************
    313470!
    314   SUBROUTINE fonte_neige_final(restart_runoff)
     471  SUBROUTINE fonte_neige_final(restart_runoff &
     472#ifdef ISO     
     473     &                        ,xtrestart_runoff &
     474#endif   
     475     &                        )
    315476!
    316477! This subroutine returns run_off_lic_0 for later writing to restart file.
    317478!
     479#ifdef ISO
     480    USE infotrac_phy, ONLY: niso
     481#ifdef ISOVERIF
     482    USE isotopes_mod, ONLY: iso_eau
     483    USE isotopes_verif_mod
     484#endif
     485#endif
     486!
    318487!****************************************************************************************
    319488    REAL, DIMENSION(klon), INTENT(OUT) :: restart_runoff
     489#ifdef ISO     
     490    REAL, DIMENSION(niso,klon), INTENT(OUT) :: xtrestart_runoff
     491#ifdef ISOVERIF
     492    INTEGER :: i
     493#endif 
     494#endif
     495
     496
    320497
    321498!****************************************************************************************
    322499! Set the output variables
    323500    restart_runoff(:) = run_off_lic_0(:)
     501#ifdef ISO
     502    xtrestart_runoff(:,:) = xtrun_off_lic_0(:,:)
     503#ifdef ISOVERIF
     504    IF (iso_eau > 0) THEN   
     505      DO i=1,klon
     506        IF (iso_verif_egalite_nostop(run_off_lic_0(i) &
     507     &                              ,xtrun_off_lic_0(iso_eau,i) &
     508     &                              ,'fonte_neige 413') &
     509     &      == 1) then
     510          WRITE(*,*) 'i=',i
     511          STOP
     512        ENDIF
     513      ENDDO !DO i=1,klon
     514    ENDIF !IF (iso_eau > 0) then
     515#endif   
     516#endif
     517
     518
    324519
    325520! Deallocation of all varaibles in the module
     
    334529    IF (ALLOCATED(fqcalving_global)) DEALLOCATE(fqcalving_global)
    335530    IF (ALLOCATED(runofflic_global)) DEALLOCATE(runofflic_global)
     531#ifdef ISO
     532    IF (ALLOCATED(xtrun_off_lic_0)) DEALLOCATE(xtrun_off_lic_0)
     533    IF (ALLOCATED(xtrun_off_ter)) DEALLOCATE(xtrun_off_ter)
     534    IF (ALLOCATED(xtrun_off_lic)) DEALLOCATE(xtrun_off_lic)
     535    IF (ALLOCATED(fxtfonte_global)) DEALLOCATE(fxtfonte_global)
     536    IF (ALLOCATED(fxtcalving_global)) DEALLOCATE(fxtcalving_global)
     537    IF (ALLOCATED(xtrunofflic_global)) DEALLOCATE(xtrunofflic_global)
     538#endif
     539
    336540
    337541  END SUBROUTINE fonte_neige_final
     
    340544!
    341545  SUBROUTINE fonte_neige_get_vars(pctsrf, fqcalving_out, &
    342        fqfonte_out, ffonte_out, run_off_lic_out)
     546              fqfonte_out, ffonte_out, run_off_lic_out &
     547#ifdef ISO     
     548     &       ,fxtcalving_out, fxtfonte_out,xtrun_off_lic_out &
     549#endif     
     550     &       )
    343551
    344552
     
    349557!****************************************************************************************
    350558
    351   USE indice_sol_mod
     559    USE indice_sol_mod
     560#ifdef ISO
     561    USE infotrac_phy, ONLY: niso
     562#endif
    352563
    353564    REAL, DIMENSION(klon,nbsrf), INTENT(IN) :: pctsrf
     
    358569    REAL, DIMENSION(klon), INTENT(OUT)      :: run_off_lic_out
    359570
     571#ifdef ISO
     572    REAL, DIMENSION(niso,klon), INTENT(OUT) :: fxtcalving_out
     573    REAL, DIMENSION(niso,klon), INTENT(OUT) :: fxtfonte_out
     574    REAL, DIMENSION(niso,klon), INTENT(OUT) :: xtrun_off_lic_out
     575    INTEGER   :: i,ixt
     576#endif
     577 
    360578    INTEGER   :: nisurf
    361579!****************************************************************************************
     
    364582    fqfonte_out(:)   = 0.0
    365583    fqcalving_out(:) = 0.0
     584#ifdef ISO       
     585    fxtfonte_out(:,:)   = 0.0
     586    fxtcalving_out(:,:) = 0.0
     587#endif
    366588
    367589    DO nisurf = 1, nbsrf
     
    373595    run_off_lic_out(:)=runofflic_global(:)
    374596
     597#ifdef ISO
     598    DO nisurf = 1, nbsrf
     599      DO i=1,klon
     600        DO ixt=1,niso
     601          fxtfonte_out(ixt,i) = fxtfonte_out(ixt,i) + fxtfonte_global(ixt,i,nisurf)*pctsrf(i,nisurf)
     602          fxtcalving_out(ixt,i) = fxtcalving_out(ixt,i) + fxtcalving_global(ixt,i,nisurf)*pctsrf(i,nisurf)
     603        ENDDO !DO ixt=1,niso
     604      ENDDO !DO i=1,klon
     605    ENDDO !DO nisurf = 1, nbsrf
     606    xtrun_off_lic_out(:,:) = xtrunofflic_global(:,:)
     607#endif
     608
    375609  END SUBROUTINE fonte_neige_get_vars
    376610!
    377611!****************************************************************************************
    378612!
     613!#ifdef ISO
     614!  subroutine fonte_neige_export_xtrun_off_lic_0(knon,xtrun_off_lic_0_diag)
     615!    use infotrac_phy, ONLY: niso
     616!
     617!    ! inputs
     618!    INTEGER, INTENT(IN)                      :: knon
     619!    real, INTENT(IN), DIMENSION(niso,klon)   :: xtrun_off_lic_0_diag
     620!
     621!    xtrun_off_lic_0(:,:)=xtrun_off_lic_0_diag(:,:)
     622!
     623!  end subroutine fonte_neige_export_xtrun_off_lic_0
     624!#endif
     625
     626#ifdef ISO
     627  SUBROUTINE gestion_neige_besoin_varglob_fonte_neige(klon,knon, &
     628     &           xtprecip_snow,xtprecip_rain, &
     629     &           fxtfonte_neige,fxtcalving, &
     630     &           knindex,nisurf,run_off_lic_diag,coeff_rel_diag)
     631
     632        ! dans cette routine, on a besoin des variables globales de
     633        ! fonte_neige_mod. Il faut donc la mettre dans fonte_neige_mod
     634        ! le reste de gestion_neige est dans isotopes_routines_mod car sinon pb
     635        ! de dépendance circulaire.
     636
     637    USE infotrac_phy, ONLY: ntiso,niso
     638    USE isotopes_mod, ONLY: iso_eau   
     639    USE indice_sol_mod   
     640#ifdef ISOVERIF
     641    USE isotopes_verif_mod
     642#endif
     643    IMPLICIT NONE
     644
     645    ! inputs
     646    INTEGER, INTENT(IN)                     :: klon,knon
     647    REAL, DIMENSION(ntiso,klon), INTENT(IN) :: xtprecip_snow, xtprecip_rain
     648    REAL, DIMENSION(niso,klon), INTENT(IN)  :: fxtfonte_neige,fxtcalving
     649    INTEGER, INTENT(IN)                     :: nisurf
     650    INTEGER, DIMENSION(klon), INTENT(IN)    :: knindex
     651    REAL, DIMENSION(klon), INTENT(IN)       :: run_off_lic_diag 
     652    REAL, INTENT(IN)                        :: coeff_rel_diag 
     653
     654    ! locals
     655    INTEGER :: i,ixt,j
     656       
     657#ifdef ISOVERIF
     658    IF (nisurf == is_lic) THEN
     659      IF (iso_eau > 0) THEN 
     660        DO i = 1, knon
     661           j = knindex(i)
     662           CALL iso_verif_egalite(xtrun_off_lic_0(iso_eau,j), &
     663     &             run_off_lic_0(j),'gestion_neige_besoin_varglob_fonte_neige 625')
     664        ENDDO
     665      ENDIF
     666    ENDIF
     667#endif
     668
     669! calcul de run_off_lic
     670
     671    IF (nisurf == is_lic) THEN
     672!         coeff_rel = dtime/(tau_calv * rday)
     673
     674      DO i = 1, knon
     675        j = knindex(i)
     676        DO ixt = 1, niso
     677          xtrun_off_lic(ixt,i)   = (coeff_rel_diag *  fxtcalving(ixt,i)) &
     678     &                            +(1. - coeff_rel_diag) * xtrun_off_lic_0(ixt,j)
     679          xtrun_off_lic_0(ixt,j) = xtrun_off_lic(ixt,i)
     680          xtrun_off_lic(ixt,i)   = xtrun_off_lic(ixt,i) + fxtfonte_neige(ixt,i) + xtprecip_rain(ixt,i)
     681        ENDDO !DO ixt=1,niso
     682#ifdef ISOVERIF
     683          IF (iso_eau > 0) THEN             
     684            IF (iso_verif_egalite_choix_nostop(xtrun_off_lic(iso_eau,i), &
     685     &                  run_off_lic_diag(i),'gestion_neige_besoin_varglob_fonte_neige 1201a', &
     686     &                  errmax,errmaxrel) == 1) THEN
     687               WRITE(*,*) 'i,j=',i,j   
     688               WRITE(*,*) 'coeff_rel_diag=',coeff_rel_diag
     689               STOP
     690            ENDIF
     691          ENDIF
     692#endif
     693      ENDDO
     694    ENDIF !IF (nisurf == is_lic) THEN 
     695
     696! Save ffonte, fqfonte and fqcalving in global arrays for each
     697! sub-surface separately
     698    DO i = 1, knon
     699      DO ixt = 1, niso
     700        fxtfonte_global(ixt,knindex(i),nisurf)   = fxtfonte_neige(ixt,i)
     701        fxtcalving_global(ixt,knindex(i),nisurf) = fxtcalving(ixt,i)
     702      ENDDO !do ixt=1,niso
     703    ENDDO   
     704
     705    IF (nisurf == is_lic) THEN
     706      DO i = 1, knon   
     707        DO ixt = 1, niso   
     708        xtrunofflic_global(ixt,knindex(i)) = xtrun_off_lic(ixt,i)
     709        ENDDO ! DO ixt=1,niso   
     710      ENDDO
     711    ENDIF
     712       
     713  END SUBROUTINE gestion_neige_besoin_varglob_fonte_neige
     714#endif
     715
     716
    379717END MODULE fonte_neige_mod
  • LMDZ6/branches/cirrus/libf/phylmd/infotrac_phy.F90

    r4638 r5202  
    55   USE       strings_mod, ONLY: msg, fmsg, maxlen, cat, dispTable, int2str, bool2str, strStack, strParse, strIdx
    66   USE readTracFiles_mod, ONLY: trac_type, readTracersFiles, tracers, setGeneration, itZonIso, nzone, tran0, isoZone, &
    7         delPhase, niso, getKey, isot_type, readIsotopesFile, isotope, maxTableWidth, iqIsoPha, nphas, ixIso, isoPhas, &
    8         addPhase, iH2O, addKey, isoSelect, testTracersFiles, isoKeys, indexUpdate,   isoCheck, nbIso, ntiso, isoName
     7        delPhase, niso, getKey, isot_type, processIsotopes, isotope, maxTableWidth, iqIsoPha, nphas, ixIso, isoPhas, &
     8        addPhase, iH2O, addKey, isoSelect, testTracersFiles, isoKeys, indexUpdate,  iqWIsoPha, nbIso, ntiso, isoName, isoCheck
    99   IMPLICIT NONE
    1010
     
    2020   PUBLIC :: id_OCS_strat, id_SO2_strat, id_H2SO4_strat, id_BIN01_strat, id_TEST_strat
    2121#endif
    22 #ifdef REPROBUS
    23    PUBLIC :: nbtr_bin, nbtr_sulgas
    24    PUBLIC :: id_OCS_strat, id_SO2_strat, id_H2SO4_strat, id_BIN01_strat, &
    25              id_TEST_strat
    26 #endif
    27 
     22
     23   !=== FOR WATER
     24   PUBLIC :: ivap, iliq, isol
    2825   !=== FOR ISOTOPES: General
    2926   PUBLIC :: isot_type, nbIso                              !--- Derived type, full isotopes families database + nb of families
     
    3734   PUBLIC :: itZonIso                                      !--- idx "it" (in "isoName(1:niso)") = function(tagging idx, isotope idx)
    3835   PUBLIC :: iqIsoPha                                      !--- idx "iq" (in "qx") = function(isotope idx, phase idx) + aliases
     36   PUBLIC :: iqWIsoPha                                      !--- Same as iqIsoPha but with normal water phases
     37
    3938   PUBLIC :: isoCheck                                      !--- Run isotopes checking routines
    4039   !=== FOR BOTH TRACERS AND ISOTOPES
     
    7372!  | longName    | Long name (with adv. scheme suffix) for outputs      | ttext       |                        |
    7473!  | type        | Type (so far: tracer or tag)                         | /           | tracer,tag             |
    75 !  | phase       | Phases list ("g"as / "l"iquid / "s"olid / "b"lowing) | /           | [g][l][s][b]           |
     74!  | phase       | Phases list ("g"as / "l"iquid / "s"olid)             | /           | [g][l][s]              |
    7675!  | component   | Name(s) of the merged/cumulated section(s)           | /           | coma-separated names   |
    7776!  | iGeneration | Generation (>=1)                                     | /           |                        |
     
    9897!  | trac   | ntiso  | Isotopes + tagging tracers list + number         | / | ntraciso       |                 |
    9998!  | zone   | nzone  | Geographic tagging zones   list + number         | / | ntraceurs_zone |                 |
    100 !  | phase  | nphas  | Phases                     list + number         |                    |[g][l][s][b] 1:4 |
     99!  | phase  | nphas  | Phases                     list + number         |                    | [g][l][s], 1:3 |
    101100!  | iqIsoPha        | Index in "qx"           = f(name(1:ntiso)),phas) | iqiso              | 1:nqtot         |
     101!  | iqWIsoPha       | Index in "qx"           = f(name(1:ntiso)),phas) | iqiso              | 1:nqtot         |
    102102!  | itZonIso        | Index in "trac(1:ntiso)"= f(zone, name(1:niso))  | index_trac         | 1:ntiso         |
    103103!  +-----------------+--------------------------------------------------+--------------------+-----------------+
     
    112112!$OMP THREADPRIVATE(nqtot, nbtr, nqo, nqtottr, nqCO2, type_trac)
    113113
     114   !=== INDICES OF WATER
     115   INTEGER,               SAVE :: ivap,iliq,isol ! Indices for vap, liq and ice
     116!$OMP THREADPRIVATE(ivap,iliq,isol)
     117
    114118   !=== VARIABLES FOR INCA
    115119   INTEGER,               SAVE, ALLOCATABLE :: conv_flg(:), &   !--- Convection     activation ; needed for INCA        (nbtr)
     
    123127  INTEGER, SAVE ::  id_OCS_strat, id_SO2_strat, id_H2SO4_strat, id_BIN01_strat, id_TEST_strat
    124128!$OMP THREADPRIVATE(id_OCS_strat, id_SO2_strat, id_H2SO4_strat, id_BIN01_strat, id_TEST_strat)
    125 #endif
    126 #ifdef REPROBUS
    127   INTEGER, SAVE ::  nbtr_bin, nbtr_sulgas
    128 !$OMP THREADPRIVATE(nbtr_bin, nbtr_sulgas)
    129   INTEGER, SAVE ::  id_OCS_strat, id_SO2_strat, id_H2SO4_strat, id_BIN01_strat,&
    130                     id_TEST_strat
    131 !$OMP THREADPRIVATE(id_OCS_strat, id_SO2_strat, id_H2SO4_strat, id_BIN01_strat)
    132 !$OMP THREADPRIVATE(id_TEST_strat)
    133129#endif
    134130
     
    182178   INTEGER :: nqtrue                                                 !--- Tracers nb from tracer.def (no higher order moments)
    183179   INTEGER :: iad                                                    !--- Advection scheme number
    184    INTEGER :: ic, iq, jq, it, nt, im, nm, iz, k                      !--- Indexes and temporary variables
    185    LOGICAL :: lerr, ll, lInit
    186    CHARACTER(LEN=1) :: p
     180   INTEGER :: iq, jq, nt, im, nm, k                                 !--- Indexes and temporary variables
     181   LOGICAL :: lerr, lInit
    187182   TYPE(trac_type), ALLOCATABLE, TARGET :: ttr(:)
    188183   TYPE(trac_type), POINTER             :: t1, t(:)
    189    INTEGER :: ierr
    190184   CHARACTER(LEN=maxlen),   ALLOCATABLE :: types_trac(:)  !--- Keyword for tracers type(s), parsed version
    191185   
     
    262256!##############################################################################################################################
    263257   IF(lInit) THEN
    264       IF(readTracersFiles(ttp, type_trac == 'repr')) CALL abort_physic(modname, 'problem with tracers file(s)',1)
     258      IF(readTracersFiles(ttp, lRepr=type_trac=='repr')) CALL abort_physic(modname, 'problem with tracers file(s)',1)
    265259   ELSE
    266260      CALL msg('No tracers description file(s) reading needed: already done in the dynamics', modname)
     
    388382
    389383   !--- SET FIELDS %iqParent, %nqChildren, %iGeneration, %iqDescen, %nqDescen
    390    CALL indexUpdate(tracers)
     384   IF(indexUpdate(tracers)) CALL abort_gcm(modname, 'problem when processing isotopes parameters', 1)
    391385
    392386!##############################################################################################################################
     
    404398   !=== READ PHYSICAL PARAMETERS FOR ISOTOPES
    405399   niso = 0; nzone = 0; nphas = nqo; ntiso = 0; isoCheck = .FALSE.
    406    IF(readIsotopesFile()) CALL abort_physic(modname, 'Problem when reading isotopes parameters', 1)
     400   IF(processIsotopes()) CALL abort_physic(modname, 'Problem when processing isotopes parameters', 1)
    407401
    408402!##############################################################################################################################
     
    416410   nqtottr = nqtot - COUNT(delPhase(tracers%gen0Name) == 'H2O' .AND. tracers%component == 'lmdz')
    417411   IF(COUNT(tracers%iso_iName == 0) - COUNT(delPhase(tracers%name) == 'H2O' .AND. tracers%component == 'lmdz') /= nqtottr) &
    418       CALL abort_physic(modname, 'pb dans le calcul de nqtottr', 1)
     412      CALL abort_physic(modname, 'problem with the computation of nqtottr', 1)
    419413
    420414   !=== DISPLAY THE RESULTS
     
    431425   t => tracers
    432426   CALL msg('Information stored in infotrac_phy :', modname)
    433    IF(dispTable('issssssssiiiiiiii', &
    434       ['iq    ', 'name  ', 'lName ', 'gen0N ', 'parent', 'type  ', 'phase ', 'compon', 'isPhy ',           &
    435                  'iGen  ', 'iqPar ', 'nqDes ', 'nqChld', 'iGroup', 'iName ', 'iZone ', 'iPhase'],          &
     427   IF(dispTable('issssssssiiiiiiii', ['iq  ', 'name', 'lNam', 'g0Nm', 'prnt', 'type', 'phas', 'comp',      &
     428                              'isPh', 'iGen', 'iqPr', 'nqDe', 'nqCh', 'iGrp', 'iNam', 'iZon', 'iPha'],     &
    436429      cat(t%name, t%longName, t%gen0Name, t%parent, t%type, t%phase, t%component, bool2str(t%isInPhysics)),&
    437430      cat([(iq, iq=1, nqtot)], t%iGeneration, t%iqParent, t%nqDescen, t%nqChildren, t%iso_iGroup,          &
  • LMDZ6/branches/cirrus/libf/phylmd/lmdz_atke_exchange_coeff.F90

    r4884 r5202  
    77subroutine atke_compute_km_kh(ngrid,nlay,dtime, &
    88                        wind_u,wind_v,temp,qvap,play,pinterf,cdrag_uv, &
    9                         tke,eps,Km_out,Kh_out)
     9                        tke,eps,tke_shear,tke_buoy,tke_trans,Km_out,Kh_out)
    1010
    1111!========================================================================
     
    7979
    8080REAL, DIMENSION(ngrid,nlay+1), INTENT(OUT)    :: eps      ! output: TKE dissipation rate at interface between layers (m2/s3)
     81REAL, DIMENSION(ngrid,nlay+1), INTENT(OUT)    :: tke_shear! output: TKE shear production rate (m2/s3)
     82REAL, DIMENSION(ngrid,nlay+1), INTENT(OUT)    :: tke_buoy ! output: TKE buoyancy production rate (m2/s3)
     83REAL, DIMENSION(ngrid,nlay+1), INTENT(OUT)    :: tke_trans! output: TKE transport (diffusion) term (m2/s3)
    8184REAL, DIMENSION(ngrid,nlay), INTENT(OUT)      :: Km_out   ! output: Exchange coefficient for momentum at interface between layers (m2/s)
    8285REAL, DIMENSION(ngrid,nlay), INTENT(OUT)      :: Kh_out   ! output: Exchange coefficient for heat flux at interface between layers (m2/s)
     
    261264                shear2(igrid,ilay) * (1. - Ri(igrid,ilay) / Prandtl(igrid,ilay))
    262265                eps(igrid,ilay) = (tke(igrid,ilay)**(3./2))/(cepsilon*l_exchange(igrid,ilay))
     266                tke_shear(igrid,ilay)=l_exchange(igrid,ilay)*Sm(igrid,ilay)*sqrt(tke(igrid,ilay))*shear2(igrid,ilay)
     267                tke_buoy(igrid,ilay)=-l_exchange(igrid,ilay)*Sm(igrid,ilay)*sqrt(tke(igrid,ilay))*shear2(igrid,ilay) &
     268                                    *(Ri(igrid,ilay) / Prandtl(igrid,ilay))
    263269            ENDDO
    264270        ENDDO
     
    278284            qq=max(0.,qq)
    279285            tke(igrid,ilay)=0.5*(qq**2)
    280             eps(igrid,ilay) = (tke(igrid,ilay)**(3./2))/(cepsilon*l_exchange(igrid,ilay))
     286            eps(igrid,ilay) = (tke(igrid,ilay)**(3./2))/(cepsilon*l_exchange(igrid,ilay))
     287            tke_shear(igrid,ilay)=l_exchange(igrid,ilay)*Sm(igrid,ilay)*sqrt(tke(igrid,ilay))*shear2(igrid,ilay)
     288            tke_buoy(igrid,ilay)=-l_exchange(igrid,ilay)*Sm(igrid,ilay)*sqrt(tke(igrid,ilay))*shear2(igrid,ilay) &
     289                                *(Ri(igrid,ilay) / Prandtl(igrid,ilay))
    281290            ENDDO
    282291        ENDDO
     
    293302            qq=(qq+l_exchange(igrid,ilay)*Sm(igrid,ilay)*dtime/sqrt(2.)      &
    294303                *shear2(igrid,ilay)*(1.-Ri(igrid,ilay)/Prandtl(igrid,ilay))) &
    295                 /(1.+qq*dtime/(cepsilon*l_exchange(igrid,ilay)*2.*sqrt(2.)))
     304                /(1.+qq*dtime/(cepsilon*l_exchange(igrid,ilay)*2.*sqrt(2.)))
     305            tke_shear(igrid,ilay)=l_exchange(igrid,ilay)*Sm(igrid,ilay)*qq/sqrt(2.)*shear2(igrid,ilay)
     306            tke_buoy(igrid,ilay)=-l_exchange(igrid,ilay)*Sm(igrid,ilay)*qq/sqrt(2.)*shear2(igrid,ilay) &
     307                                *(Ri(igrid,ilay) / Prandtl(igrid,ilay))
    296308            tke(igrid,ilay)=0.5*(qq**2)
    297309            eps(igrid,ilay) = (tke(igrid,ilay)**(3./2))/(cepsilon*l_exchange(igrid,ilay))
     
    308320            eps(igrid,ilay) = (tke(igrid,ilay)**(3./2))/(cepsilon*l_exchange(igrid,ilay))
    309321            qq=max(sqrt(2.*tke(igrid,ilay)),1.e-10)
     322            tke_shear(igrid,ilay)=l_exchange(igrid,ilay)*Sm(igrid,ilay)*qq/sqrt(2.)*shear2(igrid,ilay)
     323            tke_buoy(igrid,ilay)=-l_exchange(igrid,ilay)*Sm(igrid,ilay)*qq/sqrt(2.)*shear2(igrid,ilay) &
     324                                *(Ri(igrid,ilay) / Prandtl(igrid,ilay))
    310325            IF (Ri(igrid,ilay) .LT. 0.) THEN
    311326                netloss=qq/(2.*sqrt(2.)*cepsilon*l_exchange(igrid,ilay))
     
    327342            DO igrid=1,ngrid
    328343            qq=max(sqrt(2.*tke(igrid,ilay)),1.e-10)
     344            tke_shear(igrid,ilay)=l_exchange(igrid,ilay)*Sm(igrid,ilay)*qq/sqrt(2.)*shear2(igrid,ilay)
     345            tke_buoy(igrid,ilay)=-l_exchange(igrid,ilay)*Sm(igrid,ilay)*qq/sqrt(2.)*shear2(igrid,ilay) &
     346                                *(Ri(igrid,ilay) / Prandtl(igrid,ilay))
    329347            qq=(l_exchange(igrid,ilay)*Sm(igrid,ilay)/sqrt(2.)*shear2(igrid,ilay)*(1.-Ri(igrid,ilay)/Prandtl(igrid,ilay)) &
    330348                +qq*(1.+dtime*qq/(cepsilon*l_exchange(igrid,ilay)*2.*sqrt(2.)))) &
     
    349367    tke(igrid,nlay+1)=0.
    350368    eps(igrid,nlay+1)=0.
     369    tke_shear(igrid,nlay+1)=0.
     370    tke_buoy(igrid,nlay+1)=0.
    351371END DO
    352372
     
    359379    tke(igrid,1)=ctkes*(ustar**2)
    360380    eps(igrid,1)=0. ! arbitrary as TKE is not properly defined at the surface
     381    tke_shear(igrid,1)=0.
     382    tke_buoy(igrid,1)=0.
    361383END DO
    362384
     
    364386! vertical diffusion of TKE
    365387!==========================
     388tke_trans(:,:)=0.
    366389IF (atke_ok_vdiff) THEN
    367     CALL atke_vdiff_tke(ngrid,nlay,dtime,z_lay,z_interf,temp,play,l_exchange,Sm,tke)
     390    CALL atke_vdiff_tke(ngrid,nlay,dtime,z_lay,z_interf,temp,play,l_exchange,Sm,tke,tke_trans)
    368391ENDIF
    369392
     
    387410
    388411!===============================================================================================
    389 subroutine atke_vdiff_tke(ngrid,nlay,dtime,z_lay,z_interf,temp,play,l_exchange,Sm,tke)
     412subroutine atke_vdiff_tke(ngrid,nlay,dtime,z_lay,z_interf,temp,play,l_exchange,Sm,tke,tke_trans)
    390413
    391414! routine that computes the vertical diffusion of TKE by the turbulence
     
    408431
    409432REAL, DIMENSION(ngrid,nlay+1), INTENT(INOUT)  :: tke    ! turbulent kinetic energy at interface between layers
    410 
     433REAL, DIMENSION(ngrid,nlay+1), INTENT(INOUT)  :: tke_trans ! turbulent kinetic energy transport term (m2/s3)
    411434
    412435
     
    480503! update TKE
    481504tke(:,:)=tke(:,:)+dtke(:,:)
     505tke_trans(:,:)=dtke(:,:)/dtime
    482506
    483507
  • LMDZ6/branches/cirrus/libf/phylmd/lmdz_atke_turbulence_ini.F90

    r4804 r5202  
    5050      !!
    5151      !! ** Purpose :   Initialization of the atke module and choice of some constants
    52       !!               
     52      !!                Default values correspond to the  'best' configuration
     53      !!                from tuning on GABLS1 in Vignon et al. 2024, JAMES
    5354      !!----------------------------------------------------------------------
    5455
     
    7374
    7475      ! flag that controls options in atke_compute_km_kh
    75       iflag_atke=0
     76      iflag_atke=1
    7677      CALL getin_p('iflag_atke',iflag_atke)
    7778
    7879      ! flag that controls the calculation of mixing length in atke
    79       iflag_atke_lmix=0
     80      iflag_atke_lmix=3
    8081      CALL getin_p('iflag_atke_lmix',iflag_atke_lmix)
    8182
     
    8687
    8788      ! activate vertical diffusion of TKE or not
    88       atke_ok_vdiff=.false.
     89      atke_ok_vdiff=.true.
    8990      CALL getin_p('atke_ok_vdiff',atke_ok_vdiff)
    9091
     
    101102      ! Sun et al 2011, JAMC
    102103      ! between 10 and 40
    103       l0=15.0
     104      l0=42.5279652116005
    104105      CALL getin_p('atke_l0',l0)
    105106
    106107      ! critical Richardson number
    107       ric=0.25
     108      ric=0.190537327781655
    108109      CALL getin_p('atke_ric',ric)
    109110
    110111      ! constant for tke dissipation calculation
    111       cepsilon=5.87 ! default value as in yamada4
     112      cepsilon=8.89273387537601
    112113      CALL getin_p('atke_cepsilon',cepsilon)
    113114
     
    131132
    132133      ! slope of Pr=f(Ri) for stable conditions
    133       pr_slope=5.0 ! default value from Zilitinkevich et al. 2005
     134      pr_slope=4.67885738180385
    134135      CALL getin_p('atke_pr_slope',pr_slope)
    135136      if (pr_slope .le. 1) then
     
    139140
    140141      ! value of turbulent prandtl number in neutral conditions (Ri=0)
    141       pr_neut=0.8
     142      pr_neut=0.837372701768868
    142143      CALL getin_p('atke_pr_neut',pr_neut)
    143144
     
    151152
    152153      ! coefficient for mixing length depending on local stratification
    153       clmix=0.5
     154      clmix=0.648055235325291
    154155      CALL getin_p('atke_clmix',clmix)
    155156
     
    160161      ! minimum anisotropy coefficient (defined here as minsqrt(Ez/Ek)) at large Ri.
    161162      ! From Zilitinkevich et al. 2013, it equals sqrt(0.03)~0.17 
    162       smmin=0.17
     163      smmin=0.0960838631869678
    163164      CALL getin_p('atke_smmin',smmin)
    164165
    165166      ! ratio between the eddy diffusivity coeff for tke wrt that for momentum
    166167      ! default value from Lenderink et al. 2004
    167       cke=2.
     168      cke=2.47069655134662
    168169      CALL getin_p('atke_cke',cke)
    169170
  • LMDZ6/branches/cirrus/libf/phylmd/lmdz_call_atke.F90

    r4881 r5202  
    88contains
    99
    10 subroutine call_atke(dtime,ngrid,nlay,cdrag_uv,cdrag_t,u_surf,v_surf,temp_surf, &
     10subroutine call_atke(dtime,ngrid,nlay,nsrf,ni,cdrag_uv,cdrag_t,u_surf,v_surf,temp_surf, &
    1111                        wind_u,wind_v,temp,qvap,play,pinterf, &
    1212                        tke,eps,Km_out,Kh_out)
     
    1616
    1717USE lmdz_atke_turbulence_ini, ONLY : iflag_num_atke, rg, rd
     18USE phys_local_var_mod, ONLY: tke_shear, tke_buoy, tke_trans
    1819
    1920implicit none
     
    2627INTEGER, INTENT(IN) :: ngrid ! number of horizontal index (flat grid)
    2728INTEGER, INTENT(IN) :: nlay ! number of vertical index 
     29INTEGER, INTENT(IN) :: nsrf ! surface tile index
     30INTEGER, DIMENSION(ngrid), INTENT(IN) :: ni ! array of indices to move from knon to klon arrays
    2831
    2932
     
    5053
    5154
     55REAL, DIMENSION(ngrid,nlay+1) :: tke_shear_term,tke_buoy_term,tke_trans_term
    5256REAL, DIMENSION(ngrid,nlay) :: wind_u_predict, wind_v_predict
    5357REAL, DIMENSION(ngrid) ::  wind1
    54 INTEGER i
     58INTEGER i,j,k
    5559
    5660
    5761call atke_compute_km_kh(ngrid,nlay,dtime,&
    5862                        wind_u,wind_v,temp,qvap,play,pinterf,cdrag_uv,&
    59                         tke,eps,Km_out,Kh_out)
     63                        tke,eps,tke_shear_term,tke_buoy_term,tke_trans_term,Km_out,Kh_out)
    6064
    6165
     
    7680   call atke_compute_km_kh(ngrid,nlay,dtime,&
    7781                        wind_u_predict,wind_v_predict,temp,qvap,play,pinterf,cdrag_uv, &
    78                         tke,eps,Km_out,Kh_out)
     82                        tke,eps,tke_shear_term,tke_buoy_term,tke_trans_term,Km_out,Kh_out)
    7983
    8084end if
    8185
    8286
     87! Diagnostics of tke loss/source terms
    8388
     89 DO k=1,nlay+1
     90    DO i=1,ngrid
     91       j=ni(i)
     92       tke_shear(j,k,nsrf)=tke_shear_term(i,k)
     93       tke_buoy(j,k,nsrf)=tke_buoy_term(i,k)
     94       tke_trans(j,k,nsrf)=tke_trans_term(i,k)
     95    ENDDO
     96 ENDDO
    8497
    8598
  • LMDZ6/branches/cirrus/libf/phylmd/lmdz_lscp.F90

    r5163 r5202  
    77!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    88SUBROUTINE lscp(klon,klev,dtime,missing_val,            &
    9      paprs,pplay,temp,qt,ptconv,ratqs,                  &
     9     paprs,pplay,temp,qt,qice_save,ptconv,ratqs,        &
    1010     d_t, d_q, d_ql, d_qi, rneb, rneblsvol,             &
    11      pfraclr,pfracld,                                   &
     11     pfraclr, pfracld,                                  &
     12     cldfraliq, sigma2_icefracturb,mean_icefracturb,    &
    1213     radocond, radicefrac, rain, snow,                  &
    1314     frac_impa, frac_nucl, beta,                        &
    14      prfl, psfl, rhcl, qta, fraca,                     &
    15      tv, pspsk, tla, thl, iflag_cld_th,             &
    16      iflag_ice_thermo, distcltop, temp_cltop, cell_area,&
    17      cf_seri, rvc_seri, u_seri, v_seri, pbl_eps,        &
     15     prfl, psfl, rhcl, qta, fraca,                      &
     16     tv, pspsk, tla, thl, iflag_cld_th,                 &
     17     iflag_ice_thermo, distcltop, temp_cltop,           &
     18     tke, tke_dissip,                                   &
     19     cell_area,                                         &
     20     cf_seri, rvc_seri, u_seri, v_seri,                 &
    1821     qsub, qissr, qcld, subfra, issrfra, gamma_cond,    &
    1922     ratio_qi_qtot, dcf_sub, dcf_con, dcf_mix,          &
     
    100103! USE de modules contenant des fonctions.
    101104USE lmdz_cloudth, ONLY : cloudth, cloudth_v3, cloudth_v6, cloudth_mpc
    102 USE lmdz_lscp_tools, ONLY : calc_qsat_ecmwf, icefrac_lscp, calc_gammasat
     105USE lmdz_lscp_tools, ONLY : calc_qsat_ecmwf, calc_gammasat
     106USE lmdz_lscp_tools, ONLY : icefrac_lscp, icefrac_lscp_turb
    103107USE lmdz_lscp_tools, ONLY : fallice_velocity, distance_to_cloud_top
    104108USE lmdz_lscp_condensation, ONLY : condensation_lognormal, condensation_ice_supersat
     
    115119USE lmdz_lscp_ini, ONLY : RCPD, RLSTT, RLVTT, RLMLT, RVTMP2, RTT, RD, RG
    116120USE lmdz_lscp_ini, ONLY : ok_poprecip
    117 USE lmdz_lscp_ini, ONLY : ok_external_lognormal, ok_ice_supersat, ok_unadjusted_clouds
     121USE lmdz_lscp_ini, ONLY : ok_external_lognormal, ok_ice_supersat, ok_unadjusted_clouds, iflag_icefrac
    118122
    119123IMPLICIT NONE
     
    134138  REAL, DIMENSION(klon,klev),      INTENT(IN)   :: temp            ! temperature (K)
    135139  REAL, DIMENSION(klon,klev),      INTENT(IN)   :: qt              ! total specific humidity (in vapor phase in input) [kg/kg]
     140  REAL, DIMENSION(klon,klev),      INTENT(IN)   :: qice_save       ! ice specific from previous time step [kg/kg]
    136141  INTEGER,                         INTENT(IN)   :: iflag_cld_th    ! flag that determines the distribution of convective clouds
    137142  INTEGER,                         INTENT(IN)   :: iflag_ice_thermo! flag to activate the ice thermodynamics
     
    141146  !Inputs associated with thermal plumes
    142147
    143   REAL, DIMENSION(klon,klev),      INTENT(IN)   :: tv             ! virtual potential temperature [K]
    144   REAL, DIMENSION(klon,klev),      INTENT(IN)   :: qta            ! specific humidity within thermals [kg/kg]
    145   REAL, DIMENSION(klon,klev),      INTENT(IN)   :: fraca          ! fraction of thermals within the mesh [-]
    146   REAL, DIMENSION(klon,klev),      INTENT(IN)   :: pspsk          ! exner potential (p/100000)**(R/cp)
    147   REAL, DIMENSION(klon,klev),      INTENT(IN)   :: tla            ! liquid temperature within thermals [K]
     148  REAL, DIMENSION(klon,klev),      INTENT(IN)   :: tv                  ! virtual potential temperature [K]
     149  REAL, DIMENSION(klon,klev),      INTENT(IN)   :: qta                 ! specific humidity within thermals [kg/kg]
     150  REAL, DIMENSION(klon,klev),      INTENT(IN)   :: fraca               ! fraction of thermals within the mesh [-]
     151  REAL, DIMENSION(klon,klev),      INTENT(IN)   :: pspsk               ! exner potential (p/100000)**(R/cp)
     152  REAL, DIMENSION(klon,klev),      INTENT(IN)   :: tla                 ! liquid temperature within thermals [K]
     153  REAL, DIMENSION(klon,klev+1),      INTENT(IN)   :: tke                 !--turbulent kinetic energy [m2/s2]
     154  REAL, DIMENSION(klon,klev+1),      INTENT(IN)   :: tke_dissip          !--TKE dissipation [m2/s3]
    148155
    149156  ! INPUT/OUTPUT variables
    150157  !------------------------
    151158 
    152   REAL, DIMENSION(klon,klev),      INTENT(INOUT)   :: thl          ! liquid potential temperature [K]
    153   REAL, DIMENSION(klon,klev),      INTENT(INOUT)   :: ratqs        ! function of pressure that sets the large-scale
     159  REAL, DIMENSION(klon,klev),      INTENT(INOUT)   :: thl              ! liquid potential temperature [K]
     160  REAL, DIMENSION(klon,klev),      INTENT(INOUT)   :: ratqs            ! function of pressure that sets the large-scale
    154161
    155162  ! INPUT/OUTPUT condensation and ice supersaturation
     
    160167  REAL, DIMENSION(klon,klev),      INTENT(IN)   :: u_seri           ! eastward wind [m/s]
    161168  REAL, DIMENSION(klon,klev),      INTENT(IN)   :: v_seri           ! northward wind [m/s]
    162   REAL, DIMENSION(klon,klev+1),    INTENT(IN)   :: pbl_eps          ! TKE dissipation [?]
    163169  REAL, DIMENSION(klon),           INTENT(IN)   :: cell_area        ! area of each cell [m2]
    164170
     
    179185  REAL, DIMENSION(klon,klev),      INTENT(OUT)  :: pfraclr          ! precip fraction clear-sky part [-]
    180186  REAL, DIMENSION(klon,klev),      INTENT(OUT)  :: pfracld          ! precip fraction cloudy part [-]
     187  REAL, DIMENSION(klon,klev),      INTENT(OUT)  :: cldfraliq           ! liquid fraction of cloud [-]
     188  REAL, DIMENSION(klon,klev),      INTENT(OUT)  :: sigma2_icefracturb  ! Variance of the diagnostic supersaturation distribution (icefrac_turb) [-]
     189  REAL, DIMENSION(klon,klev),      INTENT(OUT)  :: mean_icefracturb    ! Mean of the diagnostic supersaturation distribution (icefrac_turb) [-]
    181190  REAL, DIMENSION(klon,klev),      INTENT(OUT)  :: radocond         ! condensed water used in the radiation scheme [kg/kg]
    182191  REAL, DIMENSION(klon,klev),      INTENT(OUT)  :: radicefrac       ! ice fraction of condensed water for radiation scheme
     
    190199  REAL, DIMENSION(klon,klev),      INTENT(OUT)  :: beta             ! conversion rate of condensed water
    191200
    192   ! fraction of aerosol scavenging through impaction and nucleation (for on-line)
     201  ! fraction of aerosol scavenging through impaction and nucleation    (for on-line)
    193202 
    194   REAL, DIMENSION(klon,klev),      INTENT(OUT)  :: frac_impa        ! scavenging fraction due tu impaction [-]
    195   REAL, DIMENSION(klon,klev),      INTENT(OUT)  :: frac_nucl        ! scavenging fraction due tu nucleation [-]
     203  REAL, DIMENSION(klon,klev),      INTENT(OUT)  :: frac_impa           ! scavenging fraction due tu impaction [-]
     204  REAL, DIMENSION(klon,klev),      INTENT(OUT)  :: frac_nucl           ! scavenging fraction due tu nucleation [-]
    196205 
    197206  ! for condensation and ice supersaturation
     
    255264  ! LOCAL VARIABLES:
    256265  !----------------
    257 
    258   REAL,DIMENSION(klon) :: qsl, qsi
     266  REAL,DIMENSION(klon) :: qsl, qsi                                ! saturation threshold at current vertical level
    259267  REAL :: zct, zcl,zexpo
    260268  REAL, DIMENSION(klon,klev) :: ctot
     
    263271  REAL :: zdelta, zcor, zcvm5
    264272  REAL, DIMENSION(klon) :: zdqsdT_raw
    265   REAL, DIMENSION(klon) :: gammasat,dgammasatdt                ! coefficient to make cold condensation at the correct RH and derivative wrt T
    266   REAL, DIMENSION(klon) :: Tbef,qlbef,DT
     273  REAL, DIMENSION(klon) :: gammasat,dgammasatdt                   ! coefficient to make cold condensation at the correct RH and derivative wrt T
     274  REAL, DIMENSION(klon) :: Tbef,qlbef,DT                          ! temperature, humidity and temp. variation during lognormal iteration
    267275  REAL :: num,denom
    268276  REAL :: cste
    269   REAL, DIMENSION(klon) :: zpdf_sig,zpdf_k,zpdf_delta
    270   REAL, DIMENSION(klon) :: Zpdf_a,zpdf_b,zpdf_e1,zpdf_e2
     277  REAL, DIMENSION(klon) :: zpdf_sig,zpdf_k,zpdf_delta             ! lognormal parameters
     278  REAL, DIMENSION(klon) :: Zpdf_a,zpdf_b,zpdf_e1,zpdf_e2          ! lognormal intermediate variables
    271279  REAL :: erf
    272280  REAL, DIMENSION(klon) :: zfice_th
     
    285293  REAL :: zmelt,zrain,zsnow,zprecip
    286294  REAL, DIMENSION(klon) :: dzfice
     295  REAL, DIMENSION(klon) :: zfice_turb, dzfice_turb
    287296  REAL :: zsolid
    288297  REAL, DIMENSION(klon) :: qtot, qzero
     
    315324  REAL, DIMENSION(klon,klev) :: radocondi, radocondl
    316325  REAL :: effective_zneb
    317   REAL, DIMENSION(klon) :: distcltop1D, temp_cltop1D
     326  REAL, DIMENSION(klon) :: zdistcltop, ztemp_cltop
     327  REAL, DIMENSION(klon) :: zqliq, zqice, zqvapcl        ! for icefrac_lscp_turb
    318328 
    319329  ! for condensation and ice supersaturation
     
    328338  REAL :: min_qParent, min_ratio
    329339
    330 
    331340  INTEGER i, k, n, kk, iter
    332341  INTEGER, DIMENSION(klon) :: n_i
     
    382391pfraclr(:,:)=0.0
    383392pfracld(:,:)=0.0
     393cldfraliq(:,:)=0.
     394sigma2_icefracturb(:,:)=0.
     395mean_icefracturb(:,:)=0.
    384396radocond(:,:) = 0.0
    385397radicefrac(:,:) = 0.0
     
    391403zfice(:)=0.0
    392404dzfice(:)=0.0
     405zfice_turb(:)=0.0
     406dzfice_turb(:)=0.0
    393407zqprecl(:)=0.0
    394408zqpreci(:)=0.0
     
    405419d_tot_zneb(:) = 0.0
    406420qzero(:) = 0.0
    407 distcltop1D(:)=0.0
    408 temp_cltop1D(:) = 0.0
     421zdistcltop(:)=0.0
     422ztemp_cltop(:) = 0.0
    409423ztupnew(:)=0.0
    410424
     
    459473
    460474
    461 
    462475!c_iso: variable initialisation for iso
    463476
     
    478491
    479492    ! Initialisation temperature and specific humidity
     493    ! temp(klon,klev) is not modified by the routine, instead all changes in temperature are made on zt
     494    ! at the end of the klon loop, a temperature incremtent d_t due to all processes
     495    ! (thermalization, evap/sub incoming precip, cloud formation, precipitation processes) is calculated
     496    ! d_t = temperature tendency due to lscp
     497    ! The temperature of the overlying layer is updated here because needed for thermalization
    480498    DO i = 1, klon
    481499        zt(i)=temp(i,k)
     
    812830                ELSEIF (iflag_cloudth_vert .EQ. 7) THEN
    813831                   ! Updated version of Arnaud Jam (correction by E. Vignon) + adapted treatment
    814                    ! for boundary-layer mixed phase clouds following Vignon et al. 
     832                   ! for boundary-layer mixed phase clouds
    815833                    CALL cloudth_mpc(klon,klev,k,mpc_bl_points,zt,zq,qta(:,k),fraca(:,k), &
    816834                                     pspsk(:,k),paprs(:,k+1),paprs(:,k),pplay(:,k), tla(:,k), &
     
    834852           
    835853                ! lognormal
    836             lognormale = .TRUE.
     854            lognormale(:) = .TRUE.
    837855
    838856        ELSEIF (iflag_cld_th .GE. 6) THEN
    839857           
    840858                ! lognormal distribution when no thermals
    841             lognormale = fraca(:,k) < min_frac_th_cld
     859            lognormale(:) = fraca(:,k) < min_frac_th_cld
    842860
    843861        ELSE
    844862                ! When iflag_cld_th=5, we always assume
    845863                ! bi-gaussian distribution
    846             lognormale = .FALSE.
     864            lognormale(:) = .FALSE.
    847865       
    848866        ENDIF
     
    900918                  IF (iflag_t_glace.GE.4) THEN
    901919                  ! For iflag_t_glace GE 4 the phase partition function dependends on temperature AND distance to cloud top
    902                        CALL distance_to_cloud_top(klon,klev,k,temp,pplay,paprs,rneb,distcltop1D,temp_cltop1D)
     920                       CALL distance_to_cloud_top(klon,klev,k,temp,pplay,paprs,rneb,zdistcltop,ztemp_cltop)
    903921                  ENDIF
    904                   CALL icefrac_lscp(klon, zt(:), iflag_ice_thermo, distcltop1D(:),temp_cltop1D(:),zfice(:),dzfice(:))
    905 
     922
     923                  CALL icefrac_lscp(klon, zt(:), iflag_ice_thermo, zdistcltop(:),ztemp_cltop(:),zfice(:),dzfice(:))
    906924
    907925                  !--AB Activates a condensation scheme that allows for
     
    938956                        pplay(:,k), paprs(:,k), paprs(:,k+1), &
    939957                        cf_seri(:,k), rvc_seri(:,k), ratio_qi_qtot(:,k), &
    940                         shear(:), pbl_eps(:,k), cell_area(:), &
     958                        shear(:), tke_dissip(:,k), cell_area(:), &
    941959                        Tbef(:), zq(:), zqs(:), gammasat(:), ratqs(:,k), keepgoing(:), &
    942960                        rneb(:,k), zqn(:), qvc(:), issrfra(:,k), qissr(:,k), &
     
    10171035                            cste=RLSTT
    10181036                        ENDIF
    1019 
     1037                       
     1038                        ! LEA_R : check formule
    10201039                        IF ( ok_unadjusted_clouds ) THEN
    10211040                          !--AB We relax the saturation adjustment assumption
     
    10591078        ! For iflag_t_glace GE 4 the phase partition function dependends on temperature AND distance to cloud top
    10601079        IF (iflag_t_glace.GE.4) THEN
    1061             CALL distance_to_cloud_top(klon,klev,k,temp,pplay,paprs,rneb,distcltop1D,temp_cltop1D)
    1062             distcltop(:,k)=distcltop1D(:)
    1063             temp_cltop(:,k)=temp_cltop1D(:)
    1064         ENDIF   
    1065         ! Partition function in stratiform clouds (will be overwritten in boundary-layer MPCs)
    1066         CALL icefrac_lscp(klon,zt,iflag_ice_thermo,distcltop1D,temp_cltop1D,zfice,dzfice)
    1067 
     1080           CALL distance_to_cloud_top(klon,klev,k,temp,pplay,paprs,rneb,zdistcltop,ztemp_cltop)
     1081           distcltop(:,k)=zdistcltop(:)
     1082           temp_cltop(:,k)=ztemp_cltop(:)
     1083        ENDIF
     1084
     1085        ! Partition function depending on temperature
     1086        CALL icefrac_lscp(klon, zt, iflag_ice_thermo, zdistcltop, ztemp_cltop, zfice, dzfice)
     1087
     1088        ! Partition function depending on tke for non shallow-convective clouds
     1089        IF (iflag_icefrac .GE. 1) THEN
     1090
     1091           CALL icefrac_lscp_turb(klon, dtime, Tbef, pplay(:,k), paprs(:,k), paprs(:,k+1), qice_save(:,k), ziflcld, zqn, &
     1092           rneb(:,k), tke(:,k), tke_dissip(:,k), zqliq, zqvapcl, zqice, zfice_turb, dzfice_turb, cldfraliq(:,k),sigma2_icefracturb(:,k), mean_icefracturb(:,k))
     1093
     1094        ENDIF
    10681095
    10691096        ! Water vapor update, Phase determination and subsequent latent heat exchange
    10701097        DO i=1, klon
    1071 
     1098            ! Overwrite phase partitioning in boundary layer mixed phase clouds when the
     1099            ! iflag_cloudth_vert=7 and specific param is activated
    10721100            IF (mpc_bl_points(i,k) .GT. 0) THEN
    1073                
    10741101                zcond(i) = MAX(0.0,qincloud_mpc(i))*rneb(i,k)
    10751102                ! following line is very strange and probably wrong
     
    10781105                zq(i) = zq(i) - zcond(i)       
    10791106                zfice(i)=zfice_th(i)
    1080 
    10811107            ELSE
    1082 
    10831108                ! Checks on rneb, rhcl and zqn
    10841109                IF (rneb(i,k) .LE. 0.0) THEN
     
    11081133                    ! following line is very strange and probably wrong:
    11091134                    rhcl(i,k)=(zqs(i)+zq(i))/2./zqs(i)
     1135                    ! Overwrite partitioning for non shallow-convective clouds if iflag_icefrac>1 (icefrac turb param)
     1136                    IF (iflag_icefrac .GE. 1) THEN
     1137                        IF (lognormale(i)) THEN 
     1138                           zcond(i)  = zqliq(i) + zqice(i)
     1139                           zfice(i)=zfice_turb(i)
     1140                           rhcl(i,k) = zqvapcl(i) * rneb(i,k) + (zq(i) - zqn(i)) * (1.-rneb(i,k))
     1141                        ENDIF
     1142                    ENDIF
    11101143                ENDIF
    11111144
     
    14931526                znebprecipcld(i)=0.0
    14941527            ENDIF
    1495 
     1528        !IF ( ((1-zfice(i))*zoliq(i) .GT. 0.) .AND. (zt(i) .LE. 233.15) ) THEN
     1529        !print*,'WARNING LEA OLIQ A <-40°C '
     1530        !print*,'zt,Tbef,oliq,oice,cldfraliq,icefrac,rneb',zt(i),Tbef(i),(1-zfice(i))*zoliq(i),zfice(i)*zoliq(i),cldfraliq(i,k),zfice(i),rneb(i,k)
     1531        !ENDIF
    14961532        ENDDO
    14971533
  • LMDZ6/branches/cirrus/libf/phylmd/lmdz_lscp_ini.F90

    r5165 r5202  
    6767  !$OMP THREADPRIVATE(iflag_t_glace)
    6868
    69   INTEGER, SAVE, PROTECTED :: iflag_cloudth_vert=0         ! option for determining cloud fraction and content in convective boundary layers
     69  INTEGER, SAVE, PROTECTED :: iflag_cloudth_vert=0          ! option for determining cloud fraction and content in convective boundary layers
    7070  !$OMP THREADPRIVATE(iflag_cloudth_vert)
    7171
    72   INTEGER, SAVE, PROTECTED :: iflag_gammasat=0             ! which threshold for homogeneous nucleation below -40oC
     72  INTEGER, SAVE, PROTECTED :: iflag_gammasat=0              ! which threshold for homogeneous nucleation below -40oC
    7373  !$OMP THREADPRIVATE(iflag_gammasat)
    7474
    75   INTEGER, SAVE, PROTECTED :: iflag_rain_incloud_vol=0     ! use of volume cloud fraction for rain autoconversion
     75  INTEGER, SAVE, PROTECTED :: iflag_rain_incloud_vol=0      ! use of volume cloud fraction for rain autoconversion
    7676  !$OMP THREADPRIVATE(iflag_rain_incloud_vol)
    7777
    78   INTEGER, SAVE, PROTECTED :: iflag_bergeron=0             ! bergeron effect for liquid precipitation treatment 
     78  INTEGER, SAVE, PROTECTED :: iflag_bergeron=0              ! bergeron effect for liquid precipitation treatment 
    7979  !$OMP THREADPRIVATE(iflag_bergeron)
    8080
    81   INTEGER, SAVE, PROTECTED :: iflag_fisrtilp_qsat=0        ! qsat adjustment (iterative) during autoconversion
     81  INTEGER, SAVE, PROTECTED :: iflag_fisrtilp_qsat=0         ! qsat adjustment (iterative) during autoconversion
    8282  !$OMP THREADPRIVATE(iflag_fisrtilp_qsat)
    8383
    84   INTEGER, SAVE, PROTECTED :: iflag_pdf=0                  ! type of subgrid scale qtot pdf
     84  INTEGER, SAVE, PROTECTED :: iflag_pdf=0                   ! type of subgrid scale qtot pdf
    8585  !$OMP THREADPRIVATE(iflag_pdf)
    8686
    87   INTEGER, SAVE, PROTECTED :: iflag_autoconversion=0       ! autoconversion option
     87  INTEGER, SAVE, PROTECTED :: iflag_icefrac=0               ! which phase partitioning function to use
     88  !$OMP THREADPRIVATE(iflag_icefrac)
     89
     90  INTEGER, SAVE, PROTECTED :: iflag_autoconversion=0        ! autoconversion option
    8891  !$OMP THREADPRIVATE(iflag_autoconversion)
    8992
    90   LOGICAL, SAVE, PROTECTED :: reevap_ice=.false.           ! no liquid precip for T< threshold
     93
     94  LOGICAL, SAVE, PROTECTED :: reevap_ice=.false.            ! no liquid precip for T< threshold
    9195  !$OMP THREADPRIVATE(reevap_ice)
    9296
    93   REAL, SAVE, PROTECTED :: cld_lc_lsc=2.6e-4               ! liquid autoconversion coefficient, stratiform rain
     97  REAL, SAVE, PROTECTED :: cld_lc_lsc=2.6e-4                ! liquid autoconversion coefficient, stratiform rain
    9498  !$OMP THREADPRIVATE(cld_lc_lsc)
    9599
     
    118122  !$OMP THREADPRIVATE(coef_eva)
    119123
    120   REAL, SAVE, PROTECTED :: coef_sub                        ! tuning coefficient ice precip sublimation
     124  REAL, SAVE, PROTECTED :: coef_sub                         ! tuning coefficient ice precip sublimation
    121125  !$OMP THREADPRIVATE(coef_sub)
    122126
     
    124128  !$OMP THREADPRIVATE(expo_eva)
    125129
    126   REAL, SAVE, PROTECTED :: expo_sub                       ! tuning coefficient ice precip sublimation
     130  REAL, SAVE, PROTECTED :: expo_sub                         ! tuning coefficient ice precip sublimation
    127131  !$OMP THREADPRIVATE(expo_sub)
    128132
     
    226230  !$OMP THREADPRIVATE(thresh_precip_frac)
    227231
     232  REAL, SAVE, PROTECTED :: tau_mixenv=100000                ! Homogeneization time of mixed phase clouds [s]
     233  !$OMP THREADPRIVATE(tau_mixenv)
     234
     235    REAL, SAVE, PROTECTED :: capa_crystal=1.                ! Sursaturation of ice part in mixed phase clouds [-]
     236  !$OMP THREADPRIVATE(capa_crystal)
     237
     238  REAL, SAVE, PROTECTED :: lmix_mpc=1000                    ! Length of turbulent zones in Mixed Phase Clouds [m]
     239  !$OMP THREADPRIVATE(lmix_mpc)
     240
     241  REAL, SAVE, PROTECTED :: naero5=0.5                       ! Number concentration of aerosol larger than 0.5 microns [scm-3]
     242  !$OMP THREADPRIVATE(naero5)
     243
     244  REAL, SAVE, PROTECTED :: gamma_snwretro = 0.              ! Proportion of snow taken into account in ice retroaction in icefrac_turb [-]
     245  !$OMP THREADPRIVATE(gamma_snwretro)
     246
     247  REAL, SAVE, PROTECTED :: gamma_taud = 1.                  ! Tuning coeff for tau_dissipturb [-]
     248  !$OMP THREADPRIVATE(gamma_taud)
     249
    228250  REAL, SAVE, PROTECTED :: gamma_col=1.                     ! A COMMENTER TODO [-]
    229251  !$OMP THREADPRIVATE(gamma_col)
     
    235257  !$OMP THREADPRIVATE(gamma_rim)
    236258
    237   REAL, SAVE, PROTECTED :: rho_rain=1000.                    ! A COMMENTER TODO [kg/m3]
     259  REAL, SAVE, PROTECTED :: rho_rain=1000.                   ! Rain density [kg/m3]
    238260  !$OMP THREADPRIVATE(rho_rain)
    239261
    240   REAL, SAVE, PROTECTED :: rho_ice=920.                    ! A COMMENTER TODO [kg/m3]
     262  REAL, SAVE, PROTECTED :: rho_ice=920.                     ! Ice density [kg/m3]
    241263  !$OMP THREADPRIVATE(rho_ice)
    242264
    243   REAL, SAVE, PROTECTED :: r_rain=500.E-6                   ! A COMMENTER TODO [m]
     265  REAL, SAVE, PROTECTED :: r_rain=500.E-6                   ! Rain droplets radius for POPRECIP [m]
    244266  !$OMP THREADPRIVATE(r_rain)
    245267
    246   REAL, SAVE, PROTECTED :: r_snow=1.E-3                    ! A COMMENTER TODO [m]
     268  REAL, SAVE, PROTECTED :: r_snow=1.E-3                     ! Ice crystals radius for POPRECIP [m]
    247269  !$OMP THREADPRIVATE(r_snow)
    248270
    249   REAL, SAVE, PROTECTED :: tau_auto_snow_min=100.          ! A COMMENTER TODO [s]
     271  REAL, SAVE, PROTECTED :: tau_auto_snow_min=100.           ! A COMMENTER TODO [s]
    250272  !$OMP THREADPRIVATE(tau_auto_snow_min)
    251273
     
    256278  !$OMP THREADPRIVATE(eps)
    257279
    258   REAL, SAVE, PROTECTED :: gamma_melt=1.                   ! A COMMENTER TODO [-]
     280  REAL, SAVE, PROTECTED :: gamma_melt=1.                    ! A COMMENTER TODO [-]
    259281  !$OMP THREADPRIVATE(gamma_melt)
    260282
    261   REAL, SAVE, PROTECTED :: alpha_freez=4.                 ! A COMMENTER TODO [-]
     283  REAL, SAVE, PROTECTED :: alpha_freez=4.                   ! A COMMENTER TODO [-]
    262284  !$OMP THREADPRIVATE(alpha_freez)
    263285
    264   REAL, SAVE, PROTECTED :: beta_freez=0.1                 ! A COMMENTER TODO [m-3.s-1]
     286  REAL, SAVE, PROTECTED :: beta_freez=0.1                   ! A COMMENTER TODO [m-3.s-1]
    265287  !$OMP THREADPRIVATE(beta_freez)
    266288
    267   REAL, SAVE, PROTECTED :: gamma_freez=1.                 ! A COMMENTER TODO [-]
     289  REAL, SAVE, PROTECTED :: gamma_freez=1.                   ! A COMMENTER TODO [-]
    268290  !$OMP THREADPRIVATE(gamma_freez)
    269291
    270   REAL, SAVE, PROTECTED :: rain_fallspeed=4.              ! A COMMENTER TODO [m/s]
     292  REAL, SAVE, PROTECTED :: rain_fallspeed=4.                ! A COMMENTER TODO [m/s]
    271293  !$OMP THREADPRIVATE(rain_fallspeed)
    272294
    273   REAL, SAVE, PROTECTED :: rain_fallspeed_clr              ! A COMMENTER TODO [m/s]
     295  REAL, SAVE, PROTECTED :: rain_fallspeed_clr                ! A COMMENTER TODO [m/s]
    274296  !$OMP THREADPRIVATE(rain_fallspeed_clr)
    275297
    276   REAL, SAVE, PROTECTED :: rain_fallspeed_cld             ! A COMMENTER TODO [m/s]
     298  REAL, SAVE, PROTECTED :: rain_fallspeed_cld               ! A COMMENTER TODO [m/s]
    277299  !$OMP THREADPRIVATE(rain_fallspeed_cld)
    278300
    279   REAL, SAVE, PROTECTED :: snow_fallspeed=1.             ! A COMMENTER TODO [m/s]
     301  REAL, SAVE, PROTECTED :: snow_fallspeed=1.               ! A COMMENTER TODO [m/s]
    280302  !$OMP THREADPRIVATE(snow_fallspeed)
    281303
    282   REAL, SAVE, PROTECTED :: snow_fallspeed_clr             ! A COMMENTER TODO [m/s]
     304  REAL, SAVE, PROTECTED :: snow_fallspeed_clr               ! A COMMENTER TODO [m/s]
    283305  !$OMP THREADPRIVATE(snow_fallspeed_clr)
    284306
    285   REAL, SAVE, PROTECTED :: snow_fallspeed_cld             ! A COMMENTER TODO [m/s]
     307  REAL, SAVE, PROTECTED :: snow_fallspeed_cld               ! A COMMENTER TODO [m/s]
    286308  !$OMP THREADPRIVATE(snow_fallspeed_cld)
    287309  !--End of the parameters for poprecip
     
    325347    RLMLT=RLMLT_in
    326348    RTT=RTT_in
    327     RG=RG_in
     349    RV=RV_in
    328350    RVTMP2=RVTMP2_in
    329351    RPI=RPI_in
     
    347369    CALL getin_p('iflag_fisrtilp_qsat',iflag_fisrtilp_qsat)
    348370    CALL getin_p('iflag_pdf',iflag_pdf)
     371    CALL getin_p('iflag_icefrac',iflag_icefrac)
    349372    CALL getin_p('reevap_ice',reevap_ice)
    350373    CALL getin_p('cld_lc_lsc',cld_lc_lsc)
     
    368391    CALL getin_p('dist_liq',dist_liq)
    369392    CALL getin_p('tresh_cl',tresh_cl)
     393    CALL getin_p('tau_mixenv',tau_mixenv)
     394    CALL getin_p('capa_crystal',capa_crystal)
     395    CALL getin_p('lmix_mpc',lmix_mpc)
     396    CALL getin_p('naero5',naero5)
     397    CALL getin_p('gamma_snwretro',gamma_snwretro)
     398    CALL getin_p('gamma_taud',gamma_taud)
    370399    CALL getin_p('iflag_oldbug_fisrtilp',iflag_oldbug_fisrtilp)
    371400    CALL getin_p('temp_nowater',temp_nowater)
     
    430459    WRITE(lunout,*) 'lscp_ini, iflag_fisrtilp_qsat:', iflag_fisrtilp_qsat
    431460    WRITE(lunout,*) 'lscp_ini, iflag_pdf', iflag_pdf
     461    WRITE(lunout,*) 'lscp_ini, iflag_icefrac', iflag_icefrac
    432462    WRITE(lunout,*) 'lscp_ini, reevap_ice', reevap_ice
    433463    WRITE(lunout,*) 'lscp_ini, cld_lc_lsc', cld_lc_lsc
     
    448478    WRITE(lunout,*) 'lscp_ini, dist_liq', dist_liq
    449479    WRITE(lunout,*) 'lscp_ini, tresh_cl', tresh_cl
     480    WRITE(lunout,*) 'lscp_ini, tau_mixenv', tau_mixenv
     481    WRITE(lunout,*) 'lscp_ini, capa_crystal', capa_crystal
     482    WRITE(lunout,*) 'lscp_ini, lmix_mpc', lmix_mpc
     483    WRITE(lunout,*) 'lscp_ini, naero5', naero5
     484    WRITE(lunout,*) 'lscp_ini, gamma_snwretro', gamma_snwretro
     485    WRITE(lunout,*) 'lscp_ini, gamma_taud', gamma_taud
    450486    WRITE(lunout,*) 'lscp_ini, iflag_oldbug_fisrtilp', iflag_oldbug_fisrtilp
    451487    WRITE(lunout,*) 'lscp_ini, fl_cor_ebil', fl_cor_ebil
  • LMDZ6/branches/cirrus/libf/phylmd/lmdz_lscp_poprecip.F90

    r4974 r5202  
    559559
    560560    !--Same as for aggregation
    561     !--Eff_snow_liq formula: following Milbrandt and Yau 2005,
     561    !--Eff_snow_liq formula:
    562562    !--it s a product of a collection efficiency and a sticking efficiency
    563     Eff_snow_ice = 0.05 * EXP( 0.1 * ( temp(i) - RTT ) )
     563    ! Milbrandt and Yau formula that gives very low values:
     564    ! Eff_snow_ice = 0.05 * EXP( 0.1 * ( temp(i) - RTT ) )
     565    ! Lin 1983's formula
     566    Eff_snow_ice = EXP( 0.025 * MIN( ( temp(i) - RTT ), 0.) )
    564567    !--rho_snow formula follows Brandes et al. 2007 (JAMC)
    565568    rho_snow = 1.e3 * 0.178 * ( r_snow * 2. * 1000. )**(-0.922)
     
    653656    !--NB.: this process needs a temperature adjustment
    654657
    655     !--Eff_snow_liq formula: following Seifert and Beheng 2006,
    656     !--assuming a cloud droplet diameter of 20 microns.
    657     Eff_snow_liq = 0.2
     658    !--Eff_snow_liq formula: following Ferrier 1994,
     659    !--assuming 1
     660    Eff_snow_liq = 1.0
    658661    !--rho_snow formula follows Brandes et al. 2007 (JAMC)
    659662    rho_snow = 1.e3 * 0.178 * ( r_snow * 2. * 1000. )**(-0.922)
  • LMDZ6/branches/cirrus/libf/phylmd/lmdz_lscp_tools.F90

    r5019 r5202  
    136136    CHARACTER (len = 80) :: abort_message
    137137
    138     IF ((iflag_t_glace.LT.2) .OR. (iflag_t_glace.GT.6)) THEN
     138    IF ((iflag_t_glace.LT.2)) THEN !.OR. (iflag_t_glace.GT.6)) THEN
    139139       abort_message = 'lscp cannot be used if iflag_t_glace<2 or >6'
    140140       CALL abort_physic(modname,abort_message,1)
     
    194194
    195195        ! with CMIP6 function of temperature at cloud top
    196         IF (iflag_t_glace .EQ. 5) THEN
     196        IF ((iflag_t_glace .EQ. 5) .OR. (iflag_t_glace .EQ. 7)) THEN
    197197                liqfrac_tmp = (temp(i)-t_glace_min) / (t_glace_max-t_glace_min)
    198198                liqfrac_tmp =  MIN(MAX(liqfrac_tmp,0.0),1.0)
     
    232232                ENDIF
    233233        ENDIF
    234 
     234     
    235235
    236236     ENDDO ! klon
    237  
    238237     RETURN
    239238 
     
    241240!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    242241
     242SUBROUTINE ICEFRAC_LSCP_TURB(klon, dtime, temp, pplay, paprsdn, paprsup, qice_ini, snowcld, qtot_incl, cldfra, tke, tke_dissip, qliq, qvap_cld, qice, icefrac, dicefracdT, cldfraliq, sigma2_icefracturb, mean_icefracturb)
     243!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
     244  ! Compute the liquid, ice and vapour content (+ice fraction) based
     245  ! on turbulence (see Fields 2014, Furtado 2016, Raillard 2025)
     246  ! L.Raillard (30/08/24)
     247!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
     248
     249
     250   USE lmdz_lscp_ini, ONLY : prt_level, lunout
     251   USE lmdz_lscp_ini, ONLY : RCPD, RLSTT, RLVTT, RLMLT, RVTMP2, RTT, RD, RG, RV, RPI
     252   USE lmdz_lscp_ini, ONLY : seuil_neb, temp_nowater
     253   USE lmdz_lscp_ini, ONLY : tau_mixenv, lmix_mpc, naero5, gamma_snwretro, gamma_taud, capa_crystal
     254   USE lmdz_lscp_ini, ONLY : eps
     255
     256   IMPLICIT NONE
     257
     258   INTEGER,   INTENT(IN)                           :: klon              !--number of horizontal grid points
     259   REAL,      INTENT(IN)                           :: dtime             !--time step [s]
     260
     261   REAL,      INTENT(IN),       DIMENSION(klon)    :: temp              !--temperature
     262   REAL,      INTENT(IN),       DIMENSION(klon)    :: pplay             !--pressure in the middle of the layer       [Pa]
     263   REAL,      INTENT(IN),       DIMENSION(klon)    :: paprsdn           !--pressure at the bottom interface of the layer [Pa]
     264   REAL,      INTENT(IN),       DIMENSION(klon)    :: paprsup           !--pressure at the top interface of the layer [Pa]
     265   REAL,      INTENT(IN),       DIMENSION(klon)    :: qtot_incl         !--specific total cloud water content, in-cloud content [kg/kg]
     266   REAL,      INTENT(IN),       DIMENSION(klon)    :: cldfra            !--cloud fraction in gridbox [-]
     267   REAL,      INTENT(IN),       DIMENSION(klon)    :: tke               !--turbulent kinetic energy [m2/s2]
     268   REAL,      INTENT(IN),       DIMENSION(klon)    :: tke_dissip        !--TKE dissipation [m2/s3]
     269
     270   REAL,      INTENT(IN),       DIMENSION(klon)    :: qice_ini          !--initial specific ice content gridbox-mean [kg/kg]
     271   REAL,      INTENT(IN),       DIMENSION(klon)    :: snowcld
     272   REAL,      INTENT(OUT),      DIMENSION(klon)    :: qliq              !--specific liquid content gridbox-mean [kg/kg]
     273   REAL,      INTENT(OUT),      DIMENSION(klon)    :: qvap_cld          !--specific cloud vapor content, gridbox-mean [kg/kg]
     274   REAL,      INTENT(OUT),      DIMENSION(klon)    :: qice              !--specific ice content gridbox-mean [kg/kg]
     275   REAL,      INTENT(OUT),      DIMENSION(klon)    :: icefrac           !--fraction of ice in condensed water [-]
     276   REAL,      INTENT(OUT),      DIMENSION(klon)    :: dicefracdT
     277
     278   REAL,      INTENT(OUT),      DIMENSION(klon)    :: cldfraliq         !--fraction of cldfra which is liquid only
     279   REAL,      INTENT(OUT),      DIMENSION(klon)    :: sigma2_icefracturb     !--Temporary
     280   REAL,      INTENT(OUT),      DIMENSION(klon)    :: mean_icefracturb      !--Temporary
     281
     282   REAL, DIMENSION(klon) :: qzero, qsatl, dqsatl, qsati, dqsati         !--specific humidity saturation values
     283   INTEGER :: i
     284
     285   REAL :: qvap_incl, qice_incl, qliq_incl, qiceini_incl                !--In-cloud specific quantities [kg/kg]
     286   REAL :: qsnowcld_incl
     287   !REAL :: capa_crystal                                                 !--Capacitance of ice crystals  [-]
     288   REAL :: water_vapor_diff                                             !--Water-vapour diffusion coefficient in air [m2/s] (function of T&P)
     289   REAL :: air_thermal_conduct                                          !--Thermal conductivity of air [J/m/K/s] (function of T)
     290   REAL :: C0                                                           !--Lagrangian structure function [-]
     291   REAL :: tau_mixingenv
     292   REAL :: tau_dissipturb
     293   REAL :: invtau_phaserelax
     294   REAL :: sigma2_pdf, mean_pdf
     295   REAL :: ai, bi, B0
     296   REAL :: sursat_iceliq
     297   REAL :: sursat_env
     298   REAL :: liqfra_max
     299   REAL :: sursat_iceext
     300   REAL :: nb_crystals                                                  !--number concentration of ice crystals [#/m3]
     301   REAL :: moment1_PSD                                                  !--1st moment of ice PSD
     302   REAL :: N0_PSD, lambda_PSD                                           !--parameters of the exponential PSD
     303
     304   REAL :: rho_ice                                                      !--ice density [kg/m3]
     305   REAL :: cldfra1D
     306   REAL :: deltaz, rho_air
     307   REAL :: psati                                                        !--saturation vapor pressure wrt i [Pa]
     308   
     309   C0            = 10.                                                  !--value assumed in Field2014           
     310   rho_ice       = 950.
     311   sursat_iceext = -0.1
     312   !capa_crystal  = 1. !r_ice                                       
     313   qzero(:)      = 0.
     314   cldfraliq(:)  = 0.
     315   icefrac(:)    = 0.
     316   dicefracdT(:) = 0.
     317
     318   sigma2_icefracturb(:) = 0.
     319   mean_icefracturb(:)  = 0.
     320
     321   !--wrt liquid water
     322   CALL calc_qsat_ecmwf(klon,temp(:),qzero(:),pplay(:),RTT,1,.false.,qsatl(:),dqsatl(:))
     323   !--wrt ice
     324   CALL calc_qsat_ecmwf(klon,temp(:),qzero(:),pplay(:),RTT,2,.false.,qsati(:),dqsati(:))
     325
     326
     327    DO i=1,klon
     328
     329
     330     rho_air  = pplay(i) / temp(i) / RD
     331     !deltaz   = ( paprsdn(i) - paprsup(i) ) / RG / rho_air(i)
     332     ! because cldfra is intent in, but can be locally modified due to test
     333     cldfra1D = cldfra(i)
     334     IF (cldfra(i) .LE. 0.) THEN
     335        qvap_cld(i)   = 0.
     336        qliq(i)       = 0.
     337        qice(i)       = 0.
     338        cldfraliq(i)  = 0.
     339        icefrac(i)    = 0.
     340        dicefracdT(i) = 0.
     341
     342     ! If there is a cloud
     343     ELSE
     344        IF (cldfra(i) .GE. 1.0) THEN
     345           cldfra1D = 1.0
     346        END IF
     347       
     348        ! T>0°C, no ice allowed
     349        IF ( temp(i) .GE. RTT ) THEN
     350           qvap_cld(i)   = qsatl(i) * cldfra1D
     351           qliq(i)       = MAX(0.0,qtot_incl(i)-qsatl(i))  * cldfra1D
     352           qice(i)       = 0.
     353           cldfraliq(i)  = 1.
     354           icefrac(i)    = 0.
     355           dicefracdT(i) = 0.
     356       
     357        ! T<-38°C, no liquid allowed
     358        ELSE IF ( temp(i) .LE. temp_nowater) THEN
     359           qvap_cld(i)   = qsati(i) * cldfra1D
     360           qliq(i)       = 0.
     361           qice(i)       = MAX(0.0,qtot_incl(i)-qsati(i)) * cldfra1D
     362           cldfraliq(i)  = 0.
     363           icefrac(i)    = 1.
     364           dicefracdT(i) = 0.
     365
     366        ! MPC temperature
     367        ELSE
     368           ! Not enough TKE     
     369           IF ( tke_dissip(i) .LE. eps )  THEN
     370              qvap_cld(i)   = qsati(i) * cldfra1D
     371              qliq(i)       = 0.
     372              qice(i)       = MAX(0.,qtot_incl(i)-qsati(i)) * cldfra1D   
     373              cldfraliq(i)  = 0.
     374              icefrac(i)    = 1.
     375              dicefracdT(i) = 0.
     376           
     377           ! Enough TKE   
     378           ELSE 
     379              print*,"MOUCHOIRACTIVE"
     380              !---------------------------------------------------------
     381              !--               ICE SUPERSATURATION PDF   
     382              !---------------------------------------------------------
     383              !--If -38°C< T <0°C and there is enough turbulence,
     384              !--we compute the cloud liquid properties with a Gaussian PDF
     385              !--of ice supersaturation F(Si) (Field2014, Furtado2016).
     386              !--Parameters of the PDF are function of turbulence and
     387              !--microphysics/existing ice.
     388
     389              sursat_iceliq = qsatl(i)/qsati(i) - 1.
     390              psati         = qsati(i) * pplay(i) / (RD/RV)
     391
     392              !-------------- MICROPHYSICAL TERMS --------------
     393              !--We assume an exponential ice PSD whose parameters
     394              !--are computed following Morrison&Gettelman 2008
     395              !--Ice number density is assumed equals to INP density
     396              !--which is a function of temperature (DeMott 2010) 
     397              !--bi and B0 are microphysical function characterizing
     398              !--vapor/ice interactions
     399              !--tau_phase_relax is the typical time of vapor deposition
     400              !--onto ice crystals
     401             
     402              qiceini_incl  = qice_ini(i) / cldfra1D
     403              qsnowcld_incl = snowcld(i) * RG * dtime / ( paprsdn(i) - paprsup(i) ) / cldfra1D
     404              sursat_env    = max(0., (qtot_incl(i) - qiceini_incl)/qsati(i) - 1.)
     405              IF ( qiceini_incl .GT. eps ) THEN
     406                nb_crystals = 1.e3 * 5.94e-5 * ( RTT - temp(i) )**3.33 * naero5**(0.0264*(RTT-temp(i))+0.0033)
     407                lambda_PSD  = ( (RPI*rho_ice*nb_crystals) / (rho_air*(qiceini_incl + gamma_snwretro * qsnowcld_incl)) ) ** (1./3.)
     408                N0_PSD      = nb_crystals * lambda_PSD
     409                moment1_PSD = N0_PSD/lambda_PSD**2
     410              ELSE
     411                moment1_PSD = 0.
     412              ENDIF
     413
     414              !--Formulae for air thermal conductivity and water vapor diffusivity
     415              !--comes respectively from Beard and Pruppacher (1971)
     416              !--and  Hall and Pruppacher (1976)
     417
     418              air_thermal_conduct = ( 5.69 + 0.017 * ( temp(i) - RTT ) ) * 1.e-3 * 4.184
     419              water_vapor_diff    = 2.11*1e-5 * ( temp(i) / RTT )**1.94 * ( 101325 / pplay(i) )
     420             
     421              bi = 1./((qsati(i)+qsatl(i))/2.) + RLSTT**2 / RCPD / RV / temp(i)**2
     422              B0 = 4. * RPI * capa_crystal * 1. / (  RLSTT**2 / air_thermal_conduct / RV / temp(i)**2  &
     423                                                  +  RV * temp(i) / psati / water_vapor_diff  )
     424
     425              invtau_phaserelax  = (bi * B0 * moment1_PSD )
     426
     427!             Old way of estimating moment1 : spherical crystals + monodisperse PSD             
     428!             nb_crystals = rho_air * qiceini_incl / ( 4. / 3. * RPI * r_ice**3. * rho_ice )
     429!             moment1_PSD = nb_crystals * r_ice
     430
     431              !----------------- TURBULENT SOURCE/SINK TERMS -----------------
     432              !--Tau_mixingenv is the time needed to homogeneize the parcel
     433              !--with its environment by turbulent diffusion over the parcel
     434              !--length scale
     435              !--if lmix_mpc <0, tau_mixigenv value is prescribed
     436              !--else tau_mixigenv value is derived from tke_dissip and lmix_mpc
     437              !--Tau_dissipturb is the time needed turbulence to decay due to
     438              !--viscosity
     439
     440              ai = RG / RD / temp(i) * ( RD * RLSTT / RCPD / RV / temp(i) - 1. )
     441              IF ( lmix_mpc .GT. 0 ) THEN
     442                 tau_mixingenv = ( lmix_mpc**2. / tke_dissip(i) )**(1./3.)
     443              ELSE
     444                 tau_mixingenv = tau_mixenv
     445              ENDIF
     446             
     447              tau_dissipturb = gamma_taud * 2. * 2./3. * tke(i) / tke_dissip(i) / C0
     448
     449              !--------------------- PDF COMPUTATIONS ---------------------
     450              !--Formulae for sigma2_pdf (variance), mean of PDF in Furtado2016
     451              !--cloud liquid fraction and in-cloud liquid content are given
     452              !--by integrating resp. F(Si) and Si*F(Si)
     453              !--Liquid is limited by the available water vapor trough a
     454              !--maximal liquid fraction
     455
     456              liqfra_max = MAX(0., (MIN (1.,( qtot_incl(i) - qiceini_incl - qsati(i) * (1 + sursat_iceext ) ) / ( qsatl(i) - qsati(i) ) ) ) )
     457              sigma2_pdf = 1./2. * ( ai**2 ) *  2./3. * tke(i) * tau_dissipturb / ( invtau_phaserelax + 1./tau_mixingenv )
     458              mean_pdf   = sursat_env * 1./tau_mixingenv / ( invtau_phaserelax + 1./tau_mixingenv )
     459              cldfraliq(i) = 0.5 * (1. - erf( ( sursat_iceliq - mean_pdf) / (SQRT(2.* sigma2_pdf) ) ) )
     460              IF (cldfraliq(i) .GT. liqfra_max) THEN
     461                  cldfraliq(i) = liqfra_max
     462              ENDIF
     463             
     464              qliq_incl = qsati(i) * SQRT(sigma2_pdf) / SQRT(2.*RPI) * EXP( -1.*(sursat_iceliq - mean_pdf)**2. / (2.*sigma2_pdf) )  &
     465                        - qsati(i) * cldfraliq(i) * (sursat_iceliq - mean_pdf )
     466             
     467              sigma2_icefracturb(i)= sigma2_pdf
     468              mean_icefracturb(i)  = mean_pdf
     469     
     470              !------------ SPECIFIC VAPOR CONTENT AND WATER CONSERVATION  ------------
     471
     472              IF ( (qliq_incl .LE. eps) .OR. (cldfraliq(i) .LE. eps) ) THEN
     473                  qliq_incl    = 0.
     474                  cldfraliq(i) = 0.
     475              END IF
     476               
     477              !--Specific humidity is the max between qsati and the weighted mean between
     478              !--qv in MPC patches and qv in ice-only parts. We assume that MPC parts are
     479              !--always at qsatl and ice-only parts slightly subsaturated (qsati*sursat_iceext+1)
     480              !--The whole cloud can therefore be supersaturated but never subsaturated.
     481
     482              qvap_incl = MAX(qsati(i), ( 1. - cldfraliq(i) ) * (sursat_iceext + 1.) * qsati(i) + cldfraliq(i) * qsatl(i) )
     483
     484
     485              IF ( qvap_incl  .GE. qtot_incl(i) ) THEN
     486                 qvap_incl = qsati(i)
     487                 qliq_incl = qtot_incl(i) - qvap_incl
     488                 qice_incl = 0.
     489
     490              ELSEIF ( (qvap_incl + qliq_incl) .GE. qtot_incl(i) ) THEN
     491                 qliq_incl = MAX(0.0,qtot_incl(i) - qvap_incl)
     492                 qice_incl = 0.
     493              ELSE
     494                 qice_incl = qtot_incl(i) - qvap_incl - qliq_incl
     495              END IF
     496
     497              qvap_cld(i)   = qvap_incl * cldfra1D
     498              qliq(i)       = qliq_incl * cldfra1D
     499              qice(i)       = qice_incl * cldfra1D
     500              icefrac(i)    = qice(i) / ( qice(i) + qliq(i) )
     501              dicefracdT(i) = 0.
     502              !print*,'MPC turb'
     503
     504           END IF ! Enough TKE
     505
     506        END IF ! ! MPC temperature
     507
     508     END IF ! cldfra
     509   
     510   ENDDO ! klon
     511END SUBROUTINE ICEFRAC_LSCP_TURB
     512!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    243513
    244514
  • LMDZ6/branches/cirrus/libf/phylmd/lmdz_thermcell_plume_6A.F90

    r4678 r5202  
    6363      REAL,dimension(ngrid,nlay) :: zeps
    6464
    65       REAL, dimension(ngrid) ::    wmaxa(ngrid)
     65      REAL, dimension(ngrid) ::    wmaxa
    6666
    6767      INTEGER ig,l,k,lt,it,lm
  • LMDZ6/branches/cirrus/libf/phylmd/ocean_forced_mod.F90

    r4523 r5202  
    2222       radsol, snow, agesno, &
    2323       qsurf, evap, fluxsens, fluxlat, flux_u1, flux_v1, &
    24        tsurf_new, dflux_s, dflux_l, sens_prec_liq, rhoa)
     24       tsurf_new, dflux_s, dflux_l, sens_prec_liq, rhoa &
     25#ifdef ISO
     26       ,xtprecip_rain, xtprecip_snow, xtspechum,Roce,rlat, &
     27       xtsnow,xtevap,h1 & 
     28#endif           
     29       )
    2530!
    2631! This subroutine treats the "open ocean", all grid points that are not entierly covered
     
    3641    USE phys_output_var_mod, ONLY : sens_prec_liq_o, sens_prec_sol_o, lat_prec_liq_o, lat_prec_sol_o
    3742    use config_ocean_skin_m, only: activate_ocean_skin
     43#ifdef ISO
     44    USE infotrac_phy, ONLY: ntiso,niso
     45    USE isotopes_routines_mod, ONLY: calcul_iso_surf_oce_vectall, calcul_iso_surf_sic_vectall   
     46#ifdef ISOVERIF
     47    USE isotopes_mod, ONLY: iso_eau,ridicule
     48    !USE isotopes_verif_mod, ONLY: errmax,errmaxrel,iso_verif_egalite_choix
     49    USE isotopes_verif_mod
     50#endif
     51#endif
    3852
    3953    INCLUDE "YOMCST.h"
     
    5771    real, intent(in):: rhoa(:) ! (knon) density of moist air  (kg / m3)
    5872
     73#ifdef ISO
     74    REAL, DIMENSION(ntiso,klon), INTENT(IN)  :: xtprecip_rain, xtprecip_snow
     75    REAL, DIMENSION(ntiso,klon), INTENT(IN)  :: xtspechum
     76    REAL, DIMENSION(klon),       INTENT(IN)  :: rlat
     77#endif
     78
    5979! In/Output arguments
    6080!****************************************************************************************
     
    6282    REAL, DIMENSION(klon), INTENT(INOUT)     :: snow
    6383    REAL, DIMENSION(klon), INTENT(INOUT)     :: agesno !? put to 0 in ocean
    64  
     84#ifdef ISO     
     85    REAL, DIMENSION(niso,klon), INTENT(IN)   :: xtsnow
     86    REAL, DIMENSION(niso,klon), INTENT(INOUT):: Roce
     87#endif
     88
    6589! Output arguments
    6690!****************************************************************************************
     
    7296    REAL, intent(out):: sens_prec_liq(:) ! (knon)
    7397
     98#ifdef ISO     
     99    REAL, DIMENSION(ntiso,klon), INTENT(OUT) :: xtevap ! isotopes in evaporation flux
     100    REAL, DIMENSION(klon),       INTENT(OUT) :: h1 ! just a diagnostic, not useful for the simulation
     101#endif
     102
    74103! Local variables
    75104!****************************************************************************************
     
    80109    REAL, DIMENSION(klon)       :: u1_lay, v1_lay
    81110    LOGICAL                     :: check=.FALSE.
    82     REAL sens_prec_sol(knon)
    83     REAL, DIMENSION(klon) :: lat_prec_liq, lat_prec_sol   
     111    REAL, DIMENSION(knon)       :: sens_prec_sol
     112    REAL, DIMENSION(klon)       :: lat_prec_liq, lat_prec_sol   
     113#ifdef ISO   
     114    REAL, PARAMETER :: t_coup = 273.15     
     115#endif
     116
    84117
    85118!****************************************************************************************
     
    87120!****************************************************************************************
    88121    IF (check) WRITE(*,*)' Entering ocean_forced_noice'
    89    
     122
     123#ifdef ISO
     124#ifdef ISOVERIF
     125    DO i = 1, knon
     126      IF (iso_eau > 0) THEN         
     127        CALL iso_verif_egalite_choix(xtspechum(iso_eau,i), &
     128     &                  spechum(i),'ocean_forced_mod 111', &
     129     &                  errmax,errmaxrel)     
     130        CALL iso_verif_egalite_choix(snow(i), &
     131     &                  xtsnow(iso_eau,i),'ocean_forced_mod 117', &
     132     &                  errmax,errmaxrel)
     133      ENDIF !IF (iso_eau > 0) THEN
     134    ENDDO !DO i=1,knon
     135#endif     
     136#endif
     137
    90138!****************************************************************************************
    91139! 1)   
     
    103151
    104152    else ! GCM
    105       CALL limit_read_sst(knon,knindex,tsurf_lim)
     153      CALL limit_read_sst(knon,knindex,tsurf_lim &
     154#ifdef ISO
     155     &     ,Roce,rlat &
     156#endif     
     157     &     )
    106158    endif ! knon
    107159!sb--
     
    161213         flux_u1, flux_v1) 
    162214
     215#ifdef ISO     
     216    CALL calcul_iso_surf_oce_vectall(klon, knon,t_coup, &
     217     &    ps,tsurf_new,spechum,u1_lay, v1_lay, xtspechum, &
     218     &    evap, Roce,xtevap,h1 &
     219#ifdef ISOTRAC
     220     &    ,knindex &
     221#endif
     222     &    )
     223#endif         
     224
     225#ifdef ISO
     226#ifdef ISOVERIF
     227!          write(*,*) 'ocean_forced_mod 176: sortie de ocean_forced_noice'
     228    IF (iso_eau > 0) THEN
     229      DO i = 1, knon               
     230        CALL iso_verif_egalite_choix(snow(i), &
     231     &          xtsnow(iso_eau,i),'ocean_forced_mod 180', &
     232     &          errmax,errmaxrel)
     233      ENDDO ! DO j=1,knon
     234    ENDIF !IF (iso_eau > 0) THEN
     235#endif
     236#endif   
     237
    163238  END SUBROUTINE ocean_forced_noice
    164239!
     
    173248       radsol, snow, qsol, agesno, tsoil, &
    174249       qsurf, alb1_new, alb2_new, evap, fluxsens, fluxlat, flux_u1, flux_v1, &
    175        tsurf_new, dflux_s, dflux_l, rhoa)
     250       tsurf_new, dflux_s, dflux_l, rhoa &
     251#ifdef ISO
     252       ,xtprecip_rain, xtprecip_snow, xtspechum,Roce, &
     253       xtsnow, xtsol,xtevap,Rland_ice & 
     254#endif           
     255       )
    176256!
    177257! This subroutine treats the ocean where there is ice.
     
    187267    USE indice_sol_mod
    188268    USE phys_output_var_mod, ONLY : sens_prec_liq_o, sens_prec_sol_o, lat_prec_liq_o, lat_prec_sol_o
     269#ifdef ISO
     270    USE infotrac_phy, ONLY: niso, ntiso
     271    USE isotopes_routines_mod, ONLY: calcul_iso_surf_oce_vectall, calcul_iso_surf_sic_vectall
     272#ifdef ISOVERIF
     273    USE isotopes_mod, ONLY: iso_eau,ridicule
     274    !USE isotopes_verif_mod, ONLY: errmax,errmaxrel,iso_verif_egalite_choix
     275    USE isotopes_verif_mod
     276#endif
     277#endif
    189278
    190279!   INCLUDE "indicesol.h"
     
    209298    REAL, DIMENSION(klon), INTENT(IN)    :: u1, v1, gustiness
    210299    real, intent(in):: rhoa(:) ! (knon) density of moist air  (kg / m3)
     300#ifdef ISO
     301    REAL, DIMENSION(ntiso,klon), INTENT(IN) :: xtprecip_rain, xtprecip_snow
     302    REAL, DIMENSION(ntiso,klon), INTENT(IN) :: xtspechum
     303    REAL, DIMENSION(niso,klon),  INTENT(IN) :: Roce
     304    REAL, DIMENSION(niso,klon),  INTENT(IN) :: Rland_ice
     305#endif
    211306
    212307! In/Output arguments
     
    216311    REAL, DIMENSION(klon), INTENT(INOUT)          :: agesno
    217312    REAL, DIMENSION(klon, nsoilmx), INTENT(INOUT) :: tsoil
     313#ifdef ISO     
     314    REAL, DIMENSION(niso,klon), INTENT(INOUT)     :: xtsnow
     315    REAL, DIMENSION(niso,klon), INTENT(IN)        :: xtsol
     316#endif
    218317
    219318! Output arguments
     
    226325    REAL, DIMENSION(klon), INTENT(OUT)            :: tsurf_new
    227326    REAL, DIMENSION(klon), INTENT(OUT)            :: dflux_s, dflux_l     
     327#ifdef ISO     
     328    REAL, DIMENSION(ntiso,klon), INTENT(OUT)      :: xtevap
     329#endif     
    228330
    229331! Local variables
     
    238340    REAL, DIMENSION(klon)       :: u0, v0
    239341    REAL, DIMENSION(klon)       :: u1_lay, v1_lay
    240     REAL sens_prec_liq(knon), sens_prec_sol (knon)   
     342    REAL, DIMENSION(knon)       :: sens_prec_liq, sens_prec_sol
    241343    REAL, DIMENSION(klon)       :: lat_prec_liq, lat_prec_sol   
    242344
     345#ifdef ISO
     346    REAL, PARAMETER :: t_coup = 273.15
     347    REAL, DIMENSION(klon) :: fq_fonte_diag
     348    REAL, DIMENSION(klon) :: fqfonte_diag
     349    REAL, DIMENSION(klon) :: snow_evap_diag
     350    REAL, DIMENSION(klon) :: fqcalving_diag
     351    REAL, DIMENSION(klon) :: run_off_lic_diag
     352    REAL :: coeff_rel_diag
     353    REAL :: max_eau_sol_diag 
     354    REAL, DIMENSION(klon) :: runoff_diag   
     355    INTEGER IXT
     356    REAL, DIMENSION(niso,klon) :: xtsnow_prec, xtsol_prec
     357    REAL, DIMENSION(klon) :: snow_prec, qsol_prec 
     358#endif
    243359
    244360!****************************************************************************************
     
    307423!
    308424!****************************************************************************************
     425#ifdef ISO
     426   ! verif
     427#ifdef ISOVERIF
     428    DO i = 1, knon
     429      IF (iso_eau > 0) THEN
     430        IF (snow(i) > ridicule) THEN
     431          CALL iso_verif_egalite_choix(xtsnow(iso_eau,i),snow(i), &
     432   &              'interfsurf 964',errmax,errmaxrel)
     433        ENDIF !IF ((snow(i) > ridicule)) THEN
     434      ENDIF !IF (iso_eau > 0) THEN     
     435    ENDDO !DO i=1,knon 
     436#endif
     437   ! end verif
     438
     439    DO i = 1, knon
     440      snow_prec(i) = snow(i)
     441      DO ixt = 1, niso
     442      xtsnow_prec(ixt,i) = xtsnow(ixt,i)
     443      ENDDO !DO ixt=1,niso
     444      ! initialisation:
     445      fq_fonte_diag(i) = 0.0
     446      fqfonte_diag(i)  = 0.0
     447      snow_evap_diag(i)= 0.0
     448    ENDDO !DO i=1,knon
     449#endif
     450
     451
    309452    CALL fonte_neige( knon, is_sic, knindex, dtime, &
    310453         tsurf_tmp, precip_rain, precip_snow, &
    311          snow, qsol, tsurf_new, evap)
     454         snow, qsol, tsurf_new, evap &
     455#ifdef ISO   
     456     &  ,fq_fonte_diag,fqfonte_diag,snow_evap_diag,fqcalving_diag   &
     457     &  ,max_eau_sol_diag,runoff_diag,run_off_lic_diag,coeff_rel_diag   &
     458#endif
     459     &   )
     460
     461
     462#ifdef ISO
     463! isotopes: tout est externalisé
     464!#ifdef ISOVERIF
     465!        write(*,*) 'ocean_forced_mod 377: call calcul_iso_surf_sic_vectall'
     466!        write(*,*) 'klon,knon=',klon,knon
     467!#endif
     468    CALL calcul_iso_surf_sic_vectall(klon,knon, &
     469     &          evap,snow_evap_diag,Tsurf_new,Roce,snow, &
     470     &          fq_fonte_diag,fqfonte_diag,dtime,t_coup, &
     471     &          precip_snow,xtprecip_snow,xtprecip_rain, snow_prec,xtsnow_prec, &
     472     &          xtspechum,spechum,ps, &
     473     &          xtevap,xtsnow,fqcalving_diag, &
     474     &          knindex,is_sic,run_off_lic_diag,coeff_rel_diag,Rland_ice &
     475     &   )
     476#ifdef ISOVERIF
     477        !write(*,*) 'ocean_forced_mod 391: sortie calcul_iso_surf_sic_vectall'
     478    IF (iso_eau > 0) THEN
     479      DO i = 1, knon 
     480        CALL iso_verif_egalite_choix(snow(i), &
     481     &           xtsnow(iso_eau,i),'ocean_forced_mod 396', &
     482     &           errmax,errmaxrel)
     483      ENDDO ! DO j=1,knon
     484    ENDIF !IF (iso_eau > 0) then
     485#endif
     486!#ifdef ISOVERIF
     487#endif   
     488!#ifdef ISO
    312489   
    313490! Calculation of albedo at snow (alb_neig) and update the age of snow (agesno)
  • LMDZ6/branches/cirrus/libf/phylmd/pbl_surface_mod.F90

    r4916 r5202  
    3333                                  wx_pbl_check, wx_pbl_dts_check, wx_evappot
    3434  use config_ocean_skin_m, only: activate_ocean_skin
     35#ifdef ISO
     36  USE infotrac_phy, ONLY: niso,ntraciso=>ntiso   
     37#endif
    3538
    3639  IMPLICIT NONE
     
    4952  !$OMP THREADPRIVATE(ydTs0, ydqs0)
    5053
     54#ifdef ISO
     55  REAL, ALLOCATABLE, DIMENSION(:,:,:), PRIVATE, SAVE   :: xtsnow   ! snow at surface
     56  !$OMP THREADPRIVATE(xtsnow)
     57  REAL, ALLOCATABLE, DIMENSION(:,:), PRIVATE, SAVE   :: Rland_ice   ! snow at surface
     58  !$OMP THREADPRIVATE(Rland_ice) 
     59  REAL, ALLOCATABLE, DIMENSION(:,:), PRIVATE, SAVE   :: Roce   ! snow at surface
     60  !$OMP THREADPRIVATE(Roce) 
     61#endif
     62
    5163  INTEGER, SAVE :: iflag_pbl_surface_t2m_bug
    5264  !$OMP THREADPRIVATE(iflag_pbl_surface_t2m_bug)
    5365  INTEGER, SAVE :: iflag_new_t2mq2m
    5466  !$OMP THREADPRIVATE(iflag_new_t2mq2m)
     67  LOGICAL, SAVE :: ok_bug_zg_wk_pbl
     68  !$OMP THREADPRIVATE(ok_bug_zg_wk_pbl)
    5569
    5670!FC
     
    176190
    177191  END SUBROUTINE pbl_surface_init
     192
     193#ifdef ISO
     194  SUBROUTINE pbl_surface_init_iso(xtsnow_rst,Rland_ice_rst)
     195
     196! This routine should be called after the restart file has been read.
     197! This routine initialize the restart variables and does some validation tests
     198! for the index of the different surfaces and tests the choice of type of ocean.
     199
     200    USE indice_sol_mod
     201    USE print_control_mod, ONLY: lunout
     202#ifdef ISOVERIF
     203    USE isotopes_mod, ONLY: iso_eau,ridicule
     204    USE isotopes_verif_mod
     205#endif
     206    IMPLICIT NONE
     207
     208    INCLUDE "dimsoil.h"
     209 
     210! Input variables
     211!****************************************************************************************
     212    REAL, DIMENSION(niso,klon, nbsrf), INTENT(IN)          :: xtsnow_rst
     213    REAL, DIMENSION(niso,klon), INTENT(IN)          :: Rland_ice_rst
     214 
     215! Local variables
     216!****************************************************************************************
     217    INTEGER                       :: ierr
     218    CHARACTER(len=80)             :: abort_message
     219    CHARACTER(len = 20)           :: modname = 'pbl_surface_init'
     220    integer i,ixt
     221   
     222!****************************************************************************************
     223! Allocate and initialize module variables with fields read from restart file.
     224!
     225!****************************************************************************************   
     226
     227    ALLOCATE(xtsnow(niso,klon,nbsrf), stat=ierr)
     228    IF (ierr /= 0) CALL abort_gcm('pbl_surface_init', 'pb in allocation',1)
     229
     230    ALLOCATE(Rland_ice(niso,klon), stat=ierr)
     231    IF (ierr /= 0) CALL abort_gcm('pbl_surface_init', 'pb in allocation',1)
     232
     233    ALLOCATE(Roce(niso,klon), stat=ierr)
     234    IF (ierr /= 0) CALL abort_gcm('pbl_surface_init', 'pb in allocation',1)
     235
     236    xtsnow(:,:,:)  = xtsnow_rst(:,:,:)
     237    Rland_ice(:,:) = Rland_ice_rst(:,:)
     238    Roce(:,:)      = 0.0
     239
     240#ifdef ISOVERIF
     241      IF (iso_eau >= 0) THEN
     242         CALL iso_verif_egalite_vect2D( &
     243     &           xtsnow,snow, &
     244     &           'pbl_surface_mod 170',niso,klon,nbsrf)
     245         DO i=1,klon 
     246            IF (iso_eau >= 0) THEN 
     247              CALL iso_verif_egalite(Rland_ice(iso_eau,i),1.0, &
     248     &         'pbl_surf_mod 177')
     249            ENDIF
     250         ENDDO
     251      ENDIF
     252#endif
     253
     254  END SUBROUTINE pbl_surface_init_iso
     255#endif
     256
    178257
    179258!****************************************************************************************
     
    239318!FC
    240319!!!
    241                         )
     320#ifdef ISO
     321     &   ,xtrain_f, xtsnow_f,xt, &
     322     &   wake_dlxt,zxxtevap,xtevap, &
     323     &   d_xt,d_xt_w,d_xt_x, &
     324     &   xtsol,dflux_xt,zxxtsnow,zxfluxxt,flux_xt, &
     325     &   h1_diag,runoff_diag,xtrunoff_diag &
     326#endif     
     327     &   )
    242328!****************************************************************************************
    243329! Auteur(s) Z.X. Li (LMD/CNRS) date: 19930818
     
    314400    USE mod_grid_phy_lmdz,  ONLY : nbp_lon, nbp_lat, grid1dto2d_glo
    315401    USE print_control_mod,  ONLY : prt_level,lunout
     402#ifdef ISO
     403  USE isotopes_mod, ONLY: Rdefault,iso_eau
     404#ifdef ISOVERIF
     405        USE isotopes_verif_mod
     406#endif
     407#ifdef ISOTRAC
     408        USE isotrac_mod, only: index_iso
     409#endif
     410#endif
    316411    USE ioipsl_getin_p_mod, ONLY : getin_p
    317412    use phys_state_var_mod, only: ds_ns, dt_ns, delta_sst, delta_sal, dter, &
     
    366461    REAL, DIMENSION(klon),        INTENT(IN)        :: gustiness ! gustiness
    367462
    368     REAL, DIMENSION(klon),        INTENT(IN)        :: cldt    ! total cloud fraction
     463    REAL, DIMENSION(klon),        INTENT(IN)        :: cldt    ! total cloud
     464
     465#ifdef ISO
     466    REAL, DIMENSION(ntraciso,klon,klev),   INTENT(IN)        :: xt       ! water vapour (kg/kg)
     467    REAL, DIMENSION(ntraciso,klon),        INTENT(IN)        :: xtrain_f  ! rain fall
     468    REAL, DIMENSION(ntraciso,klon),        INTENT(IN)        :: xtsnow_f  ! snow fall
     469#endif
    369470
    370471!!! nrlmd+jyg le 02/05/2011 et le 20/02/2012
     
    379480    REAL, DIMENSION(klon),        INTENT(IN)        :: wake_dens
    380481!!!
    381 
     482#ifdef ISO
     483    REAL, DIMENSION(ntraciso,klon,klev),   INTENT(IN)        :: wake_dlxt   
     484#endif
    382485! Input/Output variables
    383486!****************************************************************************************
     
    448551    REAL, INTENT(OUT):: zcoefm(:, :, :) ! (klon, klev, nbsrf + 1)
    449552    ! coef for turbulent diffusion of U and V (?), mean for each grid point
     553#ifdef ISO
     554    REAL, DIMENSION(ntraciso,klon),        INTENT(OUT)       :: zxxtevap     ! water vapour flux at surface, positiv upwards
     555    REAL, DIMENSION(ntraciso,klon, klev),  INTENT(OUT)       :: d_xt        ! change in water vapour
     556    REAL, DIMENSION(klon),                 INTENT(OUT)       :: runoff_diag
     557    REAL, DIMENSION(niso,klon),            INTENT(OUT)       :: xtrunoff_diag
     558    REAL, DIMENSION(ntraciso,klon,klev),   INTENT(OUT)       :: d_xt_w
     559    REAL, DIMENSION(ntraciso,klon,klev),   INTENT(OUT)       :: d_xt_x
     560#endif
     561
     562
    450563
    451564!!! nrlmd+jyg le 02/05/2011 et le 20/02/2012
     
    511624    REAL, DIMENSION(klon, klev, nbsrf), INTENT(OUT) :: flux_v     ! v wind tension (kg m/s)/(m**2 s) or Pascal
    512625!FC
    513     REAL, DIMENSION(klon, klev, nbsrf), INTENT(INOUT)  :: treedrg      ! tree drag (m)               
     626    REAL, DIMENSION(klon, klev, nbsrf), INTENT(INOUT) :: treedrg  ! tree drag (m)               
     627#ifdef ISO       
     628    REAL, DIMENSION(niso,klon),   INTENT(OUT)       :: xtsol      ! water height in the soil (mm)
     629    REAL, DIMENSION(ntraciso,klon, nbsrf)           :: xtevap     ! evaporation at surface
     630    REAL, DIMENSION(klon),        INTENT(OUT)       :: h1_diag    ! just diagnostic, not useful
     631#endif
    514632
    515633
     
    525643    REAL, DIMENSION(klon, klev, nbsrf), INTENT(OUT) :: flux_qbs   ! blowind snow vertical flux (kg/m**2
    526644
     645#ifdef ISO   
     646    REAL, DIMENSION(ntraciso,klon),              INTENT(OUT) :: dflux_xt    ! change of water vapour flux
     647    REAL, DIMENSION(niso,klon),                  INTENT(OUT) :: zxxtsnow    ! snow at surface, mean for each grid point
     648    REAL, DIMENSION(ntraciso,klon, klev),        INTENT(OUT) :: zxfluxxt    ! water vapour flux, mean for each grid point
     649    REAL, DIMENSION(ntraciso,klon, klev, nbsrf), INTENT(OUT) :: flux_xt     ! water vapour flux(latent flux) (kg/m**2/s) 
     650#endif
    527651
    528652! Martin
     
    573697    REAL, DIMENSION(klon)              :: ysnow, yqsurf, yagesno, yqsol
    574698    REAL, DIMENSION(klon)              :: yrain_f, ysnow_f, ybs_f
     699#ifdef ISO
     700    REAL, DIMENSION(ntraciso,klon)     :: yxt1
     701    REAL, DIMENSION(niso,klon)         :: yxtsnow, yxtsol   
     702    REAL, DIMENSION(ntraciso,klon)     :: yxtrain_f, yxtsnow_f
     703    REAL, DIMENSION(klon)              :: yrunoff_diag
     704    REAL, DIMENSION(niso,klon)         :: yxtrunoff_diag
     705    REAL, DIMENSION(niso,klon)         :: yRland_ice   
     706#endif
    575707    REAL, DIMENSION(klon)              :: ysolsw, ysollw
    576708    REAL, DIMENSION(klon)              :: yfder
     
    581713    REAL, DIMENSION(klon)              :: y_flux_t1, y_flux_q1
    582714    REAL, DIMENSION(klon)              :: y_dflux_t, y_dflux_q
     715#ifdef ISO
     716    REAL, DIMENSION(ntraciso,klon)     ::  y_flux_xt1
     717    REAL, DIMENSION(ntraciso,klon)     ::  y_dflux_xt
     718#endif
    583719    REAL, DIMENSION(klon)              :: y_flux_u1, y_flux_v1
    584720    REAL, DIMENSION(klon)              :: y_flux_bs, y_flux0
     
    608744    REAL, DIMENSION(klon)              :: AcoefH_0, AcoefQ_0, BcoefH_0, BcoefQ_0
    609745    REAL, DIMENSION(klon)              :: AcoefH, AcoefQ, BcoefH, BcoefQ
     746#ifdef ISO
     747    REAL, DIMENSION(ntraciso,klon)     :: AcoefXT, BcoefXT
     748#endif
    610749    REAL, DIMENSION(klon)              :: AcoefU, AcoefV, BcoefU, BcoefV
    611750    REAL, DIMENSION(klon)              :: AcoefQBS, BcoefQBS
     
    626765    REAL, DIMENSION(klon,klev)         :: yu, yv
    627766    REAL, DIMENSION(klon,klev)         :: yt, yq, yqbs
     767#ifdef ISO
     768    REAL, DIMENSION(ntraciso,klon)      :: yxtevap
     769    REAL, DIMENSION(ntraciso,klon,klev) :: y_d_xt
     770    REAL, DIMENSION(ntraciso,klon,klev) :: y_flux_xt
     771    REAL, DIMENSION(ntraciso,klon,klev) :: yxt   
     772#endif
    628773    REAL, DIMENSION(klon,klev)         :: ypplay, ydelp
    629774    REAL, DIMENSION(klon,klev)         :: delp
     
    697842    REAL, DIMENSION(klon,klev)         :: Kcoef_hq_w, Kcoef_m_w, gama_h_w, gama_q_w
    698843    REAL, DIMENSION(klon)              :: alf_1, alf_2, alf_1_x, alf_2_x, alf_1_w, alf_2_w
     844#ifdef ISO
     845    REAL, DIMENSION(ntraciso,klon,klev)         :: yxt_x, yxt_w
     846    REAL, DIMENSION(ntraciso,klon)              :: y_flux_xt1_x , y_flux_xt1_w   
     847    REAL, DIMENSION(ntraciso,klon,klev)         :: y_flux_xt_x,y_d_xt_x,zxfluxxt_x
     848    REAL, DIMENSION(ntraciso,klon,klev)         :: y_flux_xt_w,y_d_xt_w,zxfluxxt_w
     849    REAL, DIMENSION(ntraciso,klon,klev,nbsrf)   :: flux_xt_x, flux_xt_w
     850    REAL, DIMENSION(ntraciso,klon)              :: AcoefXT_x, BcoefXT_x
     851    REAL, DIMENSION(ntraciso,klon)              :: AcoefXT_w, BcoefXT_w
     852    REAL, DIMENSION(ntraciso,klon,klev)         :: CcoefXT, DcoefXT
     853    REAL, DIMENSION(ntraciso,klon,klev)         :: CcoefXT_x, DcoefXT_x
     854    REAL, DIMENSION(ntraciso,klon,klev)         :: CcoefXT_w, DcoefXT_w
     855    REAL, DIMENSION(ntraciso,klon,klev)         :: gama_xt,gama_xt_x,gama_xt_w
     856#endif
    699857!!!
    700858!!!jyg le 08/02/2012
     
    8891047    REAL, DIMENSION(klon)              :: yrmu0
    8901048    ! Martin
    891     REAL, DIMENSIOn(klon)              :: yri0
     1049    REAL, DIMENSION(klon)              :: yri0
    8921050
    8931051    REAL, DIMENSION(klon):: ydelta_sst, ydelta_sal, yds_ns, ydt_ns, ydter, &
     
    8961054    ! dt_ds, tkt, tks, taur, sss on ocean points
    8971055    REAL :: missing_val
     1056#ifdef ISO
     1057    REAL, DIMENSION(klon)       :: h1
     1058    INTEGER                     :: ixt
     1059!#ifdef ISOVERIF
     1060!    integer iso_verif_positif_nostop
     1061!#endif   
     1062#endif
     1063
    8981064!****************************************************************************************
    8991065! End of declarations
     
    9241090      iflag_split = iflag_split_ref
    9251091
     1092#ifdef ISO     
     1093#ifdef ISOVERIF
     1094      DO i=1,klon
     1095        DO ixt=1,niso
     1096          CALL iso_verif_noNaN(xtsol(ixt,i),'pbl_surface 608')
     1097        ENDDO
     1098      ENDDO
     1099#endif
     1100#ifdef ISOVERIF
     1101      DO i=1,klon 
     1102        IF (iso_eau >= 0) THEN 
     1103          CALL iso_verif_egalite_choix(Rland_ice(iso_eau,i),1.0, &
     1104     &         'pbl_surf_mod 585',errmax,errmaxrel)
     1105          CALL iso_verif_egalite_choix(xtsnow_f(iso_eau,i),snow_f(i), &
     1106     &         'pbl_surf_mod 594',errmax,errmaxrel)
     1107          IF (iso_verif_egalite_choix_nostop(xtsol(iso_eau,i),qsol(i), &
     1108     &         'pbl_surf_mod 596',errmax,errmaxrel) == 1) THEN
     1109                WRITE(*,*) 'i=',i
     1110                STOP
     1111          ENDIF
     1112          DO nsrf=1,nbsrf
     1113            CALL iso_verif_egalite_choix(xtsnow(iso_eau,i,nsrf),snow(i,nsrf), &
     1114     &         'pbl_surf_mod 598',errmax,errmaxrel)
     1115          ENDDO
     1116        ENDIF !IF (iso_eau >= 0) THEN   
     1117      ENDDO !DO i=1,knon 
     1118      DO k=1,klev
     1119        DO i=1,klon 
     1120          IF (iso_eau >= 0) THEN 
     1121            CALL iso_verif_egalite_choix(xt(iso_eau,i,k),q(i,k), &
     1122     &           'pbl_surf_mod 595',errmax,errmaxrel)
     1123          ENDIF !IF (iso_eau >= 0) THEN 
     1124        ENDDO !DO i=1,knon 
     1125      ENDDO !DO k=1,klev
     1126#endif
     1127#endif
     1128
     1129
    9261130!****************************************************************************************
    9271131! 1) Initialisation and validation tests
     
    9351139       CALL getin_p('iflag_new_t2mq2m',iflag_new_t2mq2m)
    9361140       WRITE(lunout,*) 'pbl_iflag_new_t2mq2m=',iflag_new_t2mq2m
     1141
     1142       ok_bug_zg_wk_pbl=.TRUE.
     1143       CALL getin_p('ok_bug_zg_wk_pbl',ok_bug_zg_wk_pbl)
     1144       WRITE(lunout,*) 'ok_bug_zg_wk_pbl=',ok_bug_zg_wk_pbl
    9371145
    9381146       print*,'PBL SURFACE AVEC GUSTINESS'
     
    9841192      PRINT*,'WARNING : On impose qsol=',qsol0
    9851193      qsol(:)=qsol0
     1194#ifdef ISO
     1195      DO ixt=1,niso
     1196        xtsol(ixt,:)=qsol0*Rdefault(ixt)
     1197      ENDDO
     1198#ifdef ISOTRAC     
     1199      DO ixt=1+niso,ntraciso
     1200        xtsol(ixt,:)=qsol0*Rdefault(index_iso(ixt))
     1201      ENDDO
     1202#endif       
     1203#endif
    9861204    ENDIF
    9871205!****************************************************************************************
     
    10341252 qsnow(:)=0. ; snowhgt(:)=0. ; to_ice(:)=0. ; sissnow(:)=0.
    10351253 runoff(:)=0.
     1254#ifdef ISO
     1255zxxtevap(:,:)=0.
     1256 d_xt(:,:,:)=0.
     1257 d_xt_x(:,:,:)=0.
     1258 d_xt_w(:,:,:)=0.
     1259 flux_xt(:,:,:,:)=0.
     1260! xtsnow(:,:,:)=0.! attention, xtsnow est l'équivalent de snow et non de qsnow
     1261 xtevap(:,:,:)=0.
     1262#endif
    10361263    IF (iflag_pbl<20.or.iflag_pbl>=30) THEN
    10371264       zcoefh(:,:,:) = 0.0
     
    11231350!FC
    11241351
     1352#ifdef ISO
     1353   yxtrain_f = 0.0 ; yxtsnow_f = 0.0
     1354   yxtsnow  = 0.0
     1355   yxt = 0.0
     1356   yxtsol = 0.0
     1357   flux_xt = 0.0
     1358   yRland_ice = 0.0
     1359!   d_xt = 0.0     
     1360   y_dflux_xt = 0.0 
     1361   dflux_xt=0.0
     1362   y_d_xt_x=0.      ; y_d_xt_w=0.       
     1363#endif
     1364
    11251365! >> PC
    11261366!the yfields_out variable is defined in (klon,nbcf_out) even if it is used on
     
    11491389    fluxlat_x(:,:)=0. ;           fluxlat_w(:,:)=0.
    11501390!>jyg
     1391#ifdef ISO
     1392    flux_xt_x(:,:,:,:)=0. ;          flux_xt_w(:,:,:,:)=0.
     1393#endif
    11511394!
    11521395!jyg<
     
    14481691          yfluxbs(j)=0.0
    14491692          y_flux_bs(j) = 0.0
     1693!!!
     1694#ifdef ISO
     1695          DO ixt=1,ntraciso
     1696            yxtrain_f(ixt,j) = xtrain_f(ixt,i)
     1697            yxtsnow_f(ixt,j) = xtsnow_f(ixt,i) 
     1698          ENDDO
     1699          DO ixt=1,niso
     1700            yxtsnow(ixt,j)   = xtsnow(ixt,i,nsrf)
     1701          ENDDO   
     1702          !IF (nsrf == is_lic) THEN
     1703          DO ixt=1,niso
     1704            yRland_ice(ixt,j)= Rland_ice(ixt,i) 
     1705          ENDDO   
     1706          !endif !IF (nsrf == is_lic) THEN
     1707#ifdef ISOVERIF
     1708          IF (iso_eau >= 0) THEN
     1709              call iso_verif_egalite_choix(ysnow_f(j), &
     1710     &          yxtsnow_f(iso_eau,j),'pbl_surf_mod 862', &
     1711     &          errmax,errmaxrel)
     1712              call iso_verif_egalite_choix(ysnow(j), &
     1713     &          yxtsnow(iso_eau,j),'pbl_surf_mod 872', &
     1714     &          errmax,errmaxrel)
     1715          ENDIF
     1716#endif
     1717#ifdef ISOVERIF
     1718         DO ixt=1,ntraciso
     1719           call iso_verif_noNaN(yxtsnow_f(ixt,j),'pbl_surf_mod 921')
     1720         ENDDO
     1721#endif
     1722#endif
    14501723       ENDDO
    14511724! >> PC
     
    14871760             yq(j,k) = q(i,k)
    14881761             yqbs(j,k)=qbs(i,k)
     1762#ifdef ISO
     1763             DO ixt=1,ntraciso   
     1764               yxt(ixt,j,k) = xt(ixt,i,k)
     1765             ENDDO !DO ixt=1,ntraciso
     1766#endif
    14891767          ENDDO
    14901768        ENDDO
     
    15041782             yq_w(j,k) = q(i,k)+(1.-wake_s(i))*wake_dlq(i,k)
    15051783!!!
     1784#ifdef ISO
     1785             DO ixt=1,ntraciso
     1786               yxt_x(ixt,j,k) = xt(ixt,i,k)-wake_s(i)*wake_dlxt(ixt,i,k)
     1787               yxt_w(ixt,j,k) = xt(ixt,i,k)+(1.-wake_s(i))*wake_dlxt(ixt,i,k)
     1788             ENDDO
     1789#endif
    15061790          ENDDO
    15071791        ENDDO
     
    15591843             i = ni(j)
    15601844             yqsol(j) = qsol(i)
     1845#ifdef ISO
     1846             DO ixt=1,niso
     1847               yxtsol(ixt,j) = xtsol(ixt,i)
     1848             ENDDO
     1849#endif
    15611850          ENDDO
    15621851       ENDIF
     
    16641953            ycdragm_w, ycdragh_w, zri1_w, pref_w, rain_f, zxtsol, ypplay(:,1) )
    16651954!
    1666 !!!bug !!        zgeo1(:) = wake_s(:)*zgeo1_w(:) + (1.-wake_s(:))*zgeo1_x(:)
    1667         zgeo1(1:knon) = wake_s(1:knon)*zgeo1_w(1:knon) + (1.-wake_s(1:knon))*zgeo1_x(1:knon)
     1955        IF(ok_bug_zg_wk_pbl) THEN
     1956         zgeo1(1:knon) = wake_s(1:knon)*zgeo1_w(1:knon) + (1.-wake_s(1:knon))*zgeo1_x(1:knon)
     1957        ELSE
     1958         zgeo1(1:knon) = ywake_s(1:knon)*zgeo1_w(1:knon) + (1.-ywake_s(1:knon))*zgeo1_x(1:knon)
     1959        ENDIF
    16681960
    16691961! --- special Dice. JYG+MPL 25112013 puis BOMEX
     
    17041996
    17051997        IF (iflag_pbl>=50) THEN
    1706         CALL call_atke(dtime,knon,klev,ycdragm(1:knon), ycdragh(1:knon),yus0(1:knon),yvs0(1:knon),yts(1:knon), &
     1998        CALL call_atke(dtime,knon,klev,nsrf,ni,ycdragm(1:knon), ycdragh(1:knon),yus0(1:knon),yvs0(1:knon),yts(1:knon), &
    17071999                  yu(1:knon,:),yv(1:knon,:),yt(1:knon,:),yq(1:knon,:),ypplay(1:knon,:),ypaprs(1:knon,:),       &
    17082000                  ytke(1:knon,:),yeps(1:knon,:), ycoefm(1:knon,:), ycoefh(1:knon,:))
     
    17492041        IF (iflag_pbl>=50) THEN
    17502042     
    1751         CALL call_atke(dtime,knon,klev,ycdragm_x(1:knon),ycdragh_x(1:knon),yus0(1:knon),yvs0(1:knon),yts_x(1:knon),    &
     2043        CALL call_atke(dtime,knon,klev,nsrf,ni,ycdragm_x(1:knon),ycdragh_x(1:knon),yus0(1:knon),yvs0(1:knon),yts_x(1:knon),    &
    17522044                       yu_x(1:knon,:),yv_x(1:knon,:),yt_x(1:knon,:),yq_x(1:knon,:),ypplay(1:knon,:),ypaprs(1:knon,:),  &
    17532045                       ytke_x(1:knon,:),yeps_x(1:knon,:),ycoefm_x(1:knon,:), ycoefh_x(1:knon,:))
     
    17892081        IF (iflag_pbl>=50) THEN
    17902082       
    1791         CALL call_atke(dtime,knon,klev,ycdragm_w(1:knon),ycdragh_w(1:knon),yus0(1:knon),yvs0(1:knon),yts_w(1:knon), &
     2083        CALL call_atke(dtime,knon,klev,nsrf,ni,ycdragm_w(1:knon),ycdragh_w(1:knon),yus0(1:knon),yvs0(1:knon),yts_w(1:knon), &
    17922084                yu_w(1:knon,:),yv_w(1:knon,:),yt_w(1:knon,:),yq_w(1:knon,:),ypplay(1:knon,:),ypaprs(1:knon,:),      &
    17932085                ytke_w(1:knon,:),yeps_w(1:knon,:),ycoefm_w(1:knon,:),ycoefh_w(1:knon,:))
     
    18502142            Kcoef_hq, gama_q, gama_h, &
    18512143!!!
    1852             AcoefH, AcoefQ, BcoefH, BcoefQ)
     2144            AcoefH, AcoefQ, BcoefH, BcoefQ &
     2145#ifdef ISO
     2146         &   ,yxt, CcoefXT, DcoefXT, gama_xt, AcoefXT, BcoefXT &
     2147#endif               
     2148         &   )
    18532149       ELSE  !(iflag_split .eq.0)
    18542150        CALL climb_hq_down(knon, ycoefh_x, ypaprs, ypplay, &
     
    18582154            Kcoef_hq_x, gama_q_x, gama_h_x, &
    18592155!!!
    1860             AcoefH_x, AcoefQ_x, BcoefH_x, BcoefQ_x)
     2156            AcoefH_x, AcoefQ_x, BcoefH_x, BcoefQ_x &
     2157#ifdef ISO
     2158         &   ,yxt_x, CcoefXT_x, DcoefXT_x, gama_xt_x, AcoefXT_x, BcoefXT_x &
     2159#endif               
     2160         &   )
    18612161!!!
    18622162       IF (prt_level >=10) THEN
     
    18732173            Kcoef_hq_w, gama_q_w, gama_h_w, &
    18742174!!!
    1875             AcoefH_w, AcoefQ_w, BcoefH_w, BcoefQ_w)
     2175            AcoefH_w, AcoefQ_w, BcoefH_w, BcoefQ_w &
     2176#ifdef ISO
     2177         &   ,yxt_w, CcoefXT_w, DcoefXT_w, gama_xt_w, AcoefXT_w, BcoefXT_w &
     2178#endif               
     2179         &   )
    18762180!!!
    18772181       IF (prt_level >=10) THEN
     
    19552259         yt1(:) = yt(:,1)
    19562260         yq1(:) = yq(:,1)
     2261#ifdef ISO
     2262         yxt1(:,:) = yxt(:,:,1)
     2263#endif
     2264
    19572265       ELSE IF (iflag_split .ge. 1) THEN
     2266#ifdef ISO
     2267        call abort_gcm('pbl_surface_mod 2149','isos pas encore dans iflag_split=1',1)
     2268#endif
     2269
    19582270!
    19592271! Cdragq computation
     
    21172429               yqsurf, ytsurf_new, y_dflux_t, y_dflux_q, &
    21182430               y_flux_u1, y_flux_v1, &
    2119                yveget,ylai,yheight )
     2431               yveget,ylai,yheight   &
     2432#ifdef ISO
     2433         &      ,yxtrain_f, yxtsnow_f,yxt1, &
     2434         &      yxtsnow,yxtsol,yxtevap,h1, &
     2435         &      yrunoff_diag,yxtrunoff_diag,yRland_ice &
     2436#endif               
     2437         &      )
    21202438 
    21212439!FC quid qd yveget ylai yheight ne sont pas definit
     
    21472465          ENDDO
    21482466      ENDIF
    2149      
     2467
     2468#ifdef ISOVERIF
     2469        DO j=1,knon
     2470          DO ixt=1,ntraciso
     2471            CALL iso_verif_noNaN(yxtevap(ixt,j), &
     2472         &      'pbl_surface 1056a: apres surf_land')
     2473          ENDDO
     2474          DO ixt=1,niso
     2475            CALL iso_verif_noNaN(yxtsol(ixt,j), &
     2476         &      'pbl_surface 1056b: apres surf_land')
     2477          ENDDO
     2478        ENDDO
     2479#endif
     2480#ifdef ISOVERIF
     2481!        write(*,*) 'pbl_surface_mod 1038: sortie surf_land'
     2482        DO j=1,knon
     2483          IF (iso_eau >= 0) THEN     
     2484                 CALL iso_verif_egalite(yxtsnow(iso_eau,j), &
     2485     &                                  ysnow(j),'pbl_surf_mod 1043')
     2486          ENDIF !if (iso_eau.gt.0) then
     2487        ENDDO !DO i=1,klon
     2488#endif
     2489   
    21502490       CASE(is_lic)
    21512491          ! Martin
     
    21682508                  ysnowhgt, yqsnow, ytoice, ysissnow, &
    21692509                  yalb3_new, yrunoff, &
    2170                   y_flux_u1, y_flux_v1)
     2510                  y_flux_u1, y_flux_v1 &
     2511#ifdef ISO
     2512                  &    ,yxtrain_f, yxtsnow_f,yxt1,yRland_ice &
     2513                  &    ,yxtsnow,yxtsol,yxtevap &
     2514#endif             
     2515                  &    )
    21712516             
    21722517             !jyg<
     
    21902535                ENDDO
    21912536             ENDIF
    2192              
     2537
     2538#ifdef ISOVERIF
     2539             DO j=1,knon
     2540               DO ixt=1,ntraciso
     2541                 CALL iso_verif_noNaN(yxtevap(ixt,j), &
     2542                        &             'pbl_surface 1095a: apres surf_landice')
     2543               ENDDO
     2544                do ixt=1,niso
     2545                   call iso_verif_noNaN(yxtsol(ixt,j), &
     2546                        &      'pbl_surface 1095b: apres surf_landice')
     2547                enddo
     2548             enddo
     2549#endif
     2550#ifdef ISOVERIF
     2551             !write(*,*) 'pbl_surface_mod 1060: sortie surf_landice'
     2552             do j=1,knon
     2553               IF (iso_eau >= 0) THEN     
     2554                 CALL iso_verif_egalite(yxtsnow(iso_eau,j), &
     2555                        &               ysnow(j),'pbl_surf_mod 1064')
     2556               ENDIF !if (iso_eau >= 0) THEN
     2557             ENDDO !DO i=1,klon
     2558#endif
     2559           
    21932560          END IF
    21942561         
     
    22072574               y_flux_u1, y_flux_v1, ydelta_sst(:knon), ydelta_sal(:knon), &
    22082575               yds_ns(:knon), ydt_ns(:knon), ydter(:knon), ydser(:knon), &
    2209                ydt_ds(:knon), ytkt(:knon), ytks(:knon), ytaur(:knon), ysss)
     2576               ydt_ds(:knon), ytkt(:knon), ytks(:knon), ytaur(:knon), ysss &
     2577#ifdef ISO
     2578         &      ,yxtrain_f, yxtsnow_f,yxt1,Roce, &
     2579         &      yxtsnow,yxtevap,h1 &
     2580#endif               
     2581         &      )
    22102582      IF (prt_level >=10) THEN
    22112583          print *,'arg de surf_ocean: ycdragh ',ycdragh(1:knon)
     
    22482620!albedo SB <<<
    22492621               ytsurf_new, y_dflux_t, y_dflux_q, &
    2250                y_flux_u1, y_flux_v1)
     2622               y_flux_u1, y_flux_v1 &
     2623#ifdef ISO
     2624         &      ,yxtrain_f, yxtsnow_f,yxt1,Roce, &
     2625         &      yxtsnow,yxtsol,yxtevap,Rland_ice &
     2626#endif               
     2627         &      )
    22512628         
    22522629! Special DICE MPL 05082013 puis BOMEX MPL 20150410
     
    22562633          y_flux_v1(j)=ycdragm(j)*(1.+sqrt(yu(j,1)*yu(j,1)+yv(j,1)*yv(j,1)))*yv(j,1)*ypplay(j,1)/RD/yt(j,1)
    22572634          ENDDO
    2258       ENDIF
     2635       ENDIF
     2636
     2637#ifdef ISOVERIF
     2638        DO j=1,knon
     2639          DO ixt=1,ntraciso
     2640            CALL iso_verif_noNaN(yxtevap(ixt,j), &
     2641         &                       'pbl_surface 1165a: apres surf_seaice')
     2642          ENDDO
     2643          DO ixt=1,niso
     2644            CALL iso_verif_noNaN(yxtsol(ixt,j), &
     2645         &      'pbl_surface 1165b: apres surf_seaice')
     2646          ENDDO
     2647        ENDDO
     2648#endif
     2649#ifdef ISOVERIF
     2650        !write(*,*) 'pbl_surface_mod 1077: sortie surf_seaice'
     2651        DO j=1,knon
     2652          IF (iso_eau >= 0) THEN     
     2653                 CALL iso_verif_egalite(yxtsnow(iso_eau,j), &
     2654     &                                  ysnow(j),'pbl_surf_mod 1106')
     2655          ENDIF !IF (iso_eau >= 0) THEN
     2656        ENDDO !DO i=1,klon
     2657#endif
    22592658
    22602659       CASE DEFAULT
     
    23162715            yt1_new=(1./RCPD)*(AcoefH(j)+BcoefH(j)*y_flux_t1(j)*dtime)
    23172716            ytsurf_new(j)=yt1_new-y_flux_t1(j)/(Kech_h(j)*RCPD)
     2717            ! for cases forced in flux and for which forcing in Ts is needed
     2718            ! to prevent the latter to reach unrealistic value (even if not used,
     2719            ! Ts is calculated and hgardfou can appear during the calculation
     2720            ! of surface saturation humidity for example
     2721            if (ok_forc_tsurf) ytsurf_new(j)=tg
    23182722          ENDDO
    23192723
     
    23262730          y_flux_t1(j) =  yfluxsens(j)
    23272731          y_flux_q1(j) = -yevap(j)
     2732#ifdef ISO
     2733          y_flux_xt1(:,:) = -yxtevap(:,:)
     2734#endif
    23282735          ENDDO
    23292736        ENDIF ! (ok_flux_surf)
     
    23412748
    23422749       IF (iflag_split .GE. 1) THEN
     2750#ifdef ISO
     2751        call abort_gcm('pbl_surface_mod 2607','isos pas encore dans iflag_split=1',1)
     2752#endif
     2753!
    23432754!
    23442755         IF (nsrf .ne. is_oce) THEN
     
    25582969            Kcoef_hq, gama_q, gama_h, &
    25592970!!!
    2560             y_flux_q(:,:), y_flux_t(:,:), y_d_q(:,:), y_d_t(:,:))   
     2971            y_flux_q(:,:), y_flux_t(:,:), y_d_q(:,:), y_d_t(:,:) &
     2972#ifdef ISO
     2973        &    ,yxt,y_flux_xt1 &
     2974        &    ,AcoefXT,BcoefXT,CcoefXT,DcoefXT,gama_xt &
     2975        &    ,y_flux_xt(:,:,:),y_d_xt(:,:,:) &
     2976#endif
     2977        &    )   
    25612978       ELSE  !(iflag_split .eq.0)
    25622979        CALL climb_hq_up(knon, dtime, yt_x, yq_x, &
     
    25672984            Kcoef_hq_x, gama_q_x, gama_h_x, &
    25682985!!!
    2569             y_flux_q_x(:,:), y_flux_t_x(:,:), y_d_q_x(:,:), y_d_t_x(:,:))   
     2986            y_flux_q_x(:,:), y_flux_t_x(:,:), y_d_q_x(:,:), y_d_t_x(:,:) &
     2987#ifdef ISO
     2988        &    ,yxt_x,y_flux_xt1_x &
     2989        &    ,AcoefXT_x,BcoefXT_x,CcoefXT_x,DcoefXT_x,gama_xt_x &
     2990        &    ,y_flux_xt_x(:,:,:),y_d_xt_x(:,:,:) &
     2991#endif
     2992        &    )   
    25702993!
    25712994       CALL climb_hq_up(knon, dtime, yt_w, yq_w, &
     
    25762999            Kcoef_hq_w, gama_q_w, gama_h_w, &
    25773000!!!
    2578             y_flux_q_w(:,:), y_flux_t_w(:,:), y_d_q_w(:,:), y_d_t_w(:,:))   
     3001            y_flux_q_w(:,:), y_flux_t_w(:,:), y_d_q_w(:,:), y_d_t_w(:,:) &
     3002#ifdef ISO
     3003        &    ,yxt_w,y_flux_xt1_w &
     3004        &    ,AcoefXT_w,BcoefXT_w,CcoefXT_w,DcoefXT_w,gama_xt_w &
     3005        &    ,y_flux_xt_w(:,:,:),y_d_xt_w(:,:,:) &
     3006#endif
     3007        &    )   
    25793008!!!
    25803009       ENDIF  ! (iflag_split .eq.0)
     
    26943123             flux_u(i,k,nsrf) = y_flux_u(j,k)
    26953124             flux_v(i,k,nsrf) = y_flux_v(j,k)
     3125
     3126#ifdef ISO
     3127             DO ixt=1,ntraciso
     3128                y_d_xt(ixt,j,k)  = y_d_xt(ixt,j,k) * ypct(j)
     3129                flux_xt(ixt,i,k,nsrf) = y_flux_xt(ixt,j,k)
     3130             ENDDO ! DO ixt=1,ntraciso
     3131             h1_diag(i)=h1(j)
     3132#endif
     3133
    26963134           ENDDO
    26973135        ENDDO
     3136
     3137#ifdef ISO
     3138#ifdef ISOVERIF
     3139        if (iso_eau.gt.0) then
     3140         call iso_verif_egalite_vect2D( &
     3141                y_d_xt,y_d_q, &
     3142                'pbl_surface_mod 2600',ntraciso,klon,klev)
     3143        endif       
     3144#endif
     3145#endif
    26983146
    26993147       ELSE  !(iflag_split .eq.0)
     
    27133161            flux_u_x(i,k,nsrf) = y_flux_u_x(j,k)
    27143162            flux_v_x(i,k,nsrf) = y_flux_v_x(j,k)
     3163
     3164#ifdef ISO
     3165            DO ixt=1,ntraciso
     3166              y_d_xt_x(ixt,j,k)  = y_d_xt_x(ixt,j,k) * ypct(j)
     3167              flux_xt_x(ixt,i,k,nsrf) = y_flux_xt_x(ixt,j,k)
     3168            ENDDO ! DO ixt=1,ntraciso
     3169#endif
    27153170          ENDDO
    27163171        ENDDO
     
    27303185            flux_u_w(i,k,nsrf) = y_flux_u_w(j,k)
    27313186            flux_v_w(i,k,nsrf) = y_flux_v_w(j,k)
     3187
     3188#ifdef ISO
     3189            DO ixt=1,ntraciso
     3190              y_d_xt_w(ixt,j,k)  = y_d_xt_w(ixt,j,k) * ypct(j)
     3191              flux_xt_w(ixt,i,k,nsrf) = y_flux_xt_w(ixt,j,k)
     3192            ENDDO ! do ixt=1,ntraciso
     3193#endif
     3194
    27323195          ENDDO
    27333196        ENDDO
     
    27413204            flux_u(i,k,nsrf) = flux_u_x(i,k,nsrf)+ywake_s(j)*(flux_u_w(i,k,nsrf)-flux_u_x(i,k,nsrf))
    27423205            flux_v(i,k,nsrf) = flux_v_x(i,k,nsrf)+ywake_s(j)*(flux_v_w(i,k,nsrf)-flux_v_x(i,k,nsrf))
     3206#ifdef ISO
     3207            DO ixt=1,ntraciso
     3208              flux_xt(ixt,i,k,nsrf) = flux_xt_x(ixt,i,k,nsrf)+ywake_s(j)*(flux_xt_w(ixt,i,k,nsrf)-flux_xt_x(ixt,i,k,nsrf))
     3209            ENDDO ! do ixt=1,ntraciso
     3210#endif
    27433211          ENDDO
    27443212        ENDDO
     
    27983266          dflux_t(i) = dflux_t(i) + y_dflux_t(j)*ypct(j)
    27993267          dflux_q(i) = dflux_q(i) + y_dflux_q(j)*ypct(j)
     3268#ifdef ISO
     3269        DO ixt=1,niso
     3270          xtsnow(ixt,i,nsrf) = yxtsnow(ixt,j) 
     3271        ENDDO
     3272        DO ixt=1,ntraciso
     3273          xtevap(ixt,i,nsrf) = - flux_xt(ixt,i,1,nsrf)
     3274          dflux_xt(ixt,i) = dflux_xt(ixt,i) + y_dflux_xt(ixt,j)*ypct(j)
     3275        ENDDO 
     3276        IF (nsrf == is_lic) THEN
     3277          DO ixt=1,niso
     3278            Rland_ice(ixt,i) = yRland_ice(ixt,j) 
     3279          ENDDO
     3280        ENDIF !IF (nsrf == is_lic) THEN     
     3281#ifdef ISOVERIF
     3282        IF (iso_eau.gt.0) THEN 
     3283          call iso_verif_egalite_choix(Rland_ice(iso_eau,i),1.0, &
     3284     &         'pbl_surf_mod 1230',errmax,errmaxrel)
     3285        ENDIF !if (iso_eau.gt.0) then
     3286#endif       
     3287#endif
    28003288       ENDDO
    28013289
     
    29023390             i = ni(j)
    29033391             qsol(i) = yqsol(j)
     3392#ifdef ISO
     3393             runoff_diag(i)=yrunoff_diag(j)   
     3394             DO ixt=1,niso
     3395               xtsol(ixt,i) = yxtsol(ixt,j)
     3396               xtrunoff_diag(ixt,i)=yxtrunoff_diag(ixt,j)
     3397             ENDDO
     3398#endif
    29043399          ENDDO
    29053400       ENDIF
     
    29143409          ENDDO
    29153410       ENDDO
    2916        
     3411
     3412#ifdef ISO
     3413#ifdef ISOVERIF
     3414       !write(*,*) 'pbl_surface 2858'
     3415       DO i = 1, klon
     3416         DO ixt=1,niso
     3417           call iso_verif_noNaN(xtsol(ixt,i),'pbl_surface 1405')
     3418         ENDDO
     3419       ENDDO
     3420#endif
     3421#ifdef ISOVERIF
     3422     IF (iso_eau.gt.0) THEN
     3423        call iso_verif_egalite_vect2D( &
     3424                y_d_xt,y_d_q, &
     3425                'pbl_surface_mod 1261',ntraciso,klon,klev)
     3426     ENDIF !if (iso_eau.gt.0) then
     3427#endif
     3428#endif
    29173429!!! jyg le 07/02/2012
    29183430       IF (iflag_split .ge.1) THEN
     
    29333445           d_u_w(i,k) = d_u_w(i,k) + y_d_u_w(j,k)
    29343446           d_v_w(i,k) = d_v_w(i,k) + y_d_v_w(j,k)
     3447#ifdef ISO
     3448           DO ixt=1,ntraciso
     3449             d_xt_x(ixt,i,k) = d_xt_x(ixt,i,k) + y_d_xt_x(ixt,j,k)
     3450             d_xt_w(ixt,i,k) = d_xt_w(ixt,i,k) + y_d_xt_w(ixt,j,k)
     3451           ENDDO ! DO ixt=1,ntraciso
     3452#endif
     3453
    29353454!
    29363455!!           d_wake_dlt(i,k) = d_wake_dlt(i,k) + y_d_t_w(i,k)-y_d_t_x(i,k)
     
    29483467             d_t(i,k) = d_t(i,k) + y_d_t(j,k)
    29493468             d_q(i,k) = d_q(i,k) + y_d_q(j,k)
     3469#ifdef ISO
     3470             DO ixt=1,ntraciso
     3471               d_xt(ixt,i,k) = d_xt(ixt,i,k) + y_d_xt(ixt,j,k)
     3472             ENDDO !DO ixt=1,ntraciso
     3473#endif
    29503474             d_u(i,k) = d_u(i,k) + y_d_u(j,k)
    29513475             d_v(i,k) = d_v(i,k) + y_d_v(j,k)
     
    29623486         ENDDO
    29633487        ENDIF
     3488
     3489#ifdef ISO
     3490#ifdef ISOVERIF
     3491!        write(*,*) 'd_q,d_xt(iso_eau,554,19)=',d_q(554,19),d_xt(iso_eau,554,19)
     3492!        write(*,*) 'pbl_surface 2929: d_q,d_xt(iso_eau,2,1)=',d_q(2,1),d_xt(iso_eau,2,1)
     3493!        write(*,*) 'y_d_q,y_d_xt(iso_eau,2,1)=',y_d_q(2,1),y_d_xt(iso_eau,2,1)
     3494!        write(*,*) 'iso_eau.gt.0=',iso_eau.gt.0
     3495        call iso_verif_noNaN_vect2D( &
     3496     &           d_xt, &
     3497     &           'pbl_surface 1385',ntraciso,klon,klev) 
     3498     IF (iso_eau >= 0) THEN
     3499        call iso_verif_egalite_vect2D( &
     3500                y_d_xt,y_d_q, &
     3501                'pbl_surface_mod 2945',ntraciso,klon,klev)
     3502        call iso_verif_egalite_vect2D( &
     3503                d_xt,d_q, &
     3504                'pbl_surface_mod 1276',ntraciso,klon,klev)
     3505     ENDIF !IF (iso_eau >= 0) THEN
     3506#endif
     3507#endif
    29643508
    29653509!      print*,'Dans pbl OK4'
     
    33493893   iflag_split=iflag_split_ref
    33503894
     3895#ifdef ISO
     3896#ifdef ISOVERIF
     3897!        write(*,*) 'pbl_surface tmp 3249: d_q,d_xt(iso_eau,2,1)=',d_q(2,1),d_xt(iso_eau,2,1)
     3898    IF (iso_eau >= 0) THEN
     3899        call iso_verif_egalite_vect2D( &
     3900                d_xt,d_q, &
     3901                'pbl_surface_mod 1276',ntraciso,klon,klev)
     3902    ENDIF !IF (iso_eau >= 0) THEN
     3903#endif
     3904#endif
     3905
    33513906!****************************************************************************************
    33523907! 16) Calculate the mean value over all sub-surfaces for some variables
     
    33703925    zxfluxt_w(:,:) = 0.0 ; zxfluxq_w(:,:) = 0.0
    33713926    zxfluxu_w(:,:) = 0.0 ; zxfluxv_w(:,:) = 0.0
     3927#ifdef ISO
     3928      zxfluxxt(:,:,:) = 0.0
     3929      zxfluxxt_x(:,:,:) = 0.0
     3930      zxfluxxt_w(:,:,:) = 0.0
     3931#endif
     3932
    33723933
    33733934!!! jyg le 07/02/2012
     
    33883949              zxfluxu_w(i,k) = zxfluxu_w(i,k) + flux_u_w(i,k,nsrf) * pctsrf(i,nsrf)
    33893950              zxfluxv_w(i,k) = zxfluxv_w(i,k) + flux_v_w(i,k,nsrf) * pctsrf(i,nsrf)
     3951#ifdef ISO
     3952              DO ixt=1,ntraciso
     3953                zxfluxxt_x(ixt,i,k) = zxfluxxt_x(ixt,i,k) + flux_xt_x(ixt,i,k,nsrf) * pctsrf(i,nsrf)
     3954                zxfluxxt_w(ixt,i,k) = zxfluxxt_w(ixt,i,k) + flux_xt_w(ixt,i,k,nsrf) * pctsrf(i,nsrf)
     3955              ENDDO ! DO ixt=1,ntraciso
     3956#endif
    33903957            ENDDO
    33913958          ENDDO
     
    34073974             zxfluxu(i,k) = zxfluxu(i,k) + flux_u(i,k,nsrf) * pctsrf(i,nsrf)
    34083975             zxfluxv(i,k) = zxfluxv(i,k) + flux_v(i,k,nsrf) * pctsrf(i,nsrf)
     3976#ifdef ISO
     3977             DO ixt=1,niso
     3978               zxfluxxt(ixt,i,k) = zxfluxxt(ixt,i,k) + flux_xt(ixt,i,k,nsrf) * pctsrf(i,nsrf)
     3979             ENDDO ! DO ixt=1,niso
     3980#endif
    34093981          ENDDO
    34103982       ENDDO
     
    34314003       END DO
    34324004    endif
     4005
     4006#ifdef ISO
     4007    DO i = 1, klon
     4008      DO ixt=1,ntraciso
     4009        zxxtevap(ixt,i)     = - zxfluxxt(ixt,i,1)
     4010      ENDDO
     4011    ENDDO
     4012#endif
    34334013
    34344014!!!
     
    36064186    zxqsurf(:) = 0.0
    36074187    zxsnow(:)  = 0.0
     4188#ifdef ISO
     4189    zxxtsnow(:,:)  = 0.0
     4190#endif
     4191
    36084192    DO nsrf = 1, nbsrf
    36094193       DO i = 1, klon
    36104194          zxqsurf(i) = zxqsurf(i) + MAX(qsurf(i,nsrf),0.0) * pctsrf(i,nsrf)
    36114195          zxsnow(i)  = zxsnow(i)  + snow(i,nsrf)  * pctsrf(i,nsrf)
     4196#ifdef ISO
     4197          DO ixt=1,niso
     4198            zxxtsnow(ixt,i)  = zxxtsnow(ixt,i)  + xtsnow(ixt,i,nsrf)  * pctsrf(i,nsrf)
     4199          ENDDO ! DO ixt=1,niso
     4200#endif
    36124201       ENDDO
    36134202    ENDDO
     
    36214210!****************************************************************************************
    36224211!
    3623   SUBROUTINE pbl_surface_final(fder_rst, snow_rst, qsurf_rst, ftsoil_rst)
     4212  SUBROUTINE pbl_surface_final(fder_rst, snow_rst, qsurf_rst, ftsoil_rst &
     4213#ifdef ISO
     4214       ,xtsnow_rst,Rland_ice_rst &
     4215#endif       
     4216       )
    36244217
    36254218    USE indice_sol_mod
     4219#ifdef ISO
     4220#ifdef ISOVERIF
     4221    USE isotopes_mod, ONLY: iso_eau,ridicule
     4222    USE isotopes_verif_mod, ONLY: errmax,errmaxrel
     4223#endif   
     4224#endif
    36264225
    36274226    INCLUDE "dimsoil.h"
     
    36334232    REAL, DIMENSION(klon, nbsrf), INTENT(OUT)          :: qsurf_rst
    36344233    REAL, DIMENSION(klon, nsoilmx, nbsrf), INTENT(OUT) :: ftsoil_rst
     4234#ifdef ISO
     4235    REAL, DIMENSION(niso,klon, nbsrf), INTENT(OUT)     :: xtsnow_rst
     4236    REAL, DIMENSION(niso,klon), INTENT(OUT)            :: Rland_ice_rst
     4237#endif
    36354238
    36364239 
     
    36434246    qsurf_rst(:,:)    = qsurf(:,:)
    36444247    ftsoil_rst(:,:,:) = ftsoil(:,:,:)
     4248#ifdef ISO
     4249    xtsnow_rst(:,:,:)  = xtsnow(:,:,:)
     4250    Rland_ice_rst(:,:) = Rland_ice(:,:)
     4251#endif
    36454252
    36464253!****************************************************************************************
     
    36554262    IF (ALLOCATED(ydTs0)) DEALLOCATE(ydTs0)
    36564263    IF (ALLOCATED(ydqs0)) DEALLOCATE(ydqs0)
     4264#ifdef ISO
     4265    IF (ALLOCATED(xtsnow)) DEALLOCATE(xtsnow)
     4266    IF (ALLOCATED(Rland_ice)) DEALLOCATE(Rland_ice)
     4267    IF (ALLOCATED(Roce)) DEALLOCATE(Roce)
     4268#endif
    36574269
    36584270!jyg<
     
    36734285  SUBROUTINE pbl_surface_newfrac(itime, pctsrf_new, pctsrf_old, &
    36744286       evap, z0m, z0h, agesno,                                  &
    3675        tsurf,alb_dir,alb_dif, ustar, u10m, v10m, tke) 
     4287       tsurf,alb_dir,alb_dif, ustar, u10m, v10m, tke &
     4288#ifdef ISO
     4289      ,xtevap  &
     4290#endif
     4291&      ) 
    36764292    !albedo SB <<<
    36774293    ! Give default values where new fraction has appread
     
    37024318    REAL, DIMENSION(klon,nbsrf+1), INTENT(INOUT)        :: z0m,z0h
    37034319    REAL, DIMENSION(klon,klev+1,nbsrf+1), INTENT(INOUT) :: tke
     4320#ifdef ISO
     4321    REAL, DIMENSION(ntraciso,klon,nbsrf), INTENT(INOUT)        :: xtevap
     4322#endif
    37044323
    37054324! Local variables
     
    37094328    CHARACTER(len=20) :: modname = 'pbl_surface_newfrac'
    37104329    INTEGER, DIMENSION(nbsrf) :: nfois=0, mfois=0, pfois=0
     4330#ifdef ISO
     4331    INTEGER           :: ixt
     4332#endif
    37114333!
    37124334! All at once !!
     
    37544376                u10m(i,nsrf)  = u10m(i,nsrf_comp1)
    37554377                v10m(i,nsrf)  = v10m(i,nsrf_comp1)
     4378#ifdef ISO
     4379                DO ixt=1,ntraciso
     4380                  xtevap(ixt,i,nsrf) = xtevap(ixt,i,nsrf_comp1)       
     4381                ENDDO       
     4382#endif
    37564383                IF (iflag_pbl > 1) THEN
    37574384                 tke(i,:,nsrf) = tke(i,:,nsrf_comp1)
     
    38094436                u10m(i,nsrf)  = u10m(i,nsrf_comp2) *pctsrf_old(i,nsrf_comp2) + u10m(i,nsrf_comp3) *pctsrf_old(i,nsrf_comp3)
    38104437                v10m(i,nsrf)  = v10m(i,nsrf_comp2) *pctsrf_old(i,nsrf_comp2) + v10m(i,nsrf_comp3) *pctsrf_old(i,nsrf_comp3)
     4438#ifdef ISO
     4439                DO ixt=1,ntraciso
     4440                  xtevap(ixt,i,nsrf) = xtevap(ixt,i,nsrf_comp2) *pctsrf_old(i,nsrf_comp2) &
     4441                                     + xtevap(ixt,i,nsrf_comp3) *pctsrf_old(i,nsrf_comp3)
     4442                ENDDO       
     4443#endif
    38114444                IF (iflag_pbl > 1) THEN
    38124445                 tke(i,:,nsrf) = tke(i,:,nsrf_comp2)*pctsrf_old(i,nsrf_comp2) + tke(i,:,nsrf_comp3)*pctsrf_old(i,nsrf_comp3)
     
    38214454             agesno(i,nsrf)   = 0.
    38224455             ftsoil(i,:,nsrf) = tsurf(i,nsrf)
     4456#ifdef ISO           
     4457             xtsnow(:,i,nsrf) = 0.
     4458#endif
    38234459          ELSE
    38244460             pfois(nsrf) = pfois(nsrf)+ 1
  • LMDZ6/branches/cirrus/libf/phylmd/phys_local_var_mod.F90

    r4951 r5202  
    1414      REAL, SAVE, ALLOCATABLE :: ql_seri(:,:),qs_seri(:,:)
    1515      !$OMP THREADPRIVATE(ql_seri,qs_seri)
     16! SN 15/07/2024 ISO 4D
     17      REAL, SAVE, ALLOCATABLE :: qx_seri(:,:,:)
     18      !$OMP THREADPRIVATE(qx_seri)
     19! SN
    1620      REAL, SAVE, ALLOCATABLE :: qbs_seri(:,:)
    1721      !$OMP THREADPRIVATE(qbs_seri)
     
    2428      REAL, SAVE, ALLOCATABLE :: pbl_eps(:,:,:)
    2529      !$OMP THREADPRIVATE(pbl_eps)
     30      REAL, SAVE, ALLOCATABLE :: tke_shear(:,:,:), tke_buoy(:,:,:), tke_trans(:,:,:)
     31      !$OMP THREADPRIVATE(tke_shear,tke_buoy,tke_trans)
    2632      REAL, SAVE, ALLOCATABLE :: tr_seri(:,:,:)
    2733      !$OMP THREADPRIVATE(tr_seri)
     
    6470      REAL, SAVE, ALLOCATABLE :: d_t_eva(:,:),d_q_eva(:,:),d_ql_eva(:,:),d_qi_eva(:,:)
    6571      !$OMP THREADPRIVATE(d_t_eva,d_q_eva,d_ql_eva,d_qi_eva)
     72! SN 15/07/2024 ISO 4D
     73      REAL, SAVE, ALLOCATABLE :: d_qx_eva(:,:,:)
     74      !$OMP THREADPRIVATE(d_qx_eva)
     75! SN
    6676      REAL, SAVE, ALLOCATABLE :: d_t_lscst(:,:),d_q_lscst(:,:)
    6777      !$OMP THREADPRIVATE(d_t_lscst,d_q_lscst)
     
    8494      REAL, SAVE, ALLOCATABLE :: d_t_vdf_x(:,:), d_q_vdf_x(:,:)
    8595      !$OMP THREADPRIVATE( d_t_vdf_x, d_q_vdf_x)
    86       REAL, SAVE, ALLOCATABLE :: d_t_bs(:,:), d_q_bs(:,:), d_qbs_bs(:,:)
    87       !$OMP THREADPRIVATE( d_t_bs,d_q_bs, d_qbs_bs)
     96      REAL, SAVE, ALLOCATABLE :: d_t_bsss(:,:), d_q_bsss(:,:), d_qbs_bsss(:,:)
     97      !$OMP THREADPRIVATE( d_t_bsss,d_q_bsss, d_qbs_bsss)
    8898!>nrlmd+jyg
    8999      REAL, SAVE, ALLOCATABLE :: d_t_oro(:,:)
     
    117127      REAL, SAVE, ALLOCATABLE :: d_q_ch4(:,:)
    118128      !$OMP THREADPRIVATE(d_q_ch4)
     129#ifdef ISO
     130      REAL, SAVE, ALLOCATABLE :: xt_seri(:,:,:)
     131      !$OMP THREADPRIVATE( xt_seri)
     132      REAL, SAVE, ALLOCATABLE :: xtl_seri(:,:,:)
     133      !$OMP THREADPRIVATE( xtl_seri)
     134      REAL, SAVE, ALLOCATABLE :: xts_seri(:,:,:)
     135      !$OMP THREADPRIVATE( xts_seri)
     136      REAL, SAVE, ALLOCATABLE :: xtbs_seri(:,:,:)
     137      !$OMP THREADPRIVATE( xtbs_seri)
     138      REAL, SAVE, ALLOCATABLE :: d_xt_eva(:,:,:)
     139      !$OMP THREADPRIVATE( d_xt_eva)
     140      REAL, SAVE, ALLOCATABLE :: d_xtl_eva(:,:,:)
     141      !$OMP THREADPRIVATE( d_xtl_eva)
     142      REAL, SAVE, ALLOCATABLE :: d_xti_eva(:,:,:)
     143      !$OMP THREADPRIVATE( d_xti_eva)
     144      REAL, SAVE, ALLOCATABLE :: d_xt_vdf(:,:,:)
     145      !$OMP THREADPRIVATE( d_xt_vdf)
     146      REAL, SAVE, ALLOCATABLE :: d_xt_dyn(:,:,:)
     147      !$OMP THREADPRIVATE( d_xt_dyn)
     148      REAL, SAVE, ALLOCATABLE :: d_xtl_dyn(:,:,:), d_xts_dyn(:,:,:), d_xtbs_dyn(:,:,:)
     149      !$OMP THREADPRIVATE(d_xtl_dyn, d_xts_dyn, d_xtbs_dyn)
     150      REAL, SAVE, ALLOCATABLE :: d_xt_con(:,:,:)
     151      !$OMP THREADPRIVATE( d_xt_con)
     152      REAL, SAVE, ALLOCATABLE :: d_xt_wake(:,:,:)
     153      !$OMP THREADPRIVATE( d_xt_wake)
     154      REAL, SAVE, ALLOCATABLE :: d_xt_lsc(:,:,:),d_xtl_lsc(:,:,:),d_xti_lsc(:,:,:)
     155      !$OMP THREADPRIVATE( d_xt_lsc,d_xtl_lsc,d_xti_lsc)
     156      REAL, SAVE, ALLOCATABLE :: d_xt_ajsb(:,:,:)
     157      !$OMP THREADPRIVATE( d_xt_ajsb)
     158      REAL, SAVE, ALLOCATABLE :: d_xt_ajs(:,:,:)
     159      !$OMP THREADPRIVATE( d_xt_ajs)
     160      REAL, SAVE, ALLOCATABLE :: d_xt_ajs_w(:,:,:), d_xt_ajs_x(:,:,:)
     161      !$OMP THREADPRIVATE(d_xt_ajs_w, d_xt_ajs_x)
     162      REAL, SAVE, ALLOCATABLE :: d_xt_vdf_w(:,:,:), d_xt_vdf_x(:,:,:)
     163      !$OMP THREADPRIVATE(d_xt_vdf_w, d_xt_vdf_x)
     164      REAL, SAVE, ALLOCATABLE :: d_xt_ch4(:,:,:)
     165      !$OMP THREADPRIVATE( d_xt_ch4)
     166      REAL, SAVE, ALLOCATABLE :: d_xt_prod_nucl(:,:,:)
     167      !$OMP THREADPRIVATE( d_xt_prod_nucl)
     168      REAL, SAVE, ALLOCATABLE :: d_xt_cosmo(:,:,:)
     169      !$OMP THREADPRIVATE( d_xt_cosmo)
     170      REAL, SAVE, ALLOCATABLE :: d_xt_decroiss(:,:,:)
     171      !$OMP THREADPRIVATE( d_xt_decroiss)
     172#endif
    119173
    120174! tendance du a la conersion Ec -> E thermique
     
    124178      !$OMP THREADPRIVATE(d_ts, d_tr)
    125179
    126 ! aerosols
    127       REAL, SAVE, ALLOCATABLE :: m_allaer (:,:,:)
    128       !$OMP THREADPRIVATE(m_allaer)
    129180! diagnostique pour le rayonnement
    130181      REAL, SAVE, ALLOCATABLE :: topswad_aero(:),  solswad_aero(:)      ! diag
     
    307358!!!OMP THREADPRIVATE(d_s_the, d_dens_the)
    308359      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:)           :: d_deltat_ajs_cv, d_deltaq_ajs_cv
    309 !$OMP THREADPRIVATE(d_deltat_ajs_cv, d_deltaq_ajs_cv)                       
     360!$OMP THREADPRIVATE(d_deltat_ajs_cv, d_deltaq_ajs_cv)
     361#ifdef ISO
     362    REAL, SAVE, ALLOCATABLE,DIMENSION(:,:,:)          :: d_deltaxt_wk
     363!$OMP THREADPRIVATE(d_deltaxt_wk)
     364    REAL, SAVE, ALLOCATABLE,DIMENSION(:,:,:)          :: d_deltaxt_wk_gw
     365!$OMP THREADPRIVATE(d_deltaxt_wk_gw)
     366    REAL, SAVE, ALLOCATABLE,DIMENSION(:,:,:)          ::  d_deltaxt_the
     367!$OMP THREADPRIVATE(d_deltaxt_the)
     368    REAL, SAVE, ALLOCATABLE,DIMENSION(:,:,:)          ::  d_deltaxt_vdf
     369!$OMP THREADPRIVATE(d_deltaxt_vdf)
     370      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:,:)           ::  d_deltaxt_ajs_cv
     371!$OMP THREADPRIVATE(d_deltaxt_ajs_cv)
     372#endif                       
    310373!!         End of Wake variables
    311374!!
     
    343406      REAL,ALLOCATABLE,SAVE,DIMENSION(:) :: zxfluxlat, zxtsol, snow_lsc, zxfqfonte
    344407!$OMP THREADPRIVATE(zxfluxlat, zxtsol, snow_lsc, zxfqfonte)
    345       REAL,ALLOCATABLE,SAVE,DIMENSION(:) :: zxrunofflic
    346 !$OMP THREADPRIVATE(zxrunofflic)
     408!SN runoffdiag
     409      REAL,ALLOCATABLE,SAVE,DIMENSION(:) :: zxrunofflic, runoff_diag
     410!$OMP THREADPRIVATE(zxrunofflic, runoff_diag)
    347411      REAL,ALLOCATABLE,SAVE,DIMENSION(:) :: zxqsurf, rain_lsc, rain_num
    348412!$OMP THREADPRIVATE(zxqsurf, rain_lsc, rain_num)
     413#ifdef ISO
     414      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:) :: xtevap,xtprw
     415!$OMP THREADPRIVATE(xtevap,xtprw)
     416      REAL,ALLOCATABLE,SAVE,DIMENSION(:) :: h1_diag
     417      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:) :: xtrunoff_diag
     418!$OMP THREADPRIVATE(h1_diagv,xtrunoff_diag)
     419      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:) :: zxfxtcalving
     420!$OMP THREADPRIVATE(zxfxtcalving)
     421      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:) :: xtsnow_lsc, zxfxtfonte
     422!$OMP THREADPRIVATE(xtsnow_lsc, zxfxtfonte)
     423      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:) :: zxxtrunofflic
     424!$OMP THREADPRIVATE(zxxtrunofflic)
     425      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:) :: xtrain_lsc
     426!$OMP THREADPRIVATE(xtrain_lsc)
     427#endif
    349428!
    350429!jyg+nrlmd<
     
    384463      REAL,ALLOCATABLE,SAVE,DIMENSION(:) :: kh, kh_x, kh_w
    385464!$OMP THREADPRIVATE(kh, kh_x, kh_w)
     465#ifdef ISO
     466      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:,:) :: dxtvdf_x, dxtvdf_w
     467!$OMP THREADPRIVATE(dxtvdf_x, dxtvdf_w)
     468      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:,:) :: xt_therm
     469!$OMP THREADPRIVATE(xt_therm)
     470#endif
    386471!!!
    387472!!!ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
     
    446531      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:,:):: sij
    447532!$OMP THREADPRIVATE(sij)
     533#ifdef ISO
     534      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:,:)  :: xtwdtrainA
     535!$OMP THREADPRIVATE(xtwdtrainA)
     536      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:,:)  :: xtev
     537!$OMP THREADPRIVATE(xtev)
     538      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:,:)  :: xttaa
     539!$OMP THREADPRIVATE(xttaa)
     540      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:,:)  :: xtclw
     541!$OMP THREADPRIVATE(xtclw)
     542#ifdef DIAGISO
     543      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:)  :: qlp
     544!$OMP THREADPRIVATE(qlp)
     545      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:)  :: qvp
     546!$OMP THREADPRIVATE(qvp)
     547      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:)  :: fq_detrainement
     548!$OMP THREADPRIVATE(fq_detrainement)
     549      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:)  :: fq_ddft
     550!$OMP THREADPRIVATE(fq_ddft)
     551      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:)  :: fq_fluxmasse
     552!$OMP THREADPRIVATE(fq_fluxmasse)
     553      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:)  :: fq_evapprecip
     554!$OMP THREADPRIVATE(fq_evapprecip)
     555      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:)  :: f_detrainement
     556!$OMP THREADPRIVATE(f_detrainement)
     557      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:)  :: q_detrainement
     558!$OMP THREADPRIVATE(q_detrainement)
     559      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:,:)  :: xt_detrainement
     560!$OMP THREADPRIVATE(xt_detrainement)
     561      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:,:)  :: xtlp
     562!$OMP THREADPRIVATE(xtlp)
     563      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:,:)  :: xtvp
     564!$OMP THREADPRIVATE(xtvp)
     565      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:)  :: q_the
     566!$OMP THREADPRIVATE(q_the)
     567      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:,:)  :: xt_the
     568!$OMP THREADPRIVATE(xt_the)
     569      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:,:)  :: fxt_detrainement
     570!$OMP THREADPRIVATE(fxt_detrainement)
     571      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:,:)  :: fxt_ddft
     572!$OMP THREADPRIVATE(fxt_ddft)
     573      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:,:)  :: fxt_fluxmasse
     574!$OMP THREADPRIVATE(fxt_fluxmasse)
     575      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:,:)  :: fxt_evapprecip
     576!$OMP THREADPRIVATE(fxt_evapprecip)
     577#endif
     578#endif
    448579!
    449580!      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:) :: coefh, coefm, lambda_th
     
    481612      REAL, ALLOCATABLE, SAVE, DIMENSION(:,:) :: pfraclr,pfracld
    482613!$OMP THREADPRIVATE(pfraclr,pfracld)
     614      REAL, SAVE, ALLOCATABLE :: cldfraliq(:,:)
     615!$OMP THREADPRIVATE(cldfraliq)
     616      REAL, SAVE, ALLOCATABLE ::mean_icefracturb(:,:)
     617!$OMP THREADPRIVATE(mean_icefracturb)
     618      REAL, SAVE, ALLOCATABLE :: sigma2_icefracturb(:,:)
     619!$OMP THREADPRIVATE(sigma2_icefracturb)
    483620
    484621! variables de sorties MM
     
    487624!$OMP THREADPRIVATE(zxsnow,snowhgt,qsnow,to_ice)
    488625!$OMP THREADPRIVATE(sissnow,runoff,albsol3_lic)
     626#ifdef ISO
     627      REAL, ALLOCATABLE, SAVE, DIMENSION(:,:) :: zxxtsnow
     628!$OMP THREADPRIVATE(zxxtsnow)     
     629      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:,:) :: xtVprecip,xtVprecipi
     630!$OMP THREADPRIVATE(xtVprecip,xtVprecipi)
     631      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:,:) :: pxtrfl, pxtsfl
     632!$OMP THREADPRIVATE(pxtrfl, pxtsfl)
     633#endif
    489634
    490635      REAL, ALLOCATABLE, SAVE, DIMENSION(:) :: p_tropopause, z_tropopause, t_tropopause
     
    567712      REAL, ALLOCATABLE, SAVE, DIMENSION(:,:) :: R2SO4
    568713!$OMP THREADPRIVATE(R2SO4)
     714      REAL, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: R2SO4B
     715!$OMP THREADPRIVATE(R2SO4B)
    569716      REAL, ALLOCATABLE, SAVE, DIMENSION(:,:) :: DENSO4
    570717!$OMP THREADPRIVATE(DENSO4)
     718      REAL, ALLOCATABLE, SAVE, DIMENSION(:,:, :) :: DENSO4B
     719!$OMP THREADPRIVATE(DENSO4B)     
    571720      REAL, ALLOCATABLE, SAVE, DIMENSION(:,:) :: f_r_wet
    572721!$OMP THREADPRIVATE(f_r_wet)
     722      REAL, ALLOCATABLE, SAVE, DIMENSION(:,:, :) :: f_r_wetB
     723!$OMP THREADPRIVATE(f_r_wetB)
    573724      REAL, ALLOCATABLE, SAVE, DIMENSION(:,:) :: decfluxaer
    574725!$OMP THREADPRIVATE(decfluxaer)
     
    599750      REAL, ALLOCATABLE, SAVE, DIMENSION(:,:) :: vsed_aer
    600751!$OMP THREADPRIVATE(vsed_aer)
     752!     Sulfate aerosol concentration (dry mixing ratio) (condensed H2SO4 mmr)
     753      REAL, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sulfmmr
     754!$OMP THREADPRIVATE(sulfmmr)
     755!     SAD all aerosols (cm2/cm3)
     756      REAL, ALLOCATABLE, SAVE, DIMENSION(:,:) :: SAD_sulfate
     757!$OMP THREADPRIVATE(SAD_sulfate)
     758!     Effective radius of wet surface aerosols (cm)
     759      REAL, ALLOCATABLE, SAVE, DIMENSION(:,:) :: reff_sulfate
     760!$OMP THREADPRIVATE(reff_sulfate)
     761!     sulfate MMR in different modes (based on sulfmmr, it must be dry mmr)
     762      REAL, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: sulfmmr_mode
     763!$OMP THREADPRIVATE(sulfmmr_mode)
     764!     particle concentration in different modes (part/m3)
     765      REAL, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: nd_mode
     766!$OMP THREADPRIVATE(nd_mode)
    601767!
    602768!---3D budget variables
     
    647813SUBROUTINE phys_local_var_init
    648814USE dimphy
    649 USE infotrac_phy, ONLY : nbtr
     815USE infotrac_phy, ONLY : nbtr,nqtot
     816#ifdef ISO
     817USE infotrac_phy, ONLY : ntraciso=>ntiso,niso
     818#endif
    650819USE aero_mod
    651820USE indice_sol_mod
    652821USE phys_output_var_mod
    653822USE phys_state_var_mod
     823#ifdef CPP_StratAer
     824USE infotrac_phy, ONLY : nbtr_bin
     825#endif
    654826
    655827IMPLICIT NONE
    656828      ALLOCATE(t_seri(klon,klev),q_seri(klon,klev),ql_seri(klon,klev),qs_seri(klon,klev), qbs_seri(klon,klev))
     829! SN 4D ISO
     830      ALLOCATE(qx_seri(klon,klev,nqtot))
     831! SN
    657832      ALLOCATE(u_seri(klon,klev),v_seri(klon,klev))
    658833      ALLOCATE(cf_seri(klon,klev),rvc_seri(klon,klev))
    659834      ALLOCATE(l_mixmin(klon,klev+1,nbsrf),l_mix(klon,klev+1,nbsrf),wprime(klon,klev+1,nbsrf))
    660835      ALLOCATE(pbl_eps(klon,klev+1,nbsrf+1))
     836      ALLOCATE(tke_shear(klon,klev+1,nbsrf), tke_buoy(klon,klev+1,nbsrf), tke_trans(klon,klev+1,nbsrf))
    661837      pbl_eps(:,:,:)=0.
     838      tke_shear(:,:,:)=0.; tke_buoy(:,:,:)=0.; tke_trans(:,:,:)=0.
    662839      l_mix(:,:,:)=0.;l_mixmin(:,:,:)=0.;wprime(:,:,:)=0. ! doit etre initialse car pas toujours remplis
    663840      ALLOCATE(rhcl(klon,klev))
     
    684861      ALLOCATE(d_u_ajs(klon,klev),d_v_ajs(klon,klev))
    685862      ALLOCATE(d_t_eva(klon,klev),d_q_eva(klon,klev))
     863! SN 4D ISO
     864      ALLOCATE(d_qx_eva(klon,klev,nqtot))
     865! SN
    686866      ALLOCATE(d_ql_eva(klon,klev),d_qi_eva(klon,klev))
    687867      ALLOCATE(d_t_lscst(klon,klev),d_q_lscst(klon,klev))
     
    690870      ALLOCATE(d_t_vdf(klon,klev),d_q_vdf(klon,klev),d_t_diss(klon,klev))
    691871      ALLOCATE (d_qbs_vdf(klon,klev))
    692       ALLOCATE(d_t_bs(klon,klev),d_q_bs(klon,klev),d_qbs_bs(klon,klev))
     872      ALLOCATE(d_t_bsss(klon,klev),d_q_bsss(klon,klev),d_qbs_bsss(klon,klev))
    693873      ALLOCATE(d_t_vdf_w(klon,klev),d_q_vdf_w(klon,klev))
    694874      ALLOCATE(d_t_vdf_x(klon,klev),d_q_vdf_x(klon,klev))
     875#ifdef ISO
     876      allocate(xt_seri(ntraciso,klon,klev))
     877      allocate(xtl_seri(ntraciso,klon,klev))
     878      allocate(xts_seri(ntraciso,klon,klev))
     879      allocate(xtbs_seri(ntraciso,klon,klev))
     880      allocate(d_xt_dyn(ntraciso,klon,klev))
     881      allocate(d_xtl_dyn(ntraciso,klon,klev))
     882      allocate(d_xts_dyn(ntraciso,klon,klev))
     883      allocate(d_xtbs_dyn(ntraciso,klon,klev))
     884      allocate(d_xt_con(ntraciso,klon,klev))
     885      allocate(d_xt_wake(ntraciso,klon,klev))
     886      allocate(d_xt_lsc(ntraciso,klon,klev))
     887      allocate(d_xtl_lsc(ntraciso,klon,klev))
     888      allocate(d_xti_lsc(ntraciso,klon,klev))
     889      allocate(d_xt_ajsb(ntraciso,klon,klev))
     890      allocate(d_xt_ajs(ntraciso,klon,klev))
     891      allocate(d_xt_ajs_w(ntraciso,klon,klev))
     892      allocate(d_xt_ajs_x(ntraciso,klon,klev))
     893      allocate(d_xt_eva(ntraciso,klon,klev))
     894      allocate(d_xtl_eva(ntraciso,klon,klev))
     895      allocate(d_xti_eva(ntraciso,klon,klev))
     896      allocate(d_xt_vdf(ntraciso,klon,klev)) 
     897      allocate(d_xt_vdf_w(ntraciso,klon,klev))
     898      allocate(d_xt_vdf_x(ntraciso,klon,klev))
     899      allocate(d_xt_ch4(ntraciso,klon,klev))
     900      allocate(d_xt_prod_nucl(ntraciso,klon,klev))
     901      allocate(d_xt_cosmo(ntraciso,klon,klev))
     902      allocate(d_xt_decroiss(ntraciso,klon,klev))
     903#endif
    695904
    696905      ALLOCATE(d_u_vdf(klon,klev),d_v_vdf(klon,klev))
     
    704913      ALLOCATE(d_ts(klon,nbsrf), d_tr(klon,klev,nbtr))
    705914
    706 ! aerosols
    707       ALLOCATE(m_allaer(klon,klev,naero_tot))
    708915! Special RRTM
    709916      ALLOCATE(ZLWFT0_i(klon,klev+1),ZSWFT0_i(klon,klev+1),ZFLDN0(klon,klev+1))
     
    8131020!!      ALLOCATE( d_s_the(klon), d_dens_the(klon))
    8141021      ALLOCATE(d_deltat_ajs_cv(klon, klev), d_deltaq_ajs_cv(klon, klev))
     1022#ifdef ISO
     1023      ALLOCATE(d_deltaxt_wk(ntraciso,klon, klev))
     1024      ALLOCATE(d_deltaxt_wk_gw(ntraciso,klon, klev))
     1025      ALLOCATE(d_deltaxt_the(ntraciso,klon, klev))
     1026      ALLOCATE(d_deltaxt_vdf(ntraciso,klon, klev))
     1027      ALLOCATE(d_deltaxt_ajs_cv(ntraciso,klon, klev))
     1028#endif
    8151029!!         End of wake variables
    8161030!!
     
    8341048      ALLOCATE(zxfqcalving(klon), zxfluxlat(klon))
    8351049      ALLOCATE(zxtsol(klon), snow_lsc(klon), zxfqfonte(klon), zxqsurf(klon))
    836       ALLOCATE(zxrunofflic(klon))
     1050! SN add runoff_diag
     1051      ALLOCATE(zxrunofflic(klon), runoff_diag(klon))
     1052      runoff_diag(:)=0.
    8371053      ALLOCATE(zxustartlic(klon), zxrhoslic(klon), zxqsaltlic(klon))
    8381054      zxustartlic(:)=0. ; zxrhoslic(:)=0. ; zxqsaltlic(:)=0.
     
    8411057      ALLOCATE(qlth(klon,klev), qith(klon,klev), qsith(klon,klev), wiceth(klon,klev))
    8421058      !
     1059#ifdef ISO
     1060      ALLOCATE(xtevap(ntraciso,klon))
     1061      ALLOCATE(xtprw(ntraciso,klon))
     1062      ALLOCATE(zxfxtcalving(niso,klon))
     1063      ALLOCATE(xtsnow_lsc(ntraciso,klon), zxfxtfonte(niso,klon))
     1064      ALLOCATE(zxxtrunofflic(niso,klon))
     1065      ALLOCATE(xtrain_lsc(ntraciso,klon))
     1066      ALLOCATE(xtrunoff_diag(niso,klon))
     1067      ALLOCATE(h1_diag(klon))
     1068!SN
     1069      xtrunoff_diag(:,:)=0. ! because variables are only given values on knon grid points
     1070#endif
     1071!
    8431072      ALLOCATE(sens_x(klon), sens_w(klon))
    8441073      ALLOCATE(zxfluxlat_x(klon), zxfluxlat_w(klon))
     
    8571086      ALLOCATE(cdragm_x(klon), cdragm_w(klon))
    8581087      ALLOCATE(kh(klon), kh_x(klon), kh_w(klon))
     1088#ifdef ISO
     1089      ALLOCATE(dxtvdf_x(ntraciso,klon,klev), dxtvdf_w(ntraciso,klon,klev))
     1090      ALLOCATE(xt_therm(ntraciso,klon,klev))
     1091#endif
    8591092!
    8601093      ALLOCATE(ptconv(klon,klev))
     
    9121145      ALLOCATE(epmlmMm(klon,klev,klev), eplaMm(klon,klev))
    9131146      ALLOCATE(sij(klon,klev,klev))
     1147#ifdef ISO
     1148      ALLOCATE(xtwdtrainA(ntraciso,klon,klev))
     1149      ALLOCATE(xtev(ntraciso,klon,klev) )
     1150      ALLOCATE(xttaa(ntraciso,klon,klev) )
     1151      ALLOCATE(xtclw(ntraciso,klon,klev) )
     1152#ifdef DIAGISO
     1153      ALLOCATE(qlp(klon,klev))
     1154      ALLOCATE(qvp(klon,klev))
     1155      ALLOCATE(fq_detrainement(klon,klev))
     1156      ALLOCATE(fq_ddft(klon,klev))
     1157      ALLOCATE(fq_fluxmasse(klon,klev))
     1158      ALLOCATE(fq_evapprecip(klon,klev))
     1159      ALLOCATE(f_detrainement(klon,klev), q_detrainement(klon,klev))
     1160      ALLOCATE(xtlp(ntraciso,klon,klev))
     1161      ALLOCATE(xtvp(ntraciso,klon,klev))
     1162      ALLOCATE(q_the(klon,klev), xt_the(ntraciso,klon,klev))
     1163      ALLOCATE(fxt_detrainement(ntraciso,klon,klev))
     1164      ALLOCATE(fxt_ddft(ntraciso,klon,klev))
     1165      ALLOCATE(fxt_fluxmasse(ntraciso,klon,klev))
     1166      ALLOCATE(fxt_evapprecip(ntraciso,klon,klev))
     1167      ALLOCATE(xt_detrainement(ntraciso,klon,klev))
     1168#endif
     1169#endif
    9141170
    9151171      ALLOCATE(prfl(klon, klev+1))
     
    9311187      ALLOCATE(pfraclr(klon,klev),pfracld(klon,klev))
    9321188      pfraclr(:,:)=0. ; pfracld(:,:)=0. ! because not always defined
     1189      ALLOCATE(cldfraliq(klon,klev))
     1190      ALLOCATE(sigma2_icefracturb(klon,klev))
     1191      ALLOCATE(mean_icefracturb(klon,klev))
    9331192      ALLOCATE(distcltop(klon,klev))
    9341193      ALLOCATE(temp_cltop(klon,klev))
     
    9371196      ALLOCATE (zxsnow(klon),snowhgt(klon),qsnow(klon),to_ice(klon))
    9381197      ALLOCATE (sissnow(klon),runoff(klon),albsol3_lic(klon))
     1198#ifdef ISO
     1199      ALLOCATE (zxxtsnow(niso,klon))
     1200      ALLOCATE(xtVprecip(ntraciso,klon, klev+1),xtVprecipi(ntraciso,klon, klev+1))
     1201      ALLOCATE(pxtsfl(ntraciso,klon, klev+1),pxtrfl(ntraciso,klon, klev+1))
     1202#endif
    9391203
    9401204      ALLOCATE (p_tropopause(klon))
     
    9681232      ALLOCATE (d_q_emiss(klon,klev))
    9691233      ALLOCATE (R2SO4(klon,klev))
     1234      ALLOCATE (R2SO4B(klon,klev,nbtr_bin))
    9701235      ALLOCATE (DENSO4(klon,klev))
     1236      ALLOCATE (DENSO4B(klon,klev,nbtr_bin))
    9711237      ALLOCATE (f_r_wet(klon,klev))
     1238      ALLOCATE (f_r_wetB(klon,klev,nbtr_bin))
    9721239      ALLOCATE (decfluxaer(klon,nbtr))
    9731240      ALLOCATE (mdw(nbtr))
     
    10061273      ALLOCATE (surf_PM25_sulf(klon))
    10071274      ALLOCATE (vsed_aer(klon,klev))
     1275      ALLOCATE (sulfmmr(klon,klev))
     1276      ALLOCATE (SAD_sulfate(klon,klev))
     1277      ALLOCATE (reff_sulfate(klon,klev))
     1278      ALLOCATE (sulfmmr_mode(klon,klev,nbtr_bin))
     1279      ALLOCATE (nd_mode(klon,klev,nbtr_bin))
    10081280#endif
    10091281
     
    10161288IMPLICIT NONE
    10171289      DEALLOCATE(t_seri,q_seri,ql_seri,qs_seri, qbs_seri)
     1290! SN 4D ISO
     1291      DEALLOCATE(qx_seri)
     1292! SN
    10181293      DEALLOCATE(u_seri,v_seri)
    10191294      DEALLOCATE(cf_seri,rvc_seri)
    10201295      DEALLOCATE(l_mixmin,l_mix,wprime)
     1296      DEALLOCATE(tke_shear,tke_buoy,tke_trans)
    10211297      DEALLOCATE(pbl_eps)
    10221298      DEALLOCATE(rhcl)
     
    10431319      DEALLOCATE(d_u_ajs,d_v_ajs)
    10441320      DEALLOCATE(d_t_eva,d_q_eva)
     1321! SN 4D ISO
     1322      DEALLOCATE(d_qx_eva)
     1323! SN
    10451324      DEALLOCATE(d_ql_eva,d_qi_eva)
    10461325      DEALLOCATE(d_t_lscst,d_q_lscst)
     
    10491328      DEALLOCATE(d_t_vdf,d_q_vdf,d_t_diss)
    10501329      DEALLOCATE(d_qbs_vdf)
    1051       DEALLOCATE(d_t_bs,d_q_bs,d_qbs_bs)
     1330      DEALLOCATE(d_t_bsss,d_q_bsss,d_qbs_bsss)
     1331#ifdef ISO
     1332      deallocate(xt_seri,xtl_seri,xts_seri,xtbs_seri)
     1333      DEALLOCATE(d_xtl_eva,d_xti_eva)
     1334      deallocate(d_xt_dyn,d_xtl_dyn,d_xts_dyn,d_xtbs_dyn)
     1335      deallocate(d_xt_con)
     1336      deallocate(d_xt_wake)
     1337      deallocate(d_xt_lsc)
     1338      deallocate(d_xtl_lsc,d_xti_lsc)
     1339      deallocate(d_xt_ajsb)
     1340      deallocate(d_xt_ajs)
     1341      deallocate(d_xt_ajs_w,d_xt_ajs_x)
     1342      deallocate(d_xt_eva)
     1343      deallocate(d_xtl_eva)
     1344      deallocate(d_xti_eva)
     1345      deallocate(d_xt_vdf)
     1346      deallocate(d_xt_vdf_w,d_xt_vdf_x)
     1347      deallocate(d_xt_ch4)
     1348      deallocate(d_xt_prod_nucl)
     1349      deallocate(d_xt_cosmo)
     1350      deallocate(d_xt_decroiss)
     1351#endif
     1352
    10521353      DEALLOCATE(d_u_vdf,d_v_vdf)
    10531354      DEALLOCATE(d_t_oli,d_t_oro)
     
    11211422      DEALLOCATE(solsw_aerop, solsw0_aerop)
    11221423      DEALLOCATE(topswcf_aerop, solswcf_aerop)
    1123 !AI Aerosols
    1124       DEALLOCATE(m_allaer)
    11251424!CK LW diagnostics
    11261425      DEALLOCATE(toplwad_aerop, sollwad_aerop)
     
    11551454!!      DEALLOCATE( d_s_the, d_dens_the)
    11561455      DEALLOCATE(d_deltat_ajs_cv, d_deltaq_ajs_cv)
     1456#ifdef ISO
     1457      DEALLOCATE(d_deltaxt_wk)
     1458      DEALLOCATE(d_deltaxt_wk_gw)
     1459      DEALLOCATE(d_deltaxt_ajs_cv)
     1460      DEALLOCATE(d_deltaxt_vdf)
     1461#endif
    11571462!
    11581463      DEALLOCATE(bils)
     
    11731478      DEALLOCATE(uwat, vwat)
    11741479      DEALLOCATE(zxfqcalving, zxfluxlat)
    1175       DEALLOCATE(zxrunofflic)
     1480! SN runoff_diag
     1481      DEALLOCATE(zxrunofflic, runoff_diag)
    11761482      DEALLOCATE(zxustartlic, zxrhoslic, zxqsaltlic)
    11771483      DEALLOCATE(zxtsol, snow_lsc, zxfqfonte, zxqsurf)
     
    11941500      DEALLOCATE(cdragm_x, cdragm_w)
    11951501      DEALLOCATE(kh, kh_x, kh_w)
     1502#ifdef ISO
     1503      DEALLOCATE(xtevap,xtprw)
     1504      DEALLOCATE(zxfxtcalving)
     1505      DEALLOCATE(zxxtrunofflic)
     1506      DEALLOCATE(xtsnow_lsc, zxfxtfonte)
     1507      DEALLOCATE(xtrain_lsc)
     1508      DEALLOCATE(dxtvdf_x, dxtvdf_w)
     1509      DEALLOCATE(xt_therm)
     1510      DEALLOCATE(h1_diag,xtrunoff_diag)
     1511#endif
    11961512!
    11971513      DEALLOCATE(ptconv)
     
    12431559      DEALLOCATE(epmlmMm, eplaMm)
    12441560      DEALLOCATE(sij)
     1561#ifdef ISO
     1562      DEALLOCATE(xtwdtrainA)
     1563      DEALLOCATE(xttaa )
     1564      DEALLOCATE(xtclw )
     1565      DEALLOCATE(xtev )
     1566#ifdef DIAGISO
     1567      DEALLOCATE(qlp)
     1568      DEALLOCATE(qvp)
     1569      DEALLOCATE(fq_detrainement)
     1570      DEALLOCATE(fq_ddft)
     1571      DEALLOCATE(fq_fluxmasse)
     1572      DEALLOCATE(fq_evapprecip)
     1573      DEALLOCATE(f_detrainement,q_detrainement)
     1574      DEALLOCATE(xtlp)
     1575      DEALLOCATE(xtvp)
     1576      DEALLOCATE(q_the,xt_the)
     1577      DEALLOCATE(fxt_detrainement)
     1578      DEALLOCATE(fxt_ddft)
     1579      DEALLOCATE(fxt_fluxmasse)
     1580      DEALLOCATE(fxt_evapprecip)
     1581      DEALLOCATE(xt_detrainement)
     1582#endif
     1583#endif
    12451584
    12461585
     
    12591598      DEALLOCATE(rneb)
    12601599      DEALLOCATE(pfraclr,pfracld)
     1600      DEALLOCATE(cldfraliq)
     1601      DEALLOCATE(sigma2_icefracturb)
     1602      DEALLOCATE(mean_icefracturb)
    12611603      DEALLOCATE (zxsnow,snowhgt,qsnow,to_ice,sissnow,runoff,albsol3_lic)
    12621604      DEALLOCATE(distcltop)
    12631605      DEALLOCATE(temp_cltop)
     1606#ifdef ISO
     1607      DEALLOCATE (zxxtsnow,xtVprecip,xtVprecipi,pxtrfl,pxtsfl)
     1608#endif
     1609
    12641610      DEALLOCATE (p_tropopause)
    12651611      DEALLOCATE (z_tropopause)
     
    12911637! variables for strat. aerosol CK
    12921638      DEALLOCATE (d_q_emiss)
    1293       DEALLOCATE (R2SO4)
    1294       DEALLOCATE (DENSO4)
    1295       DEALLOCATE (f_r_wet)
     1639      DEALLOCATE (R2SO4, R2SO4B)
     1640      DEALLOCATE (DENSO4, DENSO4B)
     1641      DEALLOCATE (f_r_wet, f_r_wetB)
    12961642      DEALLOCATE (decfluxaer)
    12971643      DEALLOCATE (mdw)
     
    13081654      DEALLOCATE (surf_PM25_sulf)
    13091655      DEALLOCATE (vsed_aer)
     1656      DEALLOCATE (sulfmmr)
     1657      DEALLOCATE (SAD_sulfate)
     1658      DEALLOCATE (reff_sulfate)
     1659      DEALLOCATE (sulfmmr_mode)
     1660      DEALLOCATE (nd_mode)
    13101661      DEALLOCATE (budg_3D_ocs_to_so2)
    13111662      DEALLOCATE (budg_3D_so2_to_h2so4)
  • LMDZ6/branches/cirrus/libf/phylmd/phys_output_ctrlout_mod.F90

    r4951 r5202  
    11121112  TYPE(ctrl_out), SAVE :: o_tke = ctrl_out((/ 4, 10, 10, 10, 10, 10, 11, 11, 11, 11/), &
    11131113    'tke ', 'TKE', 'm2/s2', (/ ('', i=1, 10) /))
     1114  TYPE(ctrl_out), SAVE :: o_tke_shear = ctrl_out((/ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11/), &
     1115    'tke_shear ', 'TKE shear term', 'm2/s3', (/ ('', i=1, 10) /)) 
     1116  TYPE(ctrl_out), SAVE :: o_tke_buoy = ctrl_out((/ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11/), &
     1117    'tke_buoy ', 'TKE buoyancy term', 'm2/s3', (/ ('', i=1, 10) /))
     1118  TYPE(ctrl_out), SAVE :: o_tke_trans = ctrl_out((/ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11/), &
     1119    'tke_trans ', 'TKE transport term', 'm2/s3', (/ ('', i=1, 10) /))
    11141120  TYPE(ctrl_out), SAVE :: o_tke_dissip = ctrl_out((/ 10, 10, 10, 10, 10, 10, 11, 11, 11, 11/), &
    1115     'tke_dissip ', 'TKE DISSIPATION', 'm2/s3', (/ ('', i=1, 10) /))   
     1121    'tke_dissip ', 'TKE dissipation term', 'm2/s3', (/ ('', i=1, 10) /))
     1122
    11161123  TYPE(ctrl_out), SAVE :: o_tke_max = ctrl_out((/ 4, 10, 10, 10, 10, 10, 11, 11, 11, 11/), &
    11171124    'tke_max', 'TKE max', 'm2/s2',                                  &
     
    14421449  TYPE(ctrl_out), SAVE :: o_tau_strat_1020 = ctrl_out((/ 11, 11, 11, 11, 11, 11, 11, 11, 11, 1/), &
    14431450    'OD1020_strat_only', 'Stratospheric Aerosol Optical depth at 1020 nm ', '1', (/ ('', i=1, 10) /))
     1451  TYPE(ctrl_out), SAVE :: o_SAD_sulfate = ctrl_out((/ 11, 11, 11, 11, 11, 11, 11, 11, 11, 1/), &
     1452    'SAD_sulfate', 'SAD WET sulfate aerosols', 'cm2/cm3', (/ ('', i=1, 10) /))
     1453  TYPE(ctrl_out), SAVE :: o_reff_sulfate = ctrl_out((/ 11, 11, 11, 11, 11, 11, 11, 11, 11, 1/), &
     1454    'reff_sulfate', 'Effective radius of WET sulfate aerosols', 'cm', (/ ('', i=1, 10) /))
     1455  TYPE(ctrl_out), SAVE :: o_sulfmmr = ctrl_out((/ 11, 11, 11, 11, 11, 11, 11, 11, 11, 1/), &
     1456    'sulfMMR', 'Sulfate aerosol concentration (dry mass mixing ratio)', 'kg(H2SO4)/kg(air)', (/ ('', i=1, 10) /))
     1457  TYPE(ctrl_out), SAVE, ALLOCATABLE :: o_nd_mode(:)
     1458  TYPE(ctrl_out), SAVE, ALLOCATABLE :: o_sulfmmr_mode(:)
    14441459!--chemistry
    14451460  TYPE(ctrl_out), SAVE :: o_R2SO4 = ctrl_out((/ 11, 11, 11, 11, 11, 11, 11, 11, 11, 1/), &
     
    15511566  TYPE(ctrl_out), SAVE :: o_rneb = ctrl_out((/ 2, 5, 10, 10, 10, 10, 11, 11, 11, 11/), &
    15521567    'rneb', 'Cloud fraction', '-', (/ ('', i=1, 10) /))
     1568  TYPE(ctrl_out), SAVE :: o_cldfraliq = ctrl_out((/ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11/), &
     1569    'cldfraliq', 'Liquid fraction of the cloud', '-', (/ ('', i=1, 10) /))
     1570  TYPE(ctrl_out), SAVE :: o_sigma2_icefracturb = ctrl_out((/ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11/), &
     1571    'sigma2_icefracturb', 'Variance of the diagnostic supersaturation distribution (icefrac_turb) [-]', '-', (/ ('', i=1, 10) /))
     1572  TYPE(ctrl_out), SAVE :: o_mean_icefracturb = ctrl_out((/ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11/), &
     1573    'mean_icefracturb', 'Mean of the diagnostic supersaturation distribution (icefrac_turb) [-]', '-', (/ ('', i=1, 10) /))
     1574 
    15531575  TYPE(ctrl_out), SAVE :: o_rnebjn = ctrl_out((/ 2, 5, 10, 10, 10, 10, 11, 11,11, 11/), &     
    15541576    'rnebjn', 'Cloud fraction in day', '-', (/ ('', i=1, 10) /))
     
    19812003  TYPE(ctrl_out), SAVE, ALLOCATABLE :: o_dtr_dry(:)
    19822004
     2005#ifdef ISO
     2006  TYPE(ctrl_out), SAVE, ALLOCATABLE :: o_xtprecip(:)
     2007  TYPE(ctrl_out), SAVE, ALLOCATABLE :: o_xtevap(:)
     2008  TYPE(ctrl_out), SAVE, ALLOCATABLE :: o_xtevap_srf(:,:) ! ajout Camille 8 mai 2023
     2009  TYPE(ctrl_out), SAVE, ALLOCATABLE :: o_xtplul(:)
     2010  TYPE(ctrl_out), SAVE, ALLOCATABLE :: o_xtpluc(:)
     2011  TYPE(ctrl_out), SAVE, ALLOCATABLE :: o_xtovap(:)
     2012  TYPE(ctrl_out), SAVE, ALLOCATABLE :: o_xtoliq(:)
     2013  TYPE(ctrl_out), SAVE, ALLOCATABLE :: o_xtcond(:)
     2014  TYPE(ctrl_out), SAVE, ALLOCATABLE :: o_xtrunoff_diag(:)
     2015  TYPE(ctrl_out), SAVE, ALLOCATABLE :: o_dxtdyn(:)
     2016  TYPE(ctrl_out), SAVE, ALLOCATABLE :: o_dxtldyn(:)
     2017  TYPE(ctrl_out), SAVE, ALLOCATABLE :: o_dxtvdf(:)
     2018  TYPE(ctrl_out), SAVE, ALLOCATABLE :: o_dxtcon(:)
     2019  TYPE(ctrl_out), SAVE, ALLOCATABLE :: o_dxtlsc(:)
     2020  TYPE(ctrl_out), SAVE, ALLOCATABLE :: o_dxteva(:)
     2021  TYPE(ctrl_out), SAVE, ALLOCATABLE :: o_dxtajs(:)
     2022  TYPE(ctrl_out), SAVE, ALLOCATABLE :: o_dxtthe(:)
     2023  TYPE(ctrl_out), SAVE, ALLOCATABLE :: o_dxtch4(:)
     2024  TYPE(ctrl_out), SAVE, ALLOCATABLE :: o_dxtprod_nucl(:)
     2025  TYPE(ctrl_out), SAVE, ALLOCATABLE :: o_dxtcosmo(:)
     2026  TYPE(ctrl_out), SAVE, ALLOCATABLE :: o_dxtdecroiss(:)
     2027#endif
     2028
    19832029  TYPE(ctrl_out), SAVE :: o_rsu = ctrl_out((/ 4, 10, 10, 10, 10, 10, 11, 11, 11, 11/), &
    19842030    'rsu', 'SW upward radiation', 'W m-2', (/ ('', i=1, 10) /))
     
    20642110  TYPE(ctrl_out), SAVE :: o_runoff = ctrl_out((/ 1, 1, 10, 1, 10, 10, 11, 11, 11, 11/), &
    20652111    'runoff', 'Run-off rate land ice', 'kg/m2/s', (/ ('', i=1, 10) /))
     2112! SN add runoff_diag
     2113!#ifdef ISO
     2114  TYPE(ctrl_out), SAVE :: o_runoff_diag = ctrl_out((/ 1, 1, 10, 1, 10, 10, 11, 11, 11, 11/), &
     2115    'runoffland', 'Run-off rate land for bucket', 'kg/m2/s', (/ ('', i=1, 10) /))
     2116!#endif
    20662117  TYPE(ctrl_out), SAVE :: o_albslw3 = ctrl_out((/ 1, 1, 1, 1, 10, 10, 11, 11, 11, 11/), &
    20672118    'albslw3', 'Surface albedo LW3', '-', (/ ('', i=1, 10) /))
  • LMDZ6/branches/cirrus/libf/phylmd/phys_output_mod.F90

    r4619 r5202  
    3535    USE iophy
    3636    USE dimphy
    37     USE infotrac_phy, ONLY: nqtot, tracers, niso
     37    USE infotrac_phy, ONLY: nqtot, tracers, niso, ntraciso=>ntiso
    3838    USE strings_mod,  ONLY: maxlen
    3939    USE ioipsl
     
    4949    ! ug Pour les sorties XIOS
    5050    USE wxios
     51#ifdef CPP_StratAer
     52   USE infotrac_phy, ONLY: nbtr_bin
     53#endif
     54#ifdef ISO
     55    USE isotopes_mod, ONLY: isoName,iso_HTO
     56#ifdef ISOTRAC
     57    use isotrac_mod, only: index_zone,index_iso,strtrac
     58#endif
     59#endif
    5160
    5261    IMPLICIT NONE
     
    93102    CHARACTER(LEN=4), DIMENSION(nlevSTD)  :: clevSTD
    94103    REAL, DIMENSION(nlevSTD)              :: rlevSTD
    95     INTEGER                               :: nsrf, k, iq, iff, i, j, ilev, itr, ixt, iiso, izone
     104    INTEGER                               :: nsrf, k, iq, iff, i, j, ilev, itr, itrb, ixt, iiso, izone
    96105    INTEGER                               :: naero
    97106    LOGICAL                               :: ok_veget
     
    112121    LOGICAL, DIMENSION(nfiles)            :: phys_out_filestations
    113122
     123#ifdef ISO
     124    CHARACTER(LEN=maxlen) :: outiso
     125    CHARACTER(LEN=20) :: unit
     126#endif
    114127    CHARACTER(LEN=maxlen) :: tnam, lnam, dn
    115128    INTEGER :: flag(nfiles)
     
    158171    ALLOCATE(o_dtr_sscav(nqtot),o_dtr_sat(nqtot),o_dtr_uscav(nqtot))
    159172    ALLOCATE(o_dtr_dry(nqtot),o_dtr_vdf(nqtot))
     173#ifdef CPP_StratAer
     174    ALLOCATE(o_nd_mode(nbtr_bin),o_sulfmmr_mode(nbtr_bin))
     175#endif
     176#ifdef ISO
     177    ALLOCATE(o_xtprecip(ntraciso))
     178    ALLOCATE(o_xtplul(ntraciso))
     179    ALLOCATE(o_xtpluc(ntraciso))
     180    ALLOCATE(o_xtevap(ntraciso))
     181    ALLOCATE(o_xtevap_srf(ntraciso,4))
     182    ALLOCATE(o_xtovap(ntraciso))
     183    ALLOCATE(o_xtoliq(ntraciso))
     184    ALLOCATE(o_xtcond(ntraciso))
     185    ALLOCATE(o_xtrunoff_diag(ntraciso))
     186    ALLOCATE(o_dxtdyn(ntraciso))
     187    ALLOCATE(o_dxtldyn(ntraciso))
     188    ALLOCATE(o_dxtcon(ntraciso))
     189    ALLOCATE(o_dxtlsc(ntraciso))
     190    ALLOCATE(o_dxteva(ntraciso))
     191    ALLOCATE(o_dxtajs(ntraciso))
     192    ALLOCATE(o_dxtvdf(ntraciso))
     193    ALLOCATE(o_dxtthe(ntraciso))
     194    ALLOCATE(o_dxtch4(ntraciso))
     195    if (iso_HTO.gt.0) then
     196      ALLOCATE(o_dxtprod_nucl(ntraciso))
     197      ALLOCATE(o_dxtcosmo(ntraciso))
     198      ALLOCATE(o_dxtdecroiss(ntraciso))
     199    endif
     200#endif
    160201
    161202    levmax = [klev, klev, klev, klev, klev, klev, nlevSTD, nlevSTD, nlevSTD, klev]
     
    467508     ENDIF ! clef_files
    468509
    469           itr = 0
     510          itr = 0; itrb = 0
    470511          DO iq = 1, nqtot
    471512            IF(.NOT.(tracers(iq)%isAdvected .AND. tracers(iq)%isInPhysics)) CYCLE
     
    503544            lnam = 'Cumulated tracer '//TRIM(tracers(iq)%longName)
    504545            tnam = 'cum'//TRIM(tracers(iq)%name); o_trac_cum(itr) = ctrl_out(flag, tnam, lnam, "-", [('',i=1,nfiles)])
    505           ENDDO
     546           
     547#ifdef CPP_StratAer
     548            if(tracers(iq)%name(1:3)=='BIN') then
     549               itrb = itrb + 1
     550               flag = [11, 11, 11, 11, 11, 11, 11, 11, 11, 1]
     551               lnam = 'Dry particle concentration in '//TRIM(tracers(iq)%longName)
     552               tnam = TRIM(tracers(iq)%name)//'_nd_mode';     o_nd_mode       (itrb) = ctrl_out(flag, tnam, lnam, "part/m3", [('',i=1,nfiles)])
     553               lnam = 'Sulfate MMR in '//TRIM(tracers(iq)%longName)
     554               tnam = TRIM(tracers(iq)%name)//'_sulfmmr_mode';o_sulfmmr_mode  (itrb) = ctrl_out(flag, tnam, lnam, "kg(H2SO4)/kg(air)", [('',i=1,nfiles)])
     555            endif
     556#endif
     557         ENDDO
    506558
    507559   ENDDO !  iff
    508560
    509     ! Updated write frequencies due to phys_out_filetimesteps.
     561#ifdef ISO
     562    write(*,*) 'phys_output_mid 589'
     563    do ixt=1,ntraciso
     564      outiso = TRIM(isoName(ixt))
     565      i = INDEX(outiso, '_', .TRUE.)
     566      outiso = outiso(1:i-1)//outiso(i+1:LEN_TRIM(outiso))
     567
     568      flag = [1,  1,  1, 10,  5, 10, 11, 11, 11, 11]; unit = 'kg/(s*m2)'
     569      o_xtprecip(ixt)=ctrl_out(flag, 'precip'//TRIM(outiso), 'Precip Totale liq+sol', unit, [('',i=1,nfiles)])
     570      o_xtpluc  (ixt)=ctrl_out(flag,   'pluc'//TRIM(outiso),    'Convective Precip.', unit, [('',i=1,nfiles)])
     571
     572      flag = [1,  1,  1, 10, 10, 10, 11, 11, 11, 11]
     573      o_xtplul  (ixt)=ctrl_out(flag,   'plul'//TRIM(outiso),   'Large-scale Precip.', unit, [('',i=1,nfiles)])
     574      o_xtevap  (ixt)=ctrl_out(flag,   'evap'//TRIM(outiso),             'Evaporat.', unit, [('',i=1,nfiles)])
     575
     576      ! ajout Camille 8 mai 2023
     577      flag = [1, 6, 10, 10, 10, 10, 11, 11, 11, 11]
     578      o_xtevap_srf (ixt,1)=ctrl_out(flag,   'evap_ter'//TRIM(outiso), 'Evap sfc'//clnsurf(1), unit, [('',i=1,nfiles)])
     579      o_xtevap_srf (ixt,2)=ctrl_out(flag,   'evap_lic'//TRIM(outiso), 'Evap sfc'//clnsurf(2), unit, [('',i=1,nfiles)])
     580      o_xtevap_srf (ixt,3)=ctrl_out(flag,   'evap_oce'//TRIM(outiso), 'Evap sfc'//clnsurf(3), unit, [('',i=1,nfiles)])
     581      o_xtevap_srf (ixt,4)=ctrl_out(flag,   'evap_sic'//TRIM(outiso), 'Evap sfc'//clnsurf(4), unit, [('',i=1,nfiles)])
     582
     583      flag = [2,  3,  4, 10, 10, 10, 11, 11, 11, 11]; unit = 'kg/kg'
     584      o_xtovap  (ixt)=ctrl_out(flag,   'ovap'//TRIM(outiso),     'Specific humidity', unit, [('',i=1,nfiles)])
     585      o_xtoliq  (ixt)=ctrl_out(flag,   'oliq'//TRIM(outiso),          'Liquid water', unit, [('',i=1,nfiles)])
     586      o_xtcond  (ixt)=ctrl_out(flag,  'ocond'//TRIM(outiso),       'Condensed water', unit, [('',i=1,nfiles)])
     587
     588      flag = [1,  1,  1, 10, 5, 10, 11, 11, 11, 11]; unit = 'kg/m2/s'
     589      o_xtrunoff_diag  (ixt)=ctrl_out(flag, 'runoffland'//TRIM(outiso), 'Run-off rate land for bucket', unit, [('',i=1,nfiles)])
     590
     591      flag = [4, 10, 10, 10, 10, 10, 11, 11, 11, 11]; unit = '(kg/kg)/s'
     592      o_dxtdyn  (ixt)=ctrl_out(flag,  'dqdyn'//TRIM(outiso),           'Dynamics dQ', unit, [('',i=1,nfiles)])
     593      o_dxtldyn (ixt)=ctrl_out(flag, 'dqldyn'//TRIM(outiso),          'Dynamics dQL', unit, [('',i=1,nfiles)])
     594      o_dxtcon  (ixt)=ctrl_out(flag,  'dqcon'//TRIM(outiso),         'Convection dQ', unit, [('',i=1,nfiles)])
     595      o_dxteva  (ixt)=ctrl_out(flag,  'dqeva'//TRIM(outiso),      'Reevaporation dQ', unit, [('',i=1,nfiles)])
     596      o_dxtlsc  (ixt)=ctrl_out(flag,  'dqlsc'//TRIM(outiso),       'Condensation dQ', unit, [('',i=1,nfiles)])
     597      o_dxtajs  (ixt)=ctrl_out(flag,  'dqajs'//TRIM(outiso),        'Dry adjust. dQ', unit, [('',i=1,nfiles)])
     598      o_dxtvdf  (ixt)=ctrl_out(flag,  'dqvdf'//TRIM(outiso),     'Boundary-layer dQ', unit, [('',i=1,nfiles)])
     599      o_dxtthe  (ixt)=ctrl_out(flag,  'dqthe'//TRIM(outiso),            'Thermal dQ', unit, [('',i=1,nfiles)])
     600
     601      IF(ok_qch4) o_dxtch4(ixt)=ctrl_out(flag, 'dqch4'//TRIM(outiso), 'H2O due to CH4 oxidation & photolysis', &
     602                                                                                      unit, [('',i=1,nfiles)])
     603      IF(ixt == iso_HTO) THEN
     604      o_dxtprod_nucl(ixt)=ctrl_out(flag, 'dqprodnucl'//TRIM(outiso), 'dHTO/dt due to nuclear production',      &
     605                                                                                      unit, [('',i=1,nfiles)])
     606      o_dxtcosmo    (ixt)=ctrl_out(flag,    'dqcosmo'//TRIM(outiso), 'dHTO/dt due to cosmogenic production',   &
     607                                                                                      unit, [('',i=1,nfiles)])
     608      o_dxtdecroiss (ixt)=ctrl_out(flag, 'dqdecroiss'//TRIM(outiso), 'dHTO/dt due to radiative destruction',   &
     609                                                                                      unit, [('',i=1,nfiles)])
     610      END IF
     611    enddo !do ixt=1,niso
     612    write(*,*) 'phys_output_mid 596'
     613#endif
     614
     615   ! Updated write frequencies due to phys_out_filetimesteps.
    510616    ! Write frequencies are now in seconds. 
    511617    ecrit_mth = ecrit_files(1)
  • LMDZ6/branches/cirrus/libf/phylmd/phys_output_write_mod.F90

    r4951 r5202  
    6565         o_fder, o_ffonte, o_fqcalving, o_fqfonte, o_mrroli, o_runofflic, &
    6666         o_taux, o_tauy, o_snowsrf, o_qsnow, &
    67          o_snowhgt, o_toice, o_sissnow, o_runoff, &
     67! SN runoff_diag
     68         o_snowhgt, o_toice, o_sissnow, o_runoff, o_runoff_diag, &
    6869         o_albslw3, o_pourc_srf, o_fract_srf, &
    6970         o_taux_srf, o_tauy_srf, o_tsol_srf, &
     
    141142         o_zfull, o_zhalf, o_rneb, o_rnebjn, o_rnebcon, &
    142143         o_rnebls, o_rneblsvol, o_rhum, o_rhl, o_rhi, o_ozone, o_ozone_light, &
    143          o_pfraclr, o_pfracld, &
     144         o_pfraclr, o_pfracld, o_cldfraliq, o_sigma2_icefracturb, o_mean_icefracturb,  &
    144145         o_qrainlsc, o_qsnowlsc, o_dqreva, o_dqrauto, o_dqrcol, o_dqrmelt, o_dqrfreez, &
    145146         o_dqssub, o_dqsauto, o_dqsagg, o_dqsrim, o_dqsmelt, o_dqsfreez, &
     
    147148         o_dqsphy, o_dqsphy2d, o_dqbsphy, o_dqbsphy2d, o_albe_srf, o_z0m_srf, o_z0h_srf, &
    148149         o_ages_srf, o_snow_srf, o_alb1, o_alb2, o_tke, o_tke_dissip, &
    149          o_tke_max, o_kz, o_kz_max, o_clwcon, &
     150         o_tke_max, o_kz, o_kz_max, o_clwcon, o_tke_shear, o_tke_buoy, o_tke_trans,  &
    150151         o_dtdyn, o_dqdyn, o_dqdyn2d, o_dqldyn, o_dqldyn2d, &
    151152         o_dqsdyn, o_dqsdyn2d, o_dqbsdyn, o_dqbsdyn2d, o_dudyn, o_dvdyn, &
     
    208209! Isotopes
    209210         o_xtprecip,o_xtplul,o_xtpluc,o_xtovap,o_xtoliq,o_xtcond, &
     211         o_xtrunoff_diag, &
    210212         o_xtevap,o_dxtdyn,o_dxtldyn,o_dxtcon,o_dxtlsc,o_dxteva, &
    211213         o_dxtajs,o_dxtvdf,o_dxtthe, o_dxtch4, &
     
    248250
    249251#ifdef CPP_StratAer
     252    USE infotrac_phy, ONLY: nbtr_bin
    250253    USE phys_output_ctrlout_mod, ONLY:  &
    251254         o_budg_3D_nucl, o_budg_3D_cond_evap, o_budg_3D_ocs_to_so2, o_budg_3D_so2_to_h2so4, &
     
    259262         o_budg_ocs_to_so2, o_budg_so2_to_h2so4, o_budg_h2so4_to_part, &
    260263         o_surf_PM25_sulf, o_ext_strat_550, o_tau_strat_550, &
    261          o_vsed_aer, o_tau_strat_1020, o_ext_strat_1020, o_f_r_wet
     264         o_vsed_aer, o_tau_strat_1020, o_ext_strat_1020, o_f_r_wet, &
     265         o_SAD_sulfate, o_reff_sulfate, o_sulfmmr, o_nd_mode, o_sulfmmr_mode
    262266#endif
    263267
     
    314318         zn2mout, t2m_min_mon, t2m_max_mon, evap, &
    315319         snowerosion, zxustartlic, zxrhoslic, zxqsaltlic, &
    316          l_mixmin,l_mix, pbl_eps, &
     320         l_mixmin,l_mix, pbl_eps, tke_shear, tke_buoy, tke_trans, &
    317321         zu10m, zv10m, zq2m, zustar, zxqsurf, &
    318322         rain_lsc, rain_num, snow_lsc, bils, sens, fder, &
    319323         zxffonte, zxfqcalving, zxfqfonte, zxrunofflic, fluxu, &
    320324         fluxv, zxsnow, qsnow, snowhgt, to_ice, &
    321          sissnow, runoff, albsol3_lic, evap_pot, &
     325! SN runoff_diag
     326         sissnow, runoff, runoff_diag, albsol3_lic, evap_pot, &
    322327         t2m, fluxt, fluxlat, fsollw, fsolsw, &
    323328         wfbils, wfevap, &
     
    367372         ql_seri, qs_seri, qbs_seri, tr_seri, qbs_seri,&
    368373         zphi, u_seri, v_seri, omega, cldfra, &
    369          rneb, rnebjn, rneblsvol, zx_rh, zx_rhl, zx_rhi, &
    370          pfraclr, pfracld,  &
     374         rneb, rnebjn, rneblsvol,  &
     375         zx_rh, zx_rhl, zx_rhi, &
     376         pfraclr, pfracld, cldfraliq, sigma2_icefracturb, mean_icefracturb, &
    371377         qraindiag, qsnowdiag, dqreva, dqssub, &
    372378         dqrauto,dqrcol,dqrmelt,dqrfreez, &
     
    382388         d_t_lscst, d_q_lscth, d_q_lscst, plul_th, &
    383389         plul_st, d_t_vdf, d_t_diss, d_q_vdf, d_q_eva, &
    384          d_t_bs, d_q_bs, d_qbs_bs, d_qbs_vdf, &
     390         d_t_bsss, d_q_bsss, d_qbs_bsss, d_qbs_vdf, &
    385391         zw2, fraca, zmax_th, d_q_ajsb, d_t_ec, d_u_vdf, &
    386392         d_v_vdf, d_u_oro, d_v_oro, d_t_oro, d_u_lif, &
     
    395401        d_xt_ajs, d_xt_ajsb, &
    396402        d_xt_prod_nucl,d_xt_cosmo,d_xt_decroiss, &
     403        xtrunoff_diag, &
    397404#endif
    398405         ep, epmax_diag, &  ! epmax_cape
     
    416423         budg_ocs_to_so2, budg_so2_to_h2so4, budg_h2so4_to_part, &
    417424         surf_PM25_sulf, tau_strat_550, tausum_strat, &
    418          vsed_aer, tau_strat_1020, f_r_wet
     425         vsed_aer, tau_strat_1020, f_r_wet, &
     426         SAD_sulfate, reff_sulfate, sulfmmr, nd_mode, sulfmmr_mode
    419427#endif
    420428
     
    449457    USE indice_sol_mod, ONLY: nbsrf
    450458#ifdef ISO
    451     USE isotopes_mod, ONLY: iso_HTO
     459    USE isotopes_mod, ONLY: iso_HTO, isoName
    452460#endif
    453461    USE geometry_mod, ONLY: cell_area, latitude_deg, longitude_deg
     
    530538    CHARACTER(LEN=maxlen) :: unt
    531539#endif
     540
     541#ifdef ISO
     542    CHARACTER(LEN=maxlen) :: outiso
     543#endif
     544
    532545    REAL,DIMENSION(klon,klev) :: z, dz
    533546    REAL,DIMENSION(klon)      :: zrho, zt
     
    13101323
    13111324       ENDDO
    1312        
    1313                
     1325
     1326
    13141327        IF (iflag_pbl > 1) THEN
    13151328          zx_tmp_fi3d=0.
     
    13231336          ENDIF
    13241337         
    1325           CALL histwrite_phy(o_tke_dissip, zx_tmp_fi3d)   
     1338          CALL histwrite_phy(o_tke_dissip, zx_tmp_fi3d)   
     1339
     1340          zx_tmp_fi3d=0.
     1341          IF (vars_defined) THEN
     1342             DO nsrf=1,nbsrf
     1343                DO k=1,klev
     1344                   zx_tmp_fi3d(:,k)=zx_tmp_fi3d(:,k) &
     1345                        +pctsrf(:,nsrf)*tke_shear(:,k,nsrf)
     1346                ENDDO
     1347             ENDDO
     1348          ENDIF
     1349
     1350          CALL histwrite_phy(o_tke_shear, zx_tmp_fi3d)
     1351
     1352          zx_tmp_fi3d=0.
     1353          IF (vars_defined) THEN
     1354             DO nsrf=1,nbsrf
     1355                DO k=1,klev
     1356                   zx_tmp_fi3d(:,k)=zx_tmp_fi3d(:,k) &
     1357                        +pctsrf(:,nsrf)*tke_buoy(:,k,nsrf)
     1358                ENDDO
     1359             ENDDO
     1360          ENDIF
     1361
     1362          CALL histwrite_phy(o_tke_buoy, zx_tmp_fi3d)
     1363
     1364
     1365          zx_tmp_fi3d=0.
     1366          IF (vars_defined) THEN
     1367             DO nsrf=1,nbsrf
     1368                DO k=1,klev
     1369                   zx_tmp_fi3d(:,k)=zx_tmp_fi3d(:,k) &
     1370                        +pctsrf(:,nsrf)*tke_trans(:,k,nsrf)
     1371                ENDDO
     1372             ENDDO
     1373          ENDIF
     1374
     1375          CALL histwrite_phy(o_tke_trans, zx_tmp_fi3d)
     1376
    13261377       ENDIF
    13271378
     
    18141865          CALL histwrite_phy(o_tau_strat_550, tausum_strat(:,1))
    18151866          CALL histwrite_phy(o_tau_strat_1020, tausum_strat(:,2))
     1867          CALL histwrite_phy(o_SAD_sulfate, SAD_sulfate)
     1868          CALL histwrite_phy(o_reff_sulfate, reff_sulfate)
     1869          CALL histwrite_phy(o_sulfmmr, sulfmmr)
     1870          ! All BINs fields
     1871          DO itr = 1, nbtr_bin
     1872             CALL histwrite_phy(o_nd_mode(itr), nd_mode(:,:,itr))
     1873             CALL histwrite_phy(o_sulfmmr_mode(itr), sulfmmr_mode(:,:,itr))
     1874          ENDDO !--itr
    18161875       ENDIF
    18171876#endif
     
    20052064           CALL histwrite_phy(o_pfraclr, pfraclr)
    20062065           CALL histwrite_phy(o_pfracld, pfracld)
     2066           CALL histwrite_phy(o_cldfraliq, cldfraliq)
     2067           CALL histwrite_phy(o_sigma2_icefracturb, sigma2_icefracturb)
     2068           CALL histwrite_phy(o_mean_icefracturb, mean_icefracturb)
    20072069           IF (ok_poprecip) THEN
    20082070           CALL histwrite_phy(o_qrainlsc, qraindiag)
     
    23062368          IF (vars_defined) zx_tmp_fi3d(1:klon,1:klev)=d_qbs_vdf(1:klon,1:klev)/pdtphys
    23072369          CALL histwrite_phy(o_dqbsvdf, zx_tmp_fi3d)
    2308           IF (vars_defined) zx_tmp_fi3d(1:klon,1:klev)=d_qbs_bs(1:klon,1:klev)/pdtphys
     2370          IF (vars_defined) zx_tmp_fi3d(1:klon,1:klev)=d_qbs_bsss(1:klon,1:klev)/pdtphys
    23092371          CALL histwrite_phy(o_dqbsbs, zx_tmp_fi3d)
    2310           IF (vars_defined) zx_tmp_fi3d(1:klon,1:klev)=d_q_bs(1:klon,1:klev)/pdtphys
     2372          IF (vars_defined) zx_tmp_fi3d(1:klon,1:klev)=d_q_bsss(1:klon,1:klev)/pdtphys
    23112373          CALL histwrite_phy(o_dqbs, zx_tmp_fi3d)
    2312           IF (vars_defined) zx_tmp_fi3d(1:klon,1:klev)=d_t_bs(1:klon,1:klev)/pdtphys
     2374          IF (vars_defined) zx_tmp_fi3d(1:klon,1:klev)=d_t_bsss(1:klon,1:klev)/pdtphys
    23132375          CALL histwrite_phy(o_dtbs, zx_tmp_fi3d)
    23142376       ENDIF
     
    28102872       end if
    28112873
     2874    !! runoff land bucket - ajout S. Nguyen 23 07 2024
     2875    CALL histwrite_phy(o_runoff_diag, runoff_diag)
     2876
    28122877#ifdef ISO
    2813     do ixt=1,ntiso
    2814 !        write(*,*) 'ixt'
     2878    !write(*,*) 'tmp phys_output_write: ntiso=',ntiso
     2879
     2880    DO ixt = 1, ntiso
     2881        !write(*,*) 'ixt,o_xtovap(ixt)=',ixt,o_xtovap(ixt)
    28152882        IF (vars_defined) zx_tmp_fi2d(:) = xtrain_fall(ixt,:) + xtsnow_fall(ixt,:)
    28162883        CALL histwrite_phy(o_xtprecip(ixt), zx_tmp_fi2d)
     
    28242891        CALL histwrite_phy(o_xtovap(ixt),  xt_seri(ixt,:,:))
    28252892        CALL histwrite_phy(o_xtoliq(ixt), xtl_seri(ixt,:,:))
     2893
     2894        !! runoff land bucket - ajout S. Nguyen 25 avril 2024
     2895        CALL histwrite_phy(o_xtrunoff_diag(ixt), xtrunoff_diag(ixt,:))
     2896
    28262897
    28272898        DO nsrf = 1, nbsrf ! ajout Camille 8 mai 2023
     
    28842955          ENDDO !  iff
    28852956#endif
     2957
     2958!SN activate water isotopes present in tracer.def
     2959#ifdef ISO
     2960          DO ixt = 1, ntiso
     2961            outiso = TRIM(isoName(ixt))
     2962            i = INDEX(outiso, '_', .TRUE.)
     2963            outiso = outiso(1:i-1)//outiso(i+1:LEN_TRIM(outiso))
     2964
     2965            CALL xios_set_fieldgroup_attr("iso2D_"//TRIM(outiso), enabled=.TRUE.)
     2966            CALL xios_set_fieldgroup_attr("iso3D_"//TRIM(outiso), enabled=.TRUE.)
     2967
     2968          ENDDO
     2969#endif
    28862970          !On finalise l'initialisation:
    28872971          IF (using_xios) CALL wxios_closedef()
  • LMDZ6/branches/cirrus/libf/phylmd/phys_state_var_mod.F90

    r4951 r5202  
    8787!$OMP THREADPRIVATE(prw_ancien, prlw_ancien, prsw_ancien, prbsw_ancien)
    8888#ifdef ISO
    89       REAL, ALLOCATABLE, SAVE :: xt_ancien(:,:,:),xtl_ancien(:,:,:),xts_ancien(:,:,:)
    90 !$OMP THREADPRIVATE(xt_ancien,xtl_ancien,xts_ancien)
     89      REAL, ALLOCATABLE, SAVE :: xt_ancien(:,:,:),xtl_ancien(:,:,:),xts_ancien(:,:,:), &
     90              xtbs_ancien(:,:,:)
     91!$OMP THREADPRIVATE(xt_ancien,xtl_ancien,xts_ancien,xtbs_ancien)
    9192#endif
    9293      REAL, ALLOCATABLE, SAVE :: u_ancien(:,:), v_ancien(:,:)
     
    760761      ALLOCATE(xtl_ancien(ntraciso,klon,klev))
    761762      ALLOCATE(xts_ancien(ntraciso,klon,klev))
     763      ALLOCATE(xtbs_ancien(ntraciso,klon,klev))
    762764      ALLOCATE(xtrain_fall(ntraciso,klon))
    763765      ALLOCATE(xtsnow_fall(ntraciso,klon))
     
    950952#ifdef ISO   
    951953      DEALLOCATE(xtsol,fxtevap) 
    952       DEALLOCATE(xt_ancien,xtl_ancien,xts_ancien, fxtd, wake_deltaxt)
     954      DEALLOCATE(xt_ancien,xtl_ancien,xts_ancien,xtbs_ancien, fxtd, wake_deltaxt)
    953955      DEALLOCATE(xtrain_fall, xtsnow_fall, xtrain_con, xtsnow_con)
    954956#ifdef ISOTRAC
  • LMDZ6/branches/cirrus/libf/phylmd/physiq_mod.F90

    r4951 r5202  
    1 !
     1
    22! $Id$
    33!
     
    184184       d_ts, &
    185185       !
    186        d_t_bs,d_q_bs,d_qbs_bs, &
     186       d_t_bsss,d_q_bsss,d_qbs_bsss, &
    187187       !
    188188!       d_t_oli,d_u_oli,d_v_oli, &
     
    333333       !
    334334       rneblsvol, &
    335        pfraclr,pfracld, &
    336        distcltop,temp_cltop, &
     335       pfraclr, pfracld, cldfraliq, sigma2_icefracturb, mean_icefracturb, &
     336       distcltop, temp_cltop, &
    337337       !-- LSCP - condensation and ice supersaturation variables
    338338       qsub, qissr, qcld, subfra, issrfra, gamma_cond, ratio_qi_qtot, &
     
    909909    REAL zdtime, zdtime1, zdtime2, zlongi
    910910    !
    911     REAL qcheck
    912911    REAL z_avant(klon), z_apres(klon), z_factor(klon)
    913912    LOGICAL zx_ajustq
     
    11331132    REAL, DIMENSION(klon,klev)     :: mass_solu_aero_pi
    11341133    ! - " - (pre-industrial value)
     1134    REAL, DIMENSION(klon,klev,naero_tot) :: m_allaer
    11351135
    11361136    ! Parameters
     
    12711271
    12721272    !--OB variables for mass fixer (hard coded for now)
    1273     LOGICAL, PARAMETER :: mass_fixer=.FALSE.
    12741273    REAL qql1(klon),qql2(klon),corrqql
    12751274
     
    14011400       IF (read_climoz>=1 .AND. create_etat0_limit .AND. grid_type==unstructured) &
    14021401          CALL regr_horiz_time_climoz(read_climoz,ok_daily_climoz)
    1403 
    1404 #ifdef REPROBUS
    1405        CALL strataer_init
    1406        CALL strataer_emiss_init
    1407 #endif
    1408 
    1409 #ifdef CPP_StratAer
    1410        CALL strataer_init
    1411        CALL strataer_nuc_init
    1412        CALL strataer_emiss_init
    1413 #endif
    14141402
    14151403       print*, '================================================='
     
    15271515       iflag_phytrac = 1 ! by default we do want to call phytrac
    15281516       CALL getin_p('iflag_phytrac',iflag_phytrac)
     1517
     1518       ok_water_mass_fixer=.FALSE.  ! OB: by default we do not apply the mass fixer
     1519       CALL getin_p('ok_water_mass_fixer',ok_water_mass_fixer)
    15291520#ifdef CPP_Dust
    15301521       IF (iflag_phytrac.EQ.0) THEN
     
    15511542       WRITE(lunout,*) 'fl_cor_ebil=',        fl_cor_ebil
    15521543       WRITE(lunout,*) 'iflag_phytrac=',      iflag_phytrac
     1544       WRITE(lunout,*) 'ok_water_mass_fixer=',ok_water_mass_fixer
    15531545       WRITE(lunout,*) 'NVM=',                nvm_lmdz
    15541546
     
    18021794      IF (.NOT. create_etat0_limit) CALL init_readaerosolstrato(flag_aerosol_strat)  !! initialise aero strato from file for XIOS interpolation (unstructured_grid)
    18031795
     1796      ! A.I : Initialisations pour le 1er passage a Cosp
    18041797      if (ok_cosp) then
     1798
    18051799#ifdef CPP_COSP
    1806         ! A.I : Initialisations pour le 1er passage a Cosp
    18071800        CALL ini_COSP(ref_liq_cosp0,ref_ice_cosp0,pctsrf_cosp0,zu10m_cosp0,zv10m_cosp0, &
    18081801               zxtsol_cosp0,zx_rh_cosp0,cldfra_cosp0,rnebcon_cosp0,flwc_cosp0, &
     
    18241817#endif
    18251818
    1826 #ifdef CPP_COSP2
    1827         CALL ini_COSP(ref_liq_cosp0,ref_ice_cosp0,pctsrf_cosp0,zu10m_cosp0,zv10m_cosp0, &
     1819#ifdef CPP_COSPV2
     1820          CALL ini_COSP(ref_liq_cosp0,ref_ice_cosp0,pctsrf_cosp0,zu10m_cosp0,zv10m_cosp0, &
    18281821               zxtsol_cosp0,zx_rh_cosp0,cldfra_cosp0,rnebcon_cosp0,flwc_cosp0, &
    18291822               fiwc_cosp0,prfl_cosp0,psfl_cosp0,pmflxr_cosp0,pmflxs_cosp0, &
    18301823               mr_ozone_cosp0,cldtau_cosp0,cldemi_cosp0,JrNt_cosp0)
    1831      
    1832         CALL phys_cosp2(itap,phys_tstep,freq_cosp, &
    1833                ok_mensuelCOSP,ok_journeCOSP,ok_hfCOSP, &
    1834                ecrit_mth,ecrit_day,ecrit_hf, ok_all_xml, missing_val, &
    1835                klon,klev,longitude_deg,latitude_deg,presnivs,overlap, &
    1836                JrNt,ref_liq,ref_ice, &
    1837                pctsrf(:,is_ter)+pctsrf(:,is_lic), &
    1838                zu10m,zv10m,pphis, &
    1839                zphi,paprs(:,1:klev),pplay,zxtsol,t_seri, &
    1840                qx(:,:,ivap),zx_rh,cldfra,rnebcon,flwc,fiwc, &
    1841                prfl(:,1:klev),psfl(:,1:klev), &
    1842                pmflxr(:,1:klev),pmflxs(:,1:klev), &
    1843                mr_ozone,cldtau, cldemi)
    1844 #endif
    1845 
    1846 #ifdef CPP_COSPV2
     1824
    18471825          CALL lmdz_cosp_interface(itap,phys_tstep,freq_cosp, &
    18481826               ok_mensuelCOSP,ok_journeCOSP,ok_hfCOSP, &
    18491827               ecrit_mth,ecrit_day,ecrit_hf, ok_all_xml, missing_val, &
    18501828               klon,klev,longitude_deg,latitude_deg,presnivs,overlap, &
    1851                JrNt,ref_liq,ref_ice, &
    1852                pctsrf(:,is_ter)+pctsrf(:,is_lic), &
    1853                zu10m,zv10m,pphis, &
    1854                phicosp,paprs(:,1:klev),pplay,zxtsol,t_seri, &
    1855                qx(:,:,ivap),zx_rh,cldfra,rnebcon,flwc,fiwc, &
    1856                prfl(:,1:klev),psfl(:,1:klev), &
    1857                pmflxr(:,1:klev),pmflxs(:,1:klev), &
    1858                mr_ozone,cldtau, cldemi)
     1829               JrNt_cosp0,ref_liq_cosp0,ref_ice_cosp0, &
     1830               pctsrf_cosp0, &
     1831               zu10m_cosp0,zv10m_cosp0,pphis, &
     1832               pphi,paprs(:,1:klev),pplay,zxtsol_cosp0,t, &
     1833               qx(:,:,ivap),zx_rh_cosp0,cldfra_cosp0,rnebcon_cosp0,flwc_cosp0,fiwc_cosp0, &
     1834               prfl_cosp0(:,1:klev),psfl_cosp0(:,1:klev), &
     1835               pmflxr_cosp0(:,1:klev),pmflxs_cosp0(:,1:klev), &
     1836               mr_ozone_cosp0,cldtau_cosp0, cldemi_cosp0)
    18591837#endif
    1860       ENDIF
     1838      endif  ! ok_cosp
    18611839
    18621840       !
     
    19081886       !
    19091887!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     1888#ifdef REPROBUS
     1889       CALL strataer_init
     1890       CALL strataer_emiss_init
     1891#endif
     1892
     1893#ifdef CPP_StratAer
     1894       CALL strataer_init
     1895       CALL strataer_nuc_init
     1896       CALL strataer_emiss_init
     1897#endif
    19101898
    19111899#ifdef CPP_Dust
     
    19481936       ELSE IF (klon_glo==1) THEN
    19491937          pbl_tke(:,:,is_ave) = 0.
     1938          pbl_eps(:,:,is_ave) = 0.
    19501939          DO nsrf=1,nbsrf
    19511940            DO k = 1,klev+1
    19521941                 pbl_tke(:,k,is_ave) = pbl_tke(:,k,is_ave) &
    19531942                     +pctsrf(:,nsrf)*pbl_tke(:,k,nsrf)
     1943                 pbl_eps(:,k,is_ave) = pbl_eps(:,k,is_ave) &
     1944                     +pctsrf(:,nsrf)*pbl_eps(:,k,nsrf)
    19541945            ENDDO
    19551946          ENDDO
     
    19571948          pbl_tke(:,:,is_ave) = 0. !ym missing init : maybe must be initialized in the same way that for klon_glo==1 ??
    19581949!>jyg
     1950          pbl_eps(:,:,is_ave) = 0.
    19591951       ENDIF
    19601952       !IM begin
     
    24702462    ENDDO
    24712463    !
    2472     !--OB mass fixer
    2473     IF (mass_fixer) THEN
     2464    !--OB water mass fixer
     2465    IF (ok_water_mass_fixer) THEN
    24742466    !--store initial water burden
    24752467    qql1(:)=0.0
     
    30243016    ! Blowing snow sublimation and sedimentation
    30253017
    3026     d_t_bs(:,:)=0.
    3027     d_q_bs(:,:)=0.
    3028     d_qbs_bs(:,:)=0.
     3018    d_t_bsss(:,:)=0.
     3019    d_q_bsss(:,:)=0.
     3020    d_qbs_bsss(:,:)=0.
    30293021    bsfl(:,:)=0.
    30303022    bs_fall(:)=0.
     
    30323024
    30333025     CALL call_blowing_snow_sublim_sedim(klon,klev,phys_tstep,t_seri,q_seri,qbs_seri,pplay,paprs, &
    3034                                         d_t_bs,d_q_bs,d_qbs_bs,bsfl,bs_fall)
     3026                                        d_t_bsss,d_q_bsss,d_qbs_bsss,bsfl,bs_fall)
    30353027
    30363028     CALL add_phys_tend &
    3037                (du0,dv0,d_t_bs,d_q_bs,dql0,dqi0,d_qbs_bs,paprs,&
    3038                'bs',abortphy,flag_inhib_tend,itap,0)
     3029               (du0,dv0,d_t_bsss,d_q_bsss,dql0,dqi0,d_qbs_bsss,paprs,&
     3030               'bsss',abortphy,flag_inhib_tend,itap,0)
    30393031
    30403032    ENDIF
     
    30793071       ENDDO
    30803072    ENDDO
    3081     IF (check) THEN
    3082        za = qcheck(klon,klev,paprs,q_seri,ql_seri,cell_area)
    3083        WRITE(lunout,*) "avantcon=", za
    3084     ENDIF
    3085     zx_ajustq = .FALSE.
    3086     IF (iflag_con.EQ.2) zx_ajustq=.TRUE.
    3087     IF (zx_ajustq) THEN
    3088        DO i = 1, klon
    3089           z_avant(i) = 0.0
    3090        ENDDO
    3091        DO k = 1, klev
    3092           DO i = 1, klon
    3093              z_avant(i) = z_avant(i) + (q_seri(i,k)+ql_seri(i,k)) &
    3094                   *(paprs(i,k)-paprs(i,k+1))/RG
    3095           ENDDO
    3096        ENDDO
    3097     ENDIF
    30983073
    30993074    ! Calcule de vitesse verticale a partir de flux de masse verticale
     
    34883463       CALL writefield_phy('q_seri',q_seri,nbp_lev)
    34893464    ENDIF
    3490 
    3491     IF (check) THEN
    3492        za = qcheck(klon,klev,paprs,q_seri,ql_seri,cell_area)
    3493        WRITE(lunout,*)"aprescon=", za
    3494        zx_t = 0.0
    3495        za = 0.0
    3496        DO i = 1, klon
    3497           za = za + cell_area(i)/REAL(klon)
    3498           zx_t = zx_t + (rain_con(i)+ &
    3499                snow_con(i))*cell_area(i)/REAL(klon)
    3500        ENDDO
    3501        zx_t = zx_t/za*phys_tstep
    3502        WRITE(lunout,*)"Precip=", zx_t
    3503     ENDIF
    3504     IF (zx_ajustq) THEN
    3505        DO i = 1, klon
    3506           z_apres(i) = 0.0
    3507        ENDDO
    3508        DO k = 1, klev
    3509           DO i = 1, klon
    3510              z_apres(i) = z_apres(i) + (q_seri(i,k)+ql_seri(i,k)) &
    3511                   *(paprs(i,k)-paprs(i,k+1))/RG
    3512           ENDDO
    3513        ENDDO
    3514        DO i = 1, klon
    3515           z_factor(i) = (z_avant(i)-(rain_con(i)+snow_con(i))*phys_tstep) &
    3516                /z_apres(i)
    3517        ENDDO
    3518        DO k = 1, klev
    3519           DO i = 1, klon
    3520              IF (z_factor(i).GT.(1.0+1.0E-08) .OR. &
    3521                   z_factor(i).LT.(1.0-1.0E-08)) THEN
    3522                 q_seri(i,k) = q_seri(i,k) * z_factor(i)
    3523              ENDIF
    3524           ENDDO
    3525        ENDDO
    3526     ENDIF
    3527     zx_ajustq=.FALSE.
    35283465
    35293466    !
     
    39213858
    39223859    CALL lscp(klon,klev,phys_tstep,missing_val,paprs,pplay, &
    3923          t_seri, q_seri,ptconv,ratqs, &
     3860         t_seri, q_seri,qs_ancien,ptconv,ratqs, &
    39243861         d_t_lsc, d_q_lsc, d_ql_lsc, d_qi_lsc, rneb, rneblsvol, &
    3925          pfraclr,pfracld, &
     3862         pfraclr, pfracld, cldfraliq, sigma2_icefracturb, mean_icefracturb, &
    39263863         radocond, picefra, rain_lsc, snow_lsc, &
    39273864         frac_impa, frac_nucl, beta_prec_fisrt, &
    39283865         prfl, psfl, rhcl,  &
    39293866         zqasc, fraca,ztv,zpspsk,ztla,zthl,iflag_cld_th, &
    3930          iflag_ice_thermo, distcltop, temp_cltop, cell_area, &
    3931          cf_seri, rvc_seri, u_seri, v_seri, pbl_eps(:,:,is_ave), &
     3867         iflag_ice_thermo, distcltop, temp_cltop,   &
     3868         pbl_tke(:,:,is_ave), pbl_eps(:,:,is_ave), &
     3869         cell_area, &
     3870         cf_seri, rvc_seri, u_seri, v_seri, &
    39323871         qsub, qissr, qcld, subfra, issrfra, gamma_cond, ratio_qi_qtot, &
    39333872         dcf_sub, dcf_con, dcf_mix, dqi_adj, dqi_sub, dqi_con, dqi_mix, &
     
    40213960       ENDIF
    40223961
    4023     ENDIF
    4024 
    4025     IF (check) THEN
    4026        za = qcheck(klon,klev,paprs,q_seri,ql_seri,cell_area)
    4027        WRITE(lunout,*)"apresilp=", za
    4028        zx_t = 0.0
    4029        za = 0.0
    4030        DO i = 1, klon
    4031           za = za + cell_area(i)/REAL(klon)
    4032           zx_t = zx_t + (rain_lsc(i) &
    4033                + snow_lsc(i))*cell_area(i)/REAL(klon)
    4034        ENDDO
    4035        zx_t = zx_t/za*phys_tstep
    4036        WRITE(lunout,*)"Precip=", zx_t
    40373962    ENDIF
    40383963
     
    44054330                  flag_aerosol, flag_bc_internal_mixture, itap, jD_cur-jD_ref, &
    44064331                  pdtphys, pplay, paprs, t_seri, rhcl, presnivs,  &
    4407                   tr_seri, mass_solu_aero, mass_solu_aero_pi
     4332                  tr_seri, mass_solu_aero, mass_solu_aero_pi, m_allaer
    44084333#else
    44094334                abort_message='You should compile with -rad ecrad if running with iflag_rrtm=2'
     
    46514576               ! Rajoute par OB pour RRTM
    46524577               tau_aero_lw_rrtm, &
    4653                cldtaupirad, &
     4578               cldtaupirad, m_allaer, &
    46544579!              zqsat, flwcrad, fiwcrad, &
    46554580               zqsat, flwc, fiwc, &
     
    47294654                                ! Rajoute par OB pour RRTM
    47304655                     tau_aero_lw_rrtm, &
    4731                      cldtaupi, &
     4656                     cldtaupi, m_allaer, &
    47324657!                    zqsat, flwcrad, fiwcrad, &
    47334658                     zqsat, flwc, fiwc, &
     
    47754700                     tau_aero_sw_rrtm, piz_aero_sw_rrtm, cg_aero_sw_rrtm, &
    47764701                     tau_aero_lw_rrtm, &
    4777                      cldtaupi, &
     4702                     cldtaupi, m_allaer, &
    47784703                     zqsat, flwc, fiwc, &
    47794704                     ref_liq, ref_ice, ref_liq_pi, ref_ice_pi, &
     
    55085433    !--currently flag is turned off
    55095434    !==================================================================
    5510     IF (mass_fixer) THEN
     5435    IF (ok_water_mass_fixer) THEN
    55115436    qql2(:)=0.0
    55125437    DO k = 1, klev
  • LMDZ6/branches/cirrus/libf/phylmd/phystokenc_mod.F90

    r2343 r5202  
    4646! Objet: Ecriture des variables pour transport offline
    4747!
     48!  Note (A Cozic - July 2024): when coupled with inca, offline fields are no
     49!  longer calculated in this routine but directly in the physics code.
    4850!======================================================================
    4951
  • LMDZ6/branches/cirrus/libf/phylmd/radlwsw_m.F90

    r4866 r5202  
    2121       tau_aero_sw_rrtm, piz_aero_sw_rrtm, cg_aero_sw_rrtm,& ! rajoute par OB RRTM
    2222       tau_aero_lw_rrtm, &              ! rajoute par C.Kleinschmitt pour RRTM
    23        cldtaupi, &
     23       cldtaupi, m_allaer, &
    2424       qsat, flwc, fiwc, &
    2525       ref_liq, ref_ice, ref_liq_pi, ref_ice_pi, &
     
    8080    ! Besoin pour ECRAD de pctsrf, zmasq, longitude, altitude
    8181#ifdef CPP_ECRAD
    82     USE phys_local_var_mod, ONLY: rhcl, m_allaer
    8382    USE geometry_mod, ONLY: latitude, longitude
    8483    USE phys_state_var_mod, ONLY: pctsrf
     
    247246    REAL,    INTENT(in)  :: ref_liq_pi(klon,klev) ! cloud droplet radius pre-industrial from newmicro
    248247    REAL,    INTENT(in)  :: ref_ice_pi(klon,klev) ! ice crystal radius   pre-industrial from newmicro
     248    REAL,    INTENT(in)  :: m_allaer(klon,klev,naero_tot) ! mass aero
    249249
    250250    CHARACTER(len=512), INTENT(in) :: namelist_ecrad_file
     
    706706             zsollw0(i)=0.
    707707             zsollwdown(i)=0.
     708             ztoplwad0aero(i) = 0.
     709             ztoplwadaero(i) = 0.
    708710          ENDDO
    709711          ! Old radiation scheme, used for AR4 runs
  • LMDZ6/branches/cirrus/libf/phylmd/surf_land_bucket_mod.F90

    r3974 r5202  
    1616       snow, qsol, agesno, tsoil, &
    1717       qsurf, z0_new, alb1_new, alb2_new, evap, &
    18        fluxsens, fluxlat, tsurf_new, dflux_s, dflux_l)
     18       fluxsens, fluxlat, tsurf_new, dflux_s, dflux_l &
     19#ifdef ISO
     20       ,xtprecip_rain, xtprecip_snow,xtspechum, &
     21       xtsnow, xtsol,xtevap,h1, &
     22       runoff_diag,xtrunoff_diag,Rland_ice &
     23#endif           
     24            )
    1925
    2026    USE limit_read_mod
     
    2834    USE mod_phys_lmdz_para
    2935    USE indice_sol_mod
     36#ifdef ISO
     37    use infotrac_phy, ONLY: ntiso,niso
     38    USE isotopes_mod, ONLY: iso_eau, iso_HDO, iso_O18, iso_O17, &
     39        ridicule_qsol
     40    USE isotopes_routines_mod, ONLY: calcul_iso_surf_ter_vectall
     41#ifdef ISOVERIF
     42    USE isotopes_verif_mod, ONLY: errmax,errmaxrel,iso_verif_noNaN, &
     43        iso_verif_aberrant_o17,iso_verif_egalite_choix,iso_verif_egalite
     44#endif
     45#endif
    3046!****************************************************************************************
    3147! Bucket calculations for surface.
     
    5268    REAL, DIMENSION(klon), INTENT(IN)       :: rugoro
    5369    REAL, DIMENSION(klon), INTENT(IN)       :: swnet, lwnet
     70#ifdef ISO
     71    REAL, DIMENSION(ntiso,klon), INTENT(IN) :: xtprecip_rain, xtprecip_snow
     72    REAL, DIMENSION(ntiso,klon), INTENT(IN) :: xtspechum   
     73#endif
    5474
    5575! In/Output variables
     
    5878    REAL, DIMENSION(klon), INTENT(INOUT)          :: agesno
    5979    REAL, DIMENSION(klon, nsoilmx), INTENT(INOUT) :: tsoil
     80#ifdef ISO
     81    REAL, DIMENSION(niso,klon), INTENT(INOUT)       :: xtsnow,xtsol
     82#endif
    6083
    6184! Output variables
     
    6790    REAL, DIMENSION(klon), INTENT(OUT)       :: tsurf_new
    6891    REAL, DIMENSION(klon), INTENT(OUT)       :: dflux_s, dflux_l     
     92#ifdef ISO
     93    REAL, DIMENSION(ntiso,klon), INTENT(OUT) :: xtevap
     94    REAL, DIMENSION(klon),       INTENT(OUT) :: h1
     95    REAL, DIMENSION(niso,klon),  INTENT(OUT) :: xtrunoff_diag
     96    REAL, DIMENSION(klon),       INTENT(OUT) :: runoff_diag
     97    REAL, DIMENSION(niso,klon),  INTENT(IN)  :: Rland_ice
     98#endif
    6999
    70100! Local variables
     
    78108    REAL, DIMENSION(klon) :: dummy_riverflow,dummy_coastalflow
    79109    INTEGER               :: i
    80 !
    81 !****************************************************************************************
    82 
     110#ifdef ISO
     111    INTEGER               :: ixt
     112    REAL, DIMENSION(niso,klon) :: xtsnow_prec,xtsol_prec
     113    REAL, DIMENSION(klon) :: snow_prec,qsol_prec
     114    REAL, PARAMETER       :: t_coup = 273.15
     115    REAL, DIMENSION(klon) :: fq_fonte_diag
     116    REAL, DIMENSION(klon) :: fqfonte_diag
     117    REAL, DIMENSION(klon) :: snow_evap_diag
     118    REAL, DIMENSION(klon) :: fqcalving_diag
     119    REAL                  :: max_eau_sol_diag 
     120    REAL, DIMENSION(klon) :: run_off_lic_diag
     121    REAL :: coeff_rel_diag
     122#endif
     123!
     124!****************************************************************************************
     125
     126#ifdef ISO
     127#ifdef ISOVERIF
     128        !write(*,*) 'surf_land_bucket 152'
     129        DO i=1,knon
     130          IF (iso_eau > 0) THEN
     131            CALL iso_verif_egalite_choix(precip_snow(i), &
     132     &                                   xtprecip_snow(iso_eau,i),'surf_land_bucket 131', &
     133     &                                   errmax,errmaxrel)
     134            CALL iso_verif_egalite_choix(qsol(i), &
     135     &                                   xtsol(iso_eau,i),'surf_land_bucket 134', &
     136     &                                   errmax,errmaxrel)
     137          ENDIF
     138        ENDDO
     139#endif
     140#ifdef ISOVERIF
     141        DO i=1,knon
     142          DO ixt=1,niso
     143            CALL iso_verif_noNaN(xtsol(ixt,i),'surf_land_mod_bucket 142')
     144          ENDDO !do ixt=1,niso
     145        ENDDO !do i=1,knon
     146        !write(*,*) 'surf_land_bucket 152'
     147#endif
     148#endif
    83149
    84150!
     
    131197         tsurf_new, evap, fluxlat, fluxsens, dflux_s, dflux_l)
    132198   
     199#ifdef ISO
     200   ! verif
     201#ifdef ISOVERIF
     202    !write(*,*) 'surf_land_bucket 211'
     203    DO i=1,knon
     204      IF (iso_eau > 0) THEN
     205        CALL iso_verif_egalite_choix(xtsnow(iso_eau,i), &
     206     &           snow(i),'surf_land_bucket 522', &
     207     &           errmax,errmaxrel)
     208      ENDIF !IF (iso_eau > 0) then
     209    ENDDO !DO i=1,knon
     210#endif
     211   ! end verif
     212#endif         
     213#ifdef ISO
     214    DO i=1,knon
     215      snow_prec(i)=snow(i)
     216      qsol_prec(i)=qsol(i)
     217      DO ixt=1,niso
     218        xtsnow_prec(ixt,i)=xtsnow(ixt,i)
     219        xtsol_prec(ixt,i) =xtsol(ixt,i)
     220      ENDDO !DO ixt=1,niso
     221      ! initialisation:
     222      fqfonte_diag(i)  =0.0
     223      fq_fonte_diag(i) =0.0
     224      snow_evap_diag(i)=0.0
     225    ENDDO !DO i=1,knon
     226#ifdef ISOVERIF
     227    ! write(*,*) 'surf_land_bucket 235'
     228    DO i=1,knon 
     229      IF (iso_eau > 0) THEN
     230        CALL iso_verif_egalite(qsol_prec(i),xtsol_prec(iso_eau,i), &
     231    &                              'surf_land_bucket 141')
     232      ENDIF
     233    ENDDO !DO i=1,knon
     234#endif   
     235#endif   
    133236!
    134237!* Calculate snow height, run_off, age of snow
     
    136239    CALL fonte_neige( knon, is_ter, knindex, dtime, &
    137240         tsurf, precip_rain, precip_snow, &
    138          snow, qsol, tsurf_new, evap)
     241         snow, qsol, tsurf_new, evap &
     242#ifdef ISO   
     243     & ,fq_fonte_diag,fqfonte_diag,snow_evap_diag,fqcalving_diag   &
     244     & ,max_eau_sol_diag,runoff_diag,run_off_lic_diag,coeff_rel_diag   &
     245#endif
     246     &   )
     247
     248#ifdef ISO
     249#ifdef ISOVERIF
     250        DO i=1,knon
     251          DO ixt=1,niso
     252            CALL iso_verif_noNaN(xtsol_prec(ixt,i),'surf_land_burcket 237')
     253          ENDDO
     254        ENDDO
     255#endif
     256#ifdef ISOVERIF
     257        !write(*,*) 'surf_land_bucket 235'
     258        DO i=1,knon
     259          IF (iso_eau > 0) THEN
     260            CALL iso_verif_egalite_choix(qsol_prec(i), &
     261     &                                   xtsol_prec(iso_eau,i),'surf_land_bucket 628', &
     262     &                                   errmax,errmaxrel)
     263            CALL iso_verif_egalite_choix(precip_snow(i), &
     264     &                                   xtprecip_snow(iso_eau,i),'surf_land_bucket 227', &
     265     &                                   errmax,errmaxrel)
     266             ! attention, dans fonte_neige, on modifie snow sans modifier
     267             ! xtsnow
     268             ! c'est fait plus tard dans gestion_neige
     269!            write(*,*) 'surf_land_bucket 287: i=',i
     270!            write(*,*) 'snow(i)=',snow(i)
     271            CALL iso_verif_egalite_choix(xtsnow(iso_eau,i), &
     272     &                                   snow_prec(i),'surf_land_bucket 245', &
     273     &                                   errmax,errmaxrel)
     274          ENDIF 
     275          IF ((iso_O17 > 0).AND.(iso_O18 > 0)) THEN
     276              IF (qsol_prec(i) > ridicule_qsol) THEN
     277                CALL iso_verif_aberrant_o17(xtsol_prec(iso_O17,i)/qsol_prec(i) &
     278     &                                     ,xtsol_prec(iso_O18,i)/qsol_prec(i) &
     279     &                                     ,'surf_land_bucket 642')
     280              ENDIF !IF ((qsol_prec(i) > ridicule_qsol) &
     281          ENDIF !IF ((iso_O17 > 0).AND.(iso_O18 > 0)) THEN
     282        ENDDO  !DO i=1,knon
     283        !write(*,*) 'surf_land_mod 291'
     284        !write(*,*) 'snow_evap_diag(1)=',snow_evap_diag(1)
     285#endif         
     286        CALL calcul_iso_surf_ter_vectall(klon,knon, &
     287     &           evap,snow_evap_diag,snow, &
     288     &           fq_fonte_diag,fqfonte_diag,dtime,precip_rain,xtprecip_rain, &
     289     &           precip_snow,xtprecip_snow, snow_prec,xtsnow_prec, &
     290     &           tsurf_new,xtspechum,pref,spechum,t_coup,u1_lay,v1_lay,p1lay, &
     291     &           qsol,xtsol,qsol_prec,xtsol_prec, &
     292     &           max_eau_sol_diag, &
     293     &           xtevap,xtsnow,h1,runoff_diag,xtrunoff_diag,fqcalving_diag, &
     294     &           knindex,is_ter,run_off_lic_diag,coeff_rel_diag,Rland_ice &
     295     &   )
     296!#ifdef ISOVERIF
     297!        write(*,*) 'surf_land_bucket 303'
     298!#endif
     299#endif
     300
    139301!
    140302!* Calculate the age of snow
  • LMDZ6/branches/cirrus/libf/phylmd/surf_land_mod.F90

    r4526 r5202  
    2020       qsurf, tsurf_new, dflux_s, dflux_l, &
    2121       flux_u1, flux_v1 , &
    22        veget,lai,height)
     22       veget,lai,height &
     23#ifdef ISO
     24       ,xtprecip_rain, xtprecip_snow,xtspechum, &
     25       xtsnow, xtsol,xtevap,h1, &
     26       runoff_diag,xtrunoff_diag,Rland_ice &
     27#endif               
     28               )
    2329
    2430    USE dimphy
     
    5965    USE calcul_fluxs_mod
    6066    USE indice_sol_mod
     67#ifdef ISO
     68    use infotrac_phy, ONLY: ntiso,niso
     69    use isotopes_mod, ONLY: nudge_qsol, iso_eau
     70#ifdef ISOVERIF
     71    use isotopes_verif_mod
     72#endif
     73#endif
     74
    6175    USE print_control_mod, ONLY: lunout
    6276
     
    92106                                                         ! corresponds to previous sollwdown
    93107    REAL, DIMENSION(klon), INTENT(IN)       :: q2m, t2m
    94 
     108#ifdef ISO
     109    REAL, DIMENSION(ntiso,klon), INTENT(IN)       :: xtprecip_rain, xtprecip_snow
     110    REAL, DIMENSION(ntiso,klon), INTENT(IN)       :: xtspechum
     111#endif
    95112! In/Output variables
    96113!****************************************************************************************
     
    98115    REAL, DIMENSION(klon), INTENT(INOUT)          :: agesno
    99116    REAL, DIMENSION(klon, nsoilmx), INTENT(INOUT) :: tsoil
     117#ifdef ISO
     118    REAL, DIMENSION(niso,klon), INTENT(INOUT)    :: xtsnow, xtsol
     119#endif
    100120
    101121! Output variables
     
    116136    REAL, DIMENSION(klon,nvm_lmdz), INTENT(OUT) :: veget,lai
    117137    REAL, DIMENSION(klon,nvm_lmdz), INTENT(OUT) :: height
     138#ifdef ISO
     139    REAL, DIMENSION(ntiso,klon), INTENT(OUT)      :: xtevap
     140    REAL, DIMENSION(klon), INTENT(OUT)      :: h1
     141    REAL, DIMENSION(niso,klon), INTENT(OUT)      :: xtrunoff_diag
     142    REAL, DIMENSION(klon), INTENT(OUT)      :: runoff_diag
     143    REAL, DIMENSION(niso,klon), INTENT(IN)        :: Rland_ice
     144#endif
    118145
    119146! Local variables
     
    132159!albedo SB <<<
    133160
    134 
     161#ifdef ISO       
     162      real, parameter :: t_coup = 273.15
     163      real, dimension(klon) :: fqfonte_diag
     164      real, dimension(klon) :: snow_evap_diag
     165      real, dimension(klon) :: fqcalving_diag
     166      integer :: ixt
     167#endif
    135168!****************************************************************************************
    136169!Total solid precip
     
    142175ENDIF
    143176!****************************************************************************************
     177#ifdef ISO
     178#ifdef ISOVERIF
     179!        write(*,*) 'surf_land_mod 162'
     180        do i=1,knon
     181          if (iso_eau.gt.0) then
     182            call iso_verif_egalite_choix(precip_snow(i), &
     183     &          xtprecip_snow(iso_eau,i),'surf_land_mod 129', &
     184     &          errmax,errmaxrel)
     185            call iso_verif_egalite_choix(qsol(i), &
     186     &          xtsol(iso_eau,i),'surf_land_mod 139', &
     187     &          errmax,errmaxrel)
     188          endif 
     189        enddo
     190#endif
     191#ifdef ISOVERIF
     192!       write(*,*) 'surf_land 169: ok_veget=',ok_veget
     193        do i=1,knon
     194         do ixt=1,ntiso
     195           call iso_verif_noNaN(xtprecip_snow(ixt,i),'surf_land 146')
     196         enddo
     197        enddo
     198#endif
     199#endif
    144200
    145201
     
    172228       END DO
    173229
     230#ifdef ISO
     231      CALL abort_gcm('surf_land_mod 220','isos pas prevus dans orchidee',1)
     232#endif
    174233       ! temporary for keeping same results using lwdown_m instead of lwdown
    175234       CALL surf_land_orchidee(itime, dtime, date0, knon, &
     
    183242            tsol_rad, tsurf_new, alb1_new, alb2_new, &
    184243            emis_new, z0m, z0h, qsurf, &
    185             veget, lai, height)       
     244            veget, lai, height &
     245!#ifdef ISO
     246!            , xtprecip_rain, xtprecip_snow, xtspechum, xtevap &
     247!#endif
     248            )                 
     249
     250#ifdef ISO
     251#ifdef ISOVERIF
     252     write(*,*) 'surf_land 193: apres surf_land_orchidee'   
     253     do i=1,knon
     254        if (iso_eau.gt.0) then
     255             call iso_verif_egalite_choix(xtevap(iso_eau,i),evap(i), &
     256    &            'surf_land 197',errmax,errmaxrel)
     257        endif !if (iso_eau.gt.0) then     
     258      enddo !do i=1,knon 
     259#endif
     260#endif
    186261
    187262!* Add contribution of relief to surface roughness
     
    196271!
    197272!****************************************************************************************
     273#ifdef ISO
     274#ifdef ISOVERIF
     275!       write(*,*) 'surf_land 247'
     276        call iso_verif_egalite_vect1D( &
     277     &           xtsnow,snow,'surf_land_mod 207',niso,klon)
     278#endif
     279#endif
     280
     281#ifdef ISO
     282        if (nudge_qsol.eq.1) then
     283          call surf_land_nudge_qsol(knon,rlat,rlon,qsol,xtsol,knindex)
     284        endif
     285        !write(*,*) 'surf_land 258'
     286#endif
    198287       CALL surf_land_bucket(itime, jour, knon, knindex, debut, dtime,&
    199288            tsurf, p1lay, cdragh, precip_rain, precip_totsnow, temp_air, &
     
    202291            snow, qsol, agesno, tsoil, &
    203292            qsurf, z0m, alb1_new, alb2_new, evap, &
    204             fluxsens, fluxlat, tsurf_new, dflux_s, dflux_l)
     293            fluxsens, fluxlat, tsurf_new, dflux_s, dflux_l &
     294#ifdef ISO
     295            ,xtprecip_rain, xtprecip_snow,xtspechum, &
     296            xtsnow, xtsol,xtevap,h1, &
     297     &      runoff_diag, xtrunoff_diag,Rland_ice &
     298#endif           
     299     &       )
    205300        z0h(1:knon)=z0m(1:knon) ! En attendant mieux
    206301
     
    224319         p1lay, temp_air, &
    225320         flux_u1, flux_v1)
     321
     322#ifdef ISO
     323#ifdef ISOVERIF
     324!     write(*,*) 'surf_land 237: sortie'   
     325      DO i=1,knon
     326        IF (iso_eau >= 0) THEN
     327             call iso_verif_egalite_choix(xtsnow(iso_eau,i),snow(i), &
     328    &            'surf_land 241',errmax,errmaxrel)
     329        ENDIF !if (iso_eau.gt.0) then     
     330      ENDDO !do i=1,knon 
     331#endif
     332#endif
    226333
    227334!albedo SB >>>
     
    248355   
    249356  END SUBROUTINE surf_land
     357
     358
     359#ifdef ISO
     360  SUBROUTINE surf_land_nudge_qsol(knon,rlat,rlon,qsol,xtsol,knindex)
     361
     362    USE dimphy   
     363    USE infotrac_phy, ONLY: niso
     364    USE isotopes_mod, ONLY: region_nudge_qsol   
     365    INTEGER, INTENT(IN)                       :: knon         
     366    REAL, DIMENSION(klon), INTENT(IN)         :: rlon, rlat
     367    REAL, DIMENSION(klon), INTENT(INOUT)      :: qsol
     368    INTEGER, DIMENSION(klon), INTENT(IN)      :: knindex   
     369    REAL, DIMENSION(niso,klon), INTENT(INOUT) :: xtsol
     370    REAL :: lat_min_nudge_qsol,lat_max_nudge_qsol
     371    REAL :: lon_min_nudge_qsol,lon_max_nudge_qsol
     372    INTEGER :: i,ixt
     373    REAL :: qsol_new
     374
     375    IF (region_nudge_qsol == 1) THEN
     376        ! Aamzonie du Sud
     377        lat_min_nudge_qsol=-15.0
     378        lat_max_nudge_qsol=-5.0
     379        lon_min_nudge_qsol=-70.0
     380        lon_max_nudge_qsol=-50.0
     381    ELSE IF (region_nudge_qsol == 2) THEN
     382        ! Aamzonie du Nord
     383        lat_min_nudge_qsol=-5.0
     384        lat_max_nudge_qsol=5.0
     385        lon_min_nudge_qsol=-70.0
     386        lon_max_nudge_qsol=-50.0
     387    ELSE
     388        WRITE(*,*) 'surf_land 298: cas pas prevu'
     389        WRITE(*,*) 'region_nudge_qsol=',region_nudge_qsol
     390        stop
     391    ENDIF
     392
     393!    write(*,*) 'surf_land 314: knon=',knon
     394!    write(*,*) 'rlat=',rlat
     395!    write(*,*) 'rlon=',rlon
     396!    write(*,*) 'region_nudge_qsol=',region_nudge_qsol
     397
     398    DO i=1,knon
     399      IF ((rlat(knindex(i)) >= lat_min_nudge_qsol).and. &
     400  &       (rlat(knindex(i)) <= lat_max_nudge_qsol).and. &
     401  &       (rlon(knindex(i)) >= lon_min_nudge_qsol).and. &
     402  &       (rlon(knindex(i)) <= lon_max_nudge_qsol)) THEN
     403!        write(*,*) 'surf_land 324: bon domaine: rlat,rlon,qsol=', &
     404!  &             rlat(knindex(i)),rlon(knindex(i)),qsol(knindex(i))
     405        qsol_new=qsol(i)
     406        IF (region_nudge_qsol == 1) THEN   
     407           qsol_new=max(qsol(i),50.0)   
     408        ELSE IF (region_nudge_qsol == 2) THEN     
     409           qsol_new=max(qsol(i),120.0)
     410        ELSE !if (region_nudge_qsol.eq.1) then
     411           WRITE(*,*) 'surf_land 317: cas pas prevu'
     412           WRITE(*,*) 'region_nudge_qsol=',region_nudge_qsol
     413           STOP
     414        ENDIF !if (region_nudge_qsol.eq.1) then
     415        IF (qsol(i) > 0.0) THEN
     416           DO ixt=1,niso
     417              xtsol(ixt,i)=xtsol(ixt,i)*qsol_new/qsol(i)
     418           ENDDO
     419        ELSE !IF (qsol(i) > 0.0) THEN
     420           DO ixt=1,niso
     421             xtsol(ixt,i)=0.0
     422           ENDDO
     423        ENDIF !IF (qsol(i) > 0.0) THEN
     424        qsol(i)=qsol_new
     425        WRITE(*,*) 'surf_land 346: qsol_new=',qsol(i)     
     426     ENDIF ! if ((rlat(i).ge.lat_min_nudge_qsol).and.
     427  ENDDO !DO i=1,knon
     428
     429  END SUBROUTINE surf_land_nudge_qsol
     430#endif
     431
    250432!
    251433!****************************************************************************************
  • LMDZ6/branches/cirrus/libf/phylmd/surf_landice_mod.F90

    r4916 r5202  
    2323       snowhgt, qsnow, to_ice, sissnow, &
    2424       alb3, runoff, &
    25        flux_u1, flux_v1)
     25       flux_u1, flux_v1 &
     26#ifdef ISO
     27         &      ,xtprecip_rain, xtprecip_snow,xtspechum,Rland_ice &
     28         &      ,xtsnow,xtsol,xtevap &
     29#endif               
     30           &    )
    2631
    2732    USE dimphy
     
    3338    USE phys_local_var_mod, ONLY : zxrhoslic, zxustartlic, zxqsaltlic
    3439    USE phys_output_var_mod, ONLY : snow_o,zfra_o
     40#ifdef ISO   
     41    USE fonte_neige_mod,  ONLY : xtrun_off_lic
     42    USE infotrac_phy,     ONLY : ntiso,niso
     43    USE isotopes_routines_mod, ONLY: calcul_iso_surf_lic_vectall
     44#ifdef ISOVERIF
     45    USE isotopes_mod, ONLY: iso_eau,ridicule
     46    USE isotopes_verif_mod
     47#endif
     48#endif
     49 
    3550!FC
    3651    USE ioipsl_getin_p_mod, ONLY : getin_p
     
    6883    REAL, DIMENSION(klon), INTENT(IN)             :: rugoro
    6984    REAL, DIMENSION(klon,nbsrf), INTENT(IN)       :: pctsrf
     85#ifdef ISO
     86    REAL, DIMENSION(ntiso,klon), INTENT(IN)       :: xtprecip_rain, xtprecip_snow
     87    REAL, DIMENSION(ntiso,klon), INTENT(IN)       :: xtspechum
     88#endif
     89
    7090
    7191    LOGICAL,  INTENT(IN)                          :: debut   !true if first step
     
    85105    REAL, DIMENSION(klon), INTENT(INOUT)          :: agesno
    86106    REAL, DIMENSION(klon, nsoilmx), INTENT(INOUT) :: tsoil
     107#ifdef ISO
     108    REAL, DIMENSION(niso,klon), INTENT(INOUT)     :: xtsnow, xtsol
     109    REAL, DIMENSION(niso,klon), INTENT(INOUT)     :: Rland_ice
     110#endif
     111
    87112
    88113! Output variables
     
    108133    REAL, DIMENSION(klon), INTENT(OUT)           :: sissnow
    109134    REAL, DIMENSION(klon), INTENT(OUT)           :: runoff  !Land ice runoff
     135#ifdef ISO
     136    REAL, DIMENSION(ntiso,klon), INTENT(OUT)     :: xtevap     
     137!    real, DIMENSION(niso,klon) :: xtrun_off_lic_0_diag ! est une variable globale de
     138!    fonte_neige
     139#endif
    110140 
    111141
     
    120150    REAL, DIMENSION(klon)    :: fqfonte,ffonte
    121151    REAL, DIMENSION(klon)    :: run_off_lic_frac
     152#ifdef ISO       
     153    REAL, PARAMETER          :: t_coup = 273.15
     154    REAL, DIMENSION(klon)    :: fqfonte_diag
     155    REAL, DIMENSION(klon)    :: fq_fonte_diag
     156    REAL, DIMENSION(klon)    ::  snow_evap_diag
     157    REAL, DIMENSION(klon)    ::  fqcalving_diag
     158    REAL max_eau_sol_diag 
     159    REAL, DIMENSION(klon)    ::  runoff_diag
     160    REAL, DIMENSION(klon)    ::    run_off_lic_diag
     161    REAL                     ::  coeff_rel_diag
     162    INTEGER                  :: ixt
     163    REAL, DIMENSION(niso,klon) :: xtsnow_prec,xtsol_prec
     164    REAL, DIMENSION(klon) :: snow_prec,qsol_prec
     165!    real, DIMENSION(klon) :: run_off_lic_0_diag
     166#endif
     167
     168
    122169    REAL, DIMENSION(klon)    :: emis_new                  !Emissivity
    123170    REAL, DIMENSION(klon)    :: swdown,lwdown
     
    146193    REAL, DIMENSION(klon)  :: fluxbs_1, fluxbs_2, bsweight_fresh
    147194    LOGICAL, DIMENSION(klon) :: ok_remaining_freshsnow
     195    REAL  :: ta1, ta2, ta3, z01, z02, z03, coefa, coefb, coefc, coefd
     196
    148197
    149198! End definition
     
    161210!FC firtscall initializations
    162211!******************************************************************************************
     212#ifdef ISO
     213#ifdef ISOVERIF
     214!     write(*,*) 'surf_land_ice 1499'   
     215  DO i=1,knon
     216    IF (iso_eau > 0) THEN
     217      CALL iso_verif_egalite_choix(xtsnow(iso_eau,i),snow(i), &
     218    &                              'surf_land_ice 126',errmax,errmaxrel)
     219    ENDIF !IF (iso_eau > 0) THEN     
     220  ENDDO !DO i=1,knon 
     221#endif
     222#endif
     223
    163224  IF (firstcall) THEN
    164225  alb_vis_sno_lic=0.77
     
    200261!****************************************************************************************
    201262#ifdef CPP_INLANDSIS
     263
     264#ifdef ISO
     265        CALL abort_gcm('surf_landice 235','isotopes pas dans INLANDSIS',1)
     266#endif
    202267
    203268        debut_is=debut
     
    321386         tsurf_new, evap, fluxlat, fluxsens, dflux_s, dflux_l)
    322387
     388#ifdef ISO
     389#ifdef ISOVERIF
     390     !write(*,*) 'surf_land_ice 1499'   
     391     DO i=1,knon
     392       IF (iso_eau > 0) THEN
     393         IF (snow(i) > ridicule) THEN
     394           CALL iso_verif_egalite_choix(xtsnow(iso_eau,i),snow(i), &
     395    &                                   'surf_land_ice 1151',errmax,errmaxrel)
     396         ENDIF !IF ((snow(i) > ridicule)) THEN
     397       ENDIF !IF (iso_eau > 0) THEN
     398     ENDDO !DO i=1,knon 
     399#endif
     400
     401    DO i=1,knon
     402      snow_prec(i)=snow(i)
     403      DO ixt=1,niso
     404        xtsnow_prec(ixt,i)=xtsnow(ixt,i)
     405      ENDDO !DO ixt=1,niso
     406      ! initialisation:
     407      fq_fonte_diag(i)=0.0
     408      fqfonte_diag(i)=0.0
     409      snow_evap_diag(i)=0.0
     410    ENDDO !DO i=1,knon
     411#endif         
     412
    323413    CALL calcul_flux_wind(knon, dtime, &
    324414         u0, v0, u1, v1, gustiness, cdragm, &
     
    350440!
    351441!****************************************************************************************
    352     z0m = z0m_landice
    353     z0h = z0h_landice
    354     !z0m = SQRT(z0m**2+rugoro**2)
    355 
     442
     443if (z0m_landice .GT. 0.) then
     444    z0m(1:knon) = z0m_landice
     445    z0h(1:knon) = z0h_landice
     446else
     447    ! parameterization of z0=f(T) following measurements in Adelie Land by Amory et al 2018
     448    coefa = 0.1658 !0.1862 !Ant
     449    coefb = -50.3869 !-55.7718 !Ant
     450    ta1 = 253.15 !255. Ant
     451    ta2 = 273.15
     452    ta3 = 273.15+3
     453    z01 = exp(coefa*ta1 + coefb) !~0.2 ! ~0.25 mm
     454    z02 = exp(coefa*ta2 + coefb) !~6  !~7 mm
     455    z03 = z01
     456    coefc = log(z03/z02)/(ta3-ta2)
     457    coefd = log(z03)-coefc*ta3
     458    do j=1,knon
     459      if (temp_air(j) .lt. ta1) then
     460        z0m(j) = z01
     461      else if (temp_air(j).ge.ta1 .and. temp_air(j).lt.ta2) then
     462        z0m(j) = exp(coefa*temp_air(j) + coefb)
     463      else if (temp_air(j).ge.ta2 .and. temp_air(j).lt.ta3) then
     464        ! if st > 0, melting induce smooth surface
     465        z0m(j) = exp(coefc*temp_air(j) + coefd)
     466      else
     467        z0m(j) = z03
     468      endif
     469      z0h(j)=z0m(j)
     470    enddo
     471
     472endif   
     473 
    356474
    357475!****************************************************************************************
     
    366484   if (ok_bs) then
    367485       fluxbs(:)=0.
    368        do j=1,klon
     486       do j=1,knon
    369487          ws1(j)=(u1(j)**2+v1(j)**2)**0.5
    370488          ustar(j)=(cdragm(j)*(u1(j)**2+v1(j)**2))**0.5
     
    493611 
    494612    CALL fonte_neige(knon, is_lic, knindex, dtime, &
    495          tsurf, precip_rain, precip_totsnow,  &
    496          snow, qsol, tsurf_new, evap_totsnow)
     613         tsurf, precip_rain, precip_totsnow, &
     614         snow, qsol, tsurf_new, evap_totsnow &
     615#ifdef ISO   
     616     &  ,fq_fonte_diag,fqfonte_diag,snow_evap_diag,fqcalving_diag     &
     617     &  ,max_eau_sol_diag,runoff_diag,run_off_lic_diag,coeff_rel_diag &
     618#endif
     619     &   )
     620
     621
     622#ifdef ISO
     623#ifdef ISOVERIF
     624    DO i=1,knon 
     625      IF (iso_eau > 0) THEN 
     626        CALL iso_verif_egalite_choix(Rland_ice(iso_eau,i),1.0, &
     627     &                               'surf_landice_mod 217',errmax,errmaxrel)
     628      ENDIF !IF (iso_eau > 0) THEN
     629    ENDDO !DO i=1,knon
     630#endif
     631
     632    CALL calcul_iso_surf_lic_vectall(klon,knon, &
     633     &    evap,snow_evap_diag,Tsurf_new,snow, &
     634     &    fq_fonte_diag,fqfonte_diag,dtime,t_coup, &
     635     &    precip_snow,xtprecip_snow,precip_rain,xtprecip_rain, snow_prec,xtsnow_prec, &
     636     &    xtspechum,spechum,ps,Rland_ice, &
     637     &    xtevap,xtsnow,fqcalving_diag, &
     638     &    knindex,is_lic,run_off_lic_diag,coeff_rel_diag &
     639     &   )
     640
     641!        call fonte_neige_export_xtrun_off_lic_0(knon,xtrun_off_lic_0_diag)
     642
     643#endif
    497644   
    498    
    499645    WHERE (snow(1 : knon) .LT. 0.0001) agesno(1 : knon) = 0.                                         
    500646    zfra(1:knon) = MAX(0.0,MIN(1.0,snow(1:knon)/(snow(1:knon)+10.0))) 
  • LMDZ6/branches/cirrus/libf/phylmd/surf_ocean_mod.F90

    r4526 r5202  
    2121       tsurf_new, dflux_s, dflux_l, lmt_bils, &
    2222       flux_u1, flux_v1, delta_sst, delta_sal, ds_ns, dt_ns, dter, dser, &
    23        dt_ds, tkt, tks, taur, sss)
     23       dt_ds, tkt, tks, taur, sss &
     24#ifdef ISO
     25        &       ,xtprecip_rain, xtprecip_snow,xtspechum,Roce, &
     26        &       xtsnow,xtevap,h1 &
     27#endif               
     28        &       )
    2429
    2530    use albedo, only: alboc, alboc_cd
     
    3136    USE ocean_cpl_mod, ONLY    : ocean_cpl_noice
    3237    USE indice_sol_mod, ONLY : nbsrf, is_oce
     38#ifdef ISO
     39    USE infotrac_phy, ONLY : ntraciso=>ntiso,niso
     40#ifdef ISOVERIF
     41    USE isotopes_mod, ONLY: iso_eau,ridicule
     42    USE isotopes_verif_mod
     43#endif
     44#endif
    3345    USE limit_read_mod
    34     use config_ocean_skin_m, only: activate_ocean_skin
     46    USE config_ocean_skin_m, ONLY: activate_ocean_skin
    3547    !
    3648    ! This subroutine will make a call to ocean_XXX_noice according to the ocean mode (force,
     
    6880    REAL, DIMENSION(klon), INTENT(IN)        :: rugoro
    6981    REAL, DIMENSION(klon,nbsrf), INTENT(IN)  :: pctsrf
     82#ifdef ISO
     83    REAL, DIMENSION(ntraciso,klon), INTENT(IN) :: xtprecip_rain, xtprecip_snow
     84    REAL, DIMENSION(ntraciso,klon), INTENT(IN) :: xtspechum
     85#endif
    7086
    7187    ! In/Output variables
     
    7591    REAL, DIMENSION(klon), INTENT(INOUT)     :: agesno
    7692    REAL, DIMENSION(klon), INTENT(inOUT)     :: z0h
     93#ifdef ISO
     94    REAL, DIMENSION(niso,klon), INTENT(IN)   :: xtsnow
     95    REAL, DIMENSION(niso,klon), INTENT(INOUT):: Roce 
     96#endif
    7797
    7898    REAL, intent(inout):: delta_sst(:) ! (knon)
     
    136156    ! size klon because of the coupling machinery.)
    137157
     158#ifdef ISO
     159    REAL, DIMENSION(ntraciso,klon), INTENT(out) :: xtevap ! isotopes in surface evaporation flux
     160    REAL, DIMENSION(klon), INTENT(out)          :: h1 ! just a diagnostic, not useful for the simulation   
     161#endif
     162
    138163    ! Local variables
    139164    !*************************************************************************
     
    146171    REAL, DIMENSION(klon) :: precip_totsnow
    147172    CHARACTER(len=20),PARAMETER :: modname="surf_ocean"
    148     real rhoa(knon) ! density of moist air  (kg / m3)
     173    REAL rhoa(knon) ! density of moist air  (kg / m3)
    149174    REAL sens_prec_liq(knon)
    150175
    151176    REAL t_int(knon) ! ocean-air interface temperature, in K
    152     real s_int(knon) ! ocean-air interface salinity, in ppt
     177    REAL s_int(knon) ! ocean-air interface salinity, in ppt
    153178
    154179    !**************************************************************************
    155180
     181#ifdef ISO
     182#ifdef ISOVERIF
     183    DO i = 1, knon
     184      IF (iso_eau > 0) THEN         
     185        CALL iso_verif_egalite_choix(xtspechum(iso_eau,i), &
     186     &          spechum(i),'surf_ocean_mod 117', &
     187     &          errmax,errmaxrel)         
     188        CALL iso_verif_egalite_choix(xtsnow(iso_eau,i), &
     189     &          snow(i),'surf_ocean_mod 127', &
     190     &          errmax,errmaxrel)
     191      ENDIF !IF (iso_eau > 0) then
     192    ENDDO !DO i=1,klon
     193#endif     
     194#endif
    156195
    157196    !******************************************************************************
     
    230269            radsol, snow, agesno, &
    231270            qsurf, evap, fluxsens, fluxlat, flux_u1, flux_v1, &
    232             tsurf_new, dflux_s, dflux_l, sens_prec_liq, rhoa)
     271            tsurf_new, dflux_s, dflux_l, sens_prec_liq, rhoa &
     272#ifdef ISO
     273            ,xtprecip_rain, xtprecip_snow, xtspechum,Roce,rlat, &
     274            xtsnow,xtevap,h1 & 
     275#endif           
     276            )
    233277    END SELECT
    234278
  • LMDZ6/branches/cirrus/libf/phylmd/surf_seaice_mod.F90

    r3815 r5202  
    2121       z0m, z0h, SFRWL, alb_dir_new, alb_dif_new, evap, fluxsens, fluxlat, & 
    2222       tsurf_new, dflux_s, dflux_l, &
    23        flux_u1, flux_v1)
     23       flux_u1, flux_v1 &
     24#ifdef ISO
     25         &      ,xtprecip_rain, xtprecip_snow,xtspechum,Roce, &
     26         &      xtsnow,xtsol,xtevap,Rland_ice &
     27#endif               
     28         &      )
    2429
    2530  USE dimphy
     
    2934  USE ocean_slab_mod, ONLY   : ocean_slab_ice
    3035  USE indice_sol_mod
     36#ifdef ISO
     37  USE infotrac_phy, ONLY : ntiso,niso
     38#endif
    3139
    3240!
     
    6270    REAL, DIMENSION(klon), INTENT(IN)        :: u1, v1, gustiness
    6371    REAL, DIMENSION(klon,nbsrf), INTENT(IN)  :: pctsrf
     72#ifdef ISO
     73    REAL, DIMENSION(ntiso,klon), INTENT(IN)  :: xtprecip_rain, xtprecip_snow
     74    REAL, DIMENSION(klon),       INTENT(IN)  :: xtspechum
     75    REAL, DIMENSION(niso,klon),  INTENT(IN)  :: Roce
     76    REAL, DIMENSION(niso,klon),  INTENT(IN)  :: Rland_ice
     77#endif
    6478
    6579! In/Output arguments
     
    6882    REAL, DIMENSION(klon), INTENT(INOUT)          :: agesno
    6983    REAL, DIMENSION(klon, nsoilmx), INTENT(INOUT) :: tsoil
     84#ifdef ISO
     85    REAL, DIMENSION(niso,klon), INTENT(INOUT)     :: xtsnow 
     86    REAL, DIMENSION(niso,klon), INTENT(IN)        :: xtsol
     87#endif
    7088
    7189! Output arguments
     
    82100    REAL, DIMENSION(klon), INTENT(OUT)       :: dflux_s, dflux_l     
    83101    REAL, DIMENSION(klon), INTENT(OUT)       :: flux_u1, flux_v1
     102#ifdef ISO
     103    REAL, DIMENSION(ntiso,klon), INTENT(OUT) :: xtevap
     104#endif
    84105
    85106! Local arguments
    86107!****************************************************************************************
    87108    REAL, DIMENSION(klon)  :: radsol
     109#ifdef ISO
     110#ifdef ISOVERIF
     111    INTEGER :: j
     112#endif
     113#endif
    88114
    89115!albedo SB >>>
     
    145171            radsol, snow, qsol, agesno, tsoil, &
    146172            qsurf, alb1_new, alb2_new, evap, fluxsens, fluxlat, flux_u1, flux_v1, &
    147             tsurf_new, dflux_s, dflux_l, rhoa)
     173            tsurf_new, dflux_s, dflux_l, rhoa &
     174#ifdef ISO
     175            ,xtprecip_rain, xtprecip_snow, xtspechum,Roce, &
     176            xtsnow, xtsol,xtevap,Rland_ice & 
     177#endif           
     178            )
    148179
    149180    END IF
  • LMDZ6/branches/cirrus/libf/phylmdiso/add_phys_tend_mod.F90

    r4523 r5202  
    957957      bilh_bnd = (-(rcw-rcpd)*t_seri(1,1) + rlvtt) * rain_lsc(1) &
    958958    &         + (-(rcs-rcpd)*t_seri(1,1) + rlstt) * snow_lsc(1)
    959   CASE("bs") param
     959  CASE("bsss") param
    960960      bilq_bnd = - bs_fall(1)
    961961      bilh_bnd = (-(rcs-rcpd)*t_seri(1,1) + rlstt) * bs_fall(1)
  • LMDZ6/branches/cirrus/libf/phylmdiso/add_wake_tend.F90

    r4143 r5202  
    1 SUBROUTINE add_wake_tend(zddeltat, zddeltaq, zds, zddensaw, zddensw, zoccur, text, abortphy &
     1SUBROUTINE add_wake_tend(zddeltat, zddeltaq, zds, zdas, zddensw, zddensaw, zoccur, text, abortphy &
    22#ifdef ISO
    33        , zddeltaxt &
     
    1313
    1414USE dimphy, ONLY: klon, klev
    15 USE phys_state_var_mod, ONLY: wake_deltat, wake_deltaq, wake_s, &
    16                               awake_dens, wake_dens
     15USE phys_state_var_mod, ONLY: wake_deltat, wake_deltaq, wake_s, awake_s, &
     16                              wake_dens, awake_dens
    1717
    1818USE print_control_mod, ONLY: prt_level
     
    2626!------------
    2727  REAL, DIMENSION(klon, klev),   INTENT (IN)         :: zddeltat, zddeltaq
    28   REAL, DIMENSION(klon),         INTENT (IN)         :: zds, zddensaw, zddensw
     28  REAL, DIMENSION(klon),         INTENT (IN)         :: zds, zdas, zddensw, zddensaw
    2929  INTEGER, DIMENSION(klon),      INTENT (IN)         :: zoccur
    3030  CHARACTER*(*),                 INTENT (IN)         :: text
     
    7979           IF (zoccur(i) .GE. 1) THEN
    8080             wake_s(i)     = wake_s(i)    + zds(i)
     81             awake_s(i)    = awake_s(i)    + zdas(i)
     82             wake_dens(i)  = wake_dens(i) + zddensw(i)
    8183             awake_dens(i) = awake_dens(i) + zddensaw(i)
    82              wake_dens(i)  = wake_dens(i) + zddensw(i)
    8384           ELSE
    8485             wake_s(i)     = 0.
     86             awake_s(i)    = 0.
     87             wake_dens(i)  = 0.
    8588             awake_dens(i) = 0.
    86              wake_dens(i)  = 0.
    8789           ENDIF   ! (zoccur(i) .GE. 1)
    8890         END DO
  • LMDZ6/branches/cirrus/libf/phylmdiso/isotopes_mod.F90

    r4491 r5202  
    2020
    2121   !--- Variables not depending on isotopes
    22    REAL,    SAVE :: pxtmelt, pxtice, pxtmin, pxtmax
    23 !$OMP THREADPRIVATE(pxtmelt, pxtice, pxtmin, pxtmax)
    24    REAL,    SAVE :: tdifexp, tv0cin, thumxt1
    25 !$OMP THREADPRIVATE(tdifexp, tv0cin, thumxt1)
     22   REAL,    SAVE :: thumxt1
     23   !$OMP THREADPRIVATE(thumxt1)
    2624   INTEGER, SAVE :: ntot
    2725!$OMP THREADPRIVATE(ntot)
     
    3028   REAL,    SAVE :: P_veg
    3129!$OMP THREADPRIVATE(P_veg)
    32    REAL,    SAVE :: musi, lambda_sursat
    33 !$OMP THREADPRIVATE(musi, lambda_sursat)
    34    REAL,    SAVE :: Kd
    35 !$OMP THREADPRIVATE(Kd)
    36    REAL,    SAVE :: rh_cste_surf_cond, T_cste_surf_cond
    37 !$OMP THREADPRIVATE(rh_cste_surf_cond, T_cste_surf_cond)
     30   REAL,    SAVE :: lambda_sursat
     31!$OMP THREADPRIVATE(lambda_sursat)
    3832   LOGICAL, SAVE :: bidouille_anti_divergence    ! T: regularly, xteau <- q to avoid slow drifts
    3933!$OMP THREADPRIVATE(bidouille_anti_divergence)
     
    5448   REAL,    SAVE :: sstlatcrit, dsstlatcrit
    5549!$OMP THREADPRIVATE(sstlatcrit, dsstlatcrit)
    56    REAL,    SAVE :: deltaO18_oce
    57 !$OMP THREADPRIVATE(deltaO18_oce)
    5850   INTEGER, SAVE :: albedo_prescrit              ! 0: default ; 1: constant albedo
    5951!$OMP THREADPRIVATE(albedo_prescrit)
     
    8880   REAL,    SAVE :: fac_modif_evaoce
    8981!$OMP THREADPRIVATE(fac_modif_evaoce)
     82   REAL,    SAVE :: deltaO18_oce
     83!$OMP THREADPRIVATE(deltaO18_oce)
    9084   INTEGER, SAVE :: ok_bidouille_wake
    9185!$OMP THREADPRIVATE(ok_bidouille_wake)
     
    106100                    alpha_liq_sol, Rdefault, Rmethox
    107101!$OMP THREADPRIVATE(alpha_liq_sol, Rdefault, Rmethox)
    108    REAL, SAVE ::    fac_coeff_eq17_liq, fac_coeff_eq17_ice
    109 !$OMP THREADPRIVATE(fac_coeff_eq17_liq, fac_coeff_eq17_ice)
     102!   REAL, SAVE ::    fac_coeff_eq17_liq, fac_coeff_eq17_ice
     103!!$OMP THREADPRIVATE(fac_coeff_eq17_liq, fac_coeff_eq17_ice)
     104
     105   !--- H2[18]O reference
     106   REAL, PARAMETER :: fac_enrichoce18=0.0005
     107   REAL, PARAMETER :: alpha_liq_sol_O18=1.00291
     108   REAL, PARAMETER :: talph1_O18=1137.
     109   REAL, PARAMETER :: talph2_O18=-0.4156
     110   REAL, PARAMETER :: talph3_O18=-2.0667E-3
     111   REAL, PARAMETER :: talps1_O18=11.839
     112   REAL, PARAMETER :: talps2_O18=-0.028244
     113   REAL, PARAMETER :: tdifrel_O18=1./0.9723
     114   REAL, PARAMETER :: tkcin0_O18=0.006
     115   REAL, PARAMETER :: tkcin1_O18=0.000285
     116   REAL, PARAMETER :: tkcin2_O18=0.00082
     117   REAL, PARAMETER :: fac_coeff_eq17_liq=0.529
     118   REAL, PARAMETER :: fac_coeff_eq17_ice=0.529
     119
     120   !---- Parameters that do not depend on the nature of water isotopes:
     121   REAL, PARAMETER :: pxtmelt = 273.15 ! temperature at which ice formation starts
     122   REAL, PARAMETER :: pxtice  = 273.15-10.0 ! -- temperature at which all condensate is ice:
     123   REAL, PARAMETER :: pxtmin = 273.15 - 120.0   ! On ne calcule qu'au dessus de -120°C
     124   REAL, PARAMETER :: pxtmax = 273.15 +  60.0   ! On ne calcule qu'au dessus de +60°C
     125   REAL, PARAMETER :: tdifexp = 0.58 ! -- a constant for alpha_eff for equilibrium below cloud base:
     126   REAL, PARAMETER :: tv0cin  = 7.0 ! wind threshold (m/s) for smooth/rough regime (Merlivat and Jouzel 1979)
     127   REAL, PARAMETER :: musi=1.0  ! facteurs lambda et mu dans Si=musi-lambda*T
     128   REAL, PARAMETER :: Kd=2.5e-9 ! m2/s ! diffusion dans le sol
     129   REAL, PARAMETER :: rh_cste_surf_cond = 0.6 ! cas où cste_surf_cond: on met rhs ou/et Ts cste pour voir
     130   REAL, PARAMETER :: T_cste_surf_cond = 288.0
     131
    110132
    111133   !--- Negligible lower thresholds: no need to check for absurd values under these lower limits
     
    140162   INTEGER :: ixt
    141163
    142    !--- H2[18]O reference
    143    REAL :: fac_enrichoce18, alpha_liq_sol_O18, &
    144            talph1_O18, talph2_O18, talph3_O18, talps1_O18, talps2_O18, &
    145            tkcin0_O18, tkcin1_O18, tkcin2_O18, tdifrel_O18 
    146 
     164 
    147165   !--- For H2[17]O
    148166   REAL    :: fac_kcin, pente_MWL
     
    152170   LOGICAL, PARAMETER ::   ok_nocinsat = .FALSE. ! if T: no sursaturation effect for ice
    153171   LOGICAL, PARAMETER :: Rdefault_smow = .FALSE. ! if T: Rdefault=smow; if F: nul
     172   LOGICAL, PARAMETER :: tnat1 = .TRUE. ! If T: all tnats are 1.
    154173
    155174   !--- For [3]H
     
    157176
    158177   CHARACTER(LEN=maxlen) :: modname, sxt
    159    REAL, ALLOCATABLE :: tmp(:)
    160178
    161179   modname = 'iso_init'
     
    214232      CALL get_in('lat_max_albedo', lat_max_albedo,  100.)
    215233   END IF
    216    deltaO18_oce=0.0
    217234   CALL get_in('deltaP_BL',           deltaP_BL,     10.0)
    218235   CALL get_in('ruissellement_pluie', ruissellement_pluie, 0)
     
    249266   CALL get_in('ok_prod_nucl_tritium', ok_prod_nucl_tritium, .FALSE., .FALSE.)
    250267
    251    !--------------------------------------------------------------
    252    ! Parameters that do not depend on the nature of water isotopes:
    253    !--------------------------------------------------------------
    254    ! -- temperature at which ice condensate starts to form (valeur ECHAM?):
    255    pxtmelt = 273.15
    256 
    257    ! -- temperature at which all condensate is ice:
    258    pxtice  = 273.15-10.0
    259 
    260    !- -- test PHASE
    261 !   pxtmelt = 273.15 - 10.0
    262 !   pxtice  = 273.15 - 30.0
    263 
    264    ! -- minimum temperature to calculate fractionation coeff
    265    pxtmin = 273.15 - 120.0   ! On ne calcule qu'au dessus de -120°C
    266    pxtmax = 273.15 +  60.0   ! On ne calcule qu'au dessus de +60°C
    267    !    Remarque: les coeffs ont ete mesures seulement jusq'à -40!
    268 
    269    ! -- a constant for alpha_eff for equilibrium below cloud base:
    270    tdifexp = 0.58
    271    tv0cin  = 7.0
    272 
    273    ! facteurs lambda et mu dans Si=musi-lambda*T
    274    musi=1.0
    275    if (ok_nocinsat) lambda_sursat = 0.0          ! no sursaturation effect
    276 
    277    ! diffusion dans le sol
    278    Kd=2.5e-9 ! m2/s   
    279 
    280    ! cas où cste_surf_cond: on met rhs ou/et Ts cste pour voir
    281    rh_cste_surf_cond = 0.6
    282     T_cste_surf_cond = 288.0
     268   ! Ocean composition
     269   CALL get_in('deltaO18_oce',  deltaO18_oce, 0.0)
    283270   
    284271   CALL msg('iso_O18, iso_HDO, iso_eau = '//TRIM(strStack(int2str([iso_O18, iso_HDO, iso_eau]))), modname)
    285272
    286273   !--------------------------------------------------------------
    287    ! Parameters that depend on the nature of water isotopes:
     274   ! Isotope fractionation factors and a few isotopic constants
    288275   !--------------------------------------------------------------
    289    IF(getKey('tnat',    tnat,    isoName)) CALL abort_physic(modname, 'can''t get tnat',    1)
    290    IF(getKey('toce',    toce,    isoName)) CALL abort_physic(modname, 'can''t get toce',    1)
    291    IF(getKey('tcorr',   tcorr,   isoName)) CALL abort_physic(modname, 'can''t get tcorr',   1)
    292    IF(getKey('talph1',  talph1,  isoName)) CALL abort_physic(modname, 'can''t get talph1',  1)
    293    IF(getKey('talph2',  talph2,  isoName)) CALL abort_physic(modname, 'can''t get talph2',  1)
    294    IF(getKey('talph3',  talph3,  isoName)) CALL abort_physic(modname, 'can''t get talph3',  1)
    295    IF(getKey('talps1',  talps1,  isoName)) CALL abort_physic(modname, 'can''t get talps1',  1)
    296    IF(getKey('talps2',  talps2,  isoName)) CALL abort_physic(modname, 'can''t get talps2',  1)
    297    IF(getKey('tkcin0',  tkcin0,  isoName)) CALL abort_physic(modname, 'can''t get tkcin0',  1)
    298    IF(getKey('tkcin1',  tkcin1,  isoName)) CALL abort_physic(modname, 'can''t get tkcin1',  1)
    299    IF(getKey('tkcin2',  tkcin2,  isoName)) CALL abort_physic(modname, 'can''t get tkcin2',  1)
    300    IF(getKey('tdifrel', tdifrel, isoName)) CALL abort_physic(modname, 'can''t get tdifrel', 1)
    301    IF(getKey('alpha_liq_sol', alpha_liq_sol, isoName)) CALL abort_physic(modname, 'can''t get alpha_liq_sol',  1)
    302    IF(getKey('Rdefault',Rdefault,isoName)) CALL abort_physic(modname, 'can''t get Rdefault',1)
    303    IF(getKey('Rmethox', Rmethox, isoName)) CALL abort_physic(modname, 'can''t get Rmethox', 1)
     276   ALLOCATE(tkcin0(niso))
     277   ALLOCATE(tkcin1(niso))
     278   ALLOCATE(tkcin2(niso))
     279   ALLOCATE(tnat(niso))
     280   ALLOCATE(tdifrel(niso))
     281   ALLOCATE(toce(niso))
     282   ALLOCATE(tcorr(niso))
     283   ALLOCATE(talph1(niso))
     284   ALLOCATE(talph2(niso))
     285   ALLOCATE(talph3(niso))
     286   ALLOCATE(talps1(niso))
     287   ALLOCATE(talps2(niso))
     288   ALLOCATE(alpha_liq_sol(niso))
     289   ALLOCATE(Rdefault(niso))
     290   ALLOCATE(Rmethox(niso))
     291
     292   do ixt=1,niso
     293     if (ixt.eq.iso_HTO) then  ! Tritium
     294       tkcin0(ixt) = 0.01056
     295       tkcin1(ixt) = 0.0005016
     296       tkcin2(ixt) = 0.0014432
     297       if (tnat1) then
     298               tnat(ixt)=1
     299       else
     300               tnat(ixt)=0.
     301       endif
     302       toce(ixt)=4.0E-19 ! rapport T/H = 0.2 TU Dreisigacker and Roether 1978
     303       tcorr(ixt)=1.
     304       tdifrel(ixt)=1./0.968
     305       talph1(ixt)=46480.
     306       talph2(ixt)=-103.87
     307       talph3(ixt)=0.
     308       talps1(ixt)=46480.
     309       talps2(ixt)=-103.87
     310       alpha_liq_sol(ixt)=1.
     311       Rmethox(ixt)=0.0
     312     endif
     313     if (ixt.eq.iso_O17) then  ! O17
     314       pente_MWL=0.528
     315       tdifrel(ixt)=1./0.98555 ! valeur utilisée en 1D et dans modèle de LdG ! tdifrel(ixt)=1./0.985452 ! donné par Amaelle
     316       fac_kcin= (tdifrel(ixt)-1.0)/(tdifrel_O18-1.0) ! fac_kcin=0.5145 ! donné par Amaelle
     317       tkcin0(ixt) = tkcin0_O18*fac_kcin
     318       tkcin1(ixt) = tkcin1_O18*fac_kcin
     319       tkcin2(ixt) = tkcin2_O18*fac_kcin
     320       if (tnat1) then
     321               tnat(ixt)=1
     322       else
     323               tnat(ixt)=0.004/100. ! O17 représente 0.004% de l'oxygène
     324       endif
     325       toce(ixt)=tnat(ixt)*(1.0+deltaO18_oce/1000.0)**pente_MWL
     326       tcorr(ixt)=1.0+fac_enrichoce18*pente_MWL ! donné par Amaelle           
     327       talph1(ixt)=talph1_O18
     328       talph2(ixt)=talph2_O18
     329       talph3(ixt)=talph3_O18
     330       talps1(ixt)=talps1_O18
     331       talps2(ixt)=talps2_O18     
     332       alpha_liq_sol(ixt)=(alpha_liq_sol_O18)**fac_coeff_eq17_liq
     333       Rdefault(ixt)=tnat(ixt)*(-3.15/1000.0+1.0)
     334       Rmethox(ixt)=(230./1000.+1.)*tnat(ixt) !Zahn et al 2006
     335     endif
     336     if (ixt.eq.iso_O18) then  ! Oxygene18
     337       tkcin0(ixt) = tkcin0_O18
     338       tkcin1(ixt) = tkcin1_O18
     339       tkcin2(ixt) = tkcin2_O18
     340       if (tnat1) then
     341               tnat(ixt)=1
     342       else
     343               tnat(ixt)=2005.2E-6
     344       endif
     345       toce(ixt)=tnat(ixt)*(1.0+deltaO18_oce/1000.0)
     346       tcorr(ixt)=1.0+fac_enrichoce18
     347       tdifrel(ixt)=tdifrel_O18
     348       talph1(ixt)=talph1_O18
     349       talph2(ixt)=talph2_O18
     350       talph3(ixt)=talph3_O18
     351       talps1(ixt)=talps1_O18
     352       talps2(ixt)=talps2_O18
     353       alpha_liq_sol(ixt)=alpha_liq_sol_O18   
     354       Rdefault(ixt)=tnat(ixt)*(-6.0/1000.0+1.0)
     355       Rmethox(ixt)=(130./1000.+1.)*tnat(ixt) !Zahn et al 2006 
     356     endif
     357     if (ixt.eq.iso_HDO) then ! Deuterium
     358       pente_MWL=8.0
     359       tdifrel(ixt)=1./0.9755 !          fac_kcin=0.88
     360       fac_kcin= (tdifrel(ixt)-1)/(tdifrel_O18-1)
     361       tkcin0(ixt) = tkcin0_O18*fac_kcin
     362       tkcin1(ixt) = tkcin1_O18*fac_kcin
     363       tkcin2(ixt) = tkcin2_O18*fac_kcin
     364       if (tnat1) then
     365               tnat(ixt)=1
     366       else
     367               tnat(ixt)=155.76E-6
     368       endif
     369       toce(ixt)=tnat(ixt)*(1.0+pente_MWL*deltaO18_oce/1000.0)
     370       tcorr(ixt)=1.0+fac_enrichoce18*pente_MWL         
     371       talph1(ixt)=24844.
     372       talph2(ixt)=-76.248
     373       talph3(ixt)=52.612E-3
     374       talps1(ixt)=16288.
     375       talps2(ixt)=-0.0934
     376       !ZXalpha_liq_sol=1.0192 ! Weston, Ralph, 1955
     377       alpha_liq_sol(ixt)=1.0212
     378       ! valeur de Lehmann & Siegenthaler, 1991, Journal of
     379       ! Glaciology, vol 37, p 23
     380       Rdefault(ixt)=tnat(ixt)*((-6.0*pente_MWL+10.0)/1000.0+1.0)
     381       Rmethox(ixt)=tnat(ixt)*(-25.0/1000.+1.) ! Zahn et al 2006
     382     endif
     383     if (ixt.eq.iso_eau) then ! Oxygene16
     384       tkcin0(ixt) = 0.0
     385       tkcin1(ixt) = 0.0
     386       tkcin2(ixt) = 0.0
     387       tnat(ixt)=1.
     388       toce(ixt)=tnat(ixt)
     389       tcorr(ixt)=1.0
     390       tdifrel(ixt)=1.
     391       talph1(ixt)=0.
     392       talph2(ixt)=0.
     393       talph3(ixt)=0.
     394       talps1(ixt)=0.
     395       talph3(ixt)=0.
     396       alpha_liq_sol(ixt)=1.
     397       Rdefault(ixt)=tnat(ixt)*1.0
     398       Rmethox(ixt)=1.0
     399     endif
     400   enddo ! ixt=1,niso
    304401
    305402   IF(.NOT.Rdefault_smow) then
     
    308405   ENDIF
    309406   write(*,*) 'Rdefault=',Rdefault
     407   write(*,*) 'toce=',toce
    310408
    311409   !--- Sensitivity test: no kinetic effect in sfc evaporation
  • LMDZ6/branches/cirrus/libf/phylmdiso/isotopes_routines_mod.F90

    r4491 r5202  
    15251525#endif       
    15261526       pxtfra=max(min(pxtfra,alpha_max),0.0)
    1527 
    15281527
    15291528      end subroutine fractcalk_liq
     
    1592215921
    1592315922      ! verif
    15924 !      text="phyisoetat0 67"
    15925 !      write(*,*) 'snow(8,1)=',snow(8,1)
    15926 !      write(*,*) 'xtsnow(4,8,1)=',xtsnow(4,8,1)
    1592715923#ifdef ISOVERIF
    1592815924      do i=1,klon
     
    1593415930         enddo !do ixt=1,niso
    1593515931      enddo !do i=1,klon
    15936 #endif     
    15937 #ifdef ISOVERIF
    1593815932      do i=1,klon
    1593915933         if (iso_eau.gt.0) then
     
    1602116015         endif
    1602216016       enddo !do i=1,klon
    16023 
    1602416017#endif
    1602516018      !end verif
     
    1612816121          deltaD_run_off_lic_0(ixt)=deltaD_sol(ixt)
    1612916122          deltaD_land_ice(ixt)=deltaD_snow(ixt)
    16130           call fractcalk_liq(ixt, 283.0, alpha(ixt))           
     16123          call fractcalk_liq(ixt, 283.0, alpha(ixt))   
    1613116124        enddo !do ixt=1,niso
    1613216125        call calcul_kcin(2.0,kcin)
     
    1883018823        if ((iso_HDO.gt.0).and.(ixt.eq.iso_HDO)) then
    1883118824            if (q.gt.ridicule) then
     18825                    write(*,*) 'xt,q=',xt,q
     18826                    write(*,*) 'alpha=',alpha
     18827                    write(*,*) 'toce,kcin,h0=',toce,kcin,h0
     18828                    write(*,*) 'RMerlivat=',RMerlivat
    1883218829                call iso_verif_aberrant_encadre( xt/q, 'isotopes_routines_mod 18930b: iso_init_ideal')
    1883318830            endif
     
    1890218899end subroutine appel_stewart_debug
    1890318900
     18901
     18902subroutine dispatch(klon,klev,qx,q_seri,xt_seri,ql_seri,xtl_seri,qs_seri,xts_seri)
     18903
     18904use infotrac_phy, ONLY: nqtot,nqo,ivap,iliq,isol,iqIsoPha,ntraciso=>ntiso
     18905implicit none
     18906
     18907! inputs
     18908integer, intent(in) :: klon,klev
     18909real,dimension(klon,klev,nqtot), intent(in) ::qx
     18910
     18911! outputs
     18912real,dimension(klon,klev), intent(out) ::q_seri,ql_seri,qs_seri
     18913real,dimension(ntraciso,klon,klev), intent(out) :: xt_seri,xtl_seri,xts_seri
     18914
     18915! locals
     18916integer :: i,k,ixt
     18917
     18918do k=1,klev
     18919do i=1,klon
     18920    q_seri(i,k)  = qx(i,k,ivap)
     18921    ql_seri(i,k) = qx(i,k,iliq)
     18922    IF (nqo.EQ.2) THEN             !--vapour and liquid only
     18923             qs_seri(i,k) = 0.
     18924    ELSE IF (nqo.ge.3) THEN        !--vapour, liquid and ice
     18925             qs_seri(i,k) = qx(i,k,isol)
     18926    ENDIF
     18927    do ixt=1,ntraciso
     18928          xt_seri(ixt,i,k)  = qx(i,k,iqIsoPha(ixt,ivap))
     18929          xtl_seri(ixt,i,k) = qx(i,k,iqIsoPha(ixt,iliq))
     18930          if (nqo.eq.2) then
     18931             xts_seri(ixt,i,k) = 0.
     18932          else if (nqo.eq.3) then
     18933             xts_seri(ixt,i,k) = qx(i,k,iqIsoPha(ixt,isol))
     18934          endif
     18935    enddo !do ixt=1,niso
     18936
     18937enddo
     18938enddo
     18939
     18940end subroutine dispatch
     18941
     18942subroutine together(klon,klev,qx,q_seri,xt_seri,ql_seri,xtl_seri,qs_seri,xts_seri)
     18943
     18944use infotrac_phy, ONLY: nqtot,nqo,ivap,iliq,isol,iqIsoPha,ntraciso=>ntiso
     18945implicit none
     18946
     18947! inputs
     18948integer, intent(in) :: klon,klev
     18949real,dimension(klon,klev), intent(in) ::q_seri,ql_seri,qs_seri
     18950real,dimension(ntraciso,klon,klev), intent(in) :: xt_seri,xtl_seri,xts_seri
     18951
     18952! inputs
     18953real,dimension(klon,klev,nqtot), intent(out) ::qx
     18954
     18955! locals
     18956integer :: i,k,ixt
     18957
     18958do k=1,klev
     18959do i=1,klon 
     18960    qx(i,k,ivap)  = q_seri(i,k)
     18961    qx(i,k,iliq) = ql_seri(i,k)
     18962    IF (nqo.ge.3) THEN        !--vapour, liquid and ice
     18963             qx(i,k,isol) = qs_seri(i,k)
     18964    ENDIF
     18965    do ixt=1,ntraciso
     18966          qx(i,k,iqIsoPha(ixt,ivap)) = xt_seri(ixt,i,k) 
     18967          qx(i,k,iqIsoPha(ixt,iliq)) = xtl_seri(ixt,i,k)
     18968          if (nqo.ge.3) then
     18969             qx(i,k,iqIsoPha(ixt,isol)) = xts_seri(ixt,i,k)
     18970          endif
     18971    enddo !do ixt=1,niso
     18972
     18973enddo
     18974enddo
     18975
     18976end subroutine together
     18977
     18978
    1890418979END MODULE isotopes_routines_mod
    1890518980#endif
  • LMDZ6/branches/cirrus/libf/phylmdiso/isotopes_verif_mod.F90

    r4491 r5202  
    10421042            write(*,*) 'deltaD=',deltaD
    10431043            write(*,*) 'Dexcess=',dexcess
     1044            write(*,*) 'tnat=',tnat
    10441045!            stop
    10451046            iso_verif_O18_aberrant_nostop=1
  • LMDZ6/branches/cirrus/libf/phylmdiso/isotrac_routines_mod.F90

    r4491 r5202  
    681681              Eqi_prime_cas(il)=Eqi_prime(cas(il)) &
    682682     &           *(Pxtisup(ieau,cas(il))/Pqisup(cas(il)))
    683               Eqi_cas(il)=Eqi(il) &
     683              Eqi_cas(il)=Eqi(cas(il)) & ! corr bug Camille 15 juin 2024
    684684     &           *(Pxtisup(ieau,cas(il))/Pqisup(cas(il)))
    685685            else
  • LMDZ6/branches/cirrus/libf/phylmdiso/phyetat0_mod.F90

    r5055 r5202  
    3030       solsw, solswfdiff, t_ancien, u_ancien, v_ancien, w01, wake_cstar, wake_deltaq, &
    3131       wake_deltat, wake_delta_pbl_TKE, delta_tsurf, beta_aridity, wake_fip, wake_pe, &
    32        wake_s, wake_dens, awake_dens, cv_gen, zgam, zmax0, zmea, zpic, zsig, &
     32       wake_s, awake_s, wake_dens, awake_dens, cv_gen, zgam, zmax0, zmea, zpic, zsig, &
    3333#ifdef ISO
    3434       fxtevap, xtsol, xt_ancien, xtl_ancien, xts_ancien, wake_deltaxt, &
     
    4949  USE time_phylmdz_mod, ONLY: init_iteration, pdtphys, itau_phy
    5050  USE wxios, ONLY: missing_val_xios => missing_val, using_xios
    51   use netcdf, only: nf90_fill_real
     51  use netcdf, only: missing_val_netcdf => nf90_fill_real
    5252  use config_ocean_skin_m, only: activate_ocean_skin
    5353#ifdef ISO
     
    112112  REAL Rland_ice(niso,klon)
    113113#endif
     114
     115  IF (using_xios) THEN
     116    missing_val=missing_val_xios
     117  ELSE
     118    missing_val=missing_val_netcdf
     119  ENDIF
     120
    114121  ! FH1D
    115122  !     real iolat(jjm+1)
     
    117124
    118125  ! Ouvrir le fichier contenant l'etat initial:
    119   IF (using_xios) THEN
    120     missing_val = missing_val_xios
    121   ELSE
    122     missing_val =  nf90_fill_real
    123   ENDIF
    124126
    125127  CALL open_startphy(fichnom)
     
    324326
    325327!===================================================================
     328! Lecture dans le cas iflag_pbl_surface =1
     329!===================================================================
     330
     331   if ( iflag_physiq <= 1 ) then
     332!===================================================================
    326333  ! Lecture des temperatures du sol profond:
    327334!===================================================================
     
    351358  found=phyetat0_get(snow_fall,"snow_f","snow fall",0.)
    352359  found=phyetat0_get(rain_fall,"rain_f","rain fall",0.)
    353 
    354360  IF (ok_bs) THEN
    355361     found=phyetat0_get(bs_fall,"bs_f","blowing snow fall",0.)
     
    405411  ENDIF
    406412
     413  endif ! iflag_physiq <= 1
     414
    407415  ! Lecture de l'age de la neige:
    408416  found=phyetat0_srf(agesno,"AGESNO","SNOW AGE",0.001)
     
    498506  found=phyetat0_get(wake_deltaq,"WAKE_DELTAQ","Delta hum. wake/env",0.)
    499507  found=phyetat0_get(wake_s,"WAKE_S","Wake frac. area",0.)
     508  found=phyetat0_get(awake_s,"AWAKE_S","Active Wake frac. area",0.)
    500509!jyg<
    501510!  Set wake_dens to -1000. when there is no restart so that the actual
     
    677686!        write(*,*) 'xtsnow(:,994,2)=',xtsnow(:,994,2)
    678687!#endif
    679 
     688  if ( iflag_physiq <= 1 ) then
    680689  CALL pbl_surface_init(fder, snow, qsurf, tsoil)
    681690#ifdef ISO
    682691  CALL pbl_surface_init_iso(xtsnow,Rland_ice)
    683692#endif
     693  endif
    684694
    685695  ! Initialize module ocean_cpl_mod for the case of coupled ocean
  • LMDZ6/branches/cirrus/libf/phylmdiso/phys_local_var_mod.F90

    r5055 r5202  
    1414      REAL, SAVE, ALLOCATABLE :: ql_seri(:,:),qs_seri(:,:)
    1515      !$OMP THREADPRIVATE(ql_seri,qs_seri)
     16! SN 15/07/2024 ISO 4D
     17      REAL, SAVE, ALLOCATABLE :: qx_seri(:,:,:)
     18      !$OMP THREADPRIVATE(qx_seri)
     19! SN
    1620      REAL, SAVE, ALLOCATABLE :: qbs_seri(:,:)
    1721      !$OMP THREADPRIVATE(qbs_seri)
     
    2428      REAL, SAVE, ALLOCATABLE :: pbl_eps(:,:,:)
    2529      !$OMP THREADPRIVATE(pbl_eps)
     30      REAL, SAVE, ALLOCATABLE :: tke_shear(:,:,:), tke_buoy(:,:,:), tke_trans(:,:,:)
     31      !$OMP THREADPRIVATE(tke_shear,tke_buoy,tke_trans)
    2632      REAL, SAVE, ALLOCATABLE :: tr_seri(:,:,:)
    2733      !$OMP THREADPRIVATE(tr_seri)
     
    6470      REAL, SAVE, ALLOCATABLE :: d_t_eva(:,:),d_q_eva(:,:),d_ql_eva(:,:),d_qi_eva(:,:)
    6571      !$OMP THREADPRIVATE(d_t_eva,d_q_eva,d_ql_eva,d_qi_eva)
     72! SN 15/07/2024 ISO 4D
     73      REAL, SAVE, ALLOCATABLE :: d_qx_eva(:,:,:)
     74      !$OMP THREADPRIVATE(d_qx_eva)
     75! SN
    6676      REAL, SAVE, ALLOCATABLE :: d_t_lscst(:,:),d_q_lscst(:,:)
    6777      !$OMP THREADPRIVATE(d_t_lscst,d_q_lscst)
     
    8494      REAL, SAVE, ALLOCATABLE :: d_t_vdf_x(:,:), d_q_vdf_x(:,:)
    8595      !$OMP THREADPRIVATE( d_t_vdf_x, d_q_vdf_x)
    86       REAL, SAVE, ALLOCATABLE :: d_t_bs(:,:), d_q_bs(:,:), d_qbs_bs(:,:)
    87       !$OMP THREADPRIVATE( d_t_bs,d_q_bs, d_qbs_bs)
     96      REAL, SAVE, ALLOCATABLE :: d_t_bsss(:,:), d_q_bsss(:,:), d_qbs_bsss(:,:)
     97      !$OMP THREADPRIVATE( d_t_bsss,d_q_bsss, d_qbs_bsss)
    8898!>nrlmd+jyg
    8999      REAL, SAVE, ALLOCATABLE :: d_t_oro(:,:)
     
    124134      REAL, SAVE, ALLOCATABLE :: xts_seri(:,:,:)
    125135      !$OMP THREADPRIVATE( xts_seri)
     136      REAL, SAVE, ALLOCATABLE :: xtbs_seri(:,:,:)
     137      !$OMP THREADPRIVATE( xtbs_seri)
    126138      REAL, SAVE, ALLOCATABLE :: d_xt_eva(:,:,:)
    127139      !$OMP THREADPRIVATE( d_xt_eva)
     
    134146      REAL, SAVE, ALLOCATABLE :: d_xt_dyn(:,:,:)
    135147      !$OMP THREADPRIVATE( d_xt_dyn)
    136       REAL, SAVE, ALLOCATABLE :: d_xtl_dyn(:,:,:), d_xts_dyn(:,:,:)
    137       !$OMP THREADPRIVATE(d_xtl_dyn, d_xts_dyn)
     148      REAL, SAVE, ALLOCATABLE :: d_xtl_dyn(:,:,:), d_xts_dyn(:,:,:), d_xtbs_dyn(:,:,:)
     149      !$OMP THREADPRIVATE(d_xtl_dyn, d_xts_dyn, d_xtbs_dyn)
    138150      REAL, SAVE, ALLOCATABLE :: d_xt_con(:,:,:)
    139151      !$OMP THREADPRIVATE( d_xt_con)
     
    166178      !$OMP THREADPRIVATE(d_ts, d_tr)
    167179
    168 ! aerosols
    169       REAL, SAVE, ALLOCATABLE :: m_allaer (:,:,:)
    170       !$OMP THREADPRIVATE(m_allaer)
    171180! diagnostique pour le rayonnement
    172181      REAL, SAVE, ALLOCATABLE :: topswad_aero(:),  solswad_aero(:)      ! diag
     
    292301!$OMP THREADPRIVATE(toplwad0_aerop, sollwad0_aerop)
    293302
     303!AI 08 2023 ajout pour Ecrad
     304      REAL,ALLOCATABLE,SAVE :: topswad_aero_s2(:), solswad_aero_s2(:)
     305!$OMP THREADPRIVATE(topswad_aero_s2, solswad_aero_s2)
     306      REAL,ALLOCATABLE,SAVE :: topswai_aero_s2(:), solswai_aero_s2(:)
     307!$OMP THREADPRIVATE(topswai_aero_s2, solswai_aero_s2)
     308      REAL,ALLOCATABLE,SAVE :: topswad0_aero_s2(:), solswad0_aero_s2(:)
     309!$OMP THREADPRIVATE(topswad0_aero_s2, solswad0_aero_s2)
     310      REAL,ALLOCATABLE,SAVE :: topsw_aero_s2(:,:), topsw0_aero_s2(:,:)
     311!$OMP THREADPRIVATE(topsw_aero_s2, topsw0_aero_s2)
     312      REAL,ALLOCATABLE,SAVE :: solsw_aero_s2(:,:), solsw0_aero_s2(:,:)
     313!$OMP THREADPRIVATE(solsw_aero_s2, solsw0_aero_s2)
     314      REAL,ALLOCATABLE,SAVE :: topswcf_aero_s2(:,:), solswcf_aero_s2(:,:)
     315!$OMP THREADPRIVATE(topswcf_aero_s2, solswcf_aero_s2)
     316! additional LW variables CK
     317      REAL,ALLOCATABLE,SAVE :: toplwad_aero_s2(:), sollwad_aero_s2(:)
     318!$OMP THREADPRIVATE(toplwad_aero_s2, sollwad_aero_s2)
     319      REAL,ALLOCATABLE,SAVE :: toplwai_aero_s2(:), sollwai_aero_s2(:)
     320!$OMP THREADPRIVATE(toplwai_aero_s2, sollwai_aero_s2)
     321      REAL,ALLOCATABLE,SAVE :: toplwad0_aero_s2(:), sollwad0_aero_s2(:)
     322!$OMP THREADPRIVATE(toplwad0_aero_s2, sollwad0_aero_s2)
     323
    294324!Ajout de celles n??cessaires au phys_output_write_mod
    295325      REAL, SAVE, ALLOCATABLE :: tal1(:), pal1(:), pab1(:), pab2(:)
     
    300330!$OMP THREADPRIVATE(sens, flwp, fiwp)
    301331!!
    302 !FC
     332!FC 
    303333      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:) :: zxfluxt, zxfluxq
    304334!$OMP THREADPRIVATE(zxfluxt, zxfluxq)
     
    315345    REAL, SAVE, ALLOCATABLE,DIMENSION(:,:)          :: d_deltat_wk, d_deltaq_wk
    316346!$OMP THREADPRIVATE(d_deltat_wk, d_deltaq_wk)
    317       REAL,ALLOCATABLE,SAVE,DIMENSION(:)            :: d_s_wk, d_dens_a_wk, d_dens_wk
    318 !$OMP THREADPRIVATE(d_s_wk, d_dens_a_wk, d_dens_wk)
     347      REAL,ALLOCATABLE,SAVE,DIMENSION(:)            :: d_s_wk, d_s_a_wk, d_dens_wk, d_dens_a_wk
     348!$OMP THREADPRIVATE(d_s_wk, d_s_a_wk, d_dens_wk, d_dens_a_wk)
    319349    REAL, SAVE, ALLOCATABLE,DIMENSION(:,:)          :: d_deltat_wk_gw, d_deltaq_wk_gw
    320350!$OMP THREADPRIVATE(d_deltat_wk_gw, d_deltaq_wk_gw)
     
    328358!!!OMP THREADPRIVATE(d_s_the, d_dens_the)
    329359      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:)           :: d_deltat_ajs_cv, d_deltaq_ajs_cv
    330 !$OMP THREADPRIVATE(d_deltat_ajs_cv, d_deltaq_ajs_cv)                       
     360!$OMP THREADPRIVATE(d_deltat_ajs_cv, d_deltaq_ajs_cv)
    331361#ifdef ISO
    332362    REAL, SAVE, ALLOCATABLE,DIMENSION(:,:,:)          :: d_deltaxt_wk
     
    376406      REAL,ALLOCATABLE,SAVE,DIMENSION(:) :: zxfluxlat, zxtsol, snow_lsc, zxfqfonte
    377407!$OMP THREADPRIVATE(zxfluxlat, zxtsol, snow_lsc, zxfqfonte)
    378       REAL,ALLOCATABLE,SAVE,DIMENSION(:) :: zxrunofflic
    379 !$OMP THREADPRIVATE(zxrunofflic)
     408!SN runoffdiag
     409      REAL,ALLOCATABLE,SAVE,DIMENSION(:) :: zxrunofflic, runoff_diag
     410!$OMP THREADPRIVATE(zxrunofflic, runoff_diag)
    380411      REAL,ALLOCATABLE,SAVE,DIMENSION(:) :: zxqsurf, rain_lsc, rain_num
    381412!$OMP THREADPRIVATE(zxqsurf, rain_lsc, rain_num)
     
    383414      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:) :: xtevap,xtprw
    384415!$OMP THREADPRIVATE(xtevap,xtprw)
    385       REAL,ALLOCATABLE,SAVE,DIMENSION(:) :: h1_diag,runoff_diag
     416      REAL,ALLOCATABLE,SAVE,DIMENSION(:) :: h1_diag
    386417      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:) :: xtrunoff_diag
    387 !$OMP THREADPRIVATE(h1_diag,runoff_diag,xtrunoff_diag)
     418!$OMP THREADPRIVATE(h1_diagv,xtrunoff_diag)
    388419      REAL,ALLOCATABLE,SAVE,DIMENSION(:,:) :: zxfxtcalving
    389420!$OMP THREADPRIVATE(zxfxtcalving)
     
    581612      REAL, ALLOCATABLE, SAVE, DIMENSION(:,:) :: pfraclr,pfracld
    582613!$OMP THREADPRIVATE(pfraclr,pfracld)
     614      REAL, SAVE, ALLOCATABLE :: cldfraliq(:,:)
     615!$OMP THREADPRIVATE(cldfraliq)
     616      REAL, SAVE, ALLOCATABLE ::mean_icefracturb(:,:)
     617!$OMP THREADPRIVATE(mean_icefracturb)
     618      REAL, SAVE, ALLOCATABLE :: sigma2_icefracturb(:,:)
     619!$OMP THREADPRIVATE(sigma2_icefracturb)
    583620
    584621! variables de sorties MM
     
    671708!
    672709! variables for stratospheric aerosol
     710      REAL, ALLOCATABLE, SAVE, DIMENSION(:,:) :: d_q_emiss
     711!$OMP THREADPRIVATE(d_q_emiss)
    673712      REAL, ALLOCATABLE, SAVE, DIMENSION(:,:) :: R2SO4
    674713!$OMP THREADPRIVATE(R2SO4)
     714      REAL, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: R2SO4B
     715!$OMP THREADPRIVATE(R2SO4B)
    675716      REAL, ALLOCATABLE, SAVE, DIMENSION(:,:) :: DENSO4
    676717!$OMP THREADPRIVATE(DENSO4)
     718      REAL, ALLOCATABLE, SAVE, DIMENSION(:,:, :) :: DENSO4B
     719!$OMP THREADPRIVATE(DENSO4B)     
    677720      REAL, ALLOCATABLE, SAVE, DIMENSION(:,:) :: f_r_wet
    678721!$OMP THREADPRIVATE(f_r_wet)
     722      REAL, ALLOCATABLE, SAVE, DIMENSION(:,:, :) :: f_r_wetB
     723!$OMP THREADPRIVATE(f_r_wetB)
    679724      REAL, ALLOCATABLE, SAVE, DIMENSION(:,:) :: decfluxaer
    680725!$OMP THREADPRIVATE(decfluxaer)
     
    685730      REAL, ALLOCATABLE, SAVE, DIMENSION(:,:) :: SO2_lifetime
    686731!$OMP THREADPRIVATE(SO2_lifetime)
     732      REAL, ALLOCATABLE, SAVE, DIMENSION(:,:) :: H2SO4_lifetime
     733!$OMP THREADPRIVATE(H2SO4_lifetime)
     734      REAL, ALLOCATABLE, SAVE, DIMENSION(:,:) :: O3_clim
     735!$OMP THREADPRIVATE(O3_clim)
    687736      REAL, ALLOCATABLE, SAVE, DIMENSION(:,:) :: alpha_bin
    688737!$OMP THREADPRIVATE(alpha_bin)
     
    701750      REAL, ALLOCATABLE, SAVE, DIMENSION(:,:) :: vsed_aer
    702751!$OMP THREADPRIVATE(vsed_aer)
     752!     Sulfate aerosol concentration (dry mixing ratio) (condensed H2SO4 mmr)
     753      REAL, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sulfmmr
     754!$OMP THREADPRIVATE(sulfmmr)
     755!     SAD all aerosols (cm2/cm3)
     756      REAL, ALLOCATABLE, SAVE, DIMENSION(:,:) :: SAD_sulfate
     757!$OMP THREADPRIVATE(SAD_sulfate)
     758!     Effective radius of wet surface aerosols (cm)
     759      REAL, ALLOCATABLE, SAVE, DIMENSION(:,:) :: reff_sulfate
     760!$OMP THREADPRIVATE(reff_sulfate)
     761!     sulfate MMR in different modes (based on sulfmmr, it must be dry mmr)
     762      REAL, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: sulfmmr_mode
     763!$OMP THREADPRIVATE(sulfmmr_mode)
     764!     particle concentration in different modes (part/m3)
     765      REAL, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: nd_mode
     766!$OMP THREADPRIVATE(nd_mode)
    703767!
    704768!---3D budget variables
     
    749813SUBROUTINE phys_local_var_init
    750814USE dimphy
    751 USE infotrac_phy, ONLY : nbtr
     815USE infotrac_phy, ONLY : nbtr,nqtot
    752816#ifdef ISO
    753817USE infotrac_phy, ONLY : ntraciso=>ntiso,niso
     
    757821USE phys_output_var_mod
    758822USE phys_state_var_mod
     823#ifdef CPP_StratAer
     824USE infotrac_phy, ONLY : nbtr_bin
     825#endif
    759826
    760827IMPLICIT NONE
    761828      ALLOCATE(t_seri(klon,klev),q_seri(klon,klev),ql_seri(klon,klev),qs_seri(klon,klev), qbs_seri(klon,klev))
     829! SN 4D ISO
     830      ALLOCATE(qx_seri(klon,klev,nqtot))
     831! SN
    762832      ALLOCATE(u_seri(klon,klev),v_seri(klon,klev))
    763833      ALLOCATE(cf_seri(klon,klev),rvc_seri(klon,klev))
    764834      ALLOCATE(l_mixmin(klon,klev+1,nbsrf),l_mix(klon,klev+1,nbsrf),wprime(klon,klev+1,nbsrf))
    765835      ALLOCATE(pbl_eps(klon,klev+1,nbsrf+1))
     836      ALLOCATE(tke_shear(klon,klev+1,nbsrf), tke_buoy(klon,klev+1,nbsrf), tke_trans(klon,klev+1,nbsrf))
    766837      pbl_eps(:,:,:)=0.
     838      tke_shear(:,:,:)=0.; tke_buoy(:,:,:)=0.; tke_trans(:,:,:)=0.
    767839      l_mix(:,:,:)=0.;l_mixmin(:,:,:)=0.;wprime(:,:,:)=0. ! doit etre initialse car pas toujours remplis
    768840      ALLOCATE(rhcl(klon,klev))
     
    789861      ALLOCATE(d_u_ajs(klon,klev),d_v_ajs(klon,klev))
    790862      ALLOCATE(d_t_eva(klon,klev),d_q_eva(klon,klev))
     863! SN 4D ISO
     864      ALLOCATE(d_qx_eva(klon,klev,nqtot))
     865! SN
    791866      ALLOCATE(d_ql_eva(klon,klev),d_qi_eva(klon,klev))
    792867      ALLOCATE(d_t_lscst(klon,klev),d_q_lscst(klon,klev))
     
    795870      ALLOCATE(d_t_vdf(klon,klev),d_q_vdf(klon,klev),d_t_diss(klon,klev))
    796871      ALLOCATE (d_qbs_vdf(klon,klev))
    797       ALLOCATE(d_t_bs(klon,klev),d_q_bs(klon,klev),d_qbs_bs(klon,klev))
     872      ALLOCATE(d_t_bsss(klon,klev),d_q_bsss(klon,klev),d_qbs_bsss(klon,klev))
    798873      ALLOCATE(d_t_vdf_w(klon,klev),d_q_vdf_w(klon,klev))
    799874      ALLOCATE(d_t_vdf_x(klon,klev),d_q_vdf_x(klon,klev))
     
    802877      allocate(xtl_seri(ntraciso,klon,klev))
    803878      allocate(xts_seri(ntraciso,klon,klev))
     879      allocate(xtbs_seri(ntraciso,klon,klev))
    804880      allocate(d_xt_dyn(ntraciso,klon,klev))
    805881      allocate(d_xtl_dyn(ntraciso,klon,klev))
    806882      allocate(d_xts_dyn(ntraciso,klon,klev))
     883      allocate(d_xtbs_dyn(ntraciso,klon,klev))
    807884      allocate(d_xt_con(ntraciso,klon,klev))
    808885      allocate(d_xt_wake(ntraciso,klon,klev))
     
    835912      ALLOCATE(d_u_lif(klon,klev),d_v_lif(klon,klev))
    836913      ALLOCATE(d_ts(klon,nbsrf), d_tr(klon,klev,nbtr))
     914
    837915! Special RRTM
    838916      ALLOCATE(ZLWFT0_i(klon,klev+1),ZSWFT0_i(klon,klev+1),ZFLDN0(klon,klev+1))
     
    913991      ALLOCATE(toplwad0_aerop(klon), sollwad0_aerop(klon))
    914992
     993!AI Ajout Ecrad (3Deffect)
     994      ALLOCATE(topswad_aero_s2(klon), solswad_aero_s2(klon))
     995      ALLOCATE(topswai_aero_s2(klon), solswai_aero_s2(klon))
     996      ALLOCATE(topswad0_aero_s2(klon), solswad0_aero_s2(klon))
     997      ALLOCATE(topsw_aero_s2(klon,naero_grp), topsw0_aero_s2(klon,naero_grp))
     998      ALLOCATE(solsw_aero_s2(klon,naero_grp), solsw0_aero_s2(klon,naero_grp))
     999      ALLOCATE(topswcf_aero_s2(klon,naero_grp), solswcf_aero_s2(klon,naero_grp))
     1000! additional LW variables CK
     1001      ALLOCATE(toplwad_aero_s2(klon), sollwad_aero_s2(klon))
     1002      ALLOCATE(toplwai_aero_s2(klon), sollwai_aero_s2(klon))
     1003      ALLOCATE(toplwad0_aero_s2(klon), sollwad0_aero_s2(klon))
     1004
    9151005! FH Ajout de celles necessaires au phys_output_write_mod
    9161006
     
    9231013      ALLOCATE(wake_omg(klon, klev))
    9241014      ALLOCATE(d_deltat_wk(klon, klev), d_deltaq_wk(klon, klev))
    925       ALLOCATE(d_s_wk(klon), d_dens_a_wk(klon), d_dens_wk(klon))
     1015      ALLOCATE(d_s_wk(klon), d_s_a_wk(klon), d_dens_wk(klon), d_dens_a_wk(klon))
    9261016      ALLOCATE(d_deltat_wk_gw(klon, klev), d_deltaq_wk_gw(klon, klev))
    9271017      ALLOCATE(d_deltat_vdf(klon, klev), d_deltaq_vdf(klon, klev))
     
    9581048      ALLOCATE(zxfqcalving(klon), zxfluxlat(klon))
    9591049      ALLOCATE(zxtsol(klon), snow_lsc(klon), zxfqfonte(klon), zxqsurf(klon))
    960       ALLOCATE(zxrunofflic(klon))
     1050! SN add runoff_diag
     1051      ALLOCATE(zxrunofflic(klon), runoff_diag(klon))
     1052      runoff_diag(:)=0.
    9611053      ALLOCATE(zxustartlic(klon), zxrhoslic(klon), zxqsaltlic(klon))
    9621054      zxustartlic(:)=0. ; zxrhoslic(:)=0. ; zxqsaltlic(:)=0.
     
    9731065      ALLOCATE(xtrain_lsc(ntraciso,klon))
    9741066      ALLOCATE(xtrunoff_diag(niso,klon))
    975       ALLOCATE(h1_diag(klon),runoff_diag(klon))
     1067      ALLOCATE(h1_diag(klon))
     1068!SN
     1069      xtrunoff_diag(:,:)=0. ! because variables are only given values on knon grid points
    9761070#endif
    9771071!
     
    10321126      ALLOCATE(wfevap(klon, nbsrf))
    10331127      ALLOCATE(evap_pot(klon, nbsrf))
    1034 ! FC
     1128! FC 
    10351129      ALLOCATE(zxfluxq(klon,klev),zxfluxt(klon,klev))
    1036 !
    10371130!
    10381131!  Deep convective variables used in phytrac
    10391132      ALLOCATE(pmflxr(klon, klev+1), pmflxs(klon, klev+1))
    10401133      ALLOCATE(wdtrainA(klon,klev),wdtrainS(klon,klev),wdtrainM(klon,klev))
    1041       ALLOCATE(dnwd(klon, klev), upwd(klon, klev) )
     1134      ALLOCATE(dnwd(klon, klev), upwd(klon, klev))
    10421135      ALLOCATE(ep(klon,klev))                          ! epmax_cape
    1043       ALLOCATE(da(klon,klev), mp(klon,klev) )
    1044       ALLOCATE(phi(klon,klev,klev) )
    1045       ALLOCATE(wght_cvfd(klon,klev) )
    1046       ALLOCATE(phi2(klon,klev,klev) )
     1136      ALLOCATE(da(klon,klev), mp(klon,klev))
     1137      ALLOCATE(phi(klon,klev,klev))
     1138      ALLOCATE(wght_cvfd(klon,klev))
     1139      ALLOCATE(phi2(klon,klev,klev))
    10471140      ALLOCATE(d1a(klon,klev), dam(klon,klev))
    1048       ALLOCATE(ev(klon,klev) )
    1049       ALLOCATE(elij(klon,klev,klev) )
    1050       ALLOCATE(qtaa(klon,klev) )
    1051       ALLOCATE(clw(klon,klev) )
    1052       ALLOCATE(epmlmMm(klon,klev,klev), eplaMm(klon,klev) )
    1053       ALLOCATE(sij(klon,klev,klev) )
     1141      ALLOCATE(ev(klon,klev))
     1142      ALLOCATE(elij(klon,klev,klev))
     1143      ALLOCATE(qtaa(klon,klev))
     1144      ALLOCATE(clw(klon,klev))
     1145      ALLOCATE(epmlmMm(klon,klev,klev), eplaMm(klon,klev))
     1146      ALLOCATE(sij(klon,klev,klev))
    10541147#ifdef ISO
    10551148      ALLOCATE(xtwdtrainA(ntraciso,klon,klev))
     
    10941187      ALLOCATE(pfraclr(klon,klev),pfracld(klon,klev))
    10951188      pfraclr(:,:)=0. ; pfracld(:,:)=0. ! because not always defined
     1189      ALLOCATE(cldfraliq(klon,klev))
     1190      ALLOCATE(sigma2_icefracturb(klon,klev))
     1191      ALLOCATE(mean_icefracturb(klon,klev))
    10961192      ALLOCATE(distcltop(klon,klev))
    10971193      ALLOCATE(temp_cltop(klon,klev))
     
    11341230
    11351231#ifdef CPP_StratAer
     1232      ALLOCATE (d_q_emiss(klon,klev))
    11361233      ALLOCATE (R2SO4(klon,klev))
     1234      ALLOCATE (R2SO4B(klon,klev,nbtr_bin))
    11371235      ALLOCATE (DENSO4(klon,klev))
     1236      ALLOCATE (DENSO4B(klon,klev,nbtr_bin))
    11381237      ALLOCATE (f_r_wet(klon,klev))
     1238      ALLOCATE (f_r_wetB(klon,klev,nbtr_bin))
    11391239      ALLOCATE (decfluxaer(klon,nbtr))
    11401240      ALLOCATE (mdw(nbtr))
     
    11471247      ALLOCATE (OCS_lifetime(klon,klev))
    11481248      ALLOCATE (SO2_lifetime(klon,klev))
     1249      ALLOCATE (H2SO4_lifetime(klon,klev))
     1250      ALLOCATE (O3_clim(klon,klev))
    11491251      ALLOCATE (alpha_bin(nbands_sw_rrtm+nbands_lw_rrtm+nwave,nbtr))
    11501252      ALLOCATE (piz_bin(nbands_sw_rrtm+nbands_lw_rrtm+nwave,nbtr))
     
    11711273      ALLOCATE (surf_PM25_sulf(klon))
    11721274      ALLOCATE (vsed_aer(klon,klev))
     1275      ALLOCATE (sulfmmr(klon,klev))
     1276      ALLOCATE (SAD_sulfate(klon,klev))
     1277      ALLOCATE (reff_sulfate(klon,klev))
     1278      ALLOCATE (sulfmmr_mode(klon,klev,nbtr_bin))
     1279      ALLOCATE (nd_mode(klon,klev,nbtr_bin))
    11731280#endif
    11741281
     
    11811288IMPLICIT NONE
    11821289      DEALLOCATE(t_seri,q_seri,ql_seri,qs_seri, qbs_seri)
     1290! SN 4D ISO
     1291      DEALLOCATE(qx_seri)
     1292! SN
    11831293      DEALLOCATE(u_seri,v_seri)
    11841294      DEALLOCATE(cf_seri,rvc_seri)
    11851295      DEALLOCATE(l_mixmin,l_mix,wprime)
     1296      DEALLOCATE(tke_shear,tke_buoy,tke_trans)
    11861297      DEALLOCATE(pbl_eps)
    11871298      DEALLOCATE(rhcl)
     
    12081319      DEALLOCATE(d_u_ajs,d_v_ajs)
    12091320      DEALLOCATE(d_t_eva,d_q_eva)
     1321! SN 4D ISO
     1322      DEALLOCATE(d_qx_eva)
     1323! SN
    12101324      DEALLOCATE(d_ql_eva,d_qi_eva)
    12111325      DEALLOCATE(d_t_lscst,d_q_lscst)
     
    12141328      DEALLOCATE(d_t_vdf,d_q_vdf,d_t_diss)
    12151329      DEALLOCATE(d_qbs_vdf)
    1216       DEALLOCATE(d_t_bs,d_q_bs,d_qbs_bs)
    1217 #ifdef ISO
    1218       deallocate(xt_seri,xtl_seri,xts_seri)
     1330      DEALLOCATE(d_t_bsss,d_q_bsss,d_qbs_bsss)
     1331#ifdef ISO
     1332      deallocate(xt_seri,xtl_seri,xts_seri,xtbs_seri)
    12191333      DEALLOCATE(d_xtl_eva,d_xti_eva)
    1220       deallocate(d_xt_dyn,d_xtl_dyn,d_xts_dyn)
     1334      deallocate(d_xt_dyn,d_xtl_dyn,d_xts_dyn,d_xtbs_dyn)
    12211335      deallocate(d_xt_con)
    12221336      deallocate(d_xt_wake)
     
    13081422      DEALLOCATE(solsw_aerop, solsw0_aerop)
    13091423      DEALLOCATE(topswcf_aerop, solswcf_aerop)
    1310 
    13111424!CK LW diagnostics
    13121425      DEALLOCATE(toplwad_aerop, sollwad_aerop)
     
    13141427      DEALLOCATE(toplwad0_aerop, sollwad0_aerop)
    13151428
     1429!AI Ajout pour Ecrad (3Deffect)
     1430      DEALLOCATE(topswad_aero_s2, solswad_aero_s2)
     1431      DEALLOCATE(topswai_aero_s2, solswai_aero_s2)
     1432      DEALLOCATE(topswad0_aero_s2, solswad0_aero_s2)
     1433      DEALLOCATE(topsw_aero_s2, topsw0_aero_s2)
     1434      DEALLOCATE(solsw_aero_s2, solsw0_aero_s2)
     1435      DEALLOCATE(topswcf_aero_s2, solswcf_aero_s2)
     1436!CK LW diagnostics
     1437      DEALLOCATE(toplwad_aero_s2, sollwad_aero_s2)
     1438      DEALLOCATE(toplwai_aero_s2, sollwai_aero_s2)
     1439      DEALLOCATE(toplwad0_aero_s2, sollwad0_aero_s2)     
     1440
    13161441! FH Ajout de celles necessaires au phys_output_write_mod
    13171442      DEALLOCATE(tal1, pal1, pab1, pab2)
     
    13221447      DEALLOCATE(wake_omg)
    13231448      DEALLOCATE(d_deltat_wk, d_deltaq_wk)
    1324       DEALLOCATE(d_s_wk, d_dens_a_wk, d_dens_wk)
     1449      DEALLOCATE(d_s_wk, d_s_a_wk, d_dens_wk, d_dens_a_wk)
    13251450      DEALLOCATE(d_deltat_wk_gw, d_deltaq_wk_gw)
    13261451      DEALLOCATE(d_deltat_vdf, d_deltaq_vdf)
     
    13531478      DEALLOCATE(uwat, vwat)
    13541479      DEALLOCATE(zxfqcalving, zxfluxlat)
    1355       DEALLOCATE(zxrunofflic)
     1480! SN runoff_diag
     1481      DEALLOCATE(zxrunofflic, runoff_diag)
    13561482      DEALLOCATE(zxustartlic, zxrhoslic, zxqsaltlic)
    13571483      DEALLOCATE(zxtsol, snow_lsc, zxfqfonte, zxqsurf)
     
    13821508      DEALLOCATE(dxtvdf_x, dxtvdf_w)
    13831509      DEALLOCATE(xt_therm)
    1384       DEALLOCATE(h1_diag,runoff_diag,xtrunoff_diag)
     1510      DEALLOCATE(h1_diag,xtrunoff_diag)
    13851511#endif
    13861512!
     
    14221548      DEALLOCATE(upwd, dnwd)
    14231549      DEALLOCATE(ep)
    1424       DEALLOCATE(da, mp )
    1425       DEALLOCATE(phi )
    1426       DEALLOCATE(wght_cvfd )
    1427       DEALLOCATE(phi2 )
     1550      DEALLOCATE(da, mp)
     1551      DEALLOCATE(phi)
     1552      DEALLOCATE(wght_cvfd)
     1553      DEALLOCATE(phi2)
    14281554      DEALLOCATE(d1a, dam)
    1429       DEALLOCATE(ev )
    1430       DEALLOCATE(elij )
    1431       DEALLOCATE(qtaa )
    1432       DEALLOCATE(clw )
    1433       DEALLOCATE(epmlmMm, eplaMm )
    1434       DEALLOCATE(sij )
     1555      DEALLOCATE(ev)
     1556      DEALLOCATE(elij)
     1557      DEALLOCATE(qtaa)
     1558      DEALLOCATE(clw)
     1559      DEALLOCATE(epmlmMm, eplaMm)
     1560      DEALLOCATE(sij)
    14351561#ifdef ISO
    14361562      DEALLOCATE(xtwdtrainA)
     
    14721598      DEALLOCATE(rneb)
    14731599      DEALLOCATE(pfraclr,pfracld)
     1600      DEALLOCATE(cldfraliq)
     1601      DEALLOCATE(sigma2_icefracturb)
     1602      DEALLOCATE(mean_icefracturb)
     1603      DEALLOCATE (zxsnow,snowhgt,qsnow,to_ice,sissnow,runoff,albsol3_lic)
    14741604      DEALLOCATE(distcltop)
    14751605      DEALLOCATE(temp_cltop)
    1476       DEALLOCATE (zxsnow,snowhgt,qsnow,to_ice,sissnow,runoff,albsol3_lic)
    14771606#ifdef ISO
    14781607      DEALLOCATE (zxxtsnow,xtVprecip,xtVprecipi,pxtrfl,pxtsfl)
     
    15071636#ifdef CPP_StratAer
    15081637! variables for strat. aerosol CK
    1509       DEALLOCATE (R2SO4)
    1510       DEALLOCATE (DENSO4)
    1511       DEALLOCATE (f_r_wet)
     1638      DEALLOCATE (d_q_emiss)
     1639      DEALLOCATE (R2SO4, R2SO4B)
     1640      DEALLOCATE (DENSO4, DENSO4B)
     1641      DEALLOCATE (f_r_wet, f_r_wetB)
    15121642      DEALLOCATE (decfluxaer)
    15131643      DEALLOCATE (mdw)
    15141644      DEALLOCATE (SO2_lifetime)
    15151645      DEALLOCATE (OCS_lifetime)
     1646      DEALLOCATE (H2SO4_lifetime)
     1647      DEALLOCATE (O3_clim)
    15161648      DEALLOCATE (alpha_bin)
    15171649      DEALLOCATE (piz_bin)
     
    15221654      DEALLOCATE (surf_PM25_sulf)
    15231655      DEALLOCATE (vsed_aer)
     1656      DEALLOCATE (sulfmmr)
     1657      DEALLOCATE (SAD_sulfate)
     1658      DEALLOCATE (reff_sulfate)
     1659      DEALLOCATE (sulfmmr_mode)
     1660      DEALLOCATE (nd_mode)
    15241661      DEALLOCATE (budg_3D_ocs_to_so2)
    15251662      DEALLOCATE (budg_3D_so2_to_h2so4)
  • LMDZ6/branches/cirrus/libf/phylmdiso/phys_output_ctrlout_mod.F90

    r5055 r5202  
    11121112  TYPE(ctrl_out), SAVE :: o_tke = ctrl_out((/ 4, 10, 10, 10, 10, 10, 11, 11, 11, 11/), &
    11131113    'tke ', 'TKE', 'm2/s2', (/ ('', i=1, 10) /))
     1114  TYPE(ctrl_out), SAVE :: o_tke_shear = ctrl_out((/ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11/), &
     1115    'tke_shear ', 'TKE shear term', 'm2/s3', (/ ('', i=1, 10) /)) 
     1116  TYPE(ctrl_out), SAVE :: o_tke_buoy = ctrl_out((/ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11/), &
     1117    'tke_buoy ', 'TKE buoyancy term', 'm2/s3', (/ ('', i=1, 10) /))
     1118  TYPE(ctrl_out), SAVE :: o_tke_trans = ctrl_out((/ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11/), &
     1119    'tke_trans ', 'TKE transport term', 'm2/s3', (/ ('', i=1, 10) /))
    11141120  TYPE(ctrl_out), SAVE :: o_tke_dissip = ctrl_out((/ 10, 10, 10, 10, 10, 10, 11, 11, 11, 11/), &
    1115     'tke_dissip ', 'TKE DISSIPATION', 'm2/s3', (/ ('', i=1, 10) /))   
     1121    'tke_dissip ', 'TKE dissipation term', 'm2/s3', (/ ('', i=1, 10) /))
     1122
    11161123  TYPE(ctrl_out), SAVE :: o_tke_max = ctrl_out((/ 4, 10, 10, 10, 10, 10, 11, 11, 11, 11/), &
    11171124    'tke_max', 'TKE max', 'm2/s2',                                  &
     
    14421449  TYPE(ctrl_out), SAVE :: o_tau_strat_1020 = ctrl_out((/ 11, 11, 11, 11, 11, 11, 11, 11, 11, 1/), &
    14431450    'OD1020_strat_only', 'Stratospheric Aerosol Optical depth at 1020 nm ', '1', (/ ('', i=1, 10) /))
     1451  TYPE(ctrl_out), SAVE :: o_SAD_sulfate = ctrl_out((/ 11, 11, 11, 11, 11, 11, 11, 11, 11, 1/), &
     1452    'SAD_sulfate', 'SAD WET sulfate aerosols', 'cm2/cm3', (/ ('', i=1, 10) /))
     1453  TYPE(ctrl_out), SAVE :: o_reff_sulfate = ctrl_out((/ 11, 11, 11, 11, 11, 11, 11, 11, 11, 1/), &
     1454    'reff_sulfate', 'Effective radius of WET sulfate aerosols', 'cm', (/ ('', i=1, 10) /))
     1455  TYPE(ctrl_out), SAVE :: o_sulfmmr = ctrl_out((/ 11, 11, 11, 11, 11, 11, 11, 11, 11, 1/), &
     1456    'sulfMMR', 'Sulfate aerosol concentration (dry mass mixing ratio)', 'kg(H2SO4)/kg(air)', (/ ('', i=1, 10) /))
     1457  TYPE(ctrl_out), SAVE, ALLOCATABLE :: o_nd_mode(:)
     1458  TYPE(ctrl_out), SAVE, ALLOCATABLE :: o_sulfmmr_mode(:)
    14441459!--chemistry
    14451460  TYPE(ctrl_out), SAVE :: o_R2SO4 = ctrl_out((/ 11, 11, 11, 11, 11, 11, 11, 11, 11, 1/), &
     
    15511566  TYPE(ctrl_out), SAVE :: o_rneb = ctrl_out((/ 2, 5, 10, 10, 10, 10, 11, 11, 11, 11/), &
    15521567    'rneb', 'Cloud fraction', '-', (/ ('', i=1, 10) /))
     1568  TYPE(ctrl_out), SAVE :: o_cldfraliq = ctrl_out((/ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11/), &
     1569    'cldfraliq', 'Liquid fraction of the cloud', '-', (/ ('', i=1, 10) /))
     1570  TYPE(ctrl_out), SAVE :: o_sigma2_icefracturb = ctrl_out((/ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11/), &
     1571    'sigma2_icefracturb', 'Variance of the diagnostic supersaturation distribution (icefrac_turb) [-]', '-', (/ ('', i=1, 10) /))
     1572  TYPE(ctrl_out), SAVE :: o_mean_icefracturb = ctrl_out((/ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11/), &
     1573    'mean_icefracturb', 'Mean of the diagnostic supersaturation distribution (icefrac_turb) [-]', '-', (/ ('', i=1, 10) /))
     1574 
    15531575  TYPE(ctrl_out), SAVE :: o_rnebjn = ctrl_out((/ 2, 5, 10, 10, 10, 10, 11, 11,11, 11/), &     
    15541576    'rnebjn', 'Cloud fraction in day', '-', (/ ('', i=1, 10) /))
     
    19812003  TYPE(ctrl_out), SAVE, ALLOCATABLE :: o_dtr_dry(:)
    19822004
    1983 
    19842005#ifdef ISO
    19852006  TYPE(ctrl_out), SAVE, ALLOCATABLE :: o_xtprecip(:)
     
    19912012  TYPE(ctrl_out), SAVE, ALLOCATABLE :: o_xtoliq(:)
    19922013  TYPE(ctrl_out), SAVE, ALLOCATABLE :: o_xtcond(:)
     2014  TYPE(ctrl_out), SAVE, ALLOCATABLE :: o_xtrunoff_diag(:)
    19932015  TYPE(ctrl_out), SAVE, ALLOCATABLE :: o_dxtdyn(:)
    19942016  TYPE(ctrl_out), SAVE, ALLOCATABLE :: o_dxtldyn(:)
     
    20882110  TYPE(ctrl_out), SAVE :: o_runoff = ctrl_out((/ 1, 1, 10, 1, 10, 10, 11, 11, 11, 11/), &
    20892111    'runoff', 'Run-off rate land ice', 'kg/m2/s', (/ ('', i=1, 10) /))
     2112! SN add runoff_diag
     2113!#ifdef ISO
     2114  TYPE(ctrl_out), SAVE :: o_runoff_diag = ctrl_out((/ 1, 1, 10, 1, 10, 10, 11, 11, 11, 11/), &
     2115    'runoffland', 'Run-off rate land for bucket', 'kg/m2/s', (/ ('', i=1, 10) /))
     2116!#endif
    20902117  TYPE(ctrl_out), SAVE :: o_albslw3 = ctrl_out((/ 1, 1, 1, 1, 10, 10, 11, 11, 11, 11/), &
    20912118    'albslw3', 'Surface albedo LW3', '-', (/ ('', i=1, 10) /))
  • LMDZ6/branches/cirrus/libf/phylmdiso/physiq_mod.F90

    r5055 r5202  
    3939    USE ioipsl_getin_p_mod, ONLY : getin_p
    4040    USE indice_sol_mod
    41     USE infotrac_phy, ONLY: nqtot, nbtr, nqo, tracers, type_trac
     41    USE infotrac_phy, ONLY: nqtot, nbtr, nqo, tracers, type_trac,ivap,iliq,isol
    4242    USE readTracFiles_mod, ONLY: addPhase
    4343    USE strings_mod,  ONLY: strIdx
     
    9393    USE phys_output_var_mod, ONLY : cloud_cover_sw, cloud_cover_sw_s2
    9494
     95
    9596    !USE cmp_seri_mod
    9697!    USE add_phys_tend_mod, only : add_pbl_tend, add_phys_tend, diag_phys_tend, prt_enerbil, &
     
    117118    USE chem_rep, ONLY: Init_chem_rep_xjour, d_q_rep, d_ql_rep, d_qi_rep, &
    118119                        ptrop, ttrop, ztrop, gravit, itroprep, Z1, Z2, fac, B
     120    USE strataer_local_var_mod
     121    USE strataer_emiss_mod, ONLY: strataer_emiss_init
    119122#endif
    120123#if defined INCA || defined REPROBUS
     
    131134
    132135#ifdef CPP_StratAer
     136    USE phys_local_var_mod, ONLY: d_q_emiss
    133137    USE strataer_local_var_mod
    134138    USE strataer_nuc_mod, ONLY: strataer_nuc_init
    135139    USE strataer_emiss_mod, ONLY: strataer_emiss_init
    136140#endif
    137 
    138141
    139142    USE lmdz_xios, ONLY: xios_update_calendar, xios_context_finalize
     
    153156        & modif_ratqs,essai_convergence,iso_init,ridicule_rain,tnat, &
    154157        & ridicule,ridicule_snow
    155     USE isotopes_routines_mod, ONLY: iso_tritium
     158    USE isotopes_routines_mod, ONLY: iso_tritium,dispatch,together
    156159#ifdef ISOVERIF
    157160    USE isotopes_verif_mod, ONLY: errmax,errmaxrel, &
     
    188191!!!!!!!!!!!!!!!!!!  END "USE" for CPP keys !!!!!!!!!!!!!!!!!!!!!!
    189192
     193USE physiqex_mod, ONLY : physiqex
    190194USE phys_local_var_mod, ONLY: phys_local_var_init, phys_local_var_end, &
    191195       ! [Variables internes non sauvegardees de la physique]
     
    193197       t_seri,q_seri,ql_seri,qs_seri,qbs_seri, &
    194198       u_seri,v_seri,cf_seri,rvc_seri,tr_seri, &
     199       rhcl, &       
     200       qx_seri, & ! CR
    195201       rhcl, &       
    196202       ! Dynamic tendencies (diagnostics)
     
    209215       !
    210216       d_t_eva,d_q_eva,d_ql_eva,d_qi_eva, &
     217       d_qx_eva, &
    211218       d_t_lsc,d_q_lsc,d_ql_lsc,d_qi_lsc, &
    212219       d_t_lscst,d_q_lscst, &
     
    219226       d_ts, &
    220227       !
    221        d_t_bs,d_q_bs,d_qbs_bs, &
     228       d_t_bsss,d_q_bsss,d_qbs_bsss, &
    222229       !
    223230!       d_t_oli,d_u_oli,d_v_oli, &
     
    247254       toplwai_aero,sollwai_aero,   &
    248255       toplwad0_aero,sollwad0_aero, &
     256       !pour Ecrad
     257       topswad_aero_s2, solswad_aero_s2,   &
     258       topswai_aero_s2, solswai_aero_s2,   &
     259       topswad0_aero_s2, solswad0_aero_s2, &
     260       topsw_aero_s2, topsw0_aero_s2,      &
     261       solsw_aero_s2, solsw0_aero_s2,      &
     262       topswcf_aero_s2, solswcf_aero_s2,   &
     263       !LW diagnostics
     264       toplwad_aero_s2, sollwad_aero_s2,   &
     265       toplwai_aero_s2, sollwai_aero_s2,   &
     266       toplwad0_aero_s2, sollwad0_aero_s2, &
    249267       !
    250268       topsw_aero,solsw_aero,       &
     
    265283       toplwai_aerop, sollwai_aerop,   &
    266284       toplwad0_aerop, sollwad0_aerop, &
     285       !pour Ecrad
     286       topswad_aero_s2, solswad_aero_s2,   &
     287       topswai_aero_s2, solswai_aero_s2,   &
     288       topswad0_aero_s2, solswad0_aero_s2, &
     289       topsw_aero_s2, topsw0_aero_s2,      &
     290       solsw_aero_s2, solsw0_aero_s2,      &
     291       topswcf_aero_s2, solswcf_aero_s2,   &
     292       !LW diagnostics
     293       toplwad_aero_s2, sollwad_aero_s2,   &
     294       toplwai_aero_s2, sollwai_aero_s2,   &
     295       toplwad0_aero_s2, sollwad0_aero_s2, &
    267296       !
    268297       ptstar, pt0, slp, &
     
    346375       !
    347376       rneblsvol, &
    348        pfraclr,pfracld, &
    349        distcltop,temp_cltop, &
     377       pfraclr, pfracld, cldfraliq, sigma2_icefracturb, mean_icefracturb, &
     378       distcltop, temp_cltop, &
    350379       !-- LSCP - condensation and ice supersaturation variables
    351380       qsub, qissr, qcld, subfra, issrfra, gamma_cond, ratio_qi_qtot, &
     
    384413
    385414#ifdef ISO
    386        USE phys_local_var_mod, ONLY: xt_seri,xtl_seri,xts_seri, &
     415       USE phys_local_var_mod, ONLY: xt_seri,xtl_seri,xts_seri,xtbs_seri, &
    387416       d_xt_eva,d_xtl_eva,d_xti_eva,           &
    388        d_xt_dyn,d_xtl_dyn,d_xts_dyn,          &
     417       d_xt_dyn,d_xtl_dyn,d_xts_dyn,d_xtbs_dyn, &
    389418       d_xt_con, d_xt_wake,                    &
    390419       d_xt_ajsb, d_xt_ajs,                    &
     
    412441       USE phys_output_var_mod, ONLY: scdnc, cldncl, reffclwtop, lcc, reffclws, &
    413442       reffclwc, cldnvi, lcc3d, lcc3dcon, lcc3dstra, icc3dcon, icc3dstra
     443       USE output_physiqex_mod, ONLY: output_physiqex
    414444
    415445
     
    556586    !
    557587    ! indices de traceurs eau vapeur, liquide, glace, fraction nuageuse LS (optional), blowing snow (optional)
    558     INTEGER,SAVE :: ivap, iliq, isol, ibs, icf, irvc
    559 !$OMP THREADPRIVATE(ivap, iliq, isol, ibs, icf, irvc)
    560     !
     588!    INTEGER,SAVE :: ivap, iliq, isol, irneb, ibs
     589!!$OMP THREADPRIVATE(ivap, iliq, isol, irneb, ibs)
     590! Camille Risi 25 juillet 2023: ivap,iliq,isol deja definis dans infotrac_phy.
     591! Et ils sont utiles ailleurs que dans physiq_mod (ex:
     592! reevap -> je commente les 2 lignes au dessus et je laisse la definition
     593! plutot dans infotrac_phy
     594    INTEGER,SAVE :: irneb, ibs, icf,irvc
     595!$OMP THREADPRIVATE(irneb, ibs, icf,irvc)
     596!
    561597    !
    562598    ! Variables argument:
     
    812848    real therm_tke_max0(klon)   ! TKE dans les thermiques au LCL
    813849    real env_tke_max0(klon)     ! TKE dans l'environnement au LCL
     850    INTEGER, SAVE :: iflag_thermcell_tke ! transtport TKE by thermals
     851    !$OMP THREADPRIVATE(iflag_thermcell_tke)
    814852
    815853!JLD    !---D\'eclenchement stochastique
     
    900938    EXTERNAL ajsec     ! ajustement sec
    901939    EXTERNAL conlmd    ! convection (schema LMD)
    902     !KE43
    903940    EXTERNAL conema3  ! convect4.3
    904     !AA
    905     ! JBM (3/14) fisrtilp_tr not loaded
    906     ! EXTERNAL fisrtilp_tr ! schema de condensation a grande echelle (pluie)
    907     !                          ! stockage des coefficients necessaires au
    908     !                          ! lessivage OFF-LINE et ON-LINE
    909941    EXTERNAL hgardfou  ! verifier les temperatures
    910942    EXTERNAL nuage     ! calculer les proprietes radiatives
     
    960992    REAL conv_t(klon,klev) ! convergence de la temperature(K/s)
    961993    !
    962 #ifdef INCA
    963     REAL zxsnow_dummy(klon)
    964 #endif
    965994    REAL zsav_tsol(klon)
    966995    !
     
    10681097    !$OMP THREADPRIVATE(ok_bug_split_th)
    10691098
     1099    ! Logical switch to a bug : modifying directly wake_deltat  by adding
     1100    ! the (w) dry adjustment tendency to wake_deltat
     1101    LOGICAL, SAVE :: ok_bug_ajs_cv = .TRUE.
     1102    !$OMP THREADPRIVATE(ok_bug_ajs_cv)
    10701103    !
    10711104    !********************************************************
     
    12051238    REAL, DIMENSION(klon,klev)     :: mass_solu_aero_pi
    12061239    ! - " - (pre-industrial value)
     1240    REAL, DIMENSION(klon,klev,naero_tot) :: m_allaer
    12071241
    12081242    ! Parameters
     
    12711305    ! Declarations pour Simulateur COSP
    12721306    !============================================================
     1307    ! AI 10-22
     1308#ifdef CPP_COSP
     1309    include "ini_COSP.h"
     1310#endif
     1311#ifdef CPP_COSPV2
     1312    include "ini_COSP.h"
     1313#endif
    12731314    real :: mr_ozone(klon,klev), phicosp(klon,klev)
    12741315
     
    13461387
    13471388    REAL, dimension(klon,klev) :: t_env,q_env
     1389#ifdef ISO
     1390    real, dimension(ntraciso,klon,klev) ::  xt_env
     1391#endif
    13481392
    13491393    REAL, dimension(klon) :: pr_et
     
    13561400    !AI namelist pour gerer le double appel de Ecrad
    13571401    CHARACTER(len=512) :: namelist_ecrad_file
     1402
     1403    !======================================================================!
     1404    ! Bifurcation vers un nouveau moniteur physique pour experimenter      !
     1405    ! des solutions et préparer le couplage avec la physique de MesoNH     !
     1406    ! 14 mai 2023                                                          !
     1407    !======================================================================!
     1408    if (debut) then                                                        !
     1409       iflag_physiq=0
     1410       call getin_p('iflag_physiq', iflag_physiq)                          !
     1411    endif                                                                  !
     1412    if ( iflag_physiq == 2 ) then
     1413#ifdef ISO
     1414       abort_message='isotopes pas encore dans physiqex'
     1415       CALL abort_physic(modname,abort_message,1)
     1416#endif
     1417       call physiqex (nlon,nlev, &                                         !
     1418       debut,lafin,pdtphys_, &                                             !
     1419       paprs,pplay,pphi,pphis,presnivs, &                                  !
     1420       u,v,rot,t,qx, &                                                     !
     1421       flxmass_w, &                                                        !
     1422       d_u, d_v, d_t, d_qx, d_ps)                                          !
     1423       return                                                              !
     1424    endif                                                                  !
     1425    !======================================================================!
     1426
    13581427
    13591428    pi = 4. * ATAN(1.)
     
    13721441    phys_tstep=NINT(pdtphys)
    13731442    IF (.NOT. using_xios) missing_val=nf90_fill_real
    1374 #ifdef CPP_XIOS
    1375 ! switch to XIOS LMDZ physics context
    1376     IF (.NOT. debut .AND. is_omp_master) THEN
    1377        CALL wxios_set_context()
    1378        CALL xios_update_calendar(itap+1)
     1443
     1444    IF (using_xios) THEN
     1445      ! switch to XIOS LMDZ physics context
     1446      IF (.NOT. debut .AND. is_omp_master) THEN
     1447        CALL wxios_set_context()
     1448        CALL xios_update_calendar(itap+1)
     1449      ENDIF
    13791450    ENDIF
    1380 #endif
    13811451
    13821452    !======================================================================
     
    13841454    ! Utilise notamment en 1D mais peut etre active egalement en 3D
    13851455    ! en imposant la valeur de igout.
    1386     !======================================================================d
     1456    !======================================================================
    13871457    IF (prt_level.ge.1) THEN
    13881458       igout=klon/2+1/klon
     
    14411511            read_climoz, &
    14421512            alp_offset)
     1513       CALL init_etat0_limit_unstruct
     1514       IF (.NOT. create_etat0_limit) CALL init_limit_read(days_elapsed)
    14431515       CALL phys_state_var_init(read_climoz)
    14441516       CALL phys_output_var_init
    14451517       IF (read_climoz>=1 .AND. create_etat0_limit .AND. grid_type==unstructured) &
    14461518          CALL regr_horiz_time_climoz(read_climoz,ok_daily_climoz)
     1519
     1520#ifdef REPROBUS
     1521       CALL strataer_init
     1522       CALL strataer_emiss_init
     1523#endif
    14471524
    14481525#ifdef CPP_StratAer
     
    14881565
    14891566        IF (ok_bs) THEN
     1567#ifdef ISO
    14901568          abort_message='blowing snow cannot be activated with water isotopes yet'
    14911569          CALL abort_physic(modname,abort_message, 1)
     
    14971575         ENDIF
    14981576        ENDIF
     1577
    14991578       Ncvpaseq1 = 0
    15001579       dnwd0=0.0
     
    15381617       tau_gl=86400.*tau_gl
    15391618       WRITE(lunout,*) 'debut physiq_mod tau_gl=',tau_gl
     1619       iflag_thermcell_tke=0
     1620       call getin_p('iflag_thermcell_tke', iflag_thermcell_tke)                          !
    15401621
    15411622       CALL getin_p('iflag_alp_wk_cond', iflag_alp_wk_cond)
     
    15601641       CALL getin_p('ok_bug_cv_trac',ok_bug_cv_trac)
    15611642       CALL getin_p('ok_bug_split_th',ok_bug_split_th)
     1643       CALL getin_p('ok_bug_ajs_cv',ok_bug_ajs_cv)
    15621644       fl_ebil = 0 ! by default, conservation diagnostics are desactivated
    15631645       CALL getin_p('fl_ebil',fl_ebil)
     
    15961678       CALL infocfields_init
    15971679
     1680       !AI 08 2023
    15981681#ifdef CPP_ECRAD
    15991682       ok_3Deffect=.false.
     
    18751958      IF (.NOT. create_etat0_limit) CALL init_readaerosolstrato(flag_aerosol_strat)  !! initialise aero strato from file for XIOS interpolation (unstructured_grid)
    18761959
     1960      ! A.I : Initialisations pour le 1er passage a Cosp
     1961      if (ok_cosp) then
     1962
    18771963#ifdef CPP_COSP
    1878       IF (ok_cosp) THEN
    1879 !           DO k = 1, klev
    1880 !             DO i = 1, klon
    1881 !               phicosp(i,k) = pphi(i,k) + pphis(i)
    1882 !             ENDDO
    1883 !           ENDDO
     1964        CALL ini_COSP(ref_liq_cosp0,ref_ice_cosp0,pctsrf_cosp0,zu10m_cosp0,zv10m_cosp0, &
     1965               zxtsol_cosp0,zx_rh_cosp0,cldfra_cosp0,rnebcon_cosp0,flwc_cosp0, &
     1966               fiwc_cosp0,prfl_cosp0,psfl_cosp0,pmflxr_cosp0,pmflxs_cosp0, &
     1967               mr_ozone_cosp0,cldtau_cosp0,cldemi_cosp0,JrNt_cosp0)
     1968
    18841969        CALL phys_cosp(itap,phys_tstep,freq_cosp, &
    18851970               ok_mensuelCOSP,ok_journeCOSP,ok_hfCOSP, &
    18861971               ecrit_mth,ecrit_day,ecrit_hf, ok_all_xml, missing_val, &
    18871972               klon,klev,longitude_deg,latitude_deg,presnivs,overlap, &
    1888                JrNt,ref_liq,ref_ice, &
    1889                pctsrf(:,is_ter)+pctsrf(:,is_lic), &
    1890                zu10m,zv10m,pphis, &
    1891                zphi,paprs(:,1:klev),pplay,zxtsol,t_seri, &
    1892                qx(:,:,ivap),zx_rh,cldfra,rnebcon,flwc,fiwc, &
    1893                prfl(:,1:klev),psfl(:,1:klev), &
    1894                pmflxr(:,1:klev),pmflxs(:,1:klev), &
    1895                mr_ozone,cldtau, cldemi)
    1896       ENDIF
    1897 #endif
    1898 
    1899 #ifdef CPP_COSP2
    1900         IF (ok_cosp) THEN
    1901 !           DO k = 1, klev
    1902 !             DO i = 1, klon
    1903 !               phicosp(i,k) = pphi(i,k) + pphis(i)
    1904 !             ENDDO
    1905 !           ENDDO
    1906           CALL phys_cosp2(itap,phys_tstep,freq_cosp, &
    1907                ok_mensuelCOSP,ok_journeCOSP,ok_hfCOSP, &
    1908                ecrit_mth,ecrit_day,ecrit_hf, ok_all_xml, missing_val, &
    1909                klon,klev,longitude_deg,latitude_deg,presnivs,overlap, &
    1910                JrNt,ref_liq,ref_ice, &
    1911                pctsrf(:,is_ter)+pctsrf(:,is_lic), &
    1912                zu10m,zv10m,pphis, &
    1913                zphi,paprs(:,1:klev),pplay,zxtsol,t_seri, &
    1914                qx(:,:,ivap),zx_rh,cldfra,rnebcon,flwc,fiwc, &
    1915                prfl(:,1:klev),psfl(:,1:klev), &
    1916                pmflxr(:,1:klev),pmflxs(:,1:klev), &
    1917                mr_ozone,cldtau, cldemi)
    1918        ENDIF
     1973               JrNt_cosp0,ref_liq_cosp0,ref_ice_cosp0, &
     1974               pctsrf_cosp0, &
     1975               zu10m_cosp0,zv10m_cosp0,pphis, &
     1976               pphi,paprs(:,1:klev),pplay,zxtsol_cosp0,t, &
     1977               qx(:,:,ivap),zx_rh_cosp0,cldfra_cosp0,rnebcon_cosp0,flwc_cosp0,fiwc_cosp0, &
     1978               prfl_cosp0(:,1:klev),psfl_cosp0(:,1:klev), &
     1979               pmflxr_cosp0(:,1:klev),pmflxs_cosp0(:,1:klev), &
     1980               mr_ozone_cosp0,cldtau_cosp0, cldemi_cosp0)
    19191981#endif
    19201982
    19211983#ifdef CPP_COSPV2
    1922         IF (ok_cosp) THEN
    1923            DO k = 1, klev
    1924              DO i = 1, klon
    1925                phicosp(i,k) = pphi(i,k) + pphis(i)
    1926              ENDDO
    1927            ENDDO
     1984          CALL ini_COSP(ref_liq_cosp0,ref_ice_cosp0,pctsrf_cosp0,zu10m_cosp0,zv10m_cosp0, &
     1985               zxtsol_cosp0,zx_rh_cosp0,cldfra_cosp0,rnebcon_cosp0,flwc_cosp0, &
     1986               fiwc_cosp0,prfl_cosp0,psfl_cosp0,pmflxr_cosp0,pmflxs_cosp0, &
     1987               mr_ozone_cosp0,cldtau_cosp0,cldemi_cosp0,JrNt_cosp0)
     1988
    19281989          CALL lmdz_cosp_interface(itap,phys_tstep,freq_cosp, &
    19291990               ok_mensuelCOSP,ok_journeCOSP,ok_hfCOSP, &
    19301991               ecrit_mth,ecrit_day,ecrit_hf, ok_all_xml, missing_val, &
    19311992               klon,klev,longitude_deg,latitude_deg,presnivs,overlap, &
    1932                JrNt,ref_liq,ref_ice, &
    1933                pctsrf(:,is_ter)+pctsrf(:,is_lic), &
    1934                zu10m,zv10m,pphis, &
    1935                phicosp,paprs(:,1:klev),pplay,zxtsol,t_seri, &
    1936                qx(:,:,ivap),zx_rh,cldfra,rnebcon,flwc,fiwc, &
    1937                prfl(:,1:klev),psfl(:,1:klev), &
    1938                pmflxr(:,1:klev),pmflxs(:,1:klev), &
    1939                mr_ozone,cldtau, cldemi)
    1940        ENDIF
    1941 #endif
     1993               JrNt_cosp0,ref_liq_cosp0,ref_ice_cosp0, &
     1994               pctsrf_cosp0, &
     1995               zu10m_cosp0,zv10m_cosp0,pphis, &
     1996               pphi,paprs(:,1:klev),pplay,zxtsol_cosp0,t, &
     1997               qx(:,:,ivap),zx_rh_cosp0,cldfra_cosp0,rnebcon_cosp0,flwc_cosp0,fiwc_cosp0, &
     1998               prfl_cosp0(:,1:klev),psfl_cosp0(:,1:klev), &
     1999               pmflxr_cosp0(:,1:klev),pmflxs_cosp0(:,1:klev), &
     2000               mr_ozone_cosp0,cldtau_cosp0, cldemi_cosp0)
     2001#endif
     2002
     2003      endif !ok_cosp
    19422004
    19432005       !
     
    20142076
    20152077
    2016 #ifdef CPP_XIOS
    2017        IF (is_omp_master) CALL xios_update_calendar(1)
    2018 #endif
     2078       IF (using_xios) THEN
     2079         IF (is_omp_master) CALL xios_update_calendar(1)
     2080       ENDIF
     2081       
    20192082       IF(read_climoz>=1 .AND. create_etat0_limit) CALL regr_horiz_time_climoz(read_climoz,ok_daily_climoz)
    20202083       CALL create_etat0_limit_unstruct
     
    22132276       ENDIF
    22142277
    2215       IF (using_xios) THEN
    2216 ! Need to put this initialisation after phyetat0 as in the coupled model the XIOS context is only
    2217 ! initialised at that moment
    2218        ! Get "missing_val" value from XML files (from temperature variable)
    2219         IF (is_omp_master) CALL xios_get_field_attr("temp",default_value=missing_val)
    2220         CALL bcast_omp(missing_val)
    2221        
     2278       IF (using_xios) THEN   
     2279         ! Need to put this initialisation after phyetat0 as in the coupled model the XIOS context is only
     2280         ! initialised at that moment
     2281         ! Get "missing_val" value from XML files (from temperature variable)
     2282         IF (is_omp_master) CALL xios_get_field_attr("temp",default_value=missing_val)
     2283         CALL bcast_omp(missing_val)
    22222284       !
    22232285       ! Now we activate some double radiation call flags only if some
    22242286       ! diagnostics are requested, otherwise there is no point in doing this
    2225        IF (is_master) THEN
    2226          !--setting up swaero_diag to TRUE in XIOS case
    2227          IF (xios_field_is_active("topswad").OR.xios_field_is_active("topswad0").OR. &
    2228             xios_field_is_active("solswad").OR.xios_field_is_active("solswad0").OR. &
    2229             xios_field_is_active("topswai").OR.xios_field_is_active("solswai").OR.  &
    2230               (iflag_rrtm==1.AND.(xios_field_is_active("toplwad").OR.xios_field_is_active("toplwad0").OR. &
    2231                                   xios_field_is_active("sollwad").OR.xios_field_is_active("sollwad0"))))  &
    2232             !!!--for now these fields are not in the XML files so they are omitted
    2233             !!!  xios_field_is_active("toplwai").OR.xios_field_is_active("sollwai") !))) &
    2234             swaero_diag=.TRUE.
     2287         IF (is_master) THEN
     2288           !--setting up swaero_diag to TRUE in XIOS case
     2289           IF (xios_field_is_active("topswad").OR.xios_field_is_active("topswad0").OR. &
     2290              xios_field_is_active("solswad").OR.xios_field_is_active("solswad0").OR. &
     2291              xios_field_is_active("topswai").OR.xios_field_is_active("solswai").OR.  &
     2292                (iflag_rrtm==1.AND.(xios_field_is_active("toplwad").OR.xios_field_is_active("toplwad0").OR. &
     2293                                    xios_field_is_active("sollwad").OR.xios_field_is_active("sollwad0"))))  &
     2294              !!!--for now these fields are not in the XML files so they are omitted
     2295              !!!  xios_field_is_active("toplwai").OR.xios_field_is_active("sollwai") !))) &
     2296              swaero_diag=.TRUE.
    22352297 
    2236          !--setting up swaerofree_diag to TRUE in XIOS case
    2237          IF (xios_field_is_active("SWdnSFCcleanclr").OR.xios_field_is_active("SWupSFCcleanclr").OR. &
    2238             xios_field_is_active("SWupTOAcleanclr").OR.xios_field_is_active("rsucsaf").OR.   &
    2239             xios_field_is_active("rsdcsaf") .OR. xios_field_is_active("LWdnSFCcleanclr").OR. &
    2240             xios_field_is_active("LWupTOAcleanclr")) &
    2241             swaerofree_diag=.TRUE.
     2298           !--setting up swaerofree_diag to TRUE in XIOS case
     2299           IF (xios_field_is_active("SWdnSFCcleanclr").OR.xios_field_is_active("SWupSFCcleanclr").OR. &
     2300              xios_field_is_active("SWupTOAcleanclr").OR.xios_field_is_active("rsucsaf").OR.   &
     2301              xios_field_is_active("rsdcsaf") .OR. xios_field_is_active("LWdnSFCcleanclr").OR. &
     2302              xios_field_is_active("LWupTOAcleanclr")) &
     2303              swaerofree_diag=.TRUE.
    22422304 
    2243          !--setting up dryaod_diag to TRUE in XIOS case
    2244          DO naero = 1, naero_tot-1
    2245           IF (xios_field_is_active("dryod550_"//name_aero_tau(naero))) dryaod_diag=.TRUE.
    2246          ENDDO
    2247          !
    2248          !--setting up ok_4xCO2atm to TRUE in XIOS case
    2249          IF (xios_field_is_active("rsut4co2").OR.xios_field_is_active("rlut4co2").OR. &
    2250             xios_field_is_active("rsutcs4co2").OR.xios_field_is_active("rlutcs4co2").OR. &
    2251             xios_field_is_active("rsu4co2").OR.xios_field_is_active("rsucs4co2").OR. &
    2252             xios_field_is_active("rsd4co2").OR.xios_field_is_active("rsdcs4co2").OR. &
    2253             xios_field_is_active("rlu4co2").OR.xios_field_is_active("rlucs4co2").OR. &
    2254             xios_field_is_active("rld4co2").OR.xios_field_is_active("rldcs4co2")) &
    2255             ok_4xCO2atm=.TRUE.
    2256        ENDIF
    2257        !$OMP BARRIER
    2258        CALL bcast(swaero_diag)
    2259        CALL bcast(swaerofree_diag)
    2260        CALL bcast(dryaod_diag)
    2261        CALL bcast(ok_4xCO2atm)
    2262 
    2263      ENDIF !using_xios
    2264 
     2305           !--setting up dryaod_diag to TRUE in XIOS case
     2306           DO naero = 1, naero_tot-1
     2307             IF (xios_field_is_active("dryod550_"//name_aero_tau(naero))) dryaod_diag=.TRUE.
     2308           ENDDO
     2309           !
     2310          !--setting up ok_4xCO2atm to TRUE in XIOS case
     2311           IF (xios_field_is_active("rsut4co2").OR.xios_field_is_active("rlut4co2").OR. &
     2312              xios_field_is_active("rsutcs4co2").OR.xios_field_is_active("rlutcs4co2").OR. &
     2313              xios_field_is_active("rsu4co2").OR.xios_field_is_active("rsucs4co2").OR. &
     2314              xios_field_is_active("rsd4co2").OR.xios_field_is_active("rsdcs4co2").OR. &
     2315              xios_field_is_active("rlu4co2").OR.xios_field_is_active("rlucs4co2").OR. &
     2316              xios_field_is_active("rld4co2").OR.xios_field_is_active("rldcs4co2")) &
     2317              ok_4xCO2atm=.TRUE.
     2318           ENDIF
     2319           !$OMP BARRIER
     2320           CALL bcast(swaero_diag)
     2321           CALL bcast(swaerofree_diag)
     2322           CALL bcast(dryaod_diag)
     2323           CALL bcast(ok_4xCO2atm)
     2324         ENDIF !using_xios
    22652325       !
    22662326       CALL printflag( tabcntr0,radpas,ok_journe, &
     
    25492609          u_seri(i,k)  = u(i,k)
    25502610          v_seri(i,k)  = v(i,k)
     2611          qx_seri(i,k,:)  = qx(i,k,:)
    25512612          q_seri(i,k)  = qx(i,k,ivap)
    25522613          ql_seri(i,k) = qx(i,k,iliq)
     
    25902651      DO k = 1, klev
    25912652       DO i = 1, klon
     2653          xtbs_seri(ixt,i,k) = 0.
    25922654          xt_seri(ixt,i,k)  = qx(i,k,iqIsoPha(ixt,ivap))
    25932655          xtl_seri(ixt,i,k) = qx(i,k,iqIsoPha(ixt,iliq))
     
    26102672    qql1(:)=0.0
    26112673    DO k = 1, klev
    2612       qql1(:)=qql1(:)+(q_seri(:,k)+ql_seri(:,k)+qs_seri(:,k)+qbs_seri(:,k))*zmasse(:,k)
     2674      qql1(:)=qql1(:)+(q_seri(:,k)+ql_seri(:,k))*zmasse(:,k)
     2675      IF (nqo >= 3) THEN
     2676        qql1(:)=qql1(:)+qs_seri(:,k)*zmasse(:,k)
     2677      ENDIF
     2678      IF (ok_bs) THEN
     2679        qql1(:)=qql1(:)+qbs_seri(:,k)*zmasse(:,k)
     2680      ENDIF
    26132681    ENDDO
    26142682#ifdef ISO
    2615 #ifdef ISOVERIF
    2616         write(*,*) 'physiq tmp 1913'
    2617 #endif
    2618     do ixt=1,ntraciso
     2683    DO ixt=1,ntraciso
    26192684    xtql1(ixt,:)=0.0
    26202685    DO k = 1, klev
    2621       xtql1(ixt,:)=xtql1(ixt,:)+(xt_seri(ixt,:,k)+xtl_seri(ixt,:,k)+xts_seri(ixt,:,k))*zmasse(:,k)
    2622     ENDDO
    2623     enddo !do ixt=1,ntraciso
     2686      xtql1(ixt,:)=xtql1(ixt,:)+(xt_seri(ixt,:,k)+xtl_seri(ixt,:,k))*zmasse(:,k)
     2687      IF (nqo >= 3) THEN
     2688        xtql1(ixt,:)=xtql1(ixt,:)+xts_seri(ixt,:,k)*zmasse(:,k)
     2689      ENDIF
     2690      IF (ok_bs) THEN
     2691        xtql1(ixt,:)=xtql1(ixt,:)+xtbs_seri(ixt,:,k)*zmasse(:,k)
     2692      ENDIF
     2693    ENDDO !DO k = 1, klev
     2694    ENDDO !DO ixt=1,ntraciso
    26242695#endif
    26252696    ENDIF
     
    26332704         IF(.NOT.tracers(iq)%isInPhysics) CYCLE
    26342705         itr = itr+1
    2635 !#ifdef ISOVERIF
    2636 !         write(*,*) 'physiq 1973: itr,iq=',itr,iq
    2637 !         write(*,*) 'qx(1,1,iq)=',qx(1,1,iq)
    2638 !#endif
    2639          DO  k = 1, klev
     2706          DO  k = 1, klev
    26402707             DO  i = 1, klon
    26412708                tr_seri(i,k,itr) = qx(i,k,iq)
     
    27522819              d_xts_dyn(ixt,i,k) =  &
    27532820     &           (xts_seri(ixt,i,k)-xts_ancien(ixt,i,k))/phys_tstep
     2821              d_xtbs_dyn(ixt,i,k) =  &
     2822     &           (xtbs_seri(ixt,i,k)-xtbs_ancien(ixt,i,k))/phys_tstep
    27542823            enddo ! do ixt=1,ntraciso
    27552824         ENDDO
     
    27652834           call iso_verif_noNaN(d_xtl_dyn(ixt,i,k),'physiq 2220d')
    27662835           call iso_verif_noNaN(d_xts_dyn(ixt,i,k),'physiq 2220e')
     2836           call iso_verif_noNaN(d_xtbs_dyn(ixt,i,k),'physiq 2220f')
    27672837           enddo ! do ixt=1,ntraciso
    27682838         enddo
     
    28482918       ! !! RomP <<<
    28492919       ancien_ok = .TRUE.
     2920#ifdef ISO
     2921       d_xtbs_dyn(:,:,:)=0.0
     2922#endif
    28502923    ENDIF
    28512924    !
     
    29863059    ! Re-evaporer l'eau liquide nuageuse
    29873060    !
    2988      CALL reevap (klon,klev,iflag_ice_thermo,t_seri,q_seri,ql_seri,qs_seri, &
    2989    &         d_t_eva,d_q_eva,d_ql_eva,d_qi_eva &
    2990 #ifdef ISO
    2991              ,xt_seri,xtl_seri,xts_seri,d_xt_eva,d_xtl_eva,d_xti_eva &
    2992 #endif
    2993    &     )
     3061     CALL reevap (klon,klev,iflag_ice_thermo,t_seri,qx_seri, &
     3062   &         d_t_eva,d_qx_eva)
     3063
     3064     call dispatch(klon,klev,qx_seri,q_seri,xt_seri,ql_seri,xtl_seri,qs_seri,xts_seri)
     3065     call dispatch(klon,klev,d_qx_eva,d_q_eva,d_xt_eva,d_ql_eva,d_xtl_eva,d_qi_eva,d_xti_eva)
     3066
     3067
     3068#ifdef ISO
     3069#ifdef ISOVERIF
     3070 DO k = 1, klev
     3071     DO i = 1, klon
     3072      do ixt=1,ntraciso
     3073      call iso_verif_noNaN(xt_seri(ixt,i,k), &
     3074     &     'reevap 2417: apres evap tot')
     3075      enddo
     3076      if (iso_eau.gt.0) then
     3077              call iso_verif_egalite_choix( &
     3078     &           xt_seri(iso_eau,i,k),q_seri(i,k), &
     3079     &          'reevap 1891, après réévap totale',errmax,errmaxrel)
     3080              call iso_verif_egalite_choix( &
     3081     &           xtl_seri(iso_eau,i,k),ql_seri(i,k), &
     3082     &          'reevap 2209, après réévap totale',errmax,errmaxrel)
     3083              call iso_verif_egalite_choix( &
     3084     &           xts_seri(iso_eau,i,k),qs_seri(i,k), &
     3085     &          'reevap 2209b, après réévap totale',errmax,errmaxrel)
     3086       endif !if (iso_eau.gt.0) then
     3087     
     3088      if ((iso_HDO.gt.0).and.(iso_O18.gt.0)) then 
     3089            if (q_seri(i,k).gt.ridicule) then 
     3090               if (iso_verif_o18_aberrant_nostop( &
     3091     &              xt_seri(iso_HDO,i,k)/q_seri(i,k), &
     3092     &              xt_seri(iso_O18,i,k)/q_seri(i,k), &
     3093     &              'reevap 2408: apres reevap totale').eq.1) then
     3094                  write(*,*) 'i,k,q_seri(i,k)=',i,k,q_seri(i,k)                       
     3095                  stop
     3096              endif !  if (iso_verif_o18_aberrant_nostop
     3097            endif !if (q_seri(i,k).gt.errmax) then   
     3098        endif !if ((iso_HDO.gt.0).and.(iso_O18.gt.0)) then       
     3099#ifdef ISOTRAC     
     3100             call iso_verif_traceur(xt_seri(1,i,k), &
     3101     &           'reevap 2165c')
     3102             call iso_verif_traceur_pbidouille(xt_seri(1,i,k), &
     3103     &           'reevap 2165d')
     3104#endif
     3105       ENDDO
     3106    ENDDO               
     3107#endif                 
     3108#endif
     3109
    29943110
    29953111     CALL add_phys_tend &
     
    31233239    ! Calcul de l'humidite de saturation au niveau du sol
    31243240
     3241! Tests Fredho, instensibilite au pas de temps -------------------------------
     3242! A detruire en 2024 une fois les tests documentes et les choix faits        !
     3243! Conservation des variables avant l'appel à l a diffusion pour les tehrmic  !
     3244    if (iflag_thermals_tenv / 10 == 1 ) then                                 !
     3245        do k=1,klev                                                          !
     3246           do i=1,klon                                                       !
     3247              t_env(i,k)=t_seri(i,k)                                         !
     3248              q_env(i,k)=q_seri(i,k)   
     3249#ifdef ISO
     3250              do ixt=1,ntraciso
     3251                xt_env(ixt,i,k)=xt_seri(ixt,i,k)
     3252              enddo
     3253#endif
     3254           enddo                                                             !
     3255        enddo                                                                !
     3256    else if (iflag_thermals_tenv / 10 == 2 ) then                            !
     3257        do k=1,klev                                                          !
     3258           do i=1,klon                                                       !
     3259              t_env(i,k)=t_seri(i,k)                                         !
     3260           enddo                                                             !
     3261        enddo                                                                !
     3262    endif                                                                    !
     3263! Tests Fredho, instensibilite au pas de temps -------------------------------
    31253264
    31263265
     
    33113450          d_deltaq_vdf(:,:) = d_q_vdf_w(:,:)-d_q_vdf_x(:,:)
    33123451          CALL add_wake_tend &
    3313              (d_deltat_vdf, d_deltaq_vdf, dsig0, ddens0, ddens0, wkoccur1, 'vdf', abortphy &
     3452             (d_deltat_vdf, d_deltaq_vdf, dsig0, dsig0, ddens0, ddens0, wkoccur1, 'vdf', abortphy &
    33143453#ifdef ISO
    33153454               ,d_deltaxt_vdf &
     
    33443483     &   )
    33453484       ENDIF
    3346 #ifdef ISOVERIF
    3347         write(*,*) 'physiq tmp 2736'
    3348 #endif
    3349 
    33503485       CALL prt_enerbil('vdf',itap)
     3486
    33513487       !--------------------------------------------------------------------
    33523488
     
    34033539    ! Blowing snow sublimation and sedimentation
    34043540
    3405     d_t_bs(:,:)=0.
    3406     d_q_bs(:,:)=0.
    3407     d_qbs_bs(:,:)=0.
     3541    d_t_bsss(:,:)=0.
     3542    d_q_bsss(:,:)=0.
     3543    d_qbs_bsss(:,:)=0.
    34083544    bsfl(:,:)=0.
    34093545    bs_fall(:)=0.
     
    34113547
    34123548     CALL call_blowing_snow_sublim_sedim(klon,klev,phys_tstep,t_seri,q_seri,qbs_seri,pplay,paprs, &
    3413                                         d_t_bs,d_q_bs,d_qbs_bs,bsfl,bs_fall)
     3549                                        d_t_bsss,d_q_bsss,d_qbs_bsss,bsfl,bs_fall)
    34143550
    34153551     CALL add_phys_tend &
    3416                (du0,dv0,d_t_bs,d_q_bs,dql0,dqi0,d_qbs_bs,paprs,&
     3552               (du0,dv0,d_t_bsss,d_q_bsss,dql0,dqi0,d_qbs_bsss,paprs,&
    34173553               'bs',abortphy,flag_inhib_tend,itap,0  &
    34183554#ifdef ISO                                       
     
    37133849                ENDDO
    37143850             ENDDO
    3715              IF (iflag_adjwk == 2) THEN
     3851             IF (iflag_adjwk == 2 .AND. OK_bug_ajs_cv) THEN
    37163852               CALL add_wake_tend &
    3717                  (d_deltat_ajs_cv, d_deltaq_ajs_cv, dsig0, ddens0, ddens0, wkoccur1, 'ajs_cv', abortphy &
     3853                 (d_deltat_ajs_cv, d_deltaq_ajs_cv, dsig0, dsig0, ddens0, ddens0, wkoccur1, 'ajs_cv', abortphy &
    37183854#ifdef ISO
    37193855                      ,d_deltaxt_ajs_cv  &
    37203856#endif
    37213857                 )
    3722              ENDIF  ! (iflag_adjwk == 2)
     3858             ENDIF  ! (iflag_adjwk == 2 .AND. OK_bug_ajs_cv)
    37233859          ENDIF  ! (iflag_adjwk >= 1)
    37243860       ENDIF ! (iflag_wake>=1)
     
    44244560       !  ====
    44254561       IF (prt_level>9) WRITE(lunout,*)'pas de convection seche'
     4562       WRITE(lunout,*) 'WARNING : running without dry convection. Somme intermediate variables are not properly defined in physiq_mod.F90'
     4563       ! Reprendre proprement les initialisation ci dessouds si on veut vraiment utiliser l'option (FH)
     4564          fraca(:,:)=0.
     4565          fm_therm(:,:)=0.
     4566          ztv(:,:)=t_seri(:,:)
     4567          zqasc(:,:)=q_seri(:,:)
     4568          ztla(:,:)=0.
     4569          zthl(:,:)=0.
     4570          zpspsk(:,:)=(pplay(:,:)/100000.)**RKAPPA
    44264571
    44274572
     
    45154660
    45164661       IF (iflag_thermals>=1) THEN
     4662
     4663! Tests Fredho, instensibilite au pas de temps -------------------------------
     4664! A detruire en 2024 une fois les tests documentes et les choix faits        !
     4665          if (iflag_thermals_tenv /10 == 0 ) then                            !
     4666            do k=1,klev                                                      !
     4667               do i=1,klon                                                   !
     4668                  t_env(i,k)=t_seri(i,k)                                     !
     4669                  q_env(i,k)=q_seri(i,k)                                     !
     4670#ifdef ISO
     4671                  do ixt=1,ntraciso
     4672                        xt_env(ixt,i,k)=xt_seri(ixt,i,k)
     4673                  enddo
     4674#endif
     4675               enddo                                                         !
     4676            enddo                                                            !
     4677          else if (iflag_thermals_tenv / 10 == 2 ) then                      !
     4678            do k=1,klev                                                      !
     4679               do i=1,klon                                                   !
     4680                  q_env(i,k)=q_seri(i,k)                                     !
     4681#ifdef ISO
     4682                  do ixt=1,ntraciso
     4683                        xt_env(ixt,i,k)=xt_seri(ixt,i,k)
     4684                  enddo
     4685#endif
     4686               enddo                                                         !
     4687            enddo                                                            !
     4688          else if (iflag_thermals_tenv / 10 == 3 ) then                      !
     4689            do k=1,klev                                                      !
     4690               do i=1,klon                                                   !
     4691                  t_env(i,k)=t(i,k)                                          !
     4692                  q_env(i,k)=qx(i,k,1)                                       !
     4693#ifdef ISO
     4694                  do ixt=1,ntraciso
     4695                        xt_env(ixt,i,k)=xt_seri(ixt,i,k)
     4696                  enddo
     4697#endif
     4698               enddo                                                         !
     4699            enddo                                                            !
     4700          endif                                                              !
     4701! Tests Fredho, instensibilite au pas de temps ------------------------------
     4702
    45174703          !jyg<
    45184704!!       IF (mod(iflag_pbl_split/2,2) .EQ. 1) THEN
     
    45234709                   t_therm(i,k) = t_seri(i,k) - wake_s(i)*wake_deltat(i,k)
    45244710                   q_therm(i,k) = q_seri(i,k) - wake_s(i)*wake_deltaq(i,k)
     4711                   t_env(i,k)   = t_env(i,k) - wake_s(i)*wake_deltat(i,k)
     4712                   q_env(i,k)   = q_env(i,k) - wake_s(i)*wake_deltaq(i,k)
    45254713                   u_therm(i,k) = u_seri(i,k)
    45264714                   v_therm(i,k) = v_seri(i,k)
     
    45284716                   do ixt=1,ntraciso
    45294717                     xt_therm(ixt,i,k) = xt_seri(ixt,i,k) - wake_s(i)*wake_deltaxt(ixt,i,k)
     4718                     xt_env(ixt,i,k) = xt_env(ixt,i,k) - wake_s(i)*wake_deltaxt(ixt,i,k)
    45304719                   enddo !do ixt=1,ntraciso
    45314720#endif
     
    45704759               ,pplay,paprs,pphi,weak_inversion &
    45714760                        ! ,u_seri,v_seri,t_seri,q_seri,zqsat,debut & !jyg
    4572                ,u_therm,v_therm,t_therm,q_therm,t_therm,q_therm,zqsat,debut &  !jyg
     4761               ,u_therm,v_therm,t_therm,q_therm,t_env,q_env,zqsat,debut &  !jyg
    45734762               ,d_u_ajs,d_v_ajs,d_t_ajs,d_q_ajs &
    45744763               ,fm_therm,entr_therm,detr_therm &
     
    45894778               ,zqla,ztva &
    45904779#ifdef ISO         
    4591      &      ,xt_therm,d_xt_ajs &
     4780     &      ,xt_env,d_xt_ajs &
    45924781#ifdef DIAGISO         
    45934782     &      ,q_the,xt_the &
     
    46244813             IF (ok_bug_split_th) THEN
    46254814               CALL add_wake_tend &
    4626                    (d_deltat_the, d_deltaq_the, dsig0, ddens0, ddens0, wkoccur1, 'the', abortphy &
     4815                   (d_deltat_the, d_deltaq_the, dsig0, dsig0, ddens0, ddens0, wkoccur1, 'the', abortphy &
    46274816#ifdef ISO
    46284817                   ,d_deltaxt_the &
     
    46314820             ELSE
    46324821               CALL add_wake_tend &
    4633                    (d_deltat_the, d_deltaq_the, dsig0, ddens0, ddens0, wake_k, 'the', abortphy &
     4822                   (d_deltat_the, d_deltaq_the, dsig0, dsig0, ddens0, ddens0, wake_k, 'the', abortphy &
    46344823#ifdef ISO
    46354824                   ,d_deltaxt_the &
     
    46604849          ! Transport de la TKE par les panaches thermiques.
    46614850          ! FH : 2010/02/01
    4662           !     if (iflag_pbl.eq.10) then
    4663           !     call thermcell_dtke(klon,klev,nbsrf,pdtphys,fm_therm,entr_therm,
    4664           !    s           rg,paprs,pbl_tke)
    4665           !     endif
     4851               if (iflag_thermcell_tke==1) then
     4852               call thermcell_dtke(klon,klev,nbsrf,pdtphys,fm_therm,entr_therm,rg,paprs,pbl_tke)
     4853               endif
    46664854          ! -------------------------------------------------------------------
    46674855
     
    49025090
    49035091    CALL lscp(klon,klev,phys_tstep,missing_val,paprs,pplay, &
    4904          t_seri, q_seri,ptconv,ratqs, &
     5092         t_seri, q_seri,qs_ancien,ptconv,ratqs, &
    49055093         d_t_lsc, d_q_lsc, d_ql_lsc, d_qi_lsc, rneb, rneblsvol, &
    4906          pfraclr,pfracld, &
     5094         pfraclr, pfracld, cldfraliq, sigma2_icefracturb, mean_icefracturb, &
    49075095         radocond, picefra, rain_lsc, snow_lsc, &
    49085096         frac_impa, frac_nucl, beta_prec_fisrt, &
    49095097         prfl, psfl, rhcl,  &
    49105098         zqasc, fraca,ztv,zpspsk,ztla,zthl,iflag_cld_th, &
    4911          iflag_ice_thermo, distcltop, temp_cltop, cell_area, &
    4912          cf_seri, rvc_seri, u_seri, v_seri, pbl_eps(:,:,is_ave), &
     5099         iflag_ice_thermo, distcltop, temp_cltop,
     5100         pbl_tke(:,:,is_ave), pbl_eps(:,:,is_ave), &
     5101         cell_area, &
     5102         cf_seri, rvc_seri, u_seri, v_seri, &
    49135103         qsub, qissr, qcld, subfra, issrfra, gamma_cond, ratio_qi_qtot, &
    49145104         dcf_sub, dcf_con, dcf_mix, dqi_adj, dqi_sub, dqi_con, dqi_mix, &
     
    49235113    ELSE
    49245114
     5115    ! Camille Risi mai 2024: on ne met pas à jour ici pour ne pas s'mbêter à modifier fisrtilp
    49255116    CALL fisrtilp(phys_tstep,paprs,pplay, &
    49265117         t_seri, q_seri,ptconv,ratqs, &
     
    55225713                     tausum_aero, tau3d_aero)
    55235714             ENDIF
    5524           ELSE                       ! RRTM radiation
     5715          ELSE IF (iflag_rrtm .EQ.1) THEN  ! RRTM radiation
    55255716             IF (aerosol_couple .AND. config_inca == 'aero' ) THEN
    55265717                abort_message='config_inca=aero et rrtm=1 impossible'
     
    55885779                !
    55895780             ENDIF
     5781          ELSE IF (iflag_rrtm .EQ.2) THEN    ! ecrad RADIATION
     5782#ifdef CPP_ECRAD
     5783             !--climatologies or INCA aerosols
     5784             CALL readaerosol_optic_ecrad( debut, aerosol_couple, ok_alw, ok_volcan, &
     5785                  flag_aerosol, flag_bc_internal_mixture, itap, jD_cur-jD_ref, &
     5786                  pdtphys, pplay, paprs, t_seri, rhcl, presnivs,  &
     5787                  tr_seri, mass_solu_aero, mass_solu_aero_pi, m_allaer)
     5788#else
     5789                abort_message='You should compile with -rad ecrad if running with iflag_rrtm=2'
     5790                CALL abort_physic(modname,abort_message,1)
     5791#endif
    55905792          ENDIF
    55915793       ELSE   !--flag_aerosol = 0
     
    58286030               ! Rajoute par OB pour RRTM
    58296031               tau_aero_lw_rrtm, &
    5830                cldtaupirad, &
     6032               cldtaupirad, m_allaer, &
    58316033!              zqsat, flwcrad, fiwcrad, &
    58326034               zqsat, flwc, fiwc, &
     
    59076109                                ! Rajoute par OB pour RRTM
    59086110                     tau_aero_lw_rrtm, &
    5909                      cldtaupi, &
     6111                     cldtaupi, m_allaer, &
    59106112!                    zqsat, flwcrad, fiwcrad, &
    59116113                     zqsat, flwc, fiwc, &
     
    59346136                     cloud_cover_sw)
    59356137          ENDIF !ok_4xCO2atm
     6138
     6139! A.I aout 2023
     6140! Effet 3D des nuages Ecrad
     6141! a passer : nom du ficher namelist et cles ok_3Deffect
     6142! a declarer comme iflag_rrtm et a lire dans physiq.def
     6143#ifdef CPP_ECRAD
     6144          IF (ok_3Deffect) then
     6145!                print*,'ok_3Deffect = ',ok_3Deffect 
     6146                namelist_ecrad_file='namelist_ecrad_s2'
     6147                CALL radlwsw &
     6148                     (debut, dist, rmu0, fract,  &
     6149                     paprs, pplay,zxtsol,SFRWL,albsol_dir, albsol_dif, &
     6150                     t_seri,q_seri,wo, &
     6151                     cldfrarad, cldemirad, cldtaurad, &
     6152                     ok_ade.OR.flag_aerosol_strat.GT.0, ok_aie,  ok_volcan, flag_volc_surfstrat, &
     6153                     flag_aerosol, flag_aerosol_strat, flag_aer_feedback, &
     6154                     tau_aero, piz_aero, cg_aero, &
     6155                     tau_aero_sw_rrtm, piz_aero_sw_rrtm, cg_aero_sw_rrtm, &
     6156                     tau_aero_lw_rrtm, &
     6157                     cldtaupi, &
     6158                     zqsat, flwc, fiwc, &
     6159                     ref_liq, ref_ice, ref_liq_pi, ref_ice_pi, &
     6160                     namelist_ecrad_file, &
     6161! A modifier             
     6162                     heat_s2,heat0_s2,cool_s2,cool0_s2,albpla_s2, &
     6163                     heat_volc,cool_volc, &
     6164                     topsw_s2,toplw_s2,solsw_s2,solswfdiff_s2,sollw_s2, &
     6165                     sollwdown_s2, &
     6166                     topsw0_s2,toplw0_s2,solsw0_s2,sollw0_s2, &
     6167                     lwdnc0_s2, lwdn0_s2, lwdn_s2, lwupc0_s2, lwup0_s2, lwup_s2,  &
     6168                     swdnc0_s2, swdn0_s2, swdn_s2, swupc0_s2, swup0_s2, swup_s2, &
     6169                     topswad_aero_s2, solswad_aero_s2, &
     6170                     topswai_aero_s2, solswai_aero_s2, &
     6171                     topswad0_aero_s2, solswad0_aero_s2, &
     6172                     topsw_aero_s2, topsw0_aero_s2, &
     6173                     solsw_aero_s2, solsw0_aero_s2, &
     6174                     topswcf_aero_s2, solswcf_aero_s2, &
     6175                                !-C. Kleinschmitt for LW diagnostics
     6176                     toplwad_aero_s2, sollwad_aero_s2,&
     6177                     toplwai_aero_s2, sollwai_aero_s2, &
     6178                     toplwad0_aero_s2, sollwad0_aero_s2,&
     6179                                !-end
     6180                     ZLWFT0_i, ZFLDN0, ZFLUP0, &
     6181                     ZSWFT0_i, ZFSDN0, ZFSUP0, &
     6182                     cloud_cover_sw_s2)
     6183          ENDIF ! ok_3Deffect
     6184#endif
     6185
    59366186       ENDIF ! aerosol_couple
    59376187       itaprad = 0
     
    61576407       d_t_hin(:, :)=0.
    61586408       CALL add_phys_tend(du_gwd_hines, dv_gwd_hines, d_t_hin, dq0, dql0, &
    6159             dqi0, dqbs0,paprs, 'hin', abortphy,flag_inhib_tend,itap,0 &
     6409            dqi0, dqbs0, paprs, 'hin', abortphy,flag_inhib_tend,itap,0 &
    61606410#ifdef ISO
    61616411     &    ,dxt0,dxtl0,dxti0 &
     
    62806530       
    62816531       SELECT CASE(flag_emit)
    6282        CASE(1) ! emission volc H2O dans LMDZ
     6532       CASE(1) ! emission volc H2O in LMDZ
    62836533          DO ieru=1, nErupt
    62846534             IF (year_cur==year_emit_vol(ieru).AND.&
     
    62886538               
    62896539                IF(flag_verbose_strataer) print *,'IN physiq_mod: date=',year_cur,mth_cur,day_cur
    6290                 ! initialisation tendance q emission
     6540                ! initialisation of q tendency emission
    62916541                d_q_emiss(:,:)=0.
    62926542                ! daily injection mass emission - NL
     
    62956545                !
    62966546                CALL STRATEMIT(pdtphys,pdtphys,latitude_deg,longitude_deg,t_seri,&
    6297                      pplay,paprs,tr_seri,&
    6298                      m_H2O_emiss_vol_daily,&
    6299                      xlat_min_vol(ieru),xlat_max_vol(ieru),&
    6300                      xlon_min_vol(ieru),xlon_max_vol(ieru),&
    6301                      altemiss_vol(ieru),&
    6302                      sigma_alt_vol(ieru),1,&
    6303                      1,nAerErupt+1,0)
     6547                    pplay,paprs,tr_seri,&
     6548                    m_H2O_emiss_vol_daily,&
     6549                    xlat_min_vol(ieru),xlat_max_vol(ieru),&
     6550                    xlon_min_vol(ieru),xlon_max_vol(ieru),&
     6551                    altemiss_vol(ieru),sigma_alt_vol(ieru),1,1.,&
     6552                    nAerErupt+1,0)
    63046553               
    63056554                IF(flag_verbose_strataer) print *,'IN physiq_mod: min max d_q_emiss=',&
     
    63156564    ENDIF
    63166565#endif
    6317 
    63186566
    63196567!===============================================================
     
    67547002    t_seri(:,:)=t_seri(:,:)+d_t_ec(:,:)
    67557003
    6756     !=======================================================================
    6757     !   SORTIES
    6758     !=======================================================================
    6759     !
    6760     !IM initialisation + calculs divers diag AMIP2
    6761     !
    6762     include "calcul_divers.h"
    6763     !
    6764     !IM Interpolation sur les niveaux de pression du NMC
    6765     !   -------------------------------------------------
    6766     !
    6767     include "calcul_STDlev.h"
    6768     !
    6769     ! slp sea level pressure derived from Arpege-IFS : CALL ctstar + CALL pppmer
    6770     CALL diag_slp(klon,t_seri,paprs,pplay,pphis,ptstar,pt0,slp)
    6771     !
     7004    !==================================================================
     7005    !--OB water mass fixer for the physics
     7006    !--water profiles are corrected to force mass conservation of water
     7007    !--currently flag is turned off
     7008    !==================================================================
     7009    IF (mass_fixer) THEN
     7010#ifdef ISO
     7011      CALL abort_gcm('physiq 6936','isos pas prevus dans le mass fixer',1)
     7012      ! Camille Risi mai 2024: on attend d'avoir la 4e dimension qui rendra tout plus simple.
     7013#endif
     7014    qql2(:)=0.0
     7015    DO k = 1, klev
     7016      qql2(:)=qql2(:)+(q_seri(:,k)+ql_seri(:,k))*zmasse(:,k)
     7017      IF (nqo >= 3) THEN
     7018        qql2(:)=qql2(:)+qs_seri(:,k)*zmasse(:,k)
     7019      ENDIF
     7020      IF (ok_bs) THEN
     7021        qql2(:)=qql2(:)+qbs_seri(:,k)*zmasse(:,k)
     7022      ENDIF
     7023    ENDDO
     7024
     7025#ifdef CPP_StratAer
     7026    IF (ok_qemiss) THEN
     7027       DO k = 1, klev
     7028          qql1(:) = qql1(:)+d_q_emiss(:,k)*zmasse(:,k)
     7029       ENDDO
     7030    ENDIF
     7031#endif
     7032    IF (ok_qch4) THEN
     7033       DO k = 1, klev
     7034          qql1(:) = qql1(:)+d_q_ch4_dtime(:,k)*zmasse(:,k)
     7035       ENDDO
     7036    ENDIF
     7037   
     7038    DO i = 1, klon
     7039      !--compute ratio of what q+ql should be with conservation to what it is
     7040      IF (ok_bs) THEN
     7041        corrqql=(qql1(i)+(evap(i)-rain_fall(i)-snow_fall(i)-bs_fall(i))*pdtphys)/qql2(i)
     7042      ELSE
     7043        corrqql=(qql1(i)+(evap(i)-rain_fall(i)-snow_fall(i))*pdtphys)/qql2(i)
     7044      ENDIF
     7045      DO k = 1, klev
     7046        q_seri(i,k) =q_seri(i,k)*corrqql
     7047        ql_seri(i,k)=ql_seri(i,k)*corrqql
     7048        IF (nqo >= 3) THEN
     7049          qs_seri(i,k)=qs_seri(i,k)*corrqql
     7050        ENDIF
     7051        IF (ok_bs) THEN
     7052          qbs_seri(i,k)=qbs_seri(i,k)*corrqql
     7053        ENDIF
     7054      ENDDO
     7055    ENDDO
     7056    ENDIF
     7057    !--fin mass fixer
     7058
    67727059    !cc prw  = eau precipitable
    67737060    !   prlw = colonne eau liquide
    67747061    !   prlw = colonne eau solide
    67757062    !   prbsw = colonne neige soufflee
     7063    !   water_budget = non-conservation residual from the LMDZ physics
     7064    !                  (should be equal to machine precision if mass fixer is activated)
    67767065    prw(:) = 0.
    67777066    prlw(:) = 0.
    67787067    prsw(:) = 0.
    67797068    prbsw(:) = 0.
     7069    water_budget(:) = 0.0
    67807070    DO k = 1, klev
    67817071       prw(:)  = prw(:)  + q_seri(:,k)*zmasse(:,k)
    67827072       prlw(:) = prlw(:) + ql_seri(:,k)*zmasse(:,k)
    6783        prsw(:) = prsw(:) + qs_seri(:,k)*zmasse(:,k)
    6784        prbsw(:)= prbsw(:) + qbs_seri(:,k)*zmasse(:,k)
     7073       water_budget(:) = water_budget(:) + (q_seri(:,k)-qx(:,k,ivap)+ql_seri(:,k)-qx(:,k,iliq))*zmasse(:,k)
     7074       IF (nqo >= 3) THEN
     7075         prsw(:) = prsw(:) + qs_seri(:,k)*zmasse(:,k)
     7076         water_budget(:) = water_budget(:) + (qs_seri(:,k)-qx(:,k,isol))*zmasse(:,k)
     7077       ENDIF
     7078       IF (nqo >= 4 .AND. ok_bs) THEN
     7079         prbsw(:)= prbsw(:) + qbs_seri(:,k)*zmasse(:,k)
     7080         water_budget(:) = water_budget(:) + (qbs_seri(:,k)-qx(:,k,ibs))*zmasse(:,k)
     7081       ENDIF
    67857082    ENDDO
    6786 
    6787 #ifdef ISO
    6788       DO i = 1, klon
    6789       do ixt=1,ntraciso
    6790        xtprw(ixt,i) = 0.
    6791        DO k = 1, klev
    6792         xtprw(ixt,i) = xtprw(ixt,i) + &
    6793      &           xt_seri(ixt,i,k)*(paprs(i,k)-paprs(i,k+1))/RG
    6794        ENDDO !DO k = 1, klev
    6795       enddo !do ixt=1,ntraciso
    6796       enddo !DO i = 1, klon
    6797 #endif
     7083    water_budget(:)=water_budget(:)+(rain_fall(:)+snow_fall(:)-evap(:))*pdtphys
     7084    IF (ok_bs) THEN
     7085      water_budget(:)=water_budget(:)+bs_fall(:)*pdtphys
     7086    ENDIF
     7087    ! Camille Risi mai 2024: pour les isotopes, on attend d'avoir la 4e dimension, ça rendra tout plus facile
     7088    ! ces variables sont diagnostiques, donc pas indispensables
     7089
     7090    !=======================================================================
     7091    !   SORTIES
     7092    !=======================================================================
     7093    !
     7094    !IM initialisation + calculs divers diag AMIP2
     7095    !
     7096    include "calcul_divers.h"
     7097    !
     7098    !IM Interpolation sur les niveaux de pression du NMC
     7099    !   -------------------------------------------------
     7100    !
     7101    include "calcul_STDlev.h"
     7102    !
     7103    ! slp sea level pressure derived from Arpege-IFS : CALL ctstar + CALL pppmer
     7104    CALL diag_slp(klon,t_seri,paprs,pplay,pphis,ptstar,pt0,slp)
     7105    !
    67987106    !
    67997107    IF (ANY(type_trac == ['inca','inco'])) THEN
     
    68987206    !IM global posePB      include "write_bilKP_ave.h"
    68997207    !
    6900 
    6901     !--OB mass fixer
    6902     !--profile is corrected to force mass conservation of water
    6903     IF (mass_fixer) THEN
    6904     qql2(:)=0.0
    6905     DO k = 1, klev
    6906       qql2(:)=qql2(:)+(q_seri(:,k)+ql_seri(:,k)+qs_seri(:,k))*zmasse(:,k)
    6907     ENDDO
    6908    
    6909 #ifdef CPP_StratAer
    6910     IF (ok_qemiss) THEN
    6911        DO k = 1, klev
    6912           qql1(:) = qql1(:)+d_q_emiss(:,k)*zmasse(:,k)
    6913        ENDDO
    6914     ENDIF
    6915 #endif
    6916     IF (ok_qch4) THEN
    6917        DO k = 1, klev
    6918           qql1(:) = qql1(:)+d_q_ch4_dtime(:,k)*zmasse(:,k)
    6919        ENDDO
    6920     ENDIF
    6921    
    6922     DO i = 1, klon
    6923       !--compute ratio of what q+ql should be with conservation to what it is
    6924       corrqql=(qql1(i)+(evap(i)-rain_fall(i)-snow_fall(i))*pdtphys)/qql2(i)
    6925       DO k = 1, klev
    6926         q_seri(i,k) =q_seri(i,k)*corrqql
    6927         ql_seri(i,k)=ql_seri(i,k)*corrqql
    6928       ENDDO
    6929     ENDDO
    6930 #ifdef ISO
    6931     do ixt=1,ntraciso
    6932     xtql2(ixt,:)=0.0
    6933     DO k = 1, klev
    6934       xtql2(ixt,:)=xtql2(ixt,:)+(xt_seri(ixt,:,k)+xtl_seri(ixt,:,k)+xts_seri(ixt,:,k))*zmasse(:,k)
    6935     ENDDO
    6936     DO i = 1, klon
    6937       !--compute ratio of what q+ql should be with conservation to what it is
    6938       corrxtql(ixt)=(xtql1(ixt,i)+(xtevap(ixt,i)-xtrain_fall(ixt,i)-xtsnow_fall(ixt,i))*pdtphys)/xtql2(ixt,i)
    6939       DO k = 1, klev
    6940         xt_seri(ixt,i,k) =xt_seri(ixt,i,k)*corrxtql(ixt)
    6941         xtl_seri(ixt,i,k)=xtl_seri(ixt,i,k)*corrxtql(ixt)
    6942       ENDDO
    6943     ENDDO   
    6944     enddo !do ixt=1,ntraciso
    6945 #endif
    6946     ENDIF
    6947     !--fin mass fixer
    6948 
    69497208    ! Sauvegarder les valeurs de t et q a la fin de la physique:
    69507209    !
     
    69627221    xtl_ancien(:,:,:)=xtl_seri(:,:,:)
    69637222    xts_ancien(:,:,:)=xts_seri(:,:,:)
     7223    xtbs_ancien(:,:,:)=xtbs_seri(:,:,:)
    69647224#endif
    69657225    CALL water_int(klon,klev,q_ancien,zmasse,prw_ancien)
     
    70987358         ok_sync, ptconv, read_climoz, clevSTD,          &
    70997359         ptconvth, d_u, d_t, qx, d_qx, zmasse,           &
    7100          flag_aerosol, flag_aerosol_strat, ok_cdnc,t,u1,v1)
     7360         flag_aerosol, flag_aerosol_strat, ok_cdnc,t, u1, v1)
    71017361#endif
    71027362
    71037363#ifndef CPP_XIOS
    7104     CALL write_paramLMDZ_phy(itap,nid_ctesGCM,ok_sync)
    7105 #endif
    7106 
    7107 #endif
    7108 
    7109 ! Pour XIOS : On remet des variables a .false. apres un premier appel
    7110     IF (debut) THEN
    7111 
    7112       IF (using_xios) THEN
    7113         swaero_diag=.FALSE.
    7114         swaerofree_diag=.FALSE.
    7115         dryaod_diag=.FALSE.
    7116         ok_4xCO2atm= .FALSE.
    7117 !       write (lunout,*)'ok_4xCO2atm= ',swaero_diag, swaerofree_diag, dryaod_diag, ok_4xCO2atm
    7118 
    7119         IF (is_master) THEN
    7120           !--setting up swaero_diag to TRUE in XIOS case
    7121           IF (xios_field_is_active("topswad").OR.xios_field_is_active("topswad0").OR. &
    7122              xios_field_is_active("solswad").OR.xios_field_is_active("solswad0").OR. &
    7123              xios_field_is_active("topswai").OR.xios_field_is_active("solswai").OR.  &
    7124                (iflag_rrtm==1.AND.(xios_field_is_active("toplwad").OR.xios_field_is_active("toplwad0").OR. &
    7125                                    xios_field_is_active("sollwad").OR.xios_field_is_active("sollwad0"))))  &
    7126              !!!--for now these fields are not in the XML files so they are omitted
    7127              !!!  xios_field_is_active("toplwai").OR.xios_field_is_active("sollwai") !))) &
    7128              swaero_diag=.TRUE.
    7129 
    7130           !--setting up swaerofree_diag to TRUE in XIOS case
    7131           IF (xios_field_is_active("SWdnSFCcleanclr").OR.xios_field_is_active("SWupSFCcleanclr").OR. &
    7132              xios_field_is_active("SWupTOAcleanclr").OR.xios_field_is_active("rsucsaf").OR.   &
    7133              xios_field_is_active("rsdcsaf") .OR. xios_field_is_active("LWdnSFCcleanclr").OR. &
    7134              xios_field_is_active("LWupTOAcleanclr")) &
    7135              swaerofree_diag=.TRUE.
    7136 
    7137           !--setting up dryaod_diag to TRUE in XIOS case
    7138           DO naero = 1, naero_tot-1
    7139            IF (xios_field_is_active("dryod550_"//name_aero_tau(naero))) dryaod_diag=.TRUE.
    7140           ENDDO
    7141           !
    7142           !--setting up ok_4xCO2atm to TRUE in XIOS case
    7143           IF (xios_field_is_active("rsut4co2").OR.xios_field_is_active("rlut4co2").OR. &
    7144              xios_field_is_active("rsutcs4co2").OR.xios_field_is_active("rlutcs4co2").OR. &
    7145              xios_field_is_active("rsu4co2").OR.xios_field_is_active("rsucs4co2").OR. &
    7146              xios_field_is_active("rsd4co2").OR.xios_field_is_active("rsdcs4co2").OR. &
    7147              xios_field_is_active("rlu4co2").OR.xios_field_is_active("rlucs4co2").OR. &
    7148              xios_field_is_active("rld4co2").OR.xios_field_is_active("rldcs4co2")) &
    7149              ok_4xCO2atm=.TRUE.
    7150         ENDIF
    7151         !$OMP BARRIER
    7152         CALL bcast(swaero_diag)
    7153         CALL bcast(swaerofree_diag)
    7154         CALL bcast(dryaod_diag)
    7155         CALL bcast(ok_4xCO2atm)
    7156 !        write (lunout,*)'ok_4xCO2atm= ',swaero_diag, swaerofree_diag, dryaod_diag, ok_4xCO2atm
    7157       ENDIF !using_xios
    7158     ENDIF
     7364      CALL write_paramLMDZ_phy(itap,nid_ctesGCM,ok_sync)
     7365#endif
     7366
     7367#endif
     7368    ! Petit appelle de sorties pour accompagner le travail sur phyex
     7369    if ( iflag_physiq == 1 ) then
     7370        call output_physiqex(debut,jD_eq,pdtphys,presnivs,paprs,u,v,t,qx,cldfra,0.*t,0.*t,0.*t,pbl_tke,theta)
     7371    endif
    71597372
    71607373    !====================================================================
     
    72007413    ! Disabling calls to the prt_alerte function
    72017414    alert_first_call = .FALSE.
     7415
    72027416   
    72037417    IF (lafin) THEN
     
    72127426         IF (read_climoz >= 1) THEN
    72137427           IF (is_mpi_root) CALL nf95_close(ncid_climoz)
    7214             DEALLOCATE(press_edg_climoz) ! pointer
    7215             DEALLOCATE(press_cen_climoz) ! pointer
     7428            DEALLOCATE(press_edg_climoz)
     7429            DEALLOCATE(press_cen_climoz)
    72167430         ENDIF
    72177431       
    72187432       ENDIF
     7433
     7434       IF (using_xios) THEN
     7435
     7436#ifdef INCA
     7437          IF (type_trac == 'inca') THEN
     7438             IF (is_omp_master .AND. grid_type==unstructured) THEN
     7439                CALL finalize_inca
     7440             ENDIF
     7441          ENDIF
     7442#endif
     7443
     7444          IF (is_omp_master .and. grid_type==unstructured) CALL xios_context_finalize
     7445       ENDIF
     7446
     7447       WRITE(lunout,*) ' physiq fin, nombre de steps ou cvpas = 1 : ', Ncvpaseq1
    72197448       
    7220        IF (using_xios) THEN
    7221          IF (is_omp_master) CALL xios_context_finalize
    7222 
    7223 #ifdef INCA
    7224          if (type_trac == 'inca') then
    7225             IF (is_omp_master .and. grid_type==unstructured) THEN
    7226                CALL finalize_inca
    7227             ENDIF
    7228          endif
    7229 #endif
    7230        ENDIF !using_xios
    7231        WRITE(lunout,*) ' physiq fin, nombre de steps ou cvpas = 1 : ', Ncvpaseq1
    72327449    ENDIF
    72337450
  • LMDZ6/branches/cirrus/libf/phylmdiso/reevap.F90

    r4491 r5202  
    1   SUBROUTINE reevap (klon,klev,iflag_ice_thermo,t_seri,q_seri,ql_seri,qs_seri, &
    2    &         d_t_eva,d_q_eva,d_ql_eva,d_qs_eva &
    3 #ifdef ISO
    4              ,xt_seri,xtl_seri,xts_seri,d_xt_eva,d_xtl_eva,d_xts_eva &
    5 #endif
    6    &     )
     1  SUBROUTINE reevap (klon,klev,iflag_ice_thermo,t_seri,qx, &
     2   &         d_t_eva,d_qx_eva)
    73
    84    ! flag to include modifications to ensure energy conservation (if flag >0)
    95    USE add_phys_tend_mod, only : fl_cor_ebil
    106#ifdef ISO
    11     USE infotrac_phy, ONLY: ntiso   
     7    USE infotrac_phy, ONLY: ntiso,nqtot,ivap,iliq,isol,iqWIsoPha
    128#ifdef ISOVERIF
    139    USE isotopes_verif_mod
     
    2319
    2420    INTEGER klon,klev,iflag_ice_thermo
    25     REAL, DIMENSION(klon,klev), INTENT(in) :: t_seri,q_seri,ql_seri,qs_seri
    26     REAL, DIMENSION(klon,klev), INTENT(out) :: d_t_eva,d_q_eva,d_ql_eva,d_qs_eva
     21    REAL, DIMENSION(klon,klev), INTENT(in) :: t_seri
     22    REAL, DIMENSION(klon,klev,nqtot), INTENT(in) ::     qx
     23    REAL, DIMENSION(klon,klev), INTENT(out) :: d_t_eva
     24    REAL, DIMENSION(klon,klev,nqtot), INTENT(out) ::    d_qx_eva
    2725
    2826    REAL za,zb,zdelta,zlvdcp,zlsdcp
    29     INTEGER i,k
     27    INTEGER i,k,ixt,ivapcur,iliqcur,isolcur   
    3028
    31 #ifdef ISO
    32     REAL, DIMENSION(ntiso,klon,klev), INTENT(in) :: xt_seri,xtl_seri,xts_seri
    33     REAL, DIMENSION(ntiso,klon,klev), INTENT(out) :: d_xt_eva,d_xtl_eva,d_xts_eva
    34     integer ixt
    35 #endif
    3629
    3730    !--------Stochastic Boundary Layer Triggering: ALE_BL--------
     
    4235    !IM 100106 BEG : pouvoir sortir les ctes de la physique
    4336    !
     37    DO ixt = 1, 1+ntiso
    4438    ! Re-evaporer l'eau liquide nuageuse
    4539    !
     40    iliqcur= iqWIsoPha(ixt,iliq)   
     41    ivapcur= iqWIsoPha(ixt,ivap)   
     42    isolcur= iqWIsoPha(ixt,isol)   
    4643!print *,'rrevap ; fl_cor_ebil:',fl_cor_ebil,' iflag_ice_thermo:',iflag_ice_thermo,' RVTMP2',RVTMP2
    4744    DO k = 1, klev  ! re-evaporation de l'eau liquide nuageuse
    48        DO i = 1, klon
    49         if (fl_cor_ebil .GT. 0) then
    50           zlvdcp=RLVTT/RCPD/(1.0+RVTMP2*(q_seri(i,k)+ql_seri(i,k)+qs_seri(i,k)))
    51           zlsdcp=RLSTT/RCPD/(1.0+RVTMP2*(q_seri(i,k)+ql_seri(i,k)+qs_seri(i,k)))
    52         else
    53           zlvdcp=RLVTT/RCPD/(1.0+RVTMP2*q_seri(i,k))
    54           !jyg<
    55           !  Attention : Arnaud a propose des formules completement differentes
    56           !                  A verifier !!!
    57           zlsdcp=RLSTT/RCPD/(1.0+RVTMP2*q_seri(i,k))
    58         end if
    59           IF (iflag_ice_thermo .EQ. 0) THEN
    60              zlsdcp=zlvdcp
     45      DO i = 1, klon
     46
     47        IF (ixt == 1) THEN ! water
     48          IF (fl_cor_ebil > 0) THEN
     49            !zlvdcp=RLVTT/RCPD/(1.0+RVTMP2*(q_seri(i,k)+ql_seri(i,k)+qs_seri(i,k)))
     50            !zlsdcp=RLSTT/RCPD/(1.0+RVTMP2*(q_seri(i,k)+ql_seri(i,k)+qs_seri(i,k)))
     51            zlvdcp=RLVTT/RCPD/(1.0+RVTMP2*(qx(i,k,ivapcur)+qx(i,k,iliqcur)+qx(i,k,isolcur)))
     52            zlsdcp=RLSTT/RCPD/(1.0+RVTMP2*(qx(i,k,ivapcur)+qx(i,k,iliqcur)+qx(i,k,isolcur)))
     53          ELSE
     54            zlvdcp=RLVTT/RCPD/(1.0+RVTMP2*qx(i,k,ivapcur))
     55            !jyg<
     56            !  Attention : Arnaud a propose des formules completement differentes
     57            !                  A verifier !!!
     58            zlsdcp=RLSTT/RCPD/(1.0+RVTMP2*qx(i,k,ivapcur))
     59         ENDIF
     60          IF (iflag_ice_thermo == 0) THEN
     61            zlsdcp=zlvdcp
    6162          ENDIF
    6263          !>jyg
     64        ENDIF
     65        IF (iflag_ice_thermo == 0) THEN   
     66           !pas necessaire a priori
    6367
    64           IF (iflag_ice_thermo.eq.0) THEN   
    65              !pas necessaire a priori
     68            zdelta = MAX(0.,SIGN(1.,RTT-t_seri(i,k)))
     69            zdelta = 0.
     70            zb = MAX(0.0,qx(i,k,iliqcur))
     71            IF (ixt == 1) THEN
     72              za = - MAX(0.0,qx(i,k,iliqcur)) &
     73                   * (zlvdcp*(1.-zdelta)+zlsdcp*zdelta)
     74              d_t_eva(i,k) = za
     75            ENDIF
     76            d_qx_eva(i,k,ivapcur)  = zb
     77            d_qx_eva(i,k,iliqcur) = -qx(i,k,iliqcur)
     78            d_qx_eva(i,k,isolcur) = 0.
    6679
    67              zdelta = MAX(0.,SIGN(1.,RTT-t_seri(i,k)))
    68   zdelta = 0.
    69              zb = MAX(0.0,ql_seri(i,k))
    70              za = - MAX(0.0,ql_seri(i,k)) &
    71                   * (zlvdcp*(1.-zdelta)+zlsdcp*zdelta)
    72              d_t_eva(i,k) = za
    73              d_q_eva(i,k) = zb
    74              d_ql_eva(i,k) = -ql_seri(i,k)
    75              d_qs_eva(i,k) = 0.
    76 
    77 #ifdef ISO
    78          do ixt=1,ntiso
    79             zb = MAX(0.0,xtl_seri(ixt,i,k))
    80             d_xt_eva(ixt,i,k) = zb
    81             d_xtl_eva(ixt,i,k) = -xtl_seri(ixt,i,k)
    82             d_xts_eva(ixt,i,k) = 0.
    83          enddo
    84 #ifdef ISOVERIF
    85       do ixt=1,ntiso
    86         call iso_verif_noNaN(xt_seri(ixt,i,k), &
    87      &     'reevap 2417: apres evap tot')
    88       enddo
    89       if (iso_eau.gt.0) then
    90               call iso_verif_egalite_choix( &
    91      &           xt_seri(iso_eau,i,k),q_seri(i,k), &
    92      &          'reevap 1891+, après reevap totale',errmax,errmaxrel)
    93               call iso_verif_egalite_choix( &
    94      &           xtl_seri(iso_eau,i,k),ql_seri(i,k), &
    95      &          'reevap 2209+, après reevap totale',errmax,errmaxrel)
    96        endif !if (iso_eau.gt.0) then       
    97       if ((iso_HDO.gt.0).and.(iso_O18.gt.0)) then 
    98             if (q_seri(i,k).gt.ridicule) then 
    99                if (iso_verif_o18_aberrant_nostop( &
    100      &              xt_seri(iso_HDO,i,k)/q_seri(i,k), &
    101      &              xt_seri(iso_O18,i,k)/q_seri(i,k), &
    102      &              'reevap 2315: apres reevap totale').eq.1) then
    103                   write(*,*) 'i,k,q_seri(i,k)=',i,k,q_seri(i,k)
    104                   write(*,*) 'd_q_eva(i,k)=',d_q_eva(i,k)
    105                   write(*,*) 'deltaD(d_q_eva(i,k))=',deltaD(d_xt_eva(iso_HDO,i,k)/d_q_eva(i,k))
    106                   write(*,*) 'deltaO18(d_q_eva(i,k))=',deltaO(d_xt_eva(iso_O18,i,k)/d_q_eva(i,k))
    107                   stop
    108               endif !  if (iso_verif_o18_aberrant_nostop
    109             endif !if (q_seri(i,k).gt.errmax) then   
    110         endif !if ((iso_HDO.gt.0).and.(iso_O18.gt.0)) then
    111 #ifdef ISOTRAC     
    112              call iso_verif_traceur(xt_seri(1,i,k), &
    113      &           'reevap 2165a')
    114              call iso_verif_traceur_pbidouille(xt_seri(1,i,k), &
    115      &           'reevap 2165b')
    116 #endif               
    117          
    118 #endif           
    119 #endif
    120 
    121           ELSE
    122 
     80        ELSE
     81             
    12382             !CR: on r\'e-\'evapore eau liquide et glace
    12483
     
    12786             !        za = - MAX(0.0,ql_seri(i,k)) &
    12887             !             * (zlvdcp*(1.-zdelta)+zlsdcp*zdelta)
    129              zb = MAX(0.0,ql_seri(i,k)+qs_seri(i,k))
    130              za = - MAX(0.0,ql_seri(i,k))*zlvdcp &
    131                   - MAX(0.0,qs_seri(i,k))*zlsdcp
    132              d_t_eva(i,k) = za
    133              d_q_eva(i,k) = zb
    134              d_ql_eva(i,k) = -ql_seri(i,k)
    135              d_qs_eva(i,k) = -qs_seri(i,k)
     88            IF (ixt == 1) THEN
     89              za = - MAX(0.0,qx(i,k,iliqcur))*zlvdcp &
     90                   - MAX(0.0,qx(i,k,iliqcur))*zlsdcp
     91              d_t_eva(i,k) = za
     92            ENDIF
     93            !zb = MAX(0.0,ql_seri(i,k)+qs_seri(i,k))
     94            !d_q_eva(i,k) = zb
     95            !d_ql_eva(i,k) = -ql_seri(i,k)
     96            !d_qs_eva(i,k) = -qs_seri(i,k)
    13697
    137 #ifdef ISO
    138          do ixt=1,ntiso
    139             zb = MAX(0.0,xtl_seri(ixt,i,k)+xts_seri(ixt,i,k))
    140             d_xt_eva(ixt,i,k) = zb
    141             d_xtl_eva(ixt,i,k) = -xtl_seri(ixt,i,k)
    142             d_xts_eva(ixt,i,k) = -xts_seri(ixt,i,k)
    143          enddo
     98            zb = MAX(0.0,qx(i,k,iliqcur)+qx(i,k,isolcur))
     99            d_qx_eva(i,k,ivapcur) = zb
     100            d_qx_eva(i,k,iliqcur) = -qx(i,k,iliqcur)
     101            d_qx_eva(i,k,isolcur) = -qx(i,k,isolcur)
     102        ENDIF
    144103
    145 #ifdef ISOVERIF
    146       do ixt=1,ntiso
    147       call iso_verif_noNaN(xt_seri(ixt,i,k), &
    148      &     'reevap 2417: apres evap tot')
    149       enddo
    150       if (iso_eau.gt.0) then
    151               call iso_verif_egalite_choix( &
    152      &           xt_seri(iso_eau,i,k),q_seri(i,k), &
    153      &          'reevap 1891, après réévap totale',errmax,errmaxrel)
    154               call iso_verif_egalite_choix( &
    155      &           xtl_seri(iso_eau,i,k),ql_seri(i,k), &
    156      &          'reevap 2209, après réévap totale',errmax,errmaxrel)
    157               call iso_verif_egalite_choix( &
    158      &           xts_seri(iso_eau,i,k),qs_seri(i,k), &
    159      &          'reevap 2209b, après réévap totale',errmax,errmaxrel)
    160        endif !if (iso_eau.gt.0) then
    161      
    162       if ((iso_HDO.gt.0).and.(iso_O18.gt.0)) then 
    163             if (q_seri(i,k).gt.ridicule) then 
    164                if (iso_verif_o18_aberrant_nostop( &
    165      &              xt_seri(iso_HDO,i,k)/q_seri(i,k), &
    166      &              xt_seri(iso_O18,i,k)/q_seri(i,k), &
    167      &              'reevap 2408: apres reevap totale').eq.1) then
    168                   write(*,*) 'i,k,q_seri(i,k)=',i,k,q_seri(i,k)                       
    169                   stop
    170               endif !  if (iso_verif_o18_aberrant_nostop
    171             endif !if (q_seri(i,k).gt.errmax) then   
    172         endif !if ((iso_HDO.gt.0).and.(iso_O18.gt.0)) then       
    173 #ifdef ISOTRAC     
    174              call iso_verif_traceur(xt_seri(1,i,k), &
    175      &           'reevap 2165c')
    176              call iso_verif_traceur_pbidouille(xt_seri(1,i,k), &
    177      &           'reevap 2165d')
    178 #endif                 
    179 #endif                 
    180 #endif
    181104
    182           ENDIF
     105      ENDDO
     106    ENDDO
    183107
    184        ENDDO
    185     ENDDO
     108    ENDDO ! DO ixt = 1, 1+niso*(nzone +1)
    186109
    187110RETURN
Note: See TracChangeset for help on using the changeset viewer.