Ignore:
Timestamp:
Dec 15, 2021, 11:18:49 PM (4 years ago)
Author:
dcugnet
Message:

First commit for new tracers.

  • parser routines readTracFiles, strings_mod and tracer_types added in misc using revision 4 of https://svn.lmd.jussieu.fr/tracers-parser
  • tested in sequential and parallel mode using ioipsl.
  • for now, only two fields of "tracers(:)" derived type vector are used: "name" and "longName".
Location:
LMDZ6/trunk/libf/phylmd
Files:
17 edited

Legend:

Unmodified
Added
Removed
  • LMDZ6/trunk/libf/phylmd/Dust/phytracr_spl_mod.F90

    r3977 r4046  
    14161416       !print *,nbtr
    14171417       do it=1,nbtr
    1418         print *, it, tname(it+nqo)
    1419         if (tname(it+nqo) == 'PREC' ) then
    1420             id_prec=it
    1421         endif
    1422         if (tname(it+nqo) == 'FINE' ) then
    1423             id_fine=it
    1424         endif
    1425         if (tname(it+nqo) == 'COSS' ) then
    1426             id_coss=it
    1427         endif
    1428         if (tname(it+nqo) == 'CODU' ) then
    1429             id_codu=it
    1430         endif
    1431         if (tname(it+nqo) == 'SCDU' ) then
    1432             id_scdu=it
    1433         endif
     1418        print *, it, tracers(it+nqo)%name
     1419        SELECT CASE(tracers(it+nqo)%name)
     1420          CASE('PREC'); id_prec=it
     1421          CASE('FINE'); id_fine=it
     1422          CASE('COSS'); id_coss=it
     1423          CASE('CODU'); id_codu=it
     1424          CASE('SCDU'); id_scdu=it
     1425        END SELECT
    14341426       enddo
    14351427       ! check consistency with dust emission scheme:
  • LMDZ6/trunk/libf/phylmd/Dust/splaeropt_5wv_rrtm.F90

    r2753 r4046  
    113113
    114114  DO itr=1,nbtr    !--loop over tracers 
    115 
    116     IF (tname(itr+nqo)=='PREC') THEN       !--fine mode accumulation mode
    117       CYCLE
    118     ELSE IF (tname(itr+nqo)=='FINE') THEN  !--fine mode accumulation mode
    119       soluble=.TRUE.
    120       spsol=1
    121       aerindex=1
    122     ELSE IF (tname(itr+nqo)=='COSS') THEN  !--coarse mode sea salt
    123       soluble=.TRUE.
    124       spsol=2
    125       aerindex=2
    126     ELSE IF (tname(itr+nqo)=='CODU') THEN  !--coarse mode dust
    127       soluble=.FALSE.
    128       spinsol=1
    129       aerindex=3
    130     ELSE IF (tname(itr+nqo)=='SCDU') THEN  !--super coarse mode dust
    131       soluble=.FALSE.
    132       spinsol=2
    133       aerindex=4
    134     ELSE
    135        CALL abort_physic(modname,'I cannot do aerosol optics for '//tname(itr+nqo),1)
    136     ENDIF
     115    SELECT CASE(tracers(itr+nqo)%name)
     116      CASE('PREC'); CYCLE                                  !--precursor
     117      CASE('FINE'); soluble=.TRUE.;  spsol=1; aerindex=1   !--fine mode accumulation mode
     118      CASE('COSS'); soluble=.TRUE.;  spsol=2; aerindex=2   !--coarse mode sea salt
     119      CASE('CODU'); soluble=.FALSE.; spsol=1; aerindex=3   !--coarse mode dust
     120      CASE('SCDU'); soluble=.FALSE.; spsol=2; aerindex=4   !--super coarse mode dust
     121      CASE DEFAULT; CALL abort_physic(modname,'I cannot do aerosol optics for '//tracers(itr+nqo)%name,1)
     122    END SELECT
    137123
    138124    DO la=1,las
  • LMDZ6/trunk/libf/phylmd/Dust/splaeropt_6bands_rrtm.F90

    r3770 r4046  
    165165  cg_ae(:,:,:,:)=0.
    166166   
    167   DO itr=1, nbtr
    168 
    169     IF (tname(itr+nqo)=='PREC') THEN       !--precursor
    170       CYCLE
    171     ELSE IF (tname(itr+nqo)=='FINE') THEN  !--fine mode accumulation mode
    172       soluble=.TRUE.
    173       spsol=1
    174       aerindex=1
    175     ELSE IF (tname(itr+nqo)=='COSS') THEN  !--coarse mode sea salt
    176       soluble=.TRUE.
    177       spsol=2
    178       aerindex=2
    179     ELSE IF (tname(itr+nqo)=='CODU') THEN  !--coarse mode dust
    180       soluble=.FALSE.
    181       spinsol=1
    182       aerindex=3
    183     ELSE IF (tname(itr+nqo)=='SCDU') THEN  !--super coarse mode dust
    184       soluble=.FALSE.
    185       spinsol=2
    186       aerindex=4
    187     ELSE
    188        CALL abort_physic(modname,'I cannot do aerosol optics for '//tname(itr+nqo),1)
    189     ENDIF
     167  DO itr=1,nbtr    !--loop over tracers 
     168    SELECT CASE(tracers(itr+nqo)%name)
     169      CASE('PREC'); CYCLE                                  !--precursor
     170      CASE('FINE'); soluble=.TRUE.;  spsol=1; aerindex=1   !--fine mode accumulation mode
     171      CASE('COSS'); soluble=.TRUE.;  spsol=2; aerindex=2   !--coarse mode sea salt
     172      CASE('CODU'); soluble=.FALSE.; spsol=1; aerindex=3   !--coarse mode dust
     173      CASE('SCDU'); soluble=.FALSE.; spsol=2; aerindex=4   !--super coarse mode dust
     174      CASE DEFAULT; CALL abort_physic(modname,'I cannot do aerosol optics for '//tracers(itr+nqo)%name,1)
     175    END SELECT
    190176
    191177    IF (soluble) THEN ! For aerosol soluble components
  • LMDZ6/trunk/libf/phylmd/Dust/splaeropt_lw_rrtm.F90

    r2753 r4046  
    5555    !
    5656    DO itr=1,nbtr
    57       !
    58       IF (tname(itr+nqo)=='PREC') THEN       !--precursor
    59         CYCLE
    60       ELSE IF (tname(itr+nqo)=='FINE') THEN  !--fine mode accumulation mode
    61         CYCLE
    62       ELSE IF (tname(itr+nqo)=='COSS') THEN  !--coarse mode sea salt
    63         CYCLE
    64       ELSE IF (tname(itr+nqo)=='CODU') THEN  !--coarse mode dust
    65         spinsol=1
    66       ELSE IF (tname(itr+nqo)=='SCDU') THEN  !--super coarse mode dust
    67         spinsol=2
    68       ELSE
    69          CALL abort_physic(modname,'I cannot do aerosol optics for '//tname(itr+nqo),1)
    70       ENDIF
     57      SELECT CASE(tracers(itr+nqo)%name)
     58        CASE('PREC','FINE''COSS'); CYCLE                   !--precursor or fine/coarde accumulation mode
     59        CASE('CODU'); spinsol=1                            !--coarse mode dust
     60        CASE('SCDU'); spinsol=2                            !--super coarse mode dust
     61        CASE DEFAULT; CALL abort_physic(modname,'I cannot do aerosol optics for '//tracers(itr+nqo)%name,1)
     62      END SELECT
    7163      !
    7264      DO inu=1,NLW
  • LMDZ6/trunk/libf/phylmd/Dust/splaerosol_optic_rrtm.F90

    r2753 r4046  
    5151  !
    5252  DO itr=1,nbtr
    53     IF (tname(itr+nqo)=='FINE') THEN
     53    IF (tracers(itr+nqo)%name=='FINE') THEN
    5454      mass_solu_aero(:,:)    = tr_seri(:,:,itr)
    5555      mass_solu_aero_pi(:,:) = tr_seri(:,:,itr)
  • LMDZ6/trunk/libf/phylmd/cvltr.F90

    r2320 r4046  
    1212  USE IOIPSL
    1313  USE dimphy
    14   USE infotrac_phy, ONLY : nbtr,tname
     14  USE infotrac_phy, ONLY : nbtr
    1515  IMPLICIT NONE
    1616!=====================================================================
  • LMDZ6/trunk/libf/phylmd/cvltr_scav.F90

    r2320 r4046  
    1313  USE IOIPSL
    1414  USE dimphy
    15   USE infotrac_phy, ONLY : nbtr,tname
     15  USE infotrac_phy, ONLY : nbtr
    1616  IMPLICIT NONE
    1717  !=====================================================================
  • LMDZ6/trunk/libf/phylmd/cvltr_spl.F90

    r2320 r4046  
    1313  USE IOIPSL
    1414  USE dimphy
    15   USE infotrac_phy, ONLY : nbtr,tname
     15  USE infotrac_phy, ONLY : nbtr
    1616  IMPLICIT NONE
    1717!=====================================================================
  • LMDZ6/trunk/libf/phylmd/dyn1d/1DUTILS.h

    r3780 r4046  
    713713!!      enddo
    714714      DO iq = 1,nqtot
    715         nmq(iq) = trim(tname(iq))
     715        nmq(iq) = trim(tracers(iq)%name)
    716716      ENDDO
    717717      print*,'in dyn1deta0 ',fichnom,klon,klev,nqtot
     
    864864!!      nmq(4)="tra2"
    865865      DO iq = 1,nqtot
    866         nmq(iq) = trim(tname(iq))
     866        nmq(iq) = trim(tracers(iq)%name)
    867867      ENDDO
    868868
  • LMDZ6/trunk/libf/phylmd/infotrac_phy.F90

    r4005 r4046  
    77! the dynamics (could be further cleaned) and is initialized using values
    88! provided by the dynamics
     9
     10  USE readTracFiles_mod, ONLY: trac_type, maxlen, delPhase
    911
    1012! nqtot : total number of tracers and higher order of moment, water vapor and liquid included
     
    4143!$OMP THREADPRIVATE(nqperes)
    4244
    43 ! Name variables
    44   INTEGER,PARAMETER :: tname_lenmax=128
    45   CHARACTER(len=tname_lenmax), ALLOCATABLE, DIMENSION(:), SAVE :: tname ! tracer short name for restart and diagnostics
    46   CHARACTER(len=tname_lenmax+3), ALLOCATABLE, DIMENSION(:), SAVE :: ttext ! tracer long name for diagnostics
    47 !$OMP THREADPRIVATE(tname,ttext)
    48 
    49 !! iadv  : index of trasport schema for each tracer
    50 !  INTEGER, ALLOCATABLE, DIMENSION(:), SAVE    :: iadv
     45! Tracers parameters
     46  TYPE(trac_type), TARGET, ALLOCATABLE, SAVE :: tracers(:)
     47!$OMP THREADPRIVATE(tracers)
    5148
    5249! niadv : vector keeping the coorspondance between all tracers(nqtot) treated in the
     
    107104CONTAINS
    108105
    109   SUBROUTINE init_infotrac_phy(nqtot_,nqo_,nbtr_,nqtottr_,nqCO2_,tname_,ttext_,type_trac_,&
     106  SUBROUTINE init_infotrac_phy(nqtot_,nqo_,nbtr_,nqtottr_,nqCO2_,tracers_,type_trac_,&
    110107                               niadv_,conv_flg_,pbl_flg_,solsym_,&
    111108                               nqfils_,nqdesc_,nqdesc_tot_,iqfils_,iqpere_,&
     
    139136    INTEGER,INTENT(IN) :: id_BIN01_strat_
    140137#endif
    141     CHARACTER(len=*),INTENT(IN) :: tname_(nqtot_) ! tracer short name for restart and diagnostics
    142     CHARACTER(len=*),INTENT(IN) :: ttext_(nqtot_) ! tracer long name for diagnostics
     138    TYPE(trac_type), INTENT(IN) :: tracers_(nqtot_) ! tracers descriptors
    143139    CHARACTER(len=*),INTENT(IN) :: type_trac_
    144140    INTEGER,INTENT(IN) :: niadv_ (nqtot_) ! equivalent dyn / physique
     
    179175    nqCO2=nqCO2_
    180176    nqtottr=nqtottr_
     177    ALLOCATE(tracers(nqtot)); tracers(:) = tracers_(:)
    181178#ifdef CPP_StratAer
    182179    nbtr_bin=nbtr_bin_
     
    187184    id_BIN01_strat=id_BIN01_strat_
    188185#endif
    189     ALLOCATE(tname(nqtot))
    190     tname(:) = tname_(:)
    191     ALLOCATE(ttext(nqtot))
    192     ttext(:) = ttext_(:)
    193186    type_trac = type_trac_
    194187    ALLOCATE(niadv(nqtot))
  • LMDZ6/trunk/libf/phylmd/iophy.F90

    r3488 r4046  
    811811    IMPLICIT NONE
    812812
    813     CHARACTER(LEN=20)                :: nam_var
    814     INTEGER, DIMENSION(nfiles)      :: flag_var
     813    CHARACTER(LEN=*), INTENT(INOUT) :: nam_var
     814    INTEGER,          INTENT(INOUT) :: flag_var(nfiles)
    815815
    816816    IF(prt_level>10) WRITE(lunout,*)'Avant getin: nam_var flag_var ',nam_var,flag_var(:)
  • LMDZ6/trunk/libf/phylmd/phyetat0.F90

    r3956 r4046  
    2323  USE geometry_mod, ONLY : longitude_deg, latitude_deg
    2424  USE iostart, ONLY : close_startphy, get_field, get_var, open_startphy
    25   USE infotrac_phy, only: nbtr, nqo, type_trac, tname, niadv
     25  USE infotrac_phy, only: nbtr, nqo, type_trac, tracers, niadv
    2626  USE traclmdz_mod,    ONLY : traclmdz_from_restart
    2727  USE carbon_cycle_mod, ONLY : carbon_cycle_tr, carbon_cycle_cpl, co2_send
     
    451451!!        iiq=niadv(it+2)                                                           ! jyg
    452452        iiq=niadv(it+nqo)                                                           ! jyg
    453         found=phyetat0_get(1,trs(:,it),"trs_"//tname(iiq), &
    454               "Surf trac"//tname(iiq),0.)
     453        found=phyetat0_get(1,trs(:,it),"trs_"//TRIM(tracers(iiq)%name), &
     454                                  "Surf trac"//TRIM(tracers(iiq)%name),0.)
    455455     ENDDO
    456456     CALL traclmdz_from_restart(trs)
  • LMDZ6/trunk/libf/phylmd/phyredem.F90

    r4035 r4046  
    3535  USE iostart, ONLY: open_restartphy, close_restartphy, enddef_restartphy, put_field, put_var
    3636  USE traclmdz_mod, ONLY : traclmdz_to_restart
    37   USE infotrac_phy, ONLY: type_trac, niadv, tname, nbtr, nqo
     37  USE infotrac_phy, ONLY: type_trac, niadv, tracers, nbtr, nqo
    3838  USE carbon_cycle_mod, ONLY : carbon_cycle_cpl, co2_send
    3939  USE indice_sol_mod, ONLY: nbsrf, is_oce, is_sic, is_ter, is_lic, epsfra
     
    329329!!        iiq=niadv(it+2)                                                           ! jyg
    330330          iiq=niadv(it+nqo)                                                           ! jyg
    331           CALL put_field(pass,"trs_"//tname(iiq), "", trs(:, it))
     331          CALL put_field(pass,"trs_"//tracers(iiq)%name, "", trs(:, it))
    332332       END DO
    333333    END IF
     
    380380    IF (pass==1) CALL enddef_restartphy
    381381    IF (pass==2) CALL close_restartphy
    382  ENDDO
     382  ENDDO ! DO pass=1,2   ! pass=1 netcdf definition ; pass=2 netcdf write
    383383 
    384384  !$OMP BARRIER
  • LMDZ6/trunk/libf/phylmd/phys_output_mod.F90

    r3792 r4046  
    3535    USE iophy
    3636    USE dimphy
    37     USE infotrac_phy, ONLY: nqtot, nqo, niadv, tname, ttext, type_trac
     37    USE infotrac_phy, ONLY: nqtot, nqo, niadv, tracers, type_trac
     38    USE strings_mod,  ONLY: maxlen
    3839    USE ioipsl
    3940    USE phys_cal_mod, only : hour, calend
     
    9596    CHARACTER(LEN=4), DIMENSION(nlevSTD)  :: clevSTD
    9697    REAL, DIMENSION(nlevSTD)              :: rlevSTD
    97     INTEGER                               :: nsrf, k, iq, iiq, iff, i, j, ilev
     98    INTEGER                               :: nsrf, k, iq, iiq, iff, i, j, ilev, jq
    9899    INTEGER                               :: naero
    99100    LOGICAL                               :: ok_veget
     
    113114    LOGICAL, DIMENSION(nfiles)            :: phys_out_filekeys
    114115    LOGICAL, DIMENSION(nfiles)            :: phys_out_filestations
     116
     117    CHARACTER(LEN=50) :: outiso
     118    CHARACTER(LEN=20) :: unit
     119    CHARACTER(LEN=maxlen) :: tnam, lnam, dn
     120    INTEGER :: flag(nfiles)
    115121
    116122!!!!!!!!!! stockage dans une region limitee pour chaque fichier !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     
    494500       IF (nqtot>=nqo+1) THEN
    495501!
    496             DO iq=nqo+1,nqtot
    497             iiq=niadv(iq)
    498             o_trac(iq-nqo) = ctrl_out((/ 1, 5, 5, 5, 10, 10, 11, 11, 11, 11 /), &
    499                            tname(iiq),'Tracer '//ttext(iiq), "-",  &
    500                            (/ '', '', '', '', '', '', '', '', '', '' /))
    501             o_dtr_vdf(iq-nqo) = ctrl_out((/ 4, 7, 7, 7, 10, 10, 11, 11, 11, 11 /), &
    502                               'd'//trim(tname(iq))//'_vdf',  &
    503                               'Tendance tracer '//ttext(iiq), "-" , &
    504                               (/ '', '', '', '', '', '', '', '', '', '' /))
    505 
    506             o_dtr_the(iq-nqo) = ctrl_out((/ 5, 7, 7, 7, 10, 10, 11, 11, 11, 11 /), &
    507                               'd'//trim(tname(iq))//'_the', &
    508                               'Tendance tracer '//ttext(iiq), "-", &
    509                               (/ '', '', '', '', '', '', '', '', '', '' /))
    510 
    511             o_dtr_con(iq-nqo) = ctrl_out((/ 5, 7, 7, 7, 10, 10, 11, 11, 11, 11 /), &
    512                               'd'//trim(tname(iq))//'_con', &
    513                               'Tendance tracer '//ttext(iiq), "-", &
    514                               (/ '', '', '', '', '', '', '', '', '', '' /))
    515 
    516             o_dtr_lessi_impa(iq-nqo) = ctrl_out((/ 7, 7, 7, 7, 10, 10, 11, 11, 11, 11 /), &
    517                                      'd'//trim(tname(iq))//'_lessi_impa', &
    518                                      'Tendance tracer '//ttext(iiq), "-", &
    519                                      (/ '', '', '', '', '', '', '', '', '', '' /))
    520 
    521             o_dtr_lessi_nucl(iq-nqo) = ctrl_out((/ 7, 7, 7, 7, 10, 10, 11, 11, 11, 11 /), &
    522                                      'd'//trim(tname(iq))//'_lessi_nucl', &
    523                                      'Tendance tracer '//ttext(iiq), "-", &
    524                                      (/ '', '', '', '', '', '', '', '', '', '' /))
    525 
    526             o_dtr_insc(iq-nqo) = ctrl_out((/ 7, 7, 7, 7, 10, 10, 11, 11, 11, 11 /), &
    527                                'd'//trim(tname(iq))//'_insc', &
    528                                'Tendance tracer '//ttext(iiq), "-", &
    529                                (/ '', '', '', '', '', '', '', '', '', '' /))
    530 
    531             o_dtr_bcscav(iq-nqo) = ctrl_out((/ 7, 7, 7, 7, 10, 10, 11, 11, 11, 11 /), &
    532                                  'd'//trim(tname(iq))//'_bcscav', &
    533                                  'Tendance tracer '//ttext(iiq), "-", &
    534                                  (/ '', '', '', '', '', '', '', '', '', '' /))
    535 
    536             o_dtr_evapls(iq-nqo) = ctrl_out((/ 7, 7, 7, 7, 10, 10, 11, 11, 11, 11 /), &
    537                                  'd'//trim(tname(iq))//'_evapls', &
    538                                  'Tendance tracer '//ttext(iiq), "-", &
    539                                  (/ '', '', '', '', '', '', '', '', '', '' /))
    540 
    541             o_dtr_ls(iq-nqo) = ctrl_out((/ 7, 7, 7, 7, 10, 10, 11, 11, 11, 11 /), &
    542                              'd'//trim(tname(iq))//'_ls', &
    543                              'Tendance tracer '//ttext(iiq), "-", &
    544                              (/ '', '', '', '', '', '', '', '', '', '' /))
    545 
    546             o_dtr_trsp(iq-nqo) = ctrl_out((/ 7, 7, 7, 7, 10, 10, 11, 11, 11, 11 /), &
    547                                'd'//trim(tname(iq))//'_trsp', &
    548                                'Tendance tracer '//ttext(iiq), "-", &
    549                                (/ '', '', '', '', '', '', '', '', '', '' /))
    550 
    551             o_dtr_sscav(iq-nqo) = ctrl_out((/ 7, 7, 7, 7, 10, 10, 11, 11, 11, 11 /), &
    552                                 'd'//trim(tname(iq))//'_sscav', &
    553                                 'Tendance tracer '//ttext(iiq), "-", &
    554                                 (/ '', '', '', '', '', '', '', '', '', '' /))
    555 
    556             o_dtr_sat(iq-nqo) = ctrl_out((/ 7, 7, 7, 7, 10, 10, 11, 11, 11, 11 /), &
    557                                'd'//trim(tname(iq))//'_sat', &
    558                                'Tendance tracer '//ttext(iiq), "-", &
    559                                (/ '', '', '', '', '', '', '', '', '', '' /))
    560 
    561             o_dtr_uscav(iq-nqo) = ctrl_out((/ 7, 7, 7, 7, 10, 10, 11, 11, 11, 11 /), &
    562                                 'd'//trim(tname(iq))//'_uscav', &
    563                                 'Tendance tracer '//ttext(iiq), "-", &
    564                                  (/ '', '', '', '', '', '', '', '', '', '' /))
    565 
    566             o_dtr_dry(iq-nqo) = ctrl_out((/ 7, 7, 7, 7, 10, 10, 11, 11, 11, 11 /), &
    567                               'cum'//'d'//trim(tname(iq))//'_dry', &
    568                               'tracer tendency dry deposition'//ttext(iiq), "-", &
    569                               (/ '', '', '', '', '', '', '', '', '', '' /))
    570 
    571             o_trac_cum(iq-nqo) = ctrl_out((/ 1, 4, 10, 10, 10, 10, 11, 11, 11, 11 /), &
    572                                'cum'//tname(iiq),&
    573                                'Cumulated tracer '//ttext(iiq), "-", &
    574                                (/ '', '', '', '', '', '', '', '', '', '' /))
    575             ENDDO
    576       ENDIF
     502          DO iq=nqo+1,nqtot
     503            iiq=niadv(iq); jq = iq-nqo
     504            dn = 'd'//TRIM(tracers(iiq)%name)//'_'
     505
     506            flag = [1, 5, 5, 5, 10, 10, 11, 11, 11, 11]
     507            lnam = 'Tracer '//TRIM(tracers(iiq)%longName)
     508            tnam = TRIM(tracers(iiq)%name); o_trac          (jq) = ctrl_out(flag, tnam, lnam, "-", [('',i=1,nfiles)])
     509            flag = [4, 7, 7, 7, 10, 10, 11, 11, 11, 11]
     510            lnam = 'Tendance tracer '//TRIM(tracers(iiq)%longName)
     511            tnam = TRIM(dn)//'vdf';         o_dtr_vdf       (jq) = ctrl_out(flag, tnam, lnam, "-", [('',i=1,nfiles)])
     512
     513            flag = [5, 7, 7, 7, 10, 10, 11, 11, 11, 11]
     514            tnam = TRIM(dn)//'the';         o_dtr_the       (jq) = ctrl_out(flag, tnam, lnam, "-", [('',i=1,nfiles)])
     515            tnam = TRIM(dn)//'con';         o_dtr_con       (jq) = ctrl_out(flag, tnam, lnam, "-", [('',i=1,nfiles)])
     516
     517            flag = [7, 7, 7, 7, 10, 10, 11, 11, 11, 11]
     518            tnam = TRIM(dn)//'lessi_impa';  o_dtr_lessi_impa(jq) = ctrl_out(flag, tnam, lnam, "-", [('',i=1,nfiles)])
     519            tnam = TRIM(dn)//'lessi_nucl';  o_dtr_lessi_nucl(jq) = ctrl_out(flag, tnam, lnam, "-", [('',i=1,nfiles)])
     520            tnam = TRIM(dn)//'insc';        o_dtr_insc      (jq) = ctrl_out(flag, tnam, lnam, "-", [('',i=1,nfiles)])
     521            tnam = TRIM(dn)//'bcscav';      o_dtr_bcscav    (jq) = ctrl_out(flag, tnam, lnam, "-", [('',i=1,nfiles)])
     522            tnam = TRIM(dn)//'evapls';      o_dtr_evapls    (jq) = ctrl_out(flag, tnam, lnam, "-", [('',i=1,nfiles)])
     523            tnam = TRIM(dn)//'ls';          o_dtr_ls        (jq) = ctrl_out(flag, tnam, lnam, "-", [('',i=1,nfiles)])
     524            tnam = TRIM(dn)//'trsp';        o_dtr_trsp      (jq) = ctrl_out(flag, tnam, lnam, "-", [('',i=1,nfiles)])
     525            tnam = TRIM(dn)//'sscav';       o_dtr_sscav     (jq) = ctrl_out(flag, tnam, lnam, "-", [('',i=1,nfiles)])
     526            tnam = TRIM(dn)//'sat';         o_dtr_sat       (jq) = ctrl_out(flag, tnam, lnam, "-", [('',i=1,nfiles)])
     527            tnam = TRIM(dn)//'uscav';       o_dtr_uscav     (jq) = ctrl_out(flag, tnam, lnam, "-", [('',i=1,nfiles)])
     528
     529            lnam = 'tracer tendency dry deposition'//TRIM(tracers(iiq)%longName)
     530            tnam = 'cum'//TRIM(dn)//'dry';  o_dtr_dry       (jq) = ctrl_out(flag, tnam, lnam, "-", [('',i=1,nfiles)])
     531
     532            flag = [1, 4, 10, 10, 10, 10, 11, 11, 11, 11]
     533            lnam = 'Cumulated tracer '//TRIM(tracers(iiq)%longName)
     534            tnam = 'cum'//TRIM(tracers(iiq)%name); o_trac_cum(jq)= ctrl_out(flag, tnam, lnam, "-", [('',i=1,nfiles)])
     535          ENDDO
     536       ENDIF
    577537
    578538   ENDDO !  iff
     
    594554      WRITE(lunout,*)'phys_output_open: ends here'
    595555    ENDIF
     556
     557!  DO iq=nqo+1,nqtot
     558!    iiq=niadv(iq)
     559!    dn = 'd'//TRIM(tracers(iiq)%name)//'_'
     560!    WRITE(*,'(a,i1,a,10i3)')'trac(',iiq,')%flag = ',o_trac(iiq)%flag
     561!    WRITE(*,'(a,i1,a)')'trac(',iiq,')%tnam = '//TRIM(o_trac(iiq)%name)
     562!    WRITE(*,'(a,i1,a)')'trac(',iiq,')%lnam = '//TRIM(o_trac(iiq)%description)
     563!  END DO
    596564
    597565  END SUBROUTINE phys_output_open
  • LMDZ6/trunk/libf/phylmd/phys_output_var_mod.F90

    r3987 r4046  
    55
    66  USE dimphy
     7  USE strings_mod, ONLY: maxlen
    78  ! Variables outputs pour les ecritures des sorties
    89  !======================================================================
     
    121122
    122123  TYPE ctrl_out
    123      INTEGER,DIMENSION(nfiles)            :: flag
    124      CHARACTER(len=20)                    :: name
    125      CHARACTER(len=150)                  :: description
    126      CHARACTER(len=20)                    :: unit
    127      CHARACTER(len=20),DIMENSION(nfiles)  :: type_ecrit
     124     INTEGER               :: flag(nfiles)
     125     CHARACTER(len=maxlen) :: name
     126     CHARACTER(len=maxlen) :: description
     127     CHARACTER(len=maxlen) :: unit
     128     CHARACTER(len=maxlen) :: type_ecrit(nfiles)
    128129  END TYPE ctrl_out
    129130
  • LMDZ6/trunk/libf/phylmd/phys_output_write_mod.F90

    r3956 r4046  
    2525
    2626    USE dimphy, ONLY: klon, klev, klevp1
    27     USE infotrac_phy, ONLY: nbtr
     27    USE infotrac_phy, ONLY: nbtr, nqtot, nqo, type_trac, tracers, niadv
     28    USE strings_mod,  ONLY: maxlen
    2829    USE mod_phys_lmdz_para, ONLY: is_north_pole_phy,is_south_pole_phy
    2930    USE mod_grid_phy_lmdz, ONLY : nbp_lon, nbp_lat
     
    366367    USE pbl_surface_mod, ONLY: snow
    367368    USE indice_sol_mod, ONLY: nbsrf
    368     USE infotrac_phy, ONLY: nqtot, nqo, type_trac, tname, niadv
    369369    USE geometry_mod, ONLY: cell_area, latitude_deg, longitude_deg
    370370    USE surface_data, ONLY: type_ocean, version_ocean, ok_veget, landice_opt
     
    441441    INTEGER ISW
    442442    CHARACTER*1 ch1
    443     CHARACTER*20 varname
     443    CHARACTER(LEN=maxlen) :: varname, dn
    444444
    445445#ifdef CPP_XIOS
     
    454454
    455455    INTEGER :: nqup
     456
    456457
    457458    ! On calcul le nouveau tau:
     
    512513          DO iq=nqo+1, nqtot
    513514            iiq=niadv(iq)
    514             varname=trim(tname(iiq))
    515             WRITE (lunout,*) 'XIOS var=', nqo, iq, nqtot, varname
     515            dn = 'd'//TRIM(tracers(iiq)%name)//'_'
     516            WRITE (lunout,*) 'XIOS var=', nqo, iq, nqtot, tracers(iiq)%name
     517
     518            unt = "kg kg-1"
     519            varname=trim(tracers(iiq)%name)
    516520            CALL xios_add_child(group_handle, child, varname)
    517             CALL xios_set_attr(child, name=varname, unit="kg kg-1")
    518             varname='d'//trim(tname(iiq))//'_vdf'
     521            CALL xios_set_attr(child, name=varname, unit=unt)
     522
     523            unt = "kg kg-1 s-1"
     524            varname=TRIM(dn)//'vdf'
    519525            CALL xios_add_child(group_handle, child, varname)
    520             CALL xios_set_attr(child, name=varname, unit="kg kg-1 s-1")
    521             varname='d'//trim(tname(iiq))//'_the'
     526            CALL xios_set_attr(child, name=varname, unit=unt)
     527            varname=TRIM(dn)//'the'
    522528            CALL xios_add_child(group_handle, child, varname)
    523             CALL xios_set_attr(child, name=varname, unit="kg kg-1 s-1")
    524             varname='d'//trim(tname(iiq))//'_con'
     529            CALL xios_set_attr(child, name=varname, unit=unt)
     530            varname=TRIM(dn)//'con'
    525531            CALL xios_add_child(group_handle, child, varname)
    526             CALL xios_set_attr(child, name=varname, unit="kg kg-1 s-1")
    527             varname='d'//trim(tname(iiq))//'_lessi_impa'
     532            CALL xios_set_attr(child, name=varname, unit=unt)
     533            varname=TRIM(dn)//'lessi_impa'
    528534            CALL xios_add_child(group_handle, child, varname)
    529             CALL xios_set_attr(child, name=varname, unit="kg kg-1 s-1")
    530             varname='d'//trim(tname(iiq))//'_lessi_nucl'
     535            CALL xios_set_attr(child, name=varname, unit=unt)
     536            varname=TRIM(dn)//'lessi_nucl'
    531537            CALL xios_add_child(group_handle, child, varname)
    532             CALL xios_set_attr(child, name=varname, unit="kg kg-1 s-1")
    533             varname='d'//trim(tname(iiq))//'_insc'
     538            CALL xios_set_attr(child, name=varname, unit=unt)
     539            varname=TRIM(dn)//'insc'
    534540            CALL xios_add_child(group_handle, child, varname)
    535             CALL xios_set_attr(child, name=varname, unit="kg kg-1 s-1")
    536             varname='d'//trim(tname(iiq))//'_bcscav'
     541            CALL xios_set_attr(child, name=varname, unit=unt)
     542            varname=TRIM(dn)//'bcscav'
    537543            CALL xios_add_child(group_handle, child, varname)
    538             CALL xios_set_attr(child, name=varname, unit="kg kg-1 s-1")
    539             varname='d'//trim(tname(iiq))//'_evapls'
     544            CALL xios_set_attr(child, name=varname, unit=unt)
     545            varname=TRIM(dn)//'evapls'
    540546            CALL xios_add_child(group_handle, child, varname)
    541             CALL xios_set_attr(child, name=varname, unit="kg kg-1 s-1")
    542             varname='d'//trim(tname(iiq))//'_ls'
     547            CALL xios_set_attr(child, name=varname, unit=unt)
     548            varname=TRIM(dn)//'ls'
    543549            CALL xios_add_child(group_handle, child, varname)
    544             CALL xios_set_attr(child, name=varname, unit="kg kg-1 s-1")
    545             varname='d'//trim(tname(iiq))//'_trsp'
     550            CALL xios_set_attr(child, name=varname, unit=unt)
     551            varname=TRIM(dn)//'trsp'
    546552            CALL xios_add_child(group_handle, child, varname)
    547             CALL xios_set_attr(child, name=varname, unit="kg kg-1 s-1")
    548             varname='d'//trim(tname(iiq))//'_sscav'
     553            CALL xios_set_attr(child, name=varname, unit=unt)
     554            varname=TRIM(dn)//'sscav'
    549555            CALL xios_add_child(group_handle, child, varname)
    550             CALL xios_set_attr(child, name=varname, unit="kg kg-1 s-1")
    551             varname='d'//trim(tname(iiq))//'_sat'
     556            CALL xios_set_attr(child, name=varname, unit=unt)
     557            varname=TRIM(dn)//'sat'
    552558            CALL xios_add_child(group_handle, child, varname)
    553             CALL xios_set_attr(child, name=varname, unit="kg kg-1 s-1")
    554             varname='d'//trim(tname(iiq))//'_uscav'
     559            CALL xios_set_attr(child, name=varname, unit=unt)
     560            varname=TRIM(dn)//'uscav'
    555561            CALL xios_add_child(group_handle, child, varname)
    556             CALL xios_set_attr(child, name=varname, unit="kg kg-1 s-1")
     562            CALL xios_set_attr(child, name=varname, unit=unt)
    557563          ENDDO
    558564          !On ajoute les variables 2D traceurs par l interface fortran
     
    561567          DO iq=nqo+1, nqtot
    562568            iiq=niadv(iq)
    563             varname='cum'//trim(tname(iiq))
     569
     570            unt = "kg m-2"
     571            varname='cum'//trim(tracers(iiq)%name)
    564572            WRITE (lunout,*) 'XIOS var=', iq, nqtot, varname
    565573            CALL xios_add_child(group_handle, child, varname)
    566             CALL xios_set_attr(child, name=varname, unit="kg m-2")
    567             varname='cumd'//trim(tname(iiq))//'_dry'
     574            CALL xios_set_attr(child, name=varname, unit=unt)
     575
     576            unt = "kg m-2 s-1"
     577            varname='cumd'//trim(tracers(iiq)%name)//'_dry'
    568578            CALL xios_add_child(group_handle, child, varname)
    569             CALL xios_set_attr(child, name=varname, unit="kg m-2 s-1")
     579            CALL xios_set_attr(child, name=varname, unit=unt)
    570580          ENDDO
    571581    ENDIF
     
    573583#endif
    574584#endif
     585
    575586    ! ug la boucle qui suit ne sert qu'une fois, pour l'initialisation, sinon il n'y a toujours qu'un seul passage:
    576587    DO iinit=1, iinitend
     
    600611       ENDIf
    601612       CALL histwrite_phy(o_aire, zx_tmp_fi2d)
    602 
    603613       IF (vars_defined) THEN
    604614          DO i=1, klon
  • LMDZ6/trunk/libf/phylmd/traclmdz_mod.F90

    r3581 r4046  
    9696    USE indice_sol_mod
    9797    USE print_control_mod, ONLY: lunout
     98    USE strings_mod, ONLY: strLower
    9899
    99100! Input variables
     
    175176!!       iiq=niadv(it+2)                                                            ! jyg
    176177       iiq=niadv(it+nqo)                                                            ! jyg
    177        IF ( tname(iiq) == "RN" ) THEN                                               
    178           id_rn=it ! radon
    179        ELSE IF ( tname(iiq) == "PB") THEN
    180           id_pb=it ! plomb
    181 ! RomP >>> profil initial de PB210
    182      open (ilesfil2,file='prof.pb210',status='old',iostat=irr2)
    183      IF (irr2 == 0) THEN
    184       read(ilesfil2,*) kradio2
    185       print*,'number of levels for pb210 profile ',kradio2
    186       do k=kradio2,1,-1
    187        read (ilesfil2,*) plomb(:,k)
    188       enddo
    189       close(ilesfil2)
    190       do k=1,klev
    191        do i=1,klon
    192          tr_seri(i,k,id_pb)=plomb(i,k)
    193 !!        print*, 'tr_seri',i,k,tr_seri(i,k,id_pb)
    194         enddo
    195       enddo
    196      ELSE
    197        print *, 'Prof.pb210 does not exist: use restart values'
    198      ENDIF
    199 ! RomP <<<
    200        ELSE IF ( tname(iiq) == "Aga" .OR. tname(iiq) == "AGA" ) THEN
    201           ! Age of stratospheric air
    202           id_aga=it
    203           radio(id_aga) = .FALSE.
    204           aerosol(id_aga) = .FALSE.
    205           pbl_flg(id_aga) = 0
    206          
    207           ! Find the first model layer above 1.5km from the surface
    208           IF (klev>=30) THEN
    209              lev_1p5km=6   ! NB! This value is for klev=39
    210           ELSE IF (klev>=10) THEN
    211              lev_1p5km=5   ! NB! This value is for klev=19
    212           ELSE
    213              lev_1p5km=klev/2
    214           END IF
    215        ELSE IF ( tname(iiq) == "BE" .OR. tname(iiq) == "Be" .OR.  &
    216             tname(iiq) == "BE7" .OR. tname(iiq) == "Be7" ) THEN 
    217           ! Recherche du Beryllium 7
    218           id_be=it
    219           ALLOCATE( srcbe(klon,klev) )
    220           radio(id_be) = .TRUE.
    221           aerosol(id_be) = .TRUE. ! le Be est un aerosol
    222 !jyg le 13/03/2013 ; ajout de pplay en argument de init_be
    223 !!!          CALL init_be(pctsrf,masktr(:,id_be),tautr(id_be),vdeptr(id_be),scavtr(id_be),srcbe)
    224           CALL init_be(pctsrf,pplay,masktr(:,id_be),tautr(id_be),vdeptr(id_be),scavtr(id_be),srcbe)
    225           WRITE(lunout,*) 'Initialisation srcBe: OK'
    226 ! RomP >>> profil initial de Be7
    227       open (ilesfil,file='prof.be7',status='old',iostat=irr)
    228       IF (irr == 0) THEN
    229        read(ilesfil,*) kradio
    230        print*,'number of levels for Be7 profile ',kradio
    231        do k=kradio,1,-1
    232         read (ilesfil,*) beryllium(:,k)
    233        enddo
    234        close(ilesfil)
    235        do k=1,klev
    236          do i=1,klon
    237           tr_seri(i,k,id_be)=beryllium(i,k)
    238 !!        print*, 'tr_seri',i,k,tr_seri(i,k,id_be)
    239          enddo
    240        enddo
    241      ELSE
    242        print *, 'Prof.Be7 does not exist: use restart values'
    243      ENDIF
    244 ! RomP <<<
    245        ELSE IF (tname(iiq)=="O3" .OR. tname(iiq)=="o3") THEN
    246           ! Recherche de l'ozone : parametrization de la chimie par Cariolle
    247           id_o3=it
    248           CALL alloc_coefoz   ! allocate ozone coefficients
    249           CALL press_coefoz   ! read input pressure levels
    250        ELSE IF ( tname(iiq) == "pcsat" .OR. tname(iiq) == "Pcsat" ) THEN
    251           id_pcsat=it
    252        ELSE IF ( tname(iiq) == "pcocsat" .OR. tname(iiq) == "Pcocsat" ) THEN
    253           id_pcocsat=it
    254        ELSE IF ( tname(iiq) == "pcq" .OR. tname(iiq) == "Pcq" ) THEN
    255           id_pcq=it
    256        ELSE IF ( tname(iiq) == "pcs0" .OR. tname(iiq) == "Pcs0" ) THEN
    257           id_pcs0=it
    258           conv_flg(it)=0 ! No transport by convection for this tracer
    259        ELSE IF ( tname(iiq) == "pcos0" .OR. tname(iiq) == "Pcos0" ) THEN
    260           id_pcos0=it
    261           conv_flg(it)=0 ! No transport by convection for this tracer
    262        ELSE IF ( tname(iiq) == "pcq0" .OR. tname(iiq) == "Pcq0" ) THEN
    263           id_pcq0=it
    264           conv_flg(it)=0 ! No transport by convection for this tracer
    265        ELSE
    266           WRITE(lunout,*) 'This is an unknown tracer in LMDZ : ', trim(tname(iiq))
    267        END IF
     178print*,'###'//TRIM(tracers(iiq)%name)//'###'
     179print*,'###'//TRIM(strLower(tracers(iiq)%name))//'###'
     180       SELECT CASE(strLower(tracers(iiq)%name))
     181         CASE("rn");      id_rn     = it ! radon
     182         CASE("pb");      id_pb     = it ! plomb
     183         CASE("aga");     id_aga    = it ! Age of stratospheric air
     184         CASE("be","be7");id_be     = it ! Recherche du Beryllium 7
     185         CASE("o3");      id_o3     = it ! Recherche de l'ozone
     186         CASE("pcsat");   id_pcsat  = it
     187         CASE("pcocsat"); id_pcocsat= it
     188         CASE("pcq");     id_pcq    = it
     189         CASE("pcs0");    id_pcs0   = it
     190         CASE("pcos0");   id_pcos0  = it
     191         CASE("pcq0");    id_pcq0   = it
     192         CASE DEFAULT
     193           WRITE(lunout,*) 'This is an unknown tracer in LMDZ : ', trim(tracers(iiq)%name)
     194       END SELECT
     195
     196       SELECT CASE(strLower(tracers(iiq)%name))
     197         CASE("pb")                        !--- RomP >>> profil initial de PB210
     198           OPEN(ilesfil2,file='prof.pb210',status='old',iostat=irr2)
     199           IF(irr2 == 0) THEN
     200             READ(ilesfil2,*) kradio2
     201             WRITE(lunout,*)'number of levels for pb210 profile ',kradio2
     202             DO k=kradio2,1,-1; READ (ilesfil2,*) plomb(:,k); END DO
     203             CLOSE(ilesfil2)
     204             tr_seri(:,:,id_pb) = plomb(:,:)
     205           ELSE
     206             WRITE(lunout,*)'Prof. Pb210 does not exist: use restart values'
     207           END IF
     208         CASE("aga")
     209           radio(id_aga) = .FALSE.
     210           aerosol(id_aga) = .FALSE.
     211           pbl_flg(id_aga) = 0
     212           ! Find the first model layer above 1.5km from the surface
     213           IF (klev>=30) THEN
     214              lev_1p5km=6                  !--- NB: This value is for klev=39
     215           ELSE IF (klev>=10) THEN
     216              lev_1p5km=5                  !--- NB: This value is for klev=19
     217           ELSE
     218              lev_1p5km=klev/2
     219           END IF
     220         CASE("be","be7")
     221           ALLOCATE( srcbe(klon,klev) )
     222           radio(id_be) = .TRUE.
     223           aerosol(id_be) = .TRUE.         !--- Le Be est un aerosol
     224           CALL init_be(pctsrf,pplay,masktr(:,id_be),tautr(id_be),vdeptr(id_be),scavtr(id_be),srcbe)
     225           WRITE(lunout,*) 'Initialisation srcBe: OK'
     226                                           !--- RomP >>> profil initial de Be7
     227           OPEN(ilesfil,file='prof.be7',status='old',iostat=irr)
     228           IF(irr == 0) THEN
     229             READ(ilesfil,*) kradio
     230             WRITE(lunout,*)'number of levels for Be7 profile ',kradio
     231             DO k=kradio,1,-1; READ(ilesfil,*) beryllium(:,k); END DO
     232             CLOSE(ilesfil)
     233             tr_seri(:,:,id_be)=beryllium(:,:)
     234           ELSE
     235             WRITE(lunout,*)'Prof. Be7 does not exist: use restart values'
     236           END IF
     237         CASE("o3")                         !--- Parametrisation par la chimie de Cariolle
     238           CALL alloc_coefoz                !--- Allocate ozone coefficients
     239           CALL press_coefoz                !--- Read input pressure levels
     240         CASE("pcs0","pcos0","pcq0")
     241           conv_flg(it)=0                   !--- No transport by convection for this tracer
     242       END SELECT
    268243    END DO
    269244
     
    309284       IF (zero) THEN
    310285          ! The tracer was not found in restart file or it was equal zero everywhere.
    311           WRITE(lunout,*) "The tracer ",trim(tname(iiq))," will be initialized"
     286          WRITE(lunout,*) "The tracer ",trim(tracers(iiq)%name)," will be initialized"
    312287          IF (it==id_pcsat .OR. it==id_pcq .OR. &
    313288               it==id_pcs0 .OR. it==id_pcq0) THEN
Note: See TracChangeset for help on using the changeset viewer.