#include "rundeck_opts.h"
MODULE TRDIAG_COM 69,4
!@sum Tracer diagnostic arrays
!@+ Mostly tracer independent, but this may depend on applications
!@auth Jean Lerner
!ver 1.0
USE MODEL_COM
, only: im,jm,lm
USE DOMAIN_DECOMP
, ONLY: grid
USE DIAG_COM
, only: npts !npts are conservation quantities
#ifdef TRACERS_ON
USE TRACER_COM
, only: ntm
* , ntsurfsrcmax, nt3Dsrcmax
#ifdef TRACERS_AMP
* ,ntmAMP
#endif
#endif
IMPLICIT NONE
SAVE
C**** TAIJS <<<< KTAIJS and IJTS_xx are Tracer-Dependent >>>>
C**** TAJLS <<<< KTAJLS and JLS_xx are Tracer-Dependent >>>>
!@dbparam to_volume_MixRat: For printout of tracer concentration
!@+ to_volume_MixRat=1: printout is in Volume Mixing Ratio
!@+ to_volume_MixRat=0: printout is in Mass Mixing Ratio
#ifdef TRACERS_SPECIAL_Shindell
INTEGER, DIMENSION(NTM) :: to_volume_MixRat=1
#else
INTEGER, DIMENSION(NTM) :: to_volume_MixRat=0
#endif
#if (defined TRACERS_WATER) || (defined TRACERS_OCEAN)
!@dbparam to_per_mil For printout of tracer concentration in permil
INTEGER, DIMENSION(NTM) :: to_per_mil = 0
#endif
#ifdef TRACERS_ON
!@var MMR_to_VMR: converts tracer mass mixing ratio to volume mr
REAL*8, DIMENSION(NTM) :: MMR_to_VMR
!!! WARNING: if new diagnostics are added, keep io_trdiag up-to-date !!!
C**** TAIJLN
!@var TAIJLN 3D tracer diagnostics (all tracers)
real*8, allocatable, dimension(:,:,:,:) :: taijln
real*8, allocatable, dimension(:,:,:,:) :: taijln_loc
!real*4, dimension(IM,JM,LM,ntm) :: taijln4
!real*8, allocatable, dimension(:,:,:,:) :: taijln4_loc
!@var SNAME_IJT, UNITS_IJT: Names and units of lat-sigma tracer IJ diags
character(len=30), dimension(lm,ntm) :: sname_ijt,units_ijt
!@var LNAME_IJT: descriptions of tracer IJ diagnostics
character(len=80), dimension(lm,ntm) :: lname_ijt = 'unused'
!@var SCALE_IJT: printout scaling factor for tracer IJ diagnostics
REAL*8, dimension(lm,ntm) :: scale_ijt
!@var IR_IJT: range index of IJ diagnosts
integer, dimension(ntm) :: ir_ijt
!@var IA_IJT: idacc-number for tracer IJ diags (same for all tracers)
integer ia_ijt
!@var IJTC_POWER: power of 10 used for tracer IJ concentration diags
integer, dimension(ntm) :: ijtc_power
!@var IJTM_POWER: power of 10 used for tracer IJ mass unit diags
integer, dimension(ntm) :: ijtm_power
!@var IJT_XX Names for TAIJLN diagnostics (Not currently used)
C**** TAIJN
!@param KTAIJ number of 2D diags describing surface and column load along with wet and dry deposition
#ifdef TRACERS_GASEXCH_Natassa
integer, parameter :: ktaij=7
#else
#ifdef TRACERS_WATER
#ifdef TRACERS_DRYDEP
integer, parameter :: ktaij=18
#else
integer, parameter :: ktaij=16
#endif
#else
#ifdef TRACERS_DRYDEP
integer, parameter :: ktaij=6
#else
integer, parameter :: ktaij=4
#endif
#endif
#endif
!@var IJT_XX names for taijn diagnostics
integer tij_conc,tij_surf,tij_surfbv,tij_mass
!@var IJT_XX names for water-based taijn diagnostics
integer tij_rvr,tij_seaice,tij_prec,tij_evap,tij_grnd,tij_lk1
* ,tij_lk2,tij_soil,tij_snow,tij_uflx,tij_vflx,tij_icocflx
integer tij_gasx,tij_kw,tij_alpha ! TRACERS_GASEXCH_Natassa
integer tij_drydep,tij_gsdep ! TRACERS_DRYDEP
!@var TAIJN lat/lon tracer diagnostics (all tracers)
real*8, allocatable, dimension(:,:,:,:) :: taijn
real*8, allocatable, dimension(:,:,:,:) :: taijn_loc
!real*4, dimension(IM,JM,ktaij,ntm) :: taijn4
!real*8, allocatable, dimension(:,:,:,:) :: taijn4_loc
!@var SCALE_TIJ: printout scaling factor for tracer IJK diagnostics
REAL*8, dimension(ktaij,ntm) :: scale_tij
!@var SNAME_TIJ,UNITS_TIJ: Names and units of lat-sigma tracer diags
character(len=30), dimension(ktaij,ntm) :: sname_tij,units_tij
!@var LNAME_TIJ: descriptions of tracer IJK diags
character(len=80), dimension(ktaij,ntm) :: lname_tij = 'unused'
C**** TAIJS <<<< KTAIJS and IJTS_xx are Tracer-Dependent >>>>
!@var ijs_XXX index for diags not specific to a certain tracer
#if (defined TRACERS_AEROSOLS_Koch) || (defined TRACERS_SPECIAL_Shindell) ||\
(defined TRACERS_AMP)
INTEGER ijs_flash,ijs_CtoG ! ,ijs_OxL1
#ifdef regional_Ox_tracers
INTEGER ijs_Oxloss, ijs_Oxprod
#endif
#endif
#ifdef TRACERS_SPECIAL_Shindell
INTEGER, DIMENSION(LM) :: ijs_OH,ijs_NO3,ijs_HO2,ijs_JH2O2
#endif
!@param KTAIJS number of special lat/lon tracer diagnostics
#if (defined TRACERS_DUST) && (defined TRACERS_SPECIAL_Shindell) &&\
(defined TRACERS_AEROSOLS_Koch) && (defined TRACERS_HETCHEM) &&\
(defined TRACERS_NITRATE) && (defined EDGAR_HYDE_SOURCES)
INTEGER,PARAMETER :: ktaijs=846
#else
#if (defined TRACERS_DUST) && (defined TRACERS_SPECIAL_Shindell) &&\
(defined TRACERS_AEROSOLS_Koch) && (defined TRACERS_HETCHEM) &&\
(defined TRACERS_NITRATE)
INTEGER,PARAMETER :: ktaijs=827
#else
#if (defined TRACERS_DUST) && (defined TRACERS_SPECIAL_Shindell) &&\
(defined TRACERS_AEROSOLS_Koch) && (defined TRACERS_HETCHEM) &&\
(defined EDGAR_HYDE_SOURCES)
INTEGER,PARAMETER :: ktaijs=837
#else
#if (defined TRACERS_DUST) && (defined TRACERS_SPECIAL_Shindell) &&\
(defined TRACERS_AEROSOLS_Koch) && (defined TRACERS_HETCHEM)
INTEGER,PARAMETER :: ktaijs=818
#else
#if (defined TRACERS_SPECIAL_Shindell) && (defined TRACERS_AEROSOLS_Koch) &&\
(defined TRACERS_HETCHEM) && (defined EDGAR_HYDE_SOURCES)
INTEGER,PARAMETER :: ktaijs=498
#else
#if (defined TRACERS_SPECIAL_Shindell) && (defined TRACERS_AEROSOLS_Koch) &&\
(defined TRACERS_HETCHEM)
INTEGER,PARAMETER :: ktaijs=479
#else
#if (defined TRACERS_DUST) && (defined TRACERS_SPECIAL_Shindell) &&\
(defined TRACERS_AEROSOLS_Koch) && (defined TRACERS_NITRATE) &&\
(defined EDGAR_HYDE_SOURCES)
INTEGER,PARAMETER :: ktaijs=707
#else
#if (defined TRACERS_DUST) && (defined TRACERS_SPECIAL_Shindell) &&\
(defined TRACERS_AEROSOLS_Koch) && (defined TRACERS_NITRATE)
INTEGER,PARAMETER :: ktaijs=688
#else
#if (defined TRACERS_DUST) && (defined TRACERS_SPECIAL_Shindell) &&\
(defined TRACERS_AEROSOLS_Koch) && (defined EDGAR_HYDE_SOURCES)
INTEGER,PARAMETER :: ktaijs=698
#else
#if (defined TRACERS_DUST) && (defined TRACERS_SPECIAL_Shindell) &&\
(defined TRACERS_AEROSOLS_Koch)
INTEGER,PARAMETER :: ktaijs=679
#else
#if (defined TRACERS_DUST) && (defined TRACERS_SPECIAL_Shindell) &&\
(defined EDGAR_HYDE_SOURCES)
INTEGER,PARAMETER :: ktaijs=513
#else
#if (defined TRACERS_DUST) && (defined TRACERS_SPECIAL_Shindell)
INTEGER,PARAMETER :: ktaijs=494
#else
#if (defined TRACERS_AEROSOLS_Koch) && (defined TRACERS_SPECIAL_Shindell) &&\
(defined EDGAR_HYDE_SOURCES)
INTEGER,PARAMETER :: ktaijs=495
#else
#if (defined TRACERS_AEROSOLS_Koch) && (defined TRACERS_SPECIAL_Shindell)
INTEGER,PARAMETER :: ktaijs=476
#else
#if (defined TRACERS_AEROSOLS_Koch) && (defined TRACERS_HETCHEM) &&\
(defined TRACERS_DUST)
INTEGER,PARAMETER :: ktaijs=663
#else
#if (defined TRACERS_AEROSOLS_Koch) && (defined TRACERS_DUST)
INTEGER,PARAMETER :: ktaijs=660
#else
#ifdef TRACERS_DUST
INTEGER,PARAMETER :: ktaijs=393
#else
#if (defined TRACERS_MINERALS) && (defined TRACERS_QUARZHEM)
INTEGER,PARAMETER :: ktaijs=1222
#else
#ifdef TRACERS_MINERALS
INTEGER,PARAMETER :: ktaijs=1063
#else
#ifdef TRACERS_SPECIAL_Shindell
INTEGER,PARAMETER :: ktaijs=476
#else
INTEGER,PARAMETER :: ktaijs=1183
#endif
#endif
#endif
#endif
#endif
#endif
#endif
#endif
#endif
#endif
#endif
#endif
#endif
#endif
#endif
#endif
#endif
#endif
#endif
#endif
#if (defined TRACERS_DUST) || (defined TRACERS_MINERALS) ||\
(defined TRACERS_QUARZHEM)
!@param nDustEmij index of dust emission in ijts_isrc
INTEGER,PARAMETER :: nDustEmij=1
!@param nDustTurbij index of dust dry turbulent deposition in ijts_isrc
INTEGER,PARAMETER :: nDustTurbij=3 ! not used?
!@param nDustEv1ij index of number of dust events below threshold wind
!@param nDustEv1ij in ijts_spec
!@param nDustEv2ij index of number of dust events above threshold wind
!@param nDustEv2ij in ijts_spec
!@param nDustWthij index of threshold velocity in ijts_spec
INTEGER,PARAMETER :: nDustEv1ij=1,nDustEv2ij=2,nDustWthij=3
#endif
#ifdef TRACERS_DUST
!@param nDustEm2ij index of dust emission according to cubic scheme
!@param nDustEm2ij in ijts_isrc
INTEGER,PARAMETER :: nDustEm2ij=2
#endif
!@param MaxSubCl Maximum number of sub classes of tracers for rad. diagnostics
INTEGER,PARAMETER :: MaxSubCl=4
#ifdef TRACERS_WATER
!@param MaxDMc Maximum number of special wet depo diags for MC clouds
!@param MaxDLs Maximum number of special wet depo diags for LS clouds
INTEGER,PARAMETER :: MaxDMc=6,MaxDLs=6
#endif
!@param MaxSpec Maximum number special diagnostics not associated with specific
!@+ tracer
INTEGER,PARAMETER :: MaxSpec=3
!@dbparam diag_rad switches on/off comprehensive radiative diags for tracers
INTEGER :: diag_rad=0 ! =off (default)
!@var TAIJS lat/lon special tracer diagnostics; sources, sinks, etc.
REAL*8, ALLOCATABLE, DIMENSION(:,:,:) :: TAIJS
REAL*8, ALLOCATABLE, DIMENSION(:,:,:) :: TAIJS_loc
!REAL*4, DIMENSION(IM,JM,ktaijs) :: TAIJS4
!REAL*8, ALLOCATABLE, DIMENSION(:,:,:) :: TAIJS4_loc
!@var ijts_source tracer independent array for TAIJS surface src. diags
INTEGER ijts_source(ntsurfsrcmax,ntm)
!@var ijts_isrc tracer independent array for TAIJS interactive srf. src.
INTEGER ijts_isrc(ntsurfsrcmax,ntm)
!@var ijts_aq tracer independent array for TAIJS aqueous change
INTEGER ijts_aq(ntm)
!@var ijts_tau tracer independent array for TAIJS hydrated opt. thick.
INTEGER ijts_tau(2,ntm)
!@var ijts_3Dtau 3D tracer independent array for TAIJS hydrated opt. thick.
INTEGER ijts_3Dtau(lm,ntm)
!@var ijts_tausub index for TAIJS opt. thick. for tracer sub classes
INTEGER ijts_tausub(2,Ntm,MaxSubCl)
!@var ijts_sqex index for TAIJS total extinction for 6 radiation bands
INTEGER ijts_sqex(2,6,Ntm)
!@var ijts_sqexsub index for TAIJS total extinction for 6 radiation bands for
!@+ tracer sub classes
INTEGER ijts_sqexsub(2,6,Ntm,MaxSubCl)
!@var ijts_sqsc index for TAIJS scattering extinction for 6 radiation bands
INTEGER ijts_sqsc(2,6,Ntm)
!@var ijts_sqscsub index for TAIJS scattering extinction for 6 radiation
!@+ bands for tracer sub classes
INTEGER ijts_sqscsub(2,6,Ntm,MaxSubCl)
!@var ijts_sqcb index for TAIJS sct asymmetry factor for 6 radiation bands
INTEGER ijts_sqcb(2,6,Ntm)
!@var ijts_sqcbsub index for TAIJS sct asymmetry factor for 6 radiation bands
!@+ for tracer sub classes
INTEGER ijts_sqcbsub(2,6,Ntm,MaxSubCl)
!@var ijts_fc tracer independent array for TAIJS SW/LW rad. forcings
INTEGER ijts_fc(6,ntm)
!@var ijts_fcsub index for TAIJS SW/LW rad. forc. for tracer sub classes
INTEGER ijts_fcsub(6,Ntm,MaxSubCl)
!@var ijts_spec index for TAIJS for special diags. not associated with single
!@var ijts_spec tracer
INTEGER :: ijts_spec(MaxSpec)
#ifdef TRACERS_AMP
!@var ijts_AMPm tracer idependent array for AMP modes
INTEGER ijts_AMPm(lm,2,Ntm)
!@var ijts_AMPe tracer idependent array for emissions
INTEGER ijts_AMPe(Ntm)
!@var ijts_AMPp tracer idependent array for AMP processes
INTEGER ijts_AMPp(7,Ntm)
#endif
#ifdef TRACERS_WATER
!@var ijts_trdpmc indices of taijs special wet depo diags for MC clouds
INTEGER :: ijts_trdpmc(MaxDMc,Ntm)
!@var ijts_trdpls indices of taijs special wet depo diags for LS clouds
INTEGER :: ijts_trdpls(MaxDLs,Ntm)
#else
#if (defined TRACERS_DUST) || (defined TRACERS_MINERALS) ||\
(defined TRACERS_QUARZHEM)
!@var ijts_wet tracer independent array for TAIJS wet depo diagnostics
INTEGER :: ijts_wet(Ntm)
#endif
#endif
!@var ijts_3Dsource tracer independent array for TAIJS 3D src. diags
INTEGER ijts_3Dsource(nt3Dsrcmax,ntm)
!@var SNAME_IJTS, UNITS_IJTS: Names & units of lat-sigma tracer diags
character(len=30), dimension(ktaijs) :: sname_ijts,units_ijts
!@var LNAME_IJTS: descriptions of tracer IJTS diags
character(len=80), dimension(ktaijs) :: lname_ijts = 'unused'
!@var SCALE_IJTS: printout scaling factor for tracer IJTS diagnostics
REAL*8, dimension(ktaijs) :: scale_ijts
!@var IA_IJTS: idacc-number for tracer source/sink IJ diags
integer ia_ijts(ktaijs)
!@var ijts_power: power of 10 used for tracer IJ source/sink diags
INTEGER, DIMENSION(ktaijs) :: ijts_power
!@var ijts_index: tracer index associated with a TAIJS diagnostic
INTEGER, DIMENSION(ktaijs) :: ijts_index
#if (defined TRACERS_DUST) && (defined TRACERS_DRYDEP)
!@var rts_save saves rts as global field for tracer diagnostics
REAL*8 :: rts_save(Im,Jm)
#endif
C**** TAJLN
!@param ktajl,ktajlx number of TAJL tracer diagnostics;
!@+ ktajlx includes composites
#ifdef TRACERS_WATER
INTEGER, PARAMETER :: ktajl=10
#else
INTEGER, PARAMETER :: ktajl=9
#endif
& ,ktajlx=ktajl+2
!@var TAJLN vertical tracer diagnostics (all tracers)
REAL*8, ALLOCATABLE, DIMENSION(:,:,:,:) :: TAJLN
REAL*8, ALLOCATABLE, DIMENSION(:,:,:,:) :: TAJLN_loc
!REAL*4, DIMENSION(JM,LM,ktajlx,ntm) :: TAJLN4
!REAL*8, ALLOCATABLE, DIMENSION(:,:,:,:) :: TAJLN4_loc
!@var jlnt_xx Names for TAJLN diagnostics
INTEGER jlnt_conc,jlnt_mass,jlnt_nt_tot,jlnt_nt_mm,jlnt_vt_tot,
& jlnt_vt_mm,jlnt_mc,jlnt_turb,jlnt_lscond, jlnt_bebe,
& jlnt_bepb
#ifdef TRACERS_WATER
& ,jlnt_cldh2o
#endif
!@var SNAME_JLN: Names of lat-sigma tracer JL diagnostics
character(len=30), dimension(ktajlx,ntm) :: sname_jln
!@var LNAME_JLN,UNITS_JLN: descriptions/units of tracer JL diagnostics
character(len=50), dimension(ktajlx,ntm) :: lname_jln = 'unused'
* ,units_jln
!@var SCALE_JLQ: printout scaling factor for tracer JL diagnostics
REAL*8, dimension(ktajlx) :: scale_jlq
!@var IA_JLQ,JGRID_JLQ: idacc-numbers,gridtypes for tracer JL diags
integer, dimension(ktajlx) :: ia_jlq,jgrid_jlq
!@var JLQ_POWER: power of 10 used for tracer JL diagnostics
!@+ It is associated with a specific physical process
integer jlq_power(ktajlx)
integer ktajlp !@var helps keeps track of
!@var scale_jln: Scale for jl maps
REAL*8, DIMENSION(ntm) :: scale_jln
C**** TAJLS <<<< KTAJLS and JLS_xx are Tracer-Dependent >>>>
!@param ktajls number of source/sink TAJLS tracer diagnostics;
!@var jls_XXX index for non-tracer specific or special diags
#ifdef regional_Ox_tracers
INTEGER jls_Oxloss, jls_Oxprod
#endif
#if (defined TRACERS_AEROSOLS_Koch) || (defined TRACERS_AMP)
INTEGER jls_OHconk,jls_HO2con,jls_NO3,jls_phot,jls_incloud(2,ntm)
#endif
#ifdef TRACERS_SPECIAL_Shindell
INTEGER jls_OHcon,jls_H2Omr,jls_N2O5sulf,jls_day,
&jls_COd,jls_COp,jls_Oxd,jls_Oxp
#ifdef SHINDELL_STRAT_CHEM
& ,jls_ClOcon,jls_H2Ocon,jls_H2Ochem
#endif
#endif
#if (defined TRACERS_DUST) && (defined TRACERS_SPECIAL_Shindell) &&\
(defined TRACERS_AEROSOLS_Koch) && (defined TRACERS_HETCHEM) &&\
(defined EDGAR_HYDE_SOURCES)
INTEGER,PARAMETER :: ktajls=203
#else
#if (defined TRACERS_DUST) && (defined TRACERS_SPECIAL_Shindell) &&\
(defined TRACERS_AEROSOLS_Koch) && (defined TRACERS_HETCHEM)
INTEGER,PARAMETER :: ktajls=184
#else
#if (defined TRACERS_DUST) && (defined TRACERS_SPECIAL_Shindell) &&\
(defined TRACERS_AEROSOLS_Koch) && (defined TRACERS_NITRATE) &&\
(defined EDGAR_HYDE_SOURCES)
INTEGER,PARAMETER :: ktajls=181
#else
#if (defined TRACERS_DUST) && (defined TRACERS_SPECIAL_Shindell) &&\
(defined TRACERS_AEROSOLS_Koch) && (defined EDGAR_HYDE_SOURCES)
INTEGER,PARAMETER :: ktajls=181
#else
#if (defined TRACERS_AEROSOLS_Koch) || (defined TRACERS_SPECIAL_Shindell) ||\
(defined TRACERS_AMP)
#ifdef regional_Ox_tracers
INTEGER, PARAMETER :: ktajls=176
#else
INTEGER, PARAMETER :: ktajls=207
#endif
#else
#ifdef TRACERS_DUST
INTEGER,PARAMETER :: Ktajls=83
#else
#if (defined TRACERS_MINERALS) && (defined TRACERS_QUARZHEM)
INTEGER,PARAMETER :: ktajls=325
#else
#ifdef TRACERS_MINERALS
INTEGER,PARAMETER :: ktajls=303
#else
#ifdef TRACERS_QUARZHEM
INTEGER,PARAMETER :: ktajls=45
#else
INTEGER, PARAMETER :: ktajls=36 ! default
#endif
#endif
#endif
#endif
#endif
#endif
#endif
#endif
#endif
#if (defined TRACERS_DUST) || (defined TRACERS_MINERALS) ||\
(defined TRACERS_QUARZHEM)
!@param nDustEmjl index of dust emission in jls_source
INTEGER,PARAMETER :: nDustEmjl=1
!@param nDustTurbjl index of dust dry turbulent deposition in jls_source
INTEGER,PARAMETER :: nDustTurbjl=3
!@param nDustEv1jl index of number of dust events below threshold wind
!@param nDustEv1jl in jls_spec
!@param nDustEv2jl index of number of dust events above threshold wind
!@param nDustEv2jl in jls_spec
!@param nDustWthjl index of threshold velocity in ijts_spec
INTEGER,PARAMETER :: nDustEv1jl=1,nDustEv2jl=2,nDustWthjl=3
#endif
#ifdef TRACERS_DUST
!@param nDustEm2jl index of dust emission according to cubic scheme
!@param nDustEm2jl in jls_source
INTEGER,PARAMETER :: nDustEm2jl=2
#endif
!@var TAJLS JL special tracer diagnostics for sources, sinks, etc
REAL*8, ALLOCATABLE, DIMENSION(:,:,:) :: TAJLS
REAL*8, ALLOCATABLE, DIMENSION(:,:,:) :: TAJLS_loc
!REAL*4, DIMENSION(JM,LM,ktajls) :: TAJLS4
!REAL*8, ALLOCATABLE, DIMENSION(:,:,:) :: TAJLS4_loc
!@var jls_source tracer independent array for TAJLS surface src. diags
INTEGER jls_source(ntsurfsrcmax,ntm)
!@var jls_isrc tracer independent array for TAJLS interactive surface src. diags
INTEGER jls_isrc(ntsurfsrcmax,ntm)
!@var jls_3Dsource tracer independent array for TAJLS 3D source diags
INTEGER jls_3Dsource(nt3Dsrcmax,ntm)
!@var jls_decay tracer independent array for radioactive sinks
INTEGER, DIMENSION(NTM) :: jls_decay
!@var jls_grav tracer independent array for grav. settling sink
INTEGER, DIMENSION(NTM) :: jls_grav
!@var jls_prec tracer independent array for precipitation/wet dep
INTEGER, DIMENSION(2,NTM) :: jls_prec
#ifdef TRACERS_WATER
!@var jls_trdpmc indices of tajls special wet depo diags for MC clouds
INTEGER :: jls_trdpmc(MaxDMc,Ntm)
!@var jls_trdpls indices of tajls special wet depo diags for LS clouds
INTEGER :: jls_trdpls(MaxDLs,Ntm)
#else
#if (defined TRACERS_DUST) || (defined TRACERS_MINERALS) ||\
(defined TRACERS_QUARZHEM)
!@var jls_wet tracer independent array for wet deposition
INTEGER,DIMENSION(NTM) :: jls_wet
#endif
#endif
!@var jls_spec index for TAJLS for special diagnostics not associated with
!@var jls_spec single tracer
INTEGER :: jls_spec(MaxSpec)
!@var jwt_jls: Weighting index for jls diags 1=simple average, 2=by area
integer, dimension(ktajls) :: jwt_jls
!@var SNAME_JLS: Names of lat-sigma tracer JL sources/sinks
character(len=30), dimension(ktajls) :: sname_jls
!@var LNAME_JLS,UNITS_JLS: descriptions/units of tracer JLS diags
character(len=50), dimension(ktajls) :: lname_jls = 'unused'
* ,units_jls
!@var SCALE_JLS: printout scaling factor for tracer JLS diagnostics
REAL*8, dimension(ktajls) :: scale_jls
!@var IA_JLS,JGRID_JLS: idacc-numbers,gridtypes for tracer JL diags
integer, dimension(ktajls) :: ia_jls,jgrid_jls
!@var JLS_POWER: power of 10 used for tracer JLS diagnostics
integer jls_power(ktajls)
!@var jls_ltop: Top layer for this diagnostic
integer jls_ltop(ktajls)
C**** TCONSRV
!@param NTCONS Maximum Number of special tracer conservation points
INTEGER, PARAMETER :: ntcons=20
!@param KTCON total number of conservation diagnostics for tracers
INTEGER, PARAMETER :: KTCON=npts+ntcons+2
!@param ntmxcon total number of conservation quantities
#ifdef TRACERS_SPECIAL_Shindell
C**** include some extra troposphere only ones
INTEGER, PARAMETER :: ntmxcon = ntm+3
#else
INTEGER, PARAMETER :: ntmxcon = ntm
#endif
!@var TCONSRV conservation diagnostics for tracers
REAL*8, ALLOCATABLE, DIMENSION(:,:,:) :: TCONSRV
REAL*8, ALLOCATABLE, DIMENSION(:,:,:) :: TCONSRV_loc
!REAL*4, DIMENSION(JM,ktcon,ntmxcon) :: TCONSRV4
!REAL*8, ALLOCATABLE, DIMENSION(:,:,:) :: TCONSRV4_loc
!@var SCALE_TCON scales for tracer conservation diagnostics
REAL*8, DIMENSION(ktcon,ntmxcon) :: SCALE_TCON
!@var TITLE_TCON titles for tracer conservation diagnostics
CHARACTER*38, DIMENSION(ktcon,ntmxcon) :: TITLE_TCON
!@var IA_TCON IDACC numbers for tracer conservation diagnostics
INTEGER, DIMENSION(ktcon,ntmxcon) :: IA_TCON
!@var NSUM_TCON indices for summation of conservation diagnostics
INTEGER, DIMENSION(ktcon,ntmxcon) :: NSUM_TCON
!@var NOFMT indices for TCONSRV array
INTEGER, DIMENSION(ktcon,ntmxcon) :: NOFMT
!@var CONPTS names of special processes for tracer conservation diags
CHARACTER*16, DIMENSION(ntcons) :: CONPTS
!@var kt_power_inst,kt_power_change: Exponents for tracer conservation
INTEGER, DIMENSION(ntm) :: kt_power_inst,kt_power_change
!@var name_tconsrv,lname_tconsrv,units_tconsrv: for tracer conservation
character(len=30), dimension(ktcon,ntmxcon) ::
& name_tconsrv,units_tconsrv
character(len=80), dimension(ktcon,ntmxcon) :: lname_tconsrv
!@var SCALE_INST,SCALE_CHANGE: Scale factors for tracer conservation
REAL*8, dimension(ntmxcon) :: SCALE_INST,SCALE_CHANGE
!@var itcon_surf Index array for surface source/sink conservation diags
INTEGER, DIMENSION(ntsurfsrcmax,ntmxcon) :: itcon_surf
!@var itcon_3D Index array for 3D source/sink conservation diags
INTEGER, DIMENSION(nt3Dsrcmax,ntmxcon) :: itcon_3Dsrc
!@var itcon_decay Index array for decay conservation diags
INTEGER, DIMENSION(ntmxcon) :: itcon_decay
!@var itcon_mc Index array for moist convection conserv. diags
INTEGER, DIMENSION(ntmxcon) :: itcon_mc
!@var itcon_ss Index array for large-scale condensation conserv. diags
INTEGER, DIMENSION(ntmxcon) :: itcon_ss
!@var itcon_amp Index array for microphysical processes diags
INTEGER, DIMENSION(7,ntmxcon) :: itcon_amp
!@var itcon_amp Index array for microphysical processes diags
INTEGER, DIMENSION(ntmxcon) :: itcon_ampe
!@var itcon_amp Index array for microphysical processes diags
INTEGER, DIMENSION(2,ntmxcon) :: itcon_ampm
#ifdef TRACERS_DRYDEP
!@var itcon_dd Index array for dry deposition conserv. diags
INTEGER, DIMENSION(ntmxcon,2) :: itcon_dd
!@var dtr_dd to save drydep change for conservation quantities
REAL*8,ALLOCATABLE :: dtr_dd(:,:,:)
#endif
#ifndef TRACERS_WATER
#if (defined TRACERS_DUST) || (defined TRACERS_MINERALS) ||\
(defined TRACERS_QUARZHEM)
!@var itcon_wt Index array for dust/mineral dust deposition conserv. diags
INTEGER,DIMENSION(ntmxcon) :: itcon_wt
#endif
#endif
#endif
!@var PDSIGJL temporary storage for mean pressures for jl diags
REAL*8, DIMENSION(JM,LM) :: PDSIGJL
END MODULE TRDIAG_COM
#ifdef TRACERS_ON
SUBROUTINE SET_TCON(QCON,NAME_CON,QSUM,INST_UNIT,SUM_UNIT 44,5
* ,INST_SC,CHNG_SC, itr,CONPTs)
!@sum SET_TCON assigns conservation diagnostic array indices
!@auth Gavin Schmidt
!@ver 1.0
USE CONSTANT
, only: sday
USE MODEL_COM
, only: dtsrc,nfiltr
USE DIAG_COM
, only: npts,ia_d5d,ia_d5s,ia_filt,ia_12hr,ia_src
* ,conpt0
USE TRDIAG_COM
, only: ktcon,title_tcon,scale_tcon,nsum_tcon
* ,nofmt,ia_tcon,name_tconsrv,lname_tconsrv,units_tconsrv
* ,ntcons
IMPLICIT NONE
!@var QCON denotes at which points conservation diags are saved
LOGICAL, INTENT(IN),DIMENSION(ktcon-1) :: QCON
!@var QSUM sets whether each diag is included in final sum
!@+ should be zero for diags set using DIAGTCB (i.e. using difference)
LOGICAL, INTENT(IN),DIMENSION(ktcon-1) :: QSUM
LOGICAL, DIMENSION(ktcon-1) :: QSUM_CON ! local version
!@var INST_SC scale for instantaneous value
REAL*8, INTENT(IN) :: INST_SC
!@var CHNG_SC scale for changes
REAL*8, INTENT(IN) :: CHNG_SC
!@var NAME_CON name of conservation quantity
CHARACTER*8, INTENT(IN) :: NAME_CON
!@var sname name of conservation quantity (no spaces)
CHARACTER*8 :: sname
!@var INST_UNIT string for unit for instant. values
CHARACTER*20, INTENT(IN) :: INST_UNIT
!@var SUM_UNIT string for unit for summed changes
CHARACTER*20, INTENT(IN) :: SUM_UNIT
!@var ITR index for the tracer
INTEGER, INTENT(IN) :: ITR
!@var CONPTS conservation diag points for special tracer diags
CHARACTER*16, INTENT(IN), DIMENSION(ntcons) :: CONPTS
!@var CONPTS_sname like CONPTS but without spaces
CHARACTER*16, DIMENSION(ntcons) :: CONPTS_sname
!@var CONPT0_sname like CONPT0 but without spaces
CHARACTER*10, DIMENSION(npts) :: CONPT0_sname
CHARACTER*11 CHGSTR
INTEGER NI,NM,NS,N,k
C**** remove spaces in NAME_CON for netcdf names
sname=TRIM(NAME_CON)
do k=1,len_trim(NAME_CON)
if (sname(k:k).eq." ") sname(k:k)="_"
end do
C**** remove spaces, invalid characters in CONPTS, CONPT0 for netcdf names
conpts_sname = conpts
do n=1,ntcons
do k=1,len_trim(conpts_sname(n))
if (conpts_sname(n)(k:k).eq." ") conpts_sname(n)(k:k)="_"
if (conpts_sname(n)(k:k).eq."+") conpts_sname(n)(k:k)="_"
enddo
enddo
conpt0_sname = conpt0
do n=1,npts
do k=1,len_trim(conpt0_sname(n))
if (conpt0_sname(n)(k:k).eq." ") conpt0_sname(n)(k:k)="_"
if (conpt0_sname(n)(k:k).eq."+") conpt0_sname(n)(k:k)="_"
enddo
enddo
C****
NI=1
NOFMT(1,itr) = NI
TITLE_TCON(NI,itr) =
* "0INSTANT "//TRIM(NAME_CON)//" "//TRIM(INST_UNIT)
SCALE_TCON(NI,itr) = INST_SC
name_tconsrv(NI,itr) ="inst_"//sname
lname_tconsrv(NI,itr) = "INSTANT "//TRIM(NAME_CON)
units_tconsrv(NI,itr) = INST_UNIT
NSUM_TCON(NI,itr) = -1
IA_TCON(NI,itr) = 12
NM=NI
DO N=2,ktcon-1
IF (QCON(N)) THEN
NM = NM + 1
NOFMT(N,itr) = NM
QSUM_CON(NM)=.FALSE.
IF (QSUM(N)) QSUM_CON(NM)=.TRUE.
CHGSTR=" CHANGE OF "
if (n.le.npts+1) then
TITLE_TCON(NM,itr) = CHGSTR//TRIM(NAME_CON)//" BY "//
* CONPT0(N-1)
name_tconsrv(NM,itr) =
* "chg_"//trim(sname)//"_"//TRIM(CONPT0_sname(N-1))
else
IF (.not. QSUM(N)) CHGSTR=" DELTA "
TITLE_TCON(NM,itr) = CHGSTR//TRIM(NAME_CON)//" BY "//
* CONPTs(N-npts-1)
name_tconsrv(NM,itr) =
* "chg_"//trim(sname)//"_"//TRIM(CONPTs_sname(N-npts-1))
end if
lname_tconsrv(NM,itr) = TITLE_TCON(NM,itr)
units_tconsrv(NM,itr) = SUM_UNIT
SELECT CASE (N)
CASE (2)
SCALE_TCON(NM,itr) = CHNG_SC/DTSRC
IA_TCON(NM,itr) = ia_d5d
CASE (3,4,5,6,7,9,11,12)
SCALE_TCON(NM,itr) = CHNG_SC/DTSRC
IA_TCON(NM,itr) = ia_d5s
CASE (8)
SCALE_TCON(NM,itr) = CHNG_SC/(NFILTR*DTSRC)
IA_TCON(NM,itr) = ia_filt
CASE (10)
SCALE_TCON(NM,itr) = CHNG_SC*2./SDAY
IA_TCON(NM,itr) = ia_12hr
CASE (13:) ! special tracer sources
SCALE_TCON(NM,itr) = CHNG_SC/DTSRC
IA_TCON(NM,itr) = ia_src
END SELECT
ELSE
NOFMT(N,itr) = 0
END IF
END DO
NS=NM+1
IF (NS.gt.KTCON) THEN
WRITE(6,*) "KTCON not large enough for extra conserv diags",
* KTCON,NI,NM,NS,NAME_CON
call stop_model
(
& "Change KTCON in tracer diagnostic common block",255)
END IF
DO NM=NI+1,NS-1
NSUM_TCON(NM,itr) = -1
IF (QSUM_CON(NM)) NSUM_TCON(NM,itr) = NS
END DO
TITLE_TCON(NS,itr) = " SUM OF CHANGES "//TRIM(SUM_UNIT)
name_Tconsrv(NS,itr) ="sum_chg_"//trim(sname)
lname_Tconsrv(NS,itr) = " SUM OF CHANGES OF "//TRIM(NAME_CON)
units_Tconsrv(NS,itr) = SUM_UNIT
SCALE_TCON(NS,itr) = 1.
IA_TCON(NS,itr) = 12
NSUM_TCON(NS,itr) = 0
RETURN
END SUBROUTINE set_tcon
#endif
#ifdef TRACERS_ON
SUBROUTINE io_trdiag(kunit,it,iaction,ioerr) 1,36
!@sum io_trdiag reads and writes tracer diagnostics arrays to file
!@auth Jean Lerner
!@ver 1.0
USE MODEL_COM
, only: im,jm,lm
USE MODEL_COM
, only: ioread,iowrite,iowrite_mon,iowrite_single
* ,irerun,ioread_single,lhead
USE DOMAIN_DECOMP
, only : PACK_DATA,PACK_J,UNPACK_DATA,UNPACK_J
USE DOMAIN_DECOMP
, only : AM_I_ROOT
USE DOMAIN_DECOMP
, only : ESMF_BCAST
USE DOMAIN_DECOMP
, only : grid, GET
USE TRACER_COM
, only: ntm
USE TRDIAG_COM
, only : taijln_loc, taijln
USE TRDIAG_COM
, only : taijn_loc, taijn
USE TRDIAG_COM
, only : taijs_loc, taijs
USE TRDIAG_COM
, only : tajln_loc, tajln
USE TRDIAG_COM
, only : tajls_loc, tajls
USE TRDIAG_COM
, only : tconsrv_loc,tconsrv
!USE TRDIAG_COM, only : taijln4_loc, taijln4
!USE TRDIAG_COM, only : taijn4_loc, taijn4
!USE TRDIAG_COM, only : taijs4_loc, taijs4
!USE TRDIAG_COM, only : tajln4_loc, tajln4
!USE TRDIAG_COM, only : tajls4_loc, tajls4
!USE TRDIAG_COM, only : tconsrv4_loc,tconsrv4
USE TRDIAG_COM
, only : pdsigjl
USE TRDIAG_COM
, only : ktaij, ktaijs, ktajlx, ktajls, ktcon
USE TRDIAG_COM
, only : ntmxcon
IMPLICIT NONE
INTEGER kunit !@var kunit unit number of read/write
INTEGER iaction !@var iaction flag for reading or writing to file
!@var IOERR 1 (or -1) if there is (or is not) an error in i/o
INTEGER, INTENT(INOUT) :: IOERR
!@var HEADER Character string label for individual records
CHARACTER*80 :: HEADER, MODULE_HEADER = "TRdiag01"
!@var it input/ouput value of hour
INTEGER, INTENT(INOUT) :: it
INTEGER it_check ! =it if all diag. TA..4 were kept up-to-date
!@param KTACC total number of tracer diagnostic words
INTEGER, PARAMETER ::
* ktacc=IM*JM*LM*NTM + IM*JM*ktaij*NTM + IM*JM*ktaijs +
* JM*LM*ktajlx*NTM + JM*LM*ktajls + JM*ntmxcon*ktcon
!@var TA..4(...) dummy arrays for reading diagnostics files
! REAL*4 TAIJLN4(im,jm,lm,ntm),TAIJN4(im,jm,ktaij,ntm)
! REAL*4 TAIJS4(IM,JM,ktaijs),TAJLN4(JM,LM,ktajlx,NTM)
! REAL*4 TAJLS4(JM,LM,ktajls),TCONSRV4(JM,ktcon,ntmxcon)
real*4, allocatable, dimension(:,:,:,:) :: taijln4
real*8, allocatable, dimension(:,:,:,:) :: taijln4_loc
real*4, allocatable, dimension(:,:,:,:) :: taijn4
real*8, allocatable, dimension(:,:,:,:) :: taijn4_loc
REAL*4, allocatable, DIMENSION(:,:,:) :: TAIJS4
REAL*8, ALLOCATABLE, DIMENSION(:,:,:) :: TAIJS4_loc
REAL*4, allocatable, DIMENSION(:,:,:,:) :: TAJLN4
REAL*8, ALLOCATABLE, DIMENSION(:,:,:,:) :: TAJLN4_loc
REAL*4, allocatable, DIMENSION(:,:,:) :: TAJLS4
REAL*8, ALLOCATABLE, DIMENSION(:,:,:) :: TAJLS4_loc
REAL*4, allocatable, DIMENSION(:,:,:) :: TCONSRV4
REAL*8, ALLOCATABLE, DIMENSION(:,:,:) :: TCONSRV4_loc
INTEGER :: status
INTEGER :: J_0H, J_1H
CALL GET
( grid, J_STRT_HALO = J_0H, J_STOP_HALO = J_1H )
ALLOCATE ( taijln4(IM,JM,LM,ntm), stat=status )
ALLOCATE ( taijn4(IM,JM,ktaij,ntm), stat=status )
ALLOCATE ( TAIJS4(IM,JM,ktaijs), stat=status )
ALLOCATE ( TAJLN4(JM,LM,ktajlx,ntm), stat=status )
ALLOCATE ( TAJLS4(JM,LM,ktajls), stat=status )
ALLOCATE ( TCONSRV4(JM,ktcon,ntmxcon), stat=status )
ALLOCATE ( TAIJLN4_loc(IM,J_0H:J_1H,LM,ntm), stat=status )
ALLOCATE ( TAIJN4_loc( IM,J_0H:J_1H,ktaij,ntm), stat=status )
ALLOCATE ( TAIJS4_loc( IM,J_0H:J_1H,ktaijs ), stat=status )
ALLOCATE ( TAJLN4_loc( J_0H:J_1H,LM,ktajlx,ntm), stat=status )
ALLOCATE ( TAJLS4_loc( J_0H:J_1H,LM,ktajls ), stat=status )
ALLOCATE ( TCONSRV4_loc( J_0H:J_1H,ktcon,ntmxcon), stat=status )
write (MODULE_HEADER(lhead+1:80),'(a,i8,a)')
* 'R8 TACC(',ktacc,'),it'
SELECT CASE (IACTION)
CASE (IOWRITE,IOWRITE_MON,IOWRITE_SINGLE)
C*** PACK distributed arrays into global ones in preparation for output
CALL PACK_DATA
(grid,TAIJLN_loc, TAIJLN)
CALL PACK_DATA
(grid,TAIJN_loc, TAIJN )
CALL PACK_DATA
(grid,TAIJS_loc, TAIJS )
CALL PACK_J
(grid,TAJLN_loc, TAJLN )
CALL PACK_J
(grid,TAJLS_loc, TAJLS )
CALL PACK_J
(grid,TCONSRV_loc, TCONSRV )
SELECT CASE (IACTION)
CASE (IOWRITE,IOWRITE_MON) ! output to standard restart file
IF (AM_I_ROOT()) WRITE (kunit,err=10) MODULE_HEADER,
* TAIJLN,TAIJN,TAIJS,
* TAJLN ,TAJLS,TCONSRV,it
CASE (IOWRITE_SINGLE) ! output to acc file
MODULE_HEADER(LHEAD+1:LHEAD+2) = 'R4'
IF (AM_I_ROOT()) WRITE (kunit,err=10) MODULE_HEADER,
* REAL(TAIJLN,KIND=4),REAL(TAIJN,KIND=4),
* REAL(TAIJS,KIND=4) ,REAL(TAJLN,KIND=4),
* REAL(TAJLS,KIND=4) ,REAL(TCONSRV,KIND=4),it
END SELECT
CASE (IOREAD:) ! input from restart file
SELECT CASE (IACTION)
CASE (ioread_single) ! accumulate diagnostic files
if ( AM_I_ROOT() ) then
READ (kunit,err=10) HEADER,
* TAIJLN4,TAIJN4,TAIJS4,TAJLN4,TAJLS4,TCONSRV4,it_check
if (it.ne.it_check) then
PRINT*,"io_trdiag: compare TAIJLN,TAIJLN4, ... dimensions"
go to 10 ! or should this be just a warning ??
end if
IF (HEADER(1:LHEAD).NE.MODULE_HEADER(1:LHEAD)) THEN
PRINT*,"Discrepancy in module version ",HEADER
* ,MODULE_HEADER
GO TO 10
END IF
end if
C*** Unpack read global data into (real*8) local distributed arrays
CALL UNPACK_DATA
( grid, real(TAIJLN4,kind=8), TAIJLN4_loc)
CALL UNPACK_DATA
( grid, real(TAIJN4,kind=8) , TAIJN4_loc)
CALL UNPACK_DATA
( grid, real(TAIJS4,kind=8) , TAIJS4_loc)
CALL UNPACK_J
( grid, real(TAJLN4,kind=8) , TAJLN4_loc)
CALL UNPACK_J
( grid, real(TAJLS4,kind=8) , TAJLS4_loc)
CALL UNPACK_J
( grid, real(TCONSRV4,kind=8), TCONSRV4_loc)
C**** Accumulate diagnostics (converted back to real*8)
TAIJLN_loc = TAIJLN_loc+TAIJLN4_loc(:,J_0H:J_1H,:,:)
TAIJN_loc = TAIJN_loc+TAIJN4_loc(:,J_0H:J_1H,:,:)
TAIJS_loc = TAIJS_loc+TAIJS4_loc(:,J_0H:J_1H,:)
TAJLN_loc = TAJLN_loc+TAJLN4_loc(J_0H:J_1H,:,:,:)
TAJLS_loc = TAJLS_loc+TAJLS4_loc(J_0H:J_1H,:,:)
TCONSRV_loc = TCONSRV_loc+TCONSRV4_loc(J_0H:J_1H,:,:)
! IF (HEADER(1:LHEAD).NE.MODULE_HEADER(1:LHEAD)) THEN
! PRINT*,"Discrepancy in module version ",HEADER
! * ,MODULE_HEADER
! GO TO 10
! END IF
CASE (ioread) ! restarts
if ( AM_I_ROOT() ) then
READ (kunit,err=10) HEADER,
* TAIJLN,TAIJN,TAIJS,
* TAJLN,TAJLS,TCONSRV,it
IF (HEADER(1:LHEAD).NE.MODULE_HEADER(1:LHEAD)) THEN
PRINT*,"Discrepancy in module version ",HEADER
* ,MODULE_HEADER
GO TO 10
END IF
end if
C*** Unpack read global data into local distributed arrays
CALL UNPACK_DATA
( grid,TAIJLN, TAIJLN_loc)
CALL UNPACK_DATA
( grid,TAIJN , TAIJN_loc)
CALL UNPACK_DATA
( grid,TAIJS , TAIJS_loc)
CALL UNPACK_J
( grid,TAJLN , TAJLN_loc)
CALL UNPACK_J
( grid,TAJLS , TAJLS_loc)
CALL UNPACK_J
( grid,TCONSRV, TCONSRV_loc)
CALL ESMF_BCAST
( grid, it )
END SELECT
END SELECT
DEALLOCATE ( taijln4 )
DEALLOCATE ( taijn4 )
DEALLOCATE ( TAIJS4 )
DEALLOCATE ( TAJLN4 )
DEALLOCATE ( TAJLS4 )
DEALLOCATE ( TCONSRV4 )
DEALLOCATE ( TAIJLN4_loc )
DEALLOCATE ( TAIJN4_loc )
DEALLOCATE ( TAIJS4_loc )
DEALLOCATE ( TAJLN4_loc )
DEALLOCATE ( TAJLS4_loc )
DEALLOCATE ( TCONSRV4_loc )
RETURN
10 IOERR=1
RETURN
END SUBROUTINE io_trdiag
#endif
SUBROUTINE ALLOC_TRDIAG_COM 1,3
USE TRDIAG_COM
USE DOMAIN_DECOMP
, only : GET
INTEGER :: J_0H,J_1H
INTEGER :: status
CALL GET
(grid, J_STRT_HALO=J_0H, J_STOP_HALO=J_1H)
#ifdef TRACERS_ON
ALLOCATE ( TAIJLN_loc(IM,J_0H:J_1H,LM,ntm), stat=status )
ALLOCATE ( TAIJN_loc( IM,J_0H:J_1H,ktaij,ntm), stat=status )
ALLOCATE ( TAIJS_loc( IM,J_0H:J_1H,ktaijs ), stat=status )
ALLOCATE ( TAJLN_loc( J_0H:J_1H,LM,ktajlx,ntm), stat=status )
ALLOCATE ( TAJLS_loc( J_0H:J_1H,LM,ktajls ), stat=status )
ALLOCATE ( TCONSRV_loc( J_0H:J_1H,ktcon,ntmxcon), stat=status )
ALLOCATE ( TAIJLN(IM,JM,LM,ntm), stat=status )
ALLOCATE ( TAIJN( IM,JM,ktaij,ntm), stat=status )
ALLOCATE ( TAIJS( IM,JM,ktaijs ), stat=status )
ALLOCATE ( TAJLN( JM,LM,ktajlx,ntm), stat=status )
ALLOCATE ( TAJLS( JM,LM,ktajls ), stat=status )
ALLOCATE ( TCONSRV( JM,ktcon,ntmxcon), stat=status )
!ALLOCATE ( TAIJLN4_loc(IM,J_0H:J_1H,LM,ntm), stat=status )
!ALLOCATE ( TAIJN4_loc( IM,J_0H:J_1H,ktaij,ntm), stat=status )
!ALLOCATE ( TAIJS4_loc( IM,J_0H:J_1H,ktaijs ), stat=status )
!ALLOCATE ( TAJLN4_loc( J_0H:J_1H,LM,ktajlx,ntm), stat=status )
!ALLOCATE ( TAJLS4_loc( J_0H:J_1H,LM,ktajls ), stat=status )
!ALLOCATE ( TCONSRV4_loc( J_0H:J_1H,ktcon,ntmxcon), stat=status )
#ifdef TRACERS_DRYDEP
ALLOCATE (dtr_dd(J_0H:J_1H,Ntm,2),stat=status)
#endif
#endif
RETURN
END SUBROUTINE ALLOC_TRDIAG_COM