! $Id: ndxx_setup.f,v 1.4 2012/03/01 22:00:26 daven Exp $ SUBROUTINE NDXX_SETUP ! !****************************************************************************** ! NDXX_SETUP dynamically allocates memory for certain diagnostic arrays that ! are declared allocatable in "diag_mod.f". (bmy, bey, 6/16/98, 12/18/08) ! ! This allows us to reduce the amount of memory that needs to be declared ! globally. We only allocate memory for arrays if the corresponding ! diagnostic is turned on. ! ! NOTES: ! (1 ) This subroutine was split off from subroutine INPUT, for clarity ! (2 ) Added call to READ49 (bey, 2/99) ! (3 ) Eliminate GISS-Specific code, and AIJ, AIL diagnostics (bmy, 3/15/99) ! (4 ) Define tracer offset TRCOFFSET for "alternate chemistry" runs. ! (5 ) Multi-level diagnostics ND21, ND22, ND43, ND45, ND66, and ND68 have ! now been split off from the AIJ arrays (bmy, 3/29/99) ! (6 ) Added code for ND14 and ND15. Also eliminated obsolete code ! and updated comments (bmy, 11/10/99) ! (7 ) Added new ND41 and ND51 diagnostics (from amf). Freed up obsolete ! diagnostics ND34. ND37, and ND42 and updated comments. (bmy, 11/15/99) ! Also note: ND41 uses allocatable array AD41. (bmy, 12/6/99) ! (8 ) The following diagnostic arrays are now declared allocatable ! in "diag_mod.f": AD21, AD22, AD38, AD39, AD43, AD45, AD47, ! AD66, AD68, CONVFLUP, TURBFLUP, MASSFLEW, MASSFLNS, MASSFLUP, TCOBOX ! Allocate memory for these arrays only if their respective ! diagnostic is turned on. This will save memory. (bmy, 11/29/99) ! (9 ) Added ND55 diagnostic for tropopause heights (hyl, bmy, 12/1/99) ! (10) ND50 and ND20 now have dynamically allocatable arrays. (bmy, 1/5/00) ! (11) ND27 diagnostic now also turns on ND24, ND25, ND26 (bmy, 1/7/00) ! (12) ND31, ND33, ND35, ND37, ND67, and ND69 now use dynamically ! allocatable arrays declared in "diag_mod.f". (bmy, 2/17/00) ! (13) ND16, ND17, ND18 now use allocatable arrays. Also now use internal ! subroutine "alloc_err" to print error messages. (bmy, 3/14/00) ! (14) AIJ is now obsolete. All diagnostic variables now use allocatable ! arrays (cf. "diag_mod.f"). This is necessary in order to keep the ! size of the 2 x 2.5 executable within machine limits. (bmy, 3/28/00) ! (15) Removed obsolete code. Added TRCOFFSET of 3 for CO run ! with parameterized OH. Removed reference to KAIJPAR. (bmy, 4/19/00) ! (16) Add TRCOFFSET of 50 for DMS/SO2/SO4/MSA. Also added arrays for ! ND13 diagnostic for sulfur emissions (bmy, 6/6/00) ! (17) Add reference to F90 module "biomass_mod.f". Also added array ! AD32_bf for biofuel NOx. (bmy, 9/11/00) ! (18) Use NTRACE + 2 prodloss families for Tagged CO for the ! ND65 diagnostic (bmy, 10/6/00) ! (19) Adjust TRCOFFSET for 10-tracer Tagged CO run. Redimensioned ! AD45 and AD47 to save memory. Renamed STATUS to AS. (bmy, 10/18/00) ! (20) Removed obsolete code from 10/00. Save out ND65 only to LLTROP ! levels for full chemistry. Save out ND43 only to LLTROP levels ! for full chemistry. Dimension DIAGCHLORO up to LLTROP for ! full chemistry (or LLPAR for CO/OH chemistry). ND24, ND25, ND26 ! can now save out less than LLPAR levels. Eliminate dependence ! on PD35, PD37, PD39 parameters (bmy, 12/5/00) ! (21) Only save out a maximum of LCONVM layers for ND14 (bmy, 12/7/00) ! (22) Removed obsolete code from 7/00, 9/00, and 12/00 (bmy, 12/21/00) ! (23) Increase to NTRACE + 4 prodloss families for Tagged CO (bmy, 1/2/01) ! (24) Add TRCOFFSET of 54 for CH4 chemistry (NSRCX == 9) (bmy, 1/16/01) ! (25) Now allocate DIAGCHLORO (ND23 diagnostic) for CH4 runs (bmy, 1/18/01) ! (26) For ND43, save up to LLTROP for full chemistry, but save up to ! LLPAR for Tagged CO or CO-OH chemistry (bmy, 2/12/01) ! (27) Now allocate AD34 for biofuel burning emissions (bmy, 3/15/01) ! (28) Add L(CH3I) to ND65 diagnostic (nad, bmy, 3/20/01) ! (29) For full chemistry, we only need to save up to LLTROP levels ! for the ND22 J-value diagnostic (bmy, 4/2/01) ! (30) Remove reference to NBIOMAX from "biomass_mod.f" (bmy, 4/17/01) ! (31) Eliminate obsolete commented-out code (bmy, 4/20/01) ! (32) Now also allocate the AD12 diagnostic array (bdf, bmy, 6/15/01) ! (33) Now assign TRCOFFSET = 40 for multi-tracer Ox run (when NSRCX = 6 ! and LSPLIT = T). Reference CMN_SETUP for LSPLIT. Allocate AD44 ! with NTRACE instead of NUMDEP for single or multi-tracer Ox runs ! (NSRCX = 6). Now define NFAM as NTRACE*2 for single or multi-tracer ! Ox runs. Updated comments & made cosmetic changes. (bmy, 7/3/01) ! (34) Added AD11 diagnostic for acetone source. Also removed obsolete ! code from 7/01. (bmy, 9/4/01) ! (35) Turn off ND23 unless NSRCX = 3, 5, or 9. This prevents us from ! referencing an unallocated DIAGCHLORO array. Add error check for ! ND65, make sure that NFAM > 0. Also clean up the code that ! allocates AD65 and FAMPL arrays. (bmy, 1/14/02) ! (36) Now set TRCOFFSET = 64 for tagged C2H6 chemistry (bmy, 1/25/02) ! (37) Eliminate obsolete code from 1/02 and 2/02. Also allocate LTNO2, ! CTNO2, LTHO2, CTHO2 for the ND43 diagnostic. (bmy, 2/27/02) ! (38) Call SETUP_PLANEFLIGHT to initialize the ND40 plane flight diagnostic ! for non-SMVGEAR chemistry runs. (mje, bmy, 7/2/02) ! (39) Now set up variables & arrays for ND01 and ND02 diagnostics (i.e. ! Rn-Pb-Be emissions and decay). (bmy, 9/20/02) ! (40) Now allocate AD05 array. Now allocate routines ALLOC_ERR and ! ERROR_STOP from "error_mod.f". Now reference NEMANTHRO from F90 ! module "tracerid_mod.f" instead of "comtrid.h". Also added array ! AD13_SO2_bf for biofuel SO2. (bmy, 1/16/03) ! (41) Now also allocate AD13_NH3_na array for ND13 (rjp, bmy, 3/23/03) ! (42) Added ND03 diagnostic for Kr85 prod/loss. Also removed special case ! TRCOFFSET for single-tracer Ox. (jsw, bmy, 8/20/03) ! (43) Now use GET_WETDEP_NMAX to get max # of soluble tracers for ND37, ! ND18, and ND19. Also set NFAM=NTRACE+5 for Tagged CO simulation. ! (3/18/04) ! (44) Now initialize AD06 and AD07* arrays (rjp, tdf, bmy, 4/5/04) ! (45) Now initialize AD08 array. Reset TRCOFFSET for tagged CO from ! 84 to 80. Also activate ND52 diagnostic for ICARTT. ! (rjp, bec, stu, cas, bmy, 4/20/04) ! (46) Now allocate AD13_SO2_sh array for ND13 (bec, bmy, 5/20/04) ! (47) Now allocate AD07_HC array for ND07 (rjp, bmy, 7/13/04) ! (48) Now references "tracer_mod.f" and "logical_mod.f" instead of "CMN" ! and "CMN_SETUP". Now references INIT_DIAG_OH from "diag_oh_mod.f" ! Adjust TRCOFFSET for various aerosol simulations. (bmy, 7/20/04) ! (49) Make sure ND21 only goes from 1-LLTROP (bmy, 9/28/04) ! (50) Now allocate AD13_SO4_bf array (bmy, 11/17/04) ! (51) Now allocate extra arrays for ND03 mercury diag. Also set up for ! mercury tracers in ND44 diagnostic. (bmy, 12/14/04) ! (52) Added separate ND21 array for cryst sulfur tracers. Now reinstated ! AD03 array for mercury simulation. Now move ND03 diagnostics into ! a separate module. Remove TCOBOX reference, it's obsolete. ! (cas, sas, bmy, 1/21/05) ! (53) Now remove references to AD41 & AFTTOT. Now call SETUP_PLANEFLIGHT ! for non-full-chemistry runs in main.f -- this will allow it to look ! for flight files for each day (bmy, 3/24/05) ! (54) Now use PD05=10 to dimension AD05 array (bmy, 4/13/05) ! (55) Now also allocates AD09 and AD09_em (bmy, 6/27/05) ! (56) Now allocates AD30 (bmy, 8/18/05) ! (57) Removed duplicate variable declarations (bmy, 2/6/06) ! (58) Now remove NBIOTRCE; it's obsolete. Replace w/ NBIOMAX (bmy, 4/5/06) ! (59) Now remove TRCOFFSET; it's obsolete (bmy, 5/16/06) ! (60) Added the ND54 for time spend in the troposphere (phs, 10/17/06) ! (61) Now allocate ND43 and ND45 counter arrays as 3-D (phs, 1/19/07) ! (62) For ND20 diagnostic, reset ND65 diagnostic with LLTROP_FIX instead of ! LLTROP. Added ND10 diagnostic setup. Added modifications for H2-HD ! simulation. (phs, bmy, 9/18/07) ! (63) Now save true pressure edges for ND31 diagnostic (bmy, 11/16/07) ! (64) Now stop the run if ND20 is defined but ND65 isn't (bmy, 12/4/07) ! (65) Allocate CTO3_24h (phs, 11/18/08) ! (66) We don't need to set LD65=1 here anymore, we now call NDXX_SETUP! ! after DIAG_PL_MOD. (phs, bmy, 12/18/08) ! (67) Added ND52 for GAMMA HO2 diagnostic. (ccc, jaegle, 2/26/09) ! (68) Add AD07_SOAGM (tmf, 1/7/09) ! (67) Added ND52 for GAMMA HO2 diagnostic. (ccc, jaegle, 2/26/09) ! (68) Add AD07_SOAGM (tmf, 1/7/09) ! (69) Now always allocate Mass Flux arrays (phs, 4/15/09) ! (70) Added ND59 for converting units to ug/m3. (lz, 10/11/10) ! (71) Add AD19, AD58, AD60 (kjw, 8/18/09, adj32_023) !****************************************************************************** ! ! References to F90 modules USE BIOMASS_MOD, ONLY : NBIOMAX USE BIOFUEL_MOD, ONLY : NBFTRACE USE DIAG49_MOD, ONLY : DO_SAVE_DIAG49 USE DIAG_MOD, ONLY : AD01, AD02, AD05 USE DIAG_MOD, ONLY : AD06, AD07, AD07_BC USE DIAG_MOD, ONLY : AD07_OC, AD07_HC, AD08 USE DIAG_MOD, ONLY : AD07_SOAGM USE DIAG_MOD, ONLY : AD09, AD09_em, AD11 USE DIAG_MOD, ONLY : AD12, AD13_DMS, AD13_SO2_ac USE DIAG_MOD, ONLY : AD13_SO2_an, AD13_SO2_bb, AD13_SO2_bf USE DIAG_MOD, ONLY : AD13_SO2_ev, AD13_SO2_nv, AD13_SO4_an USE DIAG_MOD, ONLY : AD13_SO4_bf, AD13_SO2_sh, AD13_NH3_an USE DIAG_MOD, ONLY : AD13_NH3_na, AD13_NH3_bb, AD13_NH3_bf USE DIAG_MOD, ONLY : CONVFLUP, TURBFLUP, AD16 USE DIAG_MOD, ONLY : CT16, AD17, CT17 USE DIAG_MOD, ONLY : AD18, CT18, AD21 USE DIAG_MOD, ONLY : AD21_cr, AD22, LTJV USE DIAG_MOD, ONLY : CTJV, MASSFLEW, MASSFLNS USE DIAG_MOD, ONLY : MASSFLUP, AD28, AD29 USE DIAG_MOD, ONLY : AD30, AD31 USE DIAG_MOD, ONLY : AD32_ac, AD32_an, AD32_bb USE DIAG_MOD, ONLY : AD32_bf, AD32_fe, AD32_li USE DIAG_MOD, ONLY : AD32_so, AD32_ub, AD33 USE DIAG_MOD, ONLY : AD32_SHIP, AD32_SHIP_COUNT USE DIAG_MOD, ONLY : AD34, AD35, AD36 USE DIAG_MOD, ONLY : AD36_SHIP, AD36_SHIP_COUNT USE DIAG_MOD, ONLY : EMISS_ANTHR USE DIAG_MOD, ONLY : AD37, AD38, AD39 USE DIAG_MOD, ONLY : AD43, LTNO USE DIAG_MOD, ONLY : CTNO, LTOH, CTOH USE DIAG_MOD, ONLY : LTHO2, CTHO2, LTNO2 USE DIAG_MOD, ONLY : CTNO2, LTNO3, CTNO3 USE DIAG_MOD, ONLY : AD44, AD45, LTOTH USE DIAG_MOD, ONLY : CTOTH, AD46, AD47 USE DIAG_MOD, ONLY : AD52, AD54 USE DIAG_MOD, ONLY : AD19, AD58, AD60 USE DIAG_MOD, ONLY : AD55, AD66, AD67 USE DIAG_MOD, ONLY : AD68, AD69, CTO3 USE DIAG_MOD, ONLY : AD10, AD10em, CTO3_24h USE DIAG_OH_MOD, ONLY : INIT_DIAG_OH USE DRYDEP_MOD, ONLY : NUMDEP USE ERROR_MOD, ONLY : ALLOC_ERR, ERROR_STOP USE LOGICAL_MOD, ONLY : LDUST, LCARB, LSSALT, LCRYST, LDRYD USE PLANEFLIGHT_MOD, ONLY : SETUP_PLANEFLIGHT USE TRACER_MOD, ONLY : ITS_A_CH3I_SIM USE TRACER_MOD, ONLY : ITS_A_FULLCHEM_SIM USE TRACER_MOD, ONLY : ITS_A_MERCURY_SIM USE TRACER_MOD, ONLY : ITS_A_TAGOX_SIM USE TRACER_MOD, ONLY : ITS_A_H2HD_SIM USE TRACER_MOD, ONLY : N_TRACERS USE TRACERID_MOD, ONLY : NEMANTHRO USE WETSCAV_MOD, ONLY : GET_WETDEP_NMAX IMPLICIT NONE # include "CMN_SIZE" ! Size parameters # include "CMN_DIAG" ! Diagnostic switches & arrays ! Local variables INTEGER :: NMAX, AS, NEMISS, LMAX !================================================================= ! NDXX_SETUP begins here! ! ! Initialize some multi-level variables !================================================================= LD01 = 1 LD02 = 1 LD05 = 1 LD09 = 1 LD10 = 1 LD07 = 1 LD12 = 1 LD13 = 1 LD14 = 1 LD15 = 1 LD16 = 1 LD17 = 1 LD18 = 1 LD19 = 1 LD21 = 1 LD22 = 1 LD24 = 1 LD25 = 1 LD26 = 1 LD31 = 1 LD37 = 1 LD38 = 1 LD39 = 1 LD43 = 1 LD45 = 1 LD47 = 1 LD52 = 1 LD54 = 1 LD64 = 1 !----------------------------------------------------------------- ! Prior to 12/18/08: ! We don't need to set LD65=1 here anymore, we now call ! NDXX_SETUP after DIAG_PL_MOD. (phs, bmy, 12/18/08) !LD65 = 1 !----------------------------------------------------------------- LD66 = 1 LD68 = 1 !================================================================= ! ND01: Rn, Pb, Be emissions !================================================================= IF ( ND01 > 0 ) THEN LD01 = MIN( ND01, LLPAR ) ALLOCATE( AD01( IIPAR, JJPAR, LD01, N_TRACERS ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD01' ) ENDIF !================================================================= ! ND02: Rn, Pb, Be decay !================================================================= IF ( ND02 > 0 ) THEN LD02 = MIN( ND02, LLPAR ) ALLOCATE( AD02( IIPAR, JJPAR, LD02, N_TRACERS ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD02' ) ENDIF !================================================================= ! ND04: CO2 source - see ?? ! ! ND05: Sulfate Prod/loss !================================================================= IF ( ND05 > 0 ) THEN LD05 = MIN( ND05, LLTROP ) ALLOCATE( AD05( IIPAR, JJPAR, LD05, PD05 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD05' ) ENDIF !================================================================ ! ND06: Dust emissions !================================================================ IF ( ND06 > 0 .and. LDUST ) THEN ALLOCATE( AD06( IIPAR, JJPAR, NDSTBIN ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD06' ) ENDIF !================================================================= ! ND07: Carbonaceous aerosols emissions and chemical conversion !================================================================= IF ( ND07 > 0 .and. LCARB ) THEN LD07 = MIN( ND07, LLPAR ) ALLOCATE( AD07( IIPAR, JJPAR, PD07 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD07' ) ALLOCATE( AD07_BC( IIPAR, JJPAR, LD07 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD07_BC' ) ALLOCATE( AD07_OC( IIPAR, JJPAR, LD07 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD07_OC' ) ALLOCATE( AD07_HC( IIPAR, JJPAR, LD07, 5 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD07_HC' ) ALLOCATE( AD07_SOAGM( IIPAR, JJPAR, LD07, 4 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD07_SOAGM' ) ENDIF !================================================================ ! ND08: Dust emissions !================================================================ IF ( ND08 > 0 .and. LSSALT ) THEN ALLOCATE( AD08( IIPAR, JJPAR, PD08 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD08' ) ENDIF !================================================================= ! ND09: HCN / CH3CN source & sink !================================================================= IF ( ND09 > 0 ) THEN LD09 = MIN( ND09, LLPAR ) ALLOCATE( AD09( IIPAR, JJPAR, LD09, N_TRACERS ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD09' ) ALLOCATE( AD09_em( IIPAR, JJPAR, PD09 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD09_em' ) ENDIF !================================================================= ! ND10: H2/HD prod, loss, sources !================================================================= IF ( ND10 > 0 ) THEN ! number of emissions tracers NEMISS = 5 ! Accumulating diagnostic array ALLOCATE( AD10( IIPAR, JJPAR, LD10, (PD10-NEMISS) ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD10' ) ! Accumulating diagnostic array ALLOCATE( AD10em( IIPAR, JJPAR, NEMISS ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD10em' ) ENDIF !================================================================= ! ND11: Acetone source diagnostics [atoms C/cm2/s] ! --> uses AD11 array (allocatable) !================================================================= IF ( ND11 > 0 ) THEN ALLOCATE( AD11( IIPAR, JJPAR, PD11 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD11' ) ENDIF !================================================================= ! ND12: Distribution of emissions in boundary layer [fraction] ! --> uses AD12 array (allocatable) !================================================================= LD12 = MIN( ND12, LLTROP ) IF ( ND12 > 0 ) THEN ALLOCATE( AD12( IIPAR, JJPAR, LD12 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'PL24H' ) ENDIF !================================================================= ! ND13: Sulfur emissions from DMS, SO2, and SO4 !================================================================= IF ( ND13 > 0 ) THEN LD13 = MIN( ND13, LLPAR ) ALLOCATE( AD13_DMS( IIPAR, JJPAR ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD13_DMS' ) ALLOCATE( AD13_SO2_ac( IIPAR, JJPAR, LD13 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD13_SO2_ac' ) ALLOCATE( AD13_SO2_an( IIPAR, JJPAR, NOXLEVELS ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD13_SO2_an' ) ALLOCATE( AD13_SO2_bb( IIPAR, JJPAR ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD13_SO2_bb' ) ALLOCATE( AD13_SO2_bf( IIPAR, JJPAR ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD13_SO2_bf' ) ALLOCATE( AD13_SO2_ev( IIPAR, JJPAR, LD13 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD13_SO2_ev' ) ALLOCATE( AD13_SO2_nv( IIPAR, JJPAR, LD13 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD13_SO2_nv' ) ALLOCATE( AD13_SO4_an( IIPAR, JJPAR, 2 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD13_SO4_an' ) ALLOCATE( AD13_SO4_bf( IIPAR, JJPAR ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD13_SO4_bf' ) ALLOCATE( AD13_SO2_sh( IIPAR, JJPAR ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD13_SO4_sh' ) ALLOCATE( AD13_NH3_an( IIPAR, JJPAR ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD13_NH3_an' ) ALLOCATE( AD13_NH3_na( IIPAR, JJPAR ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD13_NH3_na' ) ALLOCATE( AD13_NH3_bb( IIPAR, JJPAR ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD13_NH3_bb' ) ALLOCATE( AD13_NH3_bf( IIPAR, JJPAR ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD13_NH3_bf' ) ENDIF !================================================================= ! ND14: Upward flux of from wet conv [kg/s] ! --> uses CONVFLUP array (allocatable) !================================================================= IF ( ND14 > 0 ) THEN LD14 = MIN( ND14, LLCONVM ) NMAX = MIN( N_TRACERS, NNPAR ) ALLOCATE( CONVFLUP( IIPAR, JJPAR, LLCONVM, NMAX ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'CONVFLUP' ) ENDIF !================================================================= ! ND15: Mass change from BL-mixing [kg/s] ! --> uses TURBFLUP array (allocatable) !================================================================= IF ( ND15 > 0 ) THEN LD15 = MIN( ND15, LLPAR ) NMAX = MIN( N_TRACERS, NNPAR ) ALLOCATE( TURBFLUP( IIPAR, JJPAR, LLPAR, NMAX ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'TURBFLUP' ) ENDIF !================================================================= ! ND16: Fraction of grid box experiencing large-scale and ! convective precipitation --> uses AD16 array (allocatable) !================================================================= IF ( ND16 > 0 ) THEN LD16 = MIN( ND16, LLPAR ) ! Store both LS and convective fractions ALLOCATE( AD16( IIPAR, JJPAR, LD16, 2 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD16' ) ! Counter array for AD16 ALLOCATE( CT16( IIPAR, JJPAR, LD16, 2 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'CT16' ) ENDIF !================================================================= ! ND17: Fraction of tracer lost to rainout (in both large-scale ! and conv precipitation) --> uses AD17 array (allocatable) !================================================================= IF ( ND17 > 0 ) THEN LD17 = MIN( ND17, LLPAR ) ! Get max # of soluble tracers for this simulation NMAX = GET_WETDEP_NMAX() ! Store both LS and convective rainout fractions ALLOCATE( AD17( IIPAR, JJPAR, LD17, NMAX, 2 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD17' ) ! Counter array for AD17 ALLOCATE( CT17( IIPAR, JJPAR, LD17, 2 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'CT17' ) ENDIF !================================================================= ! ND18: Fraction of tracer lost to washout (in both large-scale ! and convective precipitation) --> uses AD18 array (alloc.) !================================================================= IF ( ND18 > 0 ) THEN LD18 = MIN( ND18, LLPAR ) ! Get max # of soluble tracers for this simulation NMAX = GET_WETDEP_NMAX() ! Store both LS and convective rainout fractions ALLOCATE( AD18( IIPAR, JJPAR, LD18, NMAX, 2 ), STAT=AS) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD18' ) ! Counter array for AD17 ALLOCATE( CT18( IIPAR, JJPAR, LD18, 2 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'CT18' ) ENDIF !================================================================= ! ND19: CH4 loss by OH !================================================================= IF ( ND19 > 0 ) THEN LD19 = MIN( ND19, LLPAR ) ALLOCATE( AD19( IIPAR, JJPAR, LD19 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD19' ) ENDIF !================================================================= ! ND20: Save O3 P-L losses to disk for single-tracer O3 run ! in the PL24H array. Also turn on ND65, since the P-L ! rates are computed by ND65. !================================================================= IF ( ND20 > 0 ) THEN IF ( ND65 == 0 ) THEN CALL ERROR_STOP( 'ND65 must be turned on for ND20 output!', & 'ndxx_setup.f' ) ENDIF ENDIF !================================================================= ! ND21: Optical depths and cloud fractions [unitless] ! --> uses AD21 array (allocatable) !================================================================= IF ( ND21 > 0 ) THEN LD21 = MIN( ND21, LLTROP ) ! For regular ALLOCATE( AD21( IIPAR, JJPAR, LD21, PD21 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD21' ) ! Separate for crystalline sulfate tracers (bmy, 1/5/05) IF ( LCRYST ) THEN ALLOCATE( AD21_cr( IIPAR, JJPAR, 6 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD21' ) ENDIF ENDIF !================================================================= ! ND22: J-value diagnostics [s^-1] ! --> uses AD22 array (allocatable) !================================================================= IF ( ND22 > 0 ) THEN ! For full chemistry, we only consider boxes below the ! tropopause. Cap LD22 at LLTROP (bmy, 4/2/01) IF ( ITS_A_FULLCHEM_SIM() ) THEN LD22 = MIN( ND22, LLTROP ) ELSE LD22 = MIN( ND22, LLPAR ) ENDIF ! Accumulating diagnostic array ALLOCATE( AD22( IIPAR, JJPAR, LD22, PD22 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD22' ) ! Locations where LT is between HR1_JV and HR2_JV ALLOCATE( LTJV( IIPAR, JJPAR ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'LTJV' ) ! Number of times where LT is between HR1_JV and HR2_JV ALLOCATE( CTJV( IIPAR, JJPAR ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'CTJV' ) ENDIF !================================================================= ! ND27: Flux of Ox across the annual mean tropopause [kg/s] ! ND27 will also turn on ND24, ND25, ND26 diagnostics !================================================================= IF ( ND27 > 0 ) THEN ND24 = LLPAR ND25 = LLPAR ND26 = LLPAR ENDIF ! Change allocations for ND24/25/26 diagnostics to save memory space ! if these diagnostics are not used.(ccc, 12/3/09) ! ! !================================================================= ! ! ND24: Eastward mass flux from transport [kg/s] ! ! --> uses MASSFLEW array (allocatable) ! !================================================================= ! IF ( ND24 > 0 ) LD24 = MIN( ND24, LLPAR ) ! NMAX = MIN( N_TRACERS, NNPAR ) ! ! ALLOCATE( MASSFLEW( IIPAR, JJPAR, LLPAR, NMAX ), STAT=AS) ! IF ( AS /= 0 ) CALL ALLOC_ERR( 'MASSFLEW' ) ! !================================================================= ! ! ND25: Northward mass flux from transport [kg/s] ! ! --> uses MASSFLNS array (allocatable) ! !================================================================= ! IF ( ND25 > 0 ) LD25 = MIN( ND25, LLPAR ) ! NMAX = MIN( N_TRACERS, NNPAR ) ! ! ALLOCATE( MASSFLNS( IIPAR, JJPAR, LLPAR, NMAX ), STAT=AS ) ! IF ( AS /= 0 ) CALL ALLOC_ERR( 'MASSFLNS' ) ! !================================================================= ! ! ND26: Vertical mass flux from transport [kg/s] ! ! --> uses MASSFLUP array (allocatable) ! !================================================================= ! IF ( ND26 > 0 ) LD26 = MIN( ND26, LLPAR ) ! NMAX = MIN( N_TRACERS, NNPAR ) ! ! ALLOCATE( MASSFLUP( IIPAR, JJPAR, LLPAR, NMAX ), STAT=AS ) ! IF ( AS /= 0 ) CALL ALLOC_ERR( 'MASSFLUP' ) !================================================================= ! ND24: Eastward mass flux from transport [kg/s] ! --> uses MASSFLEW array (allocatable) !================================================================= IF ( ND24 > 0 ) THEN LD24 = MIN( ND24, LLPAR ) NMAX = MIN( N_TRACERS, NNPAR ) ALLOCATE( MASSFLEW( IIPAR, JJPAR, LLPAR, NMAX ), STAT=AS) IF ( AS /= 0 ) CALL ALLOC_ERR( 'MASSFLEW' ) ELSE ALLOCATE( MASSFLEW( 1, 1, 1, 1 ), STAT=AS) IF ( AS /= 0 ) CALL ALLOC_ERR( 'MASSFLEW' ) ENDIF !================================================================= ! ND25: Northward mass flux from transport [kg/s] ! --> uses MASSFLNS array (allocatable) !================================================================= IF ( ND25 > 0 ) THEN LD25 = MIN( ND25, LLPAR ) NMAX = MIN( N_TRACERS, NNPAR ) ALLOCATE( MASSFLNS( IIPAR, JJPAR, LLPAR, NMAX ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'MASSFLNS' ) ELSE ALLOCATE( MASSFLNS( 1, 1, 1, 1 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'MASSFLNS' ) ENDIF !================================================================= ! ND26: Vertical mass flux from transport [kg/s] ! --> uses MASSFLUP array (allocatable) !================================================================= IF ( ND26 > 0 ) THEN LD26 = MIN( ND26, LLPAR ) NMAX = MIN( N_TRACERS, NNPAR ) ALLOCATE( MASSFLUP( IIPAR, JJPAR, LLPAR, NMAX ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'MASSFLUP' ) ELSE ALLOCATE( MASSFLUP( 1, 1, 1, 1 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'MASSFLUP' ) ENDIF !================================================================= ! ND28: Biomass burning diagnostic [molec/cm2/s] ! (NO, CO, ALK4, ACET, MEK, ALD2, PRPE, C3H8, CH2O, C2H6) ! --> uses AD28 array (allocatable) !================================================================= IF ( ND28 > 0 ) THEN ALLOCATE( AD28( IIPAR, JJPAR, NBIOMAX ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD28' ) ENDIF !================================================================= ! ND29: CO-SRCE diagnostic [molec/cm2/s] ! (anthro, biomass, biofuel, from monot., from methanol) ! --> uses AD29 array (allocatable) !================================================================= IF ( ND29 > 0 ) THEN ALLOCATE( AD29( IIPAR, JJPAR, PD29 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD29' ) ENDIF !================================================================= ! ND30: Land/water/ice flags !================================================================= IF ( ND30 > 0 ) THEN ALLOCATE( AD30( IIPAR, JJPAR ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD30' ) ENDIF !================================================================= ! ND31: 3-D pressure edges [hPa] --> Uses AD31 array (allocatable) !================================================================= IF ( ND31 > 0 ) THEN LD31 = MIN( ND31, LLPAR+1 ) ALLOCATE( AD31( IIPAR, JJPAR, LD31 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD31' ) ENDIF !================================================================= ! ND32: Sources of NOx [molec/cm2/s] ! (aircraft, biomass, biofuel, lightning, ! stratosphere, soils, fertilizer, anthropogenic) ! --> Uses AD32_xx arrays (allocatable) !================================================================= IF ( ND32 > 0 ) THEN ! For aircraft NOx ALLOCATE( AD32_ac( IIPAR, JJPAR, LLTROP ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD32_ac' ) ! For anthropogenic NOx ALLOCATE( AD32_an( IIPAR, JJPAR, NOXEXTENT ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD32_an' ) ! For biomass burning NOx ALLOCATE( AD32_bb( IIPAR, JJPAR ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD32_bb' ) ! For biofuel NOx ALLOCATE( AD32_bf( IIPAR, JJPAR ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD32_bf' ) ! For fertilizer NOx ALLOCATE( AD32_fe( IIPAR, JJPAR ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD32_fe' ) ! For Lightning NOx ALLOCATE( AD32_li( IIPAR, JJPAR, LLCONVM ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD32_li' ) ! For soil NOx ALLOCATE( AD32_so( IIPAR, JJPAR ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD32_so' ) ! For stratospheric NOx ALLOCATE( AD32_ub( IIPAR, JJPAR ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD32_st' ) ! For ship NOx ALLOCATE( AD32_SHIP( IIPAR, JJPAR ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD32_SHIP' ) ! For ship NOx counter ALLOCATE( AD32_SHIP_COUNT, STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD32_SHIP_COUNT' ) ENDIF !================================================================= ! ND33: Column sum of tracer [kg] ! --> uses AD33 array (allocatable)! !================================================================= IF ( ND33 > 0 ) THEN ALLOCATE( AD33( IIPAR, JJPAR, PD33 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD33' ) ENDIF !================================================================= ! ND34: Biofuel burning emissions [molec/cm2/s] ! (NO, CO, ALK4, ACET, MEK, ALD2, PRPE, C3H8, CH2O, C2H6) ! --> uses AD34 array (allocatable) !================================================================= IF ( ND34 > 0 ) THEN ALLOCATE( AD34( IIPAR, JJPAR, NBFTRACE ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD34' ) ENDIF !================================================================= ! ND35: Tracer at 500 mb [v/v] (this is ~ level 9 for GEOS-CHEM) ! --> uses AD35 array (allocatable) !================================================================= IF ( ND35 > 0 ) THEN ALLOCATE( AD35( IIPAR, JJPAR, N_TRACERS ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD35' ) ENDIF !================================================================= ! ND36: Anthropogenic Emisisons [molec/cm2/s] ! (NOx, CO, ALK4, ACET, MEK, ALD2, PRPE, C3H8, C2H6) ! --> uses AD36 array (allocatable) ! ! NOTE: For a CH3I run, use ND36 for CH3I emission diagnostics.... !================================================================= IF ( ITS_A_CH3I_SIM() ) NEMANTHRO = 8 ! for CH3I IF ( ND36 > 0 ) THEN ALLOCATE( AD36( IIPAR, JJPAR, NEMANTHRO ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD36' ) ALLOCATE( AD36_SHIP( IIPAR, JJPAR, NEMANTHRO ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD36_SHIP' ) ALLOCATE( AD36_SHIP_COUNT, STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD36_SHIP_COUNT' ) ENDIF IF ( DO_SAVE_DIAG49 ) THEN ALLOCATE( EMISS_ANTHR( IIPAR, JJPAR, NEMANTHRO ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'EMISS_ANTHR' ) ENDIF !================================================================= ! ND37: Fraction of tracer scavenged in cloud updrafts ! --> Uses AD37 array (allocatable) !================================================================= IF ( ND37 > 0 ) THEN LD37 = MIN( ND37, LLPAR ) ! Get max # of soluble tracers for this simulation NMAX = GET_WETDEP_NMAX() ! Allocate array accordingly IF ( NMAX > 0 ) THEN ALLOCATE( AD37( IIPAR, JJPAR, LD37, NMAX ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD37' ) ENDIF ENDIF !================================================================= ! ND38: Rainout of tracer (nfcldmx.f) ! --> uses AD38 array (allocatable) !================================================================= IF ( ND38 > 0 ) THEN LD38 = MIN( ND38, LLPAR ) ! Get max # of soluble tracers for this simulation NMAX = GET_WETDEP_NMAX() ! Allocate AD38 array accordingly IF ( NMAX > 0 ) THEN ALLOCATE( AD38( IIPAR, JJPAR, LD38, NMAX ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD38' ) ENDIF ENDIF !================================================================= ! ND39: Rainout of tracer (wetdep.f) ! --> uses AD39 array (allocatable) !================================================================= IF ( ND39 > 0 ) THEN LD39 = MIN( ND39, LLPAR ) ! Get max # of soluble tracers for this simulation NMAX = GET_WETDEP_NMAX() ! Allocate AD39 array accordingly IF ( NMAX > 0 ) THEN ALLOCATE( AD39( IIPAR, JJPAR, LD39, NMAX ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD39' ) ENDIF ENDIF !================================================================= ! ND42: SOA concentration ! ! ND43: Chemical diagnostics: OH [molec/cm3/s] and NO [v/v] ! --> uses AD43 array (allocatable) !================================================================= IF ( ND43 > 0 ) THEN ! For full chemistry, only save OH up to the tropopause. ! For tagged CO or CO-OH, save OH everywhere (bmy, 2/12/01) IF ( ITS_A_FULLCHEM_SIM() ) THEN LD43 = MIN( ND43, LLTROP ) ELSE LD43 = MIN( ND43, LLPAR ) ENDIF ! Accumulating diagnostic array ALLOCATE( AD43( IIPAR, JJPAR, LD43, PD43 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD43' ) ! Locations where LT is between HR1_NO and HR2_NO ALLOCATE( LTNO( IIPAR, JJPAR ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'LTNO' ) ! Number of times LT was between HR1_NO and HR2_NO ALLOCATE( CTNO( IIPAR, JJPAR, LD43 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'CTNO' ) ! Locations where LT is between HR1_OH and HR2_OH ALLOCATE( LTOH( IIPAR, JJPAR ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'LTOH' ) ! Locations where LT is between HR1_OH and HR2_OH ALLOCATE( CTOH( IIPAR, JJPAR, LD43 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'CTOH' ) ! Locations where LT is between HR1_OH and HR2_OH ALLOCATE( LTHO2( IIPAR, JJPAR ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'LTHO2' ) ! Locations where LT is between HR1_OH and HR2_OH ALLOCATE( CTHO2( IIPAR, JJPAR, LD43 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'CTHO2' ) ! Locations where LT is between HR1_OH and HR2_OH ALLOCATE( LTNO2( IIPAR, JJPAR ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'LTHO2' ) ! Locations where LT is between HR1_OH and HR2_OH ALLOCATE( CTNO2( IIPAR, JJPAR, LD43 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'CTHO2' ) ! Locations where LT is between HR1_OH and HR2_OH ALLOCATE( LTNO3( IIPAR, JJPAR ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'LTHO2' ) ! Locations where LT is between HR1_OH and HR2_OH ALLOCATE( CTNO3( IIPAR, JJPAR, LD43 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'CTHO2' ) ENDIF !================================================================= ! ND44: Drydep fluxes [s-1] and drydep velocities [cm/s] ! --> uses AD44 arrays (allocatable) !================================================================= ! Turn off ND44 if drydep is turned off IF ( .not. LDRYD ) ND44 = 0 ! Allocate arrays for ND44 IF ( ND44 > 0 ) THEN ! Get number of tracers for ND44 IF ( ITS_A_TAGOX_SIM() .or. ITS_A_MERCURY_SIM() ) THEN NMAX = N_TRACERS ELSE NMAX = NUMDEP ENDIF ! Allocate AD44 array ALLOCATE( AD44( IIPAR, JJPAR, NMAX, 2 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD44' ) ENDIF !================================================================= ! ND45: Tracer concentrations [v/v] between HR1_OTH and HR2_OTH ! --> uses AD45 array (allocatable) !================================================================= IF ( ND45 > 0 ) THEN LD45 = MIN( ND45, LLPAR ) NMAX = MIN( N_TRACERS+1, NNPAR+1 ) ! Accumulating diagnostic array ! Resize to NMAX to save memory (bmy, 10/18/00) ALLOCATE( AD45( IIPAR, JJPAR, LD45, NMAX ), STAT=AS ) IF ( AS > 0 ) CALL ALLOC_ERR( 'AD45' ) ! Locations where LT is between HR1_OTH and HR2_OTH ALLOCATE( LTOTH( IIPAR, JJPAR ), STAT=AS ) IF ( AS > 0 ) CALL ALLOC_ERR( 'LTOTH' ) ! Number of times LT is between HR1_OTH and HR2_OTH ALLOCATE( CTOTH( IIPAR, JJPAR ), STAT=AS ) IF ( AS > 0 ) CALL ALLOC_ERR( 'CTOTH' ) ! Number of times LT is between HR1_OTH and HR2_OTH ! and box is in the troposphere ALLOCATE( CTO3( IIPAR, JJPAR, LD45 ), STAT=AS ) IF ( AS > 0 ) CALL ALLOC_ERR( 'CTO3' ) ENDIF !================================================================= ! ND46: Biogenic emissions [molec/cm2/s] ! (ISOP, PRPE, ACET, and MONOTERPENES) ! --> uses AD46 array (allocatable) !================================================================= IF ( ND46 > 0 ) THEN ALLOCATE( AD46( IIPAR, JJPAR, PD46 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD46' ) ENDIF !================================================================= ! ND47: 24-h averaged tracer concentration [v/v] ! --> uses AD47 array (allocatable) ! ! NOTE: ND47 is always a 24-h average field, while ND45 ! can be averaged over any arbitrary time period. !================================================================= IF ( ND47 > 0 ) THEN LD47 = MIN( ND47, LLPAR ) NMAX = MIN( N_TRACERS+1, NNPAR+1 ) ! Resize to NMAX to save memory (bmy, 10/18/00) ALLOCATE( AD47( IIPAR, JJPAR, LD47, NMAX ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD47' ) ENDIF !================================================================= ! ND47(O3) or ND65 : 24-h averaged tropospheric diagnostic !================================================================= IF ( ND47 > 0 .OR. ND65 > 0 ) THEN ! NOTE: we assume that INIT_DIAG_PL has already been called LMAX = MAX( LD47, LD65 ) ! Number of times in the troposphere ALLOCATE( CTO3_24h( IIPAR, JJPAR, LMAX ), STAT=AS ) IF ( AS > 0 ) CALL ALLOC_ERR( 'CTO3_24h' ) ENDIF !================================================================= ! ND52: gamma HO2 !================================================================= IF ( ND52 > 0 ) THEN LD52 = MIN( ND52, LLPAR) ALLOCATE( AD52( IIPAR, JJPAR, LD52 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD52' ) ENDIF !================================================================= ! ND53: Free diagnostics ! ! ND54 - Time spend in the troposphere ! --> uses AD54 array (allocatable) !================================================================= IF ( ND54 > 0 ) THEN LD54 = MIN( ND54, LLTROP) ALLOCATE( AD54( IIPAR, JJPAR, LD54 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD54' ) ENDIF !================================================================= ! ND55: Tropopause diagnostics [level, height, and pressure] ! --> uses AD55 array (allocatable) !================================================================= IF ( ND55 > 0 ) THEN ALLOCATE( AD55( IIPAR, JJPAR, PD55 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD55' ) ENDIF !================================================================= ! ND56 - ND64: Free diagnostics !================================================================= !================================================================= ! ND58: CH4 emissions !================================================================= IF ( ND58 > 0 ) THEN ALLOCATE( AD58( IIPAR, JJPAR, PD58), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD58' ) ENDIF !================================================================= ! ND59: NH3 concentration, units convert !================================================================= !================================================================= ! ND60: WETLAND FRACTION !================================================================= IF ( ND60 > 0 ) THEN ALLOCATE( AD60( IIPAR, JJPAR ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD60' ) ENDIF !================================================================= ! ND66: DAO 3-D fields (UWND, VWND, SPHU, TMPU, RH) ! --> uses AD66 array (allocatable) !================================================================= IF ( ND66 > 0 ) THEN LD66 = MIN( ND66, LLPAR ) ALLOCATE( AD66( IIPAR, JJPAR, LD66, PD66 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD66' ) ENDIF !================================================================= ! ND67: DAO A-3 and surface fields ! --> Uses AD67 array (allocatable) !================================================================= IF ( ND67 > 0 ) THEN ALLOCATE( AD67( IIPAR, JJPAR, PD67 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD67' ) ENDIF !================================================================= ! ND68: Air mass diagnostics (BXHEIGHT, AD, AVGW, N_AIR) ! --> uses AD68 array (allocatable) !================================================================= IF ( ND68 > 0 ) THEN LD68 = MIN( ND68, LLPAR ) ALLOCATE( AD68( IIPAR, JJPAR, LD68, PD68 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD68' ) ENDIF !================================================================= ! ND69: DXYP -- grid box surface areas [m^2] ! --> uses AD69 array (allocatable) !================================================================= IF ( ND69 > 0 ) THEN ALLOCATE( AD69( IIPAR, JJPAR, PD69 ), STAT=AS ) IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD69' ) ENDIF ! Return to calling program END SUBROUTINE NDXX_SETUP