Files
GEOS-Chem-adjoint-v35-note/code/diag3.f~
2018-08-28 00:43:47 -04:00

3536 lines
141 KiB
FortranFixed

! $Id: diag3.f,v 1.3 2012/03/01 22:00:26 daven Exp $
SUBROUTINE DIAG3
!
!******************************************************************************
! Subroutine DIAG3 prints out diagnostics to the BINARY format punch file
! (bmy, bey, mgs, rvm, 5/27/99, 12/15/08)
!
! NOTES:
! (40) Bug fix: Save levels 1:LD13 for ND13 diagnostic for diagnostic
! categories "SO2-AC-$" and "SO2-EV-$". Now reference F90 module
! "tracerid_mod.f". Now reference NUMDEP from "drydep_mod.f".
! Now save anthro, biofuel, biomass NH3 in ND13; also fixed ND13
! tracer numbers. For ND13, change scale factor from SCALESRCE to 1.
! Now references "wetscav_mod.f". Now also save true tracer numbers
! for ND38 and ND39 diagnostic. Now also write out biomass SO2.
! Now convert ND01, ND02, ND44 diagnostics for Rn/Pb/Be from kg to
! kg/s here. (bmy, 1/24/03)
! (41) Now save out natural NH3 in ND13 as "NH3-NATU" (rjp, bmy, 3/23/03)
! (42) Now replace DXYP(JREF) by routine GET_AREA_M2, GET_XOFFSET, and
! GET_YOFFSET of "grid_mod.f". Now references "time_mod.f".
! DIAGb, DIAGe are now local variables. Now remove obsolete statements
! IF ( LBPNCH > 0 ). Removed SCALE1, replaced with SCALEDYN.
! (bmy, 2/24/03)
! (43) Added TSKIN, PARDF, PARDR, GWET to ND67 diagnostic. For GEOS-4/fvDAS,
! UWND, VWND, TMPU, SPHU are A-6 fields. Adjust the ND66 scale factors
! accordingly. Delete KZZ from ND66. Updated comments. (bmy, 6/23/03)
! (44) Bug fix: use LD68 instead of ND68 in DO-loop to avoid out-of-bounds
! error. (bec, bmy, 7/15/03)
! (45) Now print out NTRACE drydep fluxes for tagged Ox. Also tagged Ox
! now saves drydep in molec/cm2/s. Now print out Kr85 prod/loss in
! ND03. (bmy, 8/20/03)
! (46) Now use actual tracer number for ND37 diagnostic. (bmy, 1/21/04)
! (47) Now loop over the actual # of soluble tracers for ND17, ND18.
! (bmy, 3/19/04)
! (48) Now use the actual tracer # for ND17 and ND18 diagnostics.
! Rearrange ND44 code for clarity. (bmy, 3/23/04)
! (49) Added ND06 (dust aerosol) and ND07 (carbon aerosol) diagnostics.
! Now scale online dust optical depths by SCALECHEM in ND21 diagnostic.
! (rjp, tdf, bmy, 4/5/04)
! (50) Added ND08 (seasalt aerosol) diagnostic (rjp, bec, bmy, 4/20/04)
! (51) Now save out SO2 from ships (if LSHIPSO2=T) (bec, bmy, 5/20/04)
! (52) Added NVOC source diagnostics for ND07 (rjp, bmy, 7/13/04)
! (53) Now reference "logical_mod.f", "tracer_mod.f", and "diag_pl_mod.f".
! Bug fix in write to DMS_BIOG. (bmy, 7/20/04)
! (54) Comment out ND27 for GEOS-4. It isn't working 100% right. If you
! examine the flux at 200 hPa, you get the same info. (bmy, 10/15/04)
! (55) Added biofuel SO4 to the bpch file under ND13. Bug fix: replace ND68
! with LD68 in call to BPCH2 (auvray, bmy, 11/17/04)
! (56) Now save ND03 mercury diagnostic arrays to bpch file. Also updated
! ND44 for tagged Hg tracers (eck, bmy, 12/14/04)
! (57) Now print out extra ND21 diagnostics for crystalline sulfur tracers.
! Also now save total oceanic mass of Hg0 and Hg2. Now call
! WRITE_DIAG03 from "diag03_mod.f" (bmy, 1/21/05)
! (58) Now call WRITE_DIAG41 from "diag41_mod.f" (bmy, 2/17/05)
! (59) Add P(SO4s) to row 8 of ND05 diagnostic. Also remove special tracer
! numbers for the ND67 diagnostic. Now do not save CLDMAS for ND67
! for GEOS-4, since GEOS-4 convection uses different met fields.
! (bec, bmy, 5/3/05)
! (60) Bug fix in ND68 diagnostic: use LD68 instead of ND68 in call to BPCH2.
! Now modified for GEOS-5 and GCAP met fields. Remove references to
! CO-OH param simulation. Also remove references to TRCOFFSET since
! that is always zero now. Now call GET_HALFPOLAR from "bpch2_mod.f"
! to get the HALFPOLAR value for GEOS or GCAP grids. (swu, bmy, 6/24/05)
! (61) References ND04, WRITE_DIAG04 from "diag04_mod.f". Also now updated
! ND30 diagnostic for land/water/ice flags. Also remove reference
! to LWI array. (bmy, 8/18/05)
! (62) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)
! (63) Added MBO as tracer #5 in ND46 diagnostic (tmf, bmy, 10/20/05)
! (64) Removed duplicate variable declarations. Now remove restriction on
! printing out cloud mass flux in GEOS-4 for the ND66 diagnostic.
! (bmy, 3/14/06)
! (65) References ND56, WRITE_DIAG56 from "diag56_mod.f" (ltm, bmy, 5/5/06)
! (66) Now remove TRCOFFSET; it's obsolete. References ND42, WRITE_DIAG42
! from "diag42_mod.f" (dkh, bmy, 5/22/06)
! (67) Updated ND36 diagnostic for CH3I (bmy, 7/25/06)
! (68) Remove support for GEOS-1 and GEOS-STRAT met fields (bmy, 8/4/06)
! (69) Replace TINY(1d0) with 1d-32 to avoid problems on SUN 4100 platform
! (bmy, 9/5/06)
! (70) Now write diag 54 (time in the troposphere) if asked for (phs, 9/22/06)
! (71) Now use new time counters for ND43 & ND45, Also now average between
! 0 and 24 UT for ND47. Bug fix in ND36. (phs, bmy, 3/5/07)
! (72) Bug fix in ND65: use 3-D counter array (phs, bmy, 3/6/07)
! (73) Bug fix in ND07: now save out IDTSOA4 tracer. Modifications for H2/HD
! diagnostics (ND10, ND27, ND44) (tmf, phs, bmy, 9/18/07)
! (74) Now save out true pressure at 3-D level edges for ND31. Change ND31
! diagnostic category name to "PEDGE-$". Bug fix in ND28 diagnostic to
! allow you to print out individual biomass tracers w/o having to print
! all of them. (bmy, dkh, 1/24/08)
! (75) Bug fix: Now divide ALBEDO in ND67 by SCALE_I6 for GEOS-3 met, but
! by SCALE_A3 for all other met types (phs, bmy, 10/7/08)
! (76) Fix ND65, ND47, and ozone case in ND45. Now only ND45 depends
! on LD45 (phs, 11/17/08)
! (77) Bug fix: Select the right index of AD34 to write. Pick the right
! tracer field from AD22 if only a subset of tracers are requested
! to be printed out. (ccc, 12/15/08)
! (78) Added ND52 for gamma(HO2) (jaegle, 02/26/09)
! (79) Updated test on ship emissions flag for AD13 (phs, 3/3/09)
! (80) Add AD07_SOAGM for dicarbonyl SOA formation (tmf, 3/6/09)
! (81) Add output in AD22 for dicarbonyl photolysis J values (tmf, 3/6/09)
! (82) Add output in AD46 for biogenic C2H4 emissions (tmf, 3/6/09)
! (87) Add diagnostics 19, 58 and 60 for methane. (kjw, 8/18/09, adj32_023)
!******************************************************************************
!
! References to F90 modules
USE BPCH2_MOD
USE BIOMASS_MOD, ONLY : BIOTRCE, NBIOMAX
USE BIOFUEL_MOD, ONLY : NBFTRACE, BFTRACE
USE DIAG_MOD, ONLY : AD01, AD02, AD05
USE DIAG_MOD, ONLY : AD06, AD07, AD07_BC
USE DIAG_MOD, ONLY : AD07_SOAGM
USE DIAG_MOD, ONLY : AD07_OC, AD07_HC, AD08
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 : 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
USE DIAG_MOD, ONLY : AD54, CTO3, CTO3_24h
USE DIAG_MOD, ONLY : AD19, AD58, AD60
USE DIAG_MOD, ONLY : AD55, AD66, AD67
USE DIAG_MOD, ONLY : AD68, AD69
USE DIAG_MOD, ONLY : AD10, AD10em
USE DIAG03_MOD, ONLY : ND03, WRITE_DIAG03
USE DIAG04_MOD, ONLY : ND04, WRITE_DIAG04
USE DIAG41_MOD, ONLY : ND41, WRITE_DIAG41
USE DIAG42_MOD, ONLY : ND42, WRITE_DIAG42
USE DIAG56_MOD, ONLY : ND56, WRITE_DIAG56
! diag59 added, (lz,10/11/10)
USE DIAG59_MOD, ONLY : ND59, WRITE_DIAG59
USE DIAG_PL_MOD, ONLY : AD65
USE DRYDEP_MOD, ONLY : NUMDEP, NTRAIND
USE FILE_MOD, ONLY : IU_BPCH
USE GRID_MOD, ONLY : GET_AREA_M2, GET_XOFFSET, GET_YOFFSET
USE LOGICAL_MOD, ONLY : LCARB, LCRYST, LDUST
USE LOGICAL_MOD, ONLY : LSHIPSO2, LSOA, LSSALT
USE LOGICAL_MOD, ONLY : LEDGARSHIP, LARCSHIP, LEMEPSHIP
USE LOGICAL_MOD, ONLY : LICOADSSHIP, LRCPSHIP
USE TIME_MOD, ONLY : GET_DIAGb, GET_DIAGe, GET_CT_A3
USE TIME_MOD, ONLY : GET_CT_A6, GET_CT_CHEM, GET_CT_CONV
USE TIME_MOD, ONLY : GET_CT_DYN, GET_CT_EMIS, GET_CT_I6
USE TIME_MOD, ONLY : GET_CT_A1, GET_CT_I3 !! (geosfp, lzh,11/01/2014)
USE TRACER_MOD, ONLY : N_TRACERS, STT, TRACER_MW_G
USE TRACER_MOD, ONLY : TRACER_NAME
USE TRACER_MOD, ONLY : ITS_AN_AEROSOL_SIM
USE TRACER_MOD, ONLY : ITS_A_CH3I_SIM
USE TRACER_MOD, ONLY : ITS_A_FULLCHEM_SIM
USE TRACER_MOD, ONLY : ITS_A_H2HD_SIM
USE TRACER_MOD, ONLY : ITS_A_MERCURY_SIM
USE TRACER_MOD, ONLY : ITS_A_RnPbBe_SIM
USE TRACER_MOD, ONLY : ITS_A_TAGOX_SIM
USE TRACERID_MOD, ONLY : IDTPB, IDTDST1, IDTDST2
USE TRACERID_MOD, ONLY : IDTDST3, IDTDST4, IDTBCPI
USE TRACERID_MOD, ONLY : IDTOCPI, IDTALPH, IDTLIMO
USE TRACERID_MOD, ONLY : IDTSOA1, IDTSOA2, IDTSOA3
USE TRACERID_MOD, ONLY : IDTSALA, IDTSALC, IDTDMS
USE TRACERID_MOD, ONLY : IDTSO2, IDTSO4, IDTNH3
USE TRACERID_MOD, ONLY : IDTOX, IDTNOX, IDTHNO3
USE TRACERID_MOD, ONLY : IDTISOP, IDTACET, IDTPRPE
USE TRACERID_MOD, ONLY : IDTH2, IDTHD
USE TRACERID_MOD, ONLY : NEMANTHRO , IDTSOA4
USE TRACERID_MOD, ONLY : IDTSOAG, IDTSOAM
USE TRACERID_MOD, ONLY : IDTMONX, IDTMBO, IDTC2H4
USE WETSCAV_MOD, ONLY : GET_WETDEP_NSOL
USE WETSCAV_MOD, ONLY : GET_WETDEP_IDWETD
IMPLICIT NONE
# include "CMN_SIZE" ! Size parameters
# include "CMN" ! IFLX, LPAUSE
# include "CMN_DIAG" ! Diagnostic switches & arrays
# include "CMN_O3" ! FMOL, XNUMOL
# include "comode.h" ! IDEMS
! Local variables
INTEGER :: I, IREF, J, JREF, L, M, MM, MMB, LMAX
INTEGER :: N, NN, NMAX, NTEST
INTEGER :: IE, IN, IS, IW, ITEMP(3)
REAL*8 :: SCALE_TMP(IIPAR,JJPAR)
REAL*8 :: SCALE_I6, SCALE_A6, SCALE_A3, SCALED
!! (geosfp, lzh, 11/01/2014)
REAL*8 :: SCALE_I3, SCALE_A1
REAL*8 :: SCALE_ND66, SCALE_ND67
REAL*8 :: SCALEDYN, SCALECONV, SCALESRCE, SCALECHEM
REAL*8 :: SCALEX, SECONDS, PMASS, PRESSX
REAL*8 :: FDTT, AREA_M2, DIAGb, DIAGe
! For binary punch file, version 2.0
CHARACTER (LEN=40) :: CATEGORY
REAL*4 :: ARRAY(IIPAR,JJPAR,LLPAR+1)
REAL*4 :: LONRES, LATRES
INTEGER :: IFIRST, JFIRST, LFIRST
INTEGER :: HALFPOLAR
INTEGER, PARAMETER :: CENTER180 = 1
CHARACTER (LEN=20) :: MODELNAME
CHARACTER (LEN=40) :: UNIT
CHARACTER (LEN=40) :: RESERVED = ''
!
!******************************************************************************
! DIAG3 begins here!
!
! Define scale factors for division.
! Add a small number (e.g. 1d-32) to prevent division by zero errors.
!******************************************************************************
!
! Now use counter variables from "time_mod.f" (bmy, 3/27/03)
DIAGb = GET_DIAGb()
DIAGe = GET_DIAGe()
SECONDS = ( DIAGe - DIAGb ) * 3600d0
SCALED = 1d0
SCALEDYN = DBLE( GET_CT_DYN() ) + 1d-32
SCALECONV = DBLE( GET_CT_CONV() ) + 1d-32
SCALESRCE = DBLE( GET_CT_EMIS() ) + 1d-32
SCALECHEM = DBLE( GET_CT_CHEM() ) + 1d-32
SCALE_A3 = DBLE( GET_CT_A3() ) + 1d-32
SCALE_A6 = DBLE( GET_CT_A6() ) + 1d-32
SCALE_I6 = DBLE( GET_CT_I6() ) + 1d-32
!! (lzh, 11/01/2014) geosfp
SCALE_A1 = DBLE( GET_CT_A1() ) + 1d-32
SCALE_I3 = DBLE( GET_CT_I3() ) + 1d-32
!
!******************************************************************************
! Setup for binary punch file:
!
! IFIRST, JFIRST, LFIRST = I, J, L indices of the starting grid box
! LONRES = DISIZE, cast to REAL*4
! LATRES = DJSIZE, cast to REAL*4
!******************************************************************************
!
IFIRST = GET_XOFFSET( GLOBAL=.TRUE. ) + 1
JFIRST = GET_YOFFSET( GLOBAL=.TRUE. ) + 1
LFIRST = 1
LONRES = DISIZE
LATRES = DJSIZE
! Get the proper model name and HALFPOLAR setting for the bpch file
MODELNAME = GET_MODELNAME()
HALFPOLAR = GET_HALFPOLAR()
!
!******************************************************************************
! ND01: Rn, Pb, Be emissions (Category: "RN--SRCE")
!
! # : Field : Description : Units : Scale factor
! ----------------------------------------------------------------------------
! (1) Rn222 : Emissions of 222Rn : kg/s : SCALESRCE
! (2) Pb210 : Emissions of 210Pb : kg/s : SCALECHEM
! (3) Be7 : Emissions of 7Be : kg/s : SCALESRCE
!
! and Rn, Pb, Be lost to radioactive decay (Category: "RN-DECAY")
!
! # : Field : Description : Units : Scale factor
! ----------------------------------------------------------------------------
! (1) Rn222 : Loss of 222Rn : kg/s : SCALECHEM
! (2) Pb210 : Loss of 210Pb : kg/s : SCALECHEM
! (3) Be7 : Loss of 7Be : kg/s : SCALECHEM
!******************************************************************************
!
IF ( ND01 > 0 ) THEN
CATEGORY = 'RN--SRCE'
UNIT = 'kg/s'
DO M = 1, TMAX(1)
N = TINDEX(1,M)
IF ( N > N_TRACERS ) CYCLE
NN = N
! Pb "emission" comes from chemical decay of Rn, which happens
! in the chemistry routine, so use SCALECHEM (bmy, 1/27/03)
IF ( N == IDTPB ) THEN
SCALEX = SCALECHEM
ELSE
SCALEX = SCALESRCE
ENDIF
! Divide by # of emission timesteps
DO L = 1, LD01
ARRAY(:,:,L) = AD01(:,:,L,N) / SCALEX
ENDDO
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD01, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD01) )
ENDDO
ENDIF
!
!******************************************************************************
! ND02: Rn, Pb, Be lost to radioactive decay (Category: "RN-DECAY")
!
! # : Field : Description : Units : Scale factor
! ----------------------------------------------------------------------------
! (1) Rn222 : Loss of 222Rn : kg/s : SCALECHEM
! (2) Pb210 : Loss of 210Pb : kg/s : SCALECHEM
! (3) Be7 : Loss of 7Be : kg/s : SCALECHEM
!******************************************************************************
!
IF ( ND02 > 0 ) THEN
CATEGORY = 'RN-DECAY'
UNIT = 'kg/s'
DO M = 1, TMAX(2)
N = TINDEX(2,M)
IF ( N > N_TRACERS ) CYCLE
NN = N
! Divide by # of chemistry timesteps
DO L = 1, LD02
ARRAY(:,:,L) = AD02(:,:,L,N) / SCALECHEM
ENDDO
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD02, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD02) )
ENDDO
ENDIF
!
!******************************************************************************
! ND03: Diagnostics from Hg0/Hg2/HgP offline simulation (eck, bmy, 1/20/05)
!******************************************************************************
!
IF ( ND03 > 0 ) CALL WRITE_DIAG03
!
!******************************************************************************
! ND04: Diagnostics from CO2 simulation (pns, bmy, 7/26/05)
!******************************************************************************
!
IF ( ND04 > 0 ) CALL WRITE_DIAG04
!
!******************************************************************************
! ND05: Production/Loss for coupled fullchem/aerosol runs (NSRCX==3) or
! offline sulfate chemistry runs (NSRCX==10).
!
! # : Field : Description : Units : Scale factor
! ----------------------------------------------------------------------------
! (1 ) SO2dms : P(SO2) from DMS + OH : kg S : SCALEX
! (2 ) SO2no3 : P(SO2) from DMS + NO3 : kg S : SCALEX
! (3 ) SO2 : Total P(SO2) : kg S : SCALEX
! (4 ) MSAdms : P(MSA) from DMS : kg S : SCALEX
! (5 ) SO4gas : P(SO4) gas phase : kg S : SCALEX
! (6 ) SO4aq : P(SO4) aqueous phase : kg S : SCALEX
! (7 ) PSO4 : Total P(SO4) : kg S : SCALEX
! (8 ) PSO4s : Total P(SO4 from seasalt) : kg S : SCALEX
! (9 ) LOH : L(OH) by DMS : kg OH : SCALEX
! (10) LNO3 : L(NO3) by DMS : kg NO3 : SCALEX
!******************************************************************************
!
IF ( ND05 > 0 ) THEN
CATEGORY = 'PL-SUL=$'
DO M = 1, TMAX(5)
N = TINDEX(5,M)
! Tracers 9, 10 are OH, NO3
! and are in [kg] instead of [kg S]
IF ( N < 9 ) THEN
UNIT = 'kg S'
ELSE
UNIT = 'kg'
ENDIF
NN = N
SCALEX = 1.d0
DO L = 1, LD05
ARRAY(:,:,L) = AD05(:,:,L,N) / SCALEX
ENDDO
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD05, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD05) )
ENDDO
ENDIF
!
!******************************************************************************
! ND06: Dust aerosol emissions
!
! # : Field : Description : Units : Scale factor
! --------------------------------------------------------------------------
! (1) DUST : Soil dust (4 different classes) : kg : 1
!******************************************************************************
!
IF ( ND06 > 0 .and. LDUST ) THEN
! Category & unit string
UNIT = 'kg'
CATEGORY = 'DUSTSRCE'
! Loop over # of dust bins
DO N = 1, NDSTBIN
! At present we have 4 dust bins
IF ( N == 1 ) NN = IDTDST1
IF ( N == 2 ) NN = IDTDST2
IF ( N == 3 ) NN = IDTDST3
IF ( N == 4 ) NN = IDTDST4
! Save dust into ARRAY
ARRAY(:,:,1) = AD06(:,:,N)
! Write to BPCH file
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
ENDDO
ENDIF
!
!******************************************************************************
! ND07: Emissions of BC and OC aerosols
!
! # : Field : Description : Units : Scale factor
! --------------------------------------------------------------------------
! (1) Carbon : Carbonaceous aerosols : kg : 1
!******************************************************************************
!
IF ( ND07 > 0 .and. LCARB ) THEN
! Unit
UNIT = 'kg'
!-------------------
! BC ANTHRO source
!-------------------
CATEGORY = 'BC-ANTH'
N = IDTBCPI
ARRAY(:,:,1) = AD07(:,:,1)
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, N,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
!-------------------
! BC BIOMASS source
!-------------------
CATEGORY = 'BC-BIOB'
N = IDTBCPI
ARRAY(:,:,1) = AD07(:,:,2)
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, N,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
!-------------------
! BC BIOFUEL source
!-------------------
CATEGORY = 'BC-BIOF'
N = IDTBCPI
ARRAY(:,:,1) = AD07(:,:,3)
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, N,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
!------------------------------
! H-philic BC from H-phobic BC
!------------------------------
CATEGORY = 'PL-BC=$'
N = IDTBCPI
DO L = 1, LD07
ARRAY(:,:,L) = AD07_BC(:,:,L)
ENDDO
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, N,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD07, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD07) )
!------------------------------
! OC ANTHRO source
!------------------------------
CATEGORY = 'OC-ANTH'
N = IDTOCPI
ARRAY(:,:,1) = AD07(:,:,4)
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, N,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
!------------------------------
! OC BIOMASS source
!------------------------------
CATEGORY = 'OC-BIOB'
N = IDTOCPI
ARRAY(:,:,1) = AD07(:,:,5)
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, N,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
!------------------------------
! OC BIOFUEL source
!------------------------------
CATEGORY = 'OC-BIOF'
N = IDTOCPI
ARRAY(:,:,1) = AD07(:,:,6)
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, N,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
!------------------------------
! OC BIOGENIC source
!------------------------------
CATEGORY = 'OC-BIOG'
N = IDTOCPI
ARRAY(:,:,1) = AD07(:,:,7)
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, N,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
!------------------------------
! H-philic OC from H-phobic OC
!------------------------------
CATEGORY = 'PL-OC=$'
N = IDTOCPI
DO L = 1, LD07
ARRAY(:,:,L) = AD07_OC(:,:,L)
ENDDO
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, N,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD07, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD07) )
! Only save extra SOA diagnostics if LSOA=T
IF ( LSOA ) THEN
!------------------------------
! NVOC SOURCE diagnostics
!------------------------------
DO N = 8, 12
SELECT CASE ( N )
! ALPH
CASE ( 8 )
CATEGORY = 'OC-ALPH'
NN = IDTALPH
! LIMO
CASE ( 9 )
CATEGORY = 'OC-LIMO'
NN = IDTLIMO
! TERP
CASE ( 10 )
CATEGORY = 'OC-TERP'
NN = IDTLIMO + 1
! ALCO
CASE ( 11 )
CATEGORY = 'OC-ALCO'
NN = IDTLIMO + 2
! SESQ
CASE ( 12 )
CATEGORY = 'OC-SESQ'
NN = IDTLIMO + 3
END SELECT
ARRAY(:,:,1) = AD07(:,:,N)
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
ENDDO
!-----------------------------------------------
! SOA Production from NVOC oxidation [kg]
! 1:ALPH+LIMO+TERP, 2:ALCO, 3:SESQ, 4:ISOP
!-----------------------------------------------
CATEGORY = 'PL-OC=$'
DO N = 1, 4
IF ( N == 1 ) NN = IDTSOA1
IF ( N == 2 ) NN = IDTSOA2
IF ( N == 3 ) NN = IDTSOA3
IF ( N == 4 ) NN = IDTSOA4 ! (tmf, bmy, 3/20/07)
DO L = 1, LD07
ARRAY(:,:,L) = AD07_HC(:,:,L,N)
ENDDO
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD07, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD07) )
ENDDO
!-----------------------------------------------
! SOA Production from GLYX and MGLY [kg]
! 1: SOAG <- GLYX; 2: SOAM <- MGLY IN AEROSOL
! 3: SOAG <- GLYX; 4: SOAM <- MGLY INCLOUD
! (tmf, 1/7/09)
! Test if SOAG and SOAM tracers are valid before
! saving them. (ccc, 1/7/09)
!-----------------------------------------------
IF ( IDTSOAG /= 0 .AND. IDTSOAM /= 0 ) THEN
CATEGORY = 'SOAGM=$'
DO N = 1, 4
IF ( N == 1 ) NN = 91
IF ( N == 2 ) NN = 92
IF ( N == 3 ) NN = 93
IF ( N == 4 ) NN = 94
DO L = 1, LD07
ARRAY(:,:,L) = AD07_SOAGM(:,:,L,N)
ENDDO
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD07, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD07) )
ENDDO
ENDIF
ENDIF
ENDIF
!
!******************************************************************************
! ND08: Sea salt aerosol emissions
!
! # : Field : Description : Units : Scale factor
! --------------------------------------------------------------------------
! (1) SALA : Accumulation mode seasalt : kg : 1
! (2) SALC : Coarse mode seasalt : kg : 1
!******************************************************************************
!
IF ( ND08 > 0 .and. LSSALT ) THEN
! Category & unit string
UNIT = 'kg'
CATEGORY = 'SALTSRCE'
! Loop over seasalt tracers
DO N = 1, 2
! At present we have 2 seasalts
IF ( N == 1 ) NN = IDTSALA
IF ( N == 2 ) NN = IDTSALC
! Save seasalts into ARRAY
ARRAY(:,:,1) = AD08(:,:,N)
! Write to BPCH file
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
ENDDO
ENDIF
!
!******************************************************************************
! ND09: HCN/CH3CN sources/sinks (Categories: "HCN-PL-$", "HCN-SRCE")
!
! # : Field : Description : Units : Scale factor
! ----------------------------------------------------------------------------
! (1:N) sink : Loss of tagged tracer to OH : kg
! (N+1) HCNbb : HCN from biomass burning : molec/cm2/s : SCALESRCE
! (N+2) CH3CNbb : CH3CN from biomass burning : molec/cm2/s : SCALESRCE
! (N+3) HCNdf : HCN from domestic fossil fuel : molec/cm2/s : SCALESRCE
! (N+4) CH3CNdf : CH3CN from domestic fossil fuel : molec/cm2/s : SCALESRCE
! (N+5) HCNoc : HCN loss to ocean uptake : molec/cm2/s : SCALECHEM
! (N+6) CH3CNoc : CH3CN loss to ocean uptake : molec/cm2/s : SCALECHEM
!******************************************************************************
!
IF ( ND09 > 0 ) THEN
! Binary punch file
DO M = 1, TMAX(9)
N = TINDEX(9,M)
IF ( N > N_TRACERS+6 ) CYCLE
! Test tracer number
IF ( N <= N_TRACERS ) THEN
!---------------------------
! HCN/CH3CN sinks
!---------------------------
CATEGORY = 'HCN-PL-$'
UNIT = 'kg'
NN = N
DO L = 1, LD09
ARRAY(:,:,L) = AD09(:,:,L,N)
ENDDO
! Save to disk
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD09, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD09) )
ELSE
!---------------------------
! HCN/CH3CN sources
!---------------------------
CATEGORY = 'HCN-SRCE'
UNIT = 'molec/cm2/s'
NN = N - N_TRACERS
! Pick proper scale
IF ( NN <= 4 ) THEN
SCALEX = SCALESRCE
ELSE
SCALEX = SCALECHEM
ENDIF
! Scale data
ARRAY(:,:,1) = AD09_em(:,:,NN) / SCALEX
! Write to disk
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
ENDIF
ENDDO
ENDIF
!
!******************************************************************************
! ND10: H2/HD source diagnostics, prod and loss (phs, 9/18/07)
!
! # Field : Description : Units : Scale factor
! --------------------------------------------------------------------------
! (1 ) H2oh : H2 Loss by OH : mol/cm3/s : SCALECHEM
! (2 ) H2iso : H2 Prod from isoprene : mol/cm3/s : SCALECHEM
! (3 ) H2ch4 : H2 Prod from CH4 : mol/cm3/s : SCALECHEM
! (4 ) H2ch3oh: H2 Prod from CH3OH : mol/cm3/s : SCALECHEM
! (5 ) H2mono : H2 Prod from monoprene : mol/cm3/s : SCALECHEM
! (6 ) H2acet : H2 Prod from acetone : mol/cm3/s : SCALECHEM
! (7 ) H2o1d : H2 Loss by strat O1D : mol/cm3/s : SCALECHEM
!
! (8 ) HDoh : H2 Loss by OH : mol/cm3/s : SCALECHEM
! (9 ) HDiso : H2 Prod from isoprene : mol/cm3/s : SCALECHEM
! (10) HDch4 : H2 Prod from CH4 : mol/cm3/s : SCALECHEM
! (11) HDch3oh: H2 Prod from CH3OH : mol/cm3/s : SCALECHEM
! (12) HDmono : H2 Prod from monoprene : mol/cm3/s : SCALECHEM
! (13) HDacet : H2 Prod from acetone : mol/cm3/s : SCALECHEM
! (14) HDo1d : H2 Loss by strat O1D : mol/cm3/s : SCALECHEM
!
! (15) ALPHA : OH k rates kHD/kH2 ratio: unitless : SCALECHEM
!
! (16) H2anth : H2 from Anthro Sources : mol/cm2/s : SCALESRCE
! (17) H2bb : H2 from Biomass Burning : mol/cm2/s : SCALESRCE
! (18) H2bf : H2 from Biofuel Burning : mol/cm2/s : SCALESRCE
! (19) H2ocean: H2 from Ocean : mol/cm2/s : SCALESRCE
! (19) HDocean: HD from Ocean : mol/cm2/s : SCALESRCE
!
! NOTES:
! (1 ) Non zero only if ND10>0 and it is a H2/HD offline simulation
! (2 )
!******************************************************************************
!
IF ( ND10 > 0 ) THEN
DO M = 1, TMAX(10)
N = TINDEX(10,M)
IF ( N > PD10 ) CYCLE
! Test tracer number (NEMISS=5, see "ndxx_setup.f" )
IF ( N <= ( PD10 - 5 ) ) THEN
!---------------------------
! H2/HD Prod-Loss
!---------------------------
CATEGORY = 'PL-H2HD-'
UNIT = 'molec/cm3/s'
NN = N
DO L = 1, LD10
ARRAY(:,:,L) = AD10(:,:,L,N) / SCALECHEM
ENDDO
! Save to disk
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD10, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD10) )
ELSE
!---------------------------
! H2/HD sources
!---------------------------
CATEGORY = 'H2HD-SRC'
UNIT = 'molec/cm2/s'
NN = N - 15
! Scale data
ARRAY(:,:,1) = AD10em(:,:,NN) / SCALESRCE
! Write to disk
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
ENDIF
ENDDO
ENDIF
!
!******************************************************************************
! ND11: Acetone source & sink diagnostic (Category: "ACETSRCE")
!
! # : Field : Description : Units : Scale factor
! ----------------------------------------------------------------------------
! (1) ACETmo : Acetone source from MONOTERPENES : at C/cm2/s : SCALESRCE
! (2) ACETmb : Acetone source from METHYL BUTENOL : at C/cm2/s : SCALESRCE
! (3) ACETbg : Acetone source from DIRECT EMISSION: at C/cm2/s : SCALESRCE
! (4) ACETdl : Acetone source from DRY LEAF MATTER: at C/cm2/s : SCALESRCE
! (5) ACETgr : Acetone source from GRASSLANDS : at C/cm2/s : SCALESRCE
! (6) ACETop : Acetone source from OCEANS : at C/cm2/s : SCALESRCE
! (7) ACETol : Acetone sink from OCEANS : at C/cm2/s : SCALECHEM
!******************************************************************************
!
IF ( ND11 > 0 ) THEN
CATEGORY = 'ACETSRCE'
UNIT = 'atoms C/cm2/s'
DO M = 1, TMAX(11)
N = TINDEX(11,M)
IF ( N > PD11 ) CYCLE
NN = N
! Acetone ocean sink is on the chemistry timestep
! but acetone sources are all on the emission timestep
IF ( N == 7 ) THEN
SCALEX = SCALECHEM
ELSE
SCALEX = SCALESRCE
ENDIF
ARRAY(:,:,1) = AD11(:,:,N) / SCALEX
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
ENDDO
ENDIF
!
!******************************************************************************
! ND12: distribution of suface emissions in the boundry layer: [fraction]
!
! # : Field : Description : Units : Scale factor
! --------------------------------------------------------------------------
! (1) EMDIS-BL : Fraction of BL occupied by level L : unitless : SCALECHEM
!******************************************************************************
!
IF ( ND12 > 0 ) THEN
UNIT = 'unitless'
CATEGORY = 'EMDIS-BL'
DO L = 1, LD12
ARRAY(:,:,L) = AD12(:,:,L) / SCALECHEM
ENDDO
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, 1,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LLTROP, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD12) )
ENDIF
!
!******************************************************************************
! ND13: Sulfur emissions (for DMS/SO2/SO4/MSA/NH3/NH4/NIT chemistry)
!
! # : Field : Description : Units : Scale factor
! --------------------------------------------------------------------------
! (1 ) DMS-BIOG : Biogenic DMS emission : kg S : 1
! (2 ) SO2-AC-$ : Aircraft SO2 emission : kg S : 1
! (3 ) SO2-AN-$ : Anthropogenic SO2 emission : kg S : 1
! (4 ) SO2-BIOB : Biomass SO2 emission : kg S : 1
! (5 ) SO2-BIOF : Biofuel SO2 emission : kg S : 1
! (6 ) SO2-NV-$ : Non-eruptive volcano SO2 em. : kg S : 1
! (7 ) SO2-EV-$ : Eruptive volcano SO2 emissions : kg S : 1
! (8 ) SO4-AN-$ : Anthropogenic SO4 emission : kg S : 1
! (9 ) NH3-ANTH : Anthropogenic NH3 emission : kg NH3 : 1
! (10) NH3-NATU : Natural source NH3 emission : kg NH3 : 1
! (11) NH3-BIOB : Biomass burning NH3 emission : kg NH3 : 1
! (12) NH3-BIOF : Biofuel burning NH3 emission : kg NH3 : 1
!******************************************************************************
!
IF ( ND13 > 0 .and.
& ( ITS_A_FULLCHEM_SIM() .or. ITS_AN_AEROSOL_SIM() ) ) THEN
UNIT = 'kg S'
!==============================================================
! Biogenic DMS
!==============================================================
CATEGORY = 'DMS-BIOG'
ARRAY(:,:,1) = AD13_DMS(:,:)
N = IDTDMS
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, N,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
!==============================================================
! Aircraft SO2
!==============================================================
CATEGORY = 'SO2-AC-$'
N = IDTSO2
DO L = 1, LD13
ARRAY(:,:,L) = AD13_SO2_ac(:,:,L)
ENDDO
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, N,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD13, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD13) )
!==============================================================
! Anthropogenic SO2
!==============================================================
CATEGORY = 'SO2-AN-$'
N = IDTSO2
DO L = 1, NOXEXTENT
ARRAY(:,:,L) = AD13_SO2_an(:,:,L)
ENDDO
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, N,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 2, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:2) )
!==============================================================
! Biomass SO2
!==============================================================
CATEGORY = 'SO2-BIOB'
ARRAY(:,:,1) = AD13_SO2_bb(:,:)
N = IDTSO2
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, N,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
!==============================================================
! Biofuel SO2
!==============================================================
CATEGORY = 'SO2-BIOF'
ARRAY(:,:,1) = AD13_SO2_bf(:,:)
N = IDTSO2
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, N,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
!==============================================================
! Eruptive volcano SO2
!==============================================================
CATEGORY = 'SO2-EV-$'
N = IDTSO2
DO L = 1, LD13
ARRAY(:,:,L) = AD13_SO2_ev(:,:,L)
ENDDO
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, N,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD13, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD13) )
!==============================================================
! Non-eruptive volcano SO2
!==============================================================
CATEGORY = 'SO2-NV-$'
N = IDTSO2
DO L = 1, LD13
ARRAY(:,:,L) = AD13_SO2_nv(:,:,L)
ENDDO
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, N,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD13, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD13) )
!==============================================================
! Ship SO2 bec (5/17/04)
! New test on logical flag (phs, 3/2/09)
!==============================================================
! Add ICOADSSHIP (cklee, 6/30/09)
! Add RCP
IF ( LSHIPSO2 .OR. LEDGARSHIP .OR. LARCSHIP .OR.
$ LEMEPSHIP .OR. LICOADSSHIP .OR. LRCPSHIP ) THEN
CATEGORY = 'SO2-SHIP'
ARRAY(:,:,1) = AD13_SO2_sh(:,:)
N = IDTSO2
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, N,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
ENDIF
!==============================================================
! Anthropogenic SO4
!==============================================================
CATEGORY = 'SO4-AN-$'
N = IDTSO4
! Fix loop to make compatible with NEI2008
! DO L = 1, NOXEXTENT
DO L = 1, 2
ARRAY(:,:,L) = AD13_SO4_an(:,:,L)
ENDDO
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, N,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 2, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:2) )
!==============================================================
! Biofuel SO4
!==============================================================
CATEGORY = 'SO4-BIOF'
ARRAY(:,:,1) = AD13_SO4_bf(:,:)
N = IDTSO4
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, N,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
!==============================================================
! Anthropogenic NH3
!==============================================================
UNIT = 'kg'
CATEGORY = 'NH3-ANTH'
ARRAY(:,:,1) = AD13_NH3_an(:,:)
N = IDTNH3
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, N,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
!==============================================================
! Natural source NH3
!==============================================================
CATEGORY = 'NH3-NATU'
ARRAY(:,:,1) = AD13_NH3_na(:,:)
N = IDTNH3
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, N,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
!==============================================================
! Biomass NH3
!==============================================================
CATEGORY = 'NH3-BIOB'
ARRAY(:,:,1) = AD13_NH3_bb(:,:)
N = IDTNH3
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, N,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
!==============================================================
! Biofuel NH3
!==============================================================
CATEGORY = 'NH3-BIOF'
ARRAY(:,:,1) = AD13_NH3_bf(:,:)
N = IDTNH3
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, N,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
ENDIF
!
!******************************************************************************
! ND14: Upward mass flux from wet convection (NFCLDMX)
!
! # : Field : Description : Units : Scale factor
! --------------------------------------------------------------------------
! (1) CONVFLUP : Upward mass flux from wet conv : kg/s : SCALECONV
!
! NOTES:
! (1) Bug fix -- only write LD14 levels to the bpch file (bmy, 12/7/00)
!******************************************************************************
!
IF ( ND14 > 0 ) THEN
CATEGORY = 'CV-FLX-$'
UNIT = 'kg/s'
DO M = 1, TMAX(14)
N = TINDEX(14,M)
IF ( N > N_TRACERS ) CYCLE
NN = N
ARRAY(:,:,1:LD14) = CONVFLUP(:,:,1:LD14,N) / SCALECONV
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD14, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD14) )
ENDDO
ENDIF
!
!******************************************************************************
! ND15: Upward mass flux from boundary layer mixing (TURBDAY)
!
! # : Field : Description : Units : Scale factor
! --------------------------------------------------------------------------
! (1) TURBFLUX : Upward mass flux from BL mixing : kg/s : SCALECONV
!
! NOTES:
! (1) Bug fix -- only write LD15 levels to the bpch file (bmy, 12/7/00)
!******************************************************************************
!
IF ( ND15 > 0 ) THEN
CATEGORY = 'TURBMC-$'
UNIT = 'kg/s'
DO M = 1, TMAX(15)
N = TINDEX(15,M)
IF ( N > N_TRACERS ) CYCLE
NN = N
ARRAY(:,:,1:LD15) = TURBFLUP(:,:,1:LD15,N) / SCALECONV
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD15, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD15) )
ENDDO
ENDIF
!
!******************************************************************************
! ND16: Fraction of grid box experiencing LS or convective precipitation
!
! # Field : Description : Units : Scale factor
! --------------------------------------------------------------------------
! (1) WD-FLS-$ : LS precip fraction : unitless : CT16(:,:,:,1)
! (2) WD-FCV-$ : Convective precip fraction : unitless : CT16(:,:,:,2)
!******************************************************************************
!
IF ( ND16 > 0 ) THEN
! Large-scale area of precipitation
CATEGORY = 'WD-FRC-$'
UNIT = 'unitless'
DO M = 1, TMAX(16)
N = TINDEX(16,M)
IF ( N > PD16 ) CYCLE
NN = N
DO L = 1, LD16
SCALE_TMP(:,:) = FLOAT( CT16(:,:,L,N) ) + 1d-20
ARRAY(:,:,L) = AD16(:,:,L,N) / SCALE_TMP(:,:)
ENDDO
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD16, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD16) )
ENDDO
ENDIF
!
!******************************************************************************
! ND17: Fraction of tracer lost rainout in LS and convective precip
!
! # Field : Description : Units : Scale factor
! --------------------------------------------------------------------------
! (1) WD-LSR-$ : Rainout fraction/LS Precip : unitless : CT17(:,:,:,1)
! (2) WD-CVR-$ : Rainout fraction/conv precip : unitless : CT17(:,:,:,2)
!
! NOTES:
! (1) Now loop over all soluble tracers (bmy, 3/19/04)
! (2) Now use actual tracer number (bmy, 3/23/04)
!******************************************************************************
!
IF ( ND17 > 0 ) THEN
UNIT = 'unitless'
! Get max # of soluble tracers for this simulation
NMAX = GET_WETDEP_NSOL()
! Loop over soluble tracers
DO N = 1, NMAX
! Tracer number
NN = GET_WETDEP_IDWETD( N )
! To output only the species asked in input.geos
! (ccc, 5/15/09)
MM = 1
MMB = 0
DO WHILE ( MMB /= NN .AND. MM <= TMAX(17) )
MMB = TINDEX(17,MM)
MM = MM + 1
ENDDO
IF ( MMB /= NN ) CYCLE
! Large-scale rainout/washout fractions
CATEGORY = 'WD-LSR-$'
DO L = 1, LD17
SCALE_TMP(:,:) = FLOAT( CT17(:,:,L,1) ) + 1d-20
ARRAY(:,:,L) = AD17(:,:,L,N,1) / SCALE_TMP(:,:)
ENDDO
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD17, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD17) )
! Convective rainout/washout fractions
CATEGORY = 'WD-CVR-$'
DO L = 1, LD17
SCALE_TMP(:,:) = FLOAT( CT17(:,:,L,2) ) + 1d-20
ARRAY(:,:,L) = AD17(:,:,L,N,2) / SCALE_TMP(:,:)
ENDDO
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD17, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD17) )
ENDDO
ENDIF
!
!******************************************************************************
! ND18: Fraction of tracer lost to washout in LS or convective precip
!
! # Field : Description : Units : Scale factor
! --------------------------------------------------------------------------
! (1) WD-LSW-$ : Washout fraction/LS precip : unitless : CT18(:,:,:,1)
! (2) WD-CVW-$ : Washout fraction/conv precip : unitless : CT18(:,:,:,2)
!
! NOTES:
! (1) Now loop over all soluble tracers (bmy, 3/19/04)
! (2) Now use actual tracer number (bmy, 3/23/04)
!******************************************************************************
!
IF ( ND18 > 0 ) THEN
UNIT = 'unitless'
! Get max # of soluble tracers for this simulation
NMAX = GET_WETDEP_NSOL()
DO N = 1, NMAX
! Tracer number
NN = GET_WETDEP_IDWETD( N )
! To output only the species asked in input.geos
! (ccc, 5/15/09)
MM = 1
MMB = 0
DO WHILE ( MMB /= NN .AND. MM <= TMAX(18) )
MMB = TINDEX(18,MM)
MM = MM + 1
ENDDO
IF ( MMB /= NN ) CYCLE
! Large-scale rainout/washout fractions
CATEGORY = 'WD-LSW-$'
DO L = 1, LD18
SCALE_TMP(:,:) = FLOAT( CT18(:,:,L,1) ) + 1d-20
ARRAY(:,:,L) = AD18(:,:,L,N,1) / SCALE_TMP(:,:)
ENDDO
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD18, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD18) )
! Convective washout fractions
CATEGORY = 'WD-CVW-$'
DO L = 1, LD18
SCALE_TMP(:,:) = FLOAT( CT18(:,:,L,2) ) + 1d-20
ARRAY(:,:,L) = AD18(:,:,L,N,2) / SCALE_TMP(:,:)
ENDDO
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD18, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD18) )
ENDDO
ENDIF
!
!******************************************************************************
! ND19: CH4 loss
!
! # : Field : Description : Units : Scale factor
! --------------------------------------------------------------------------
! (1 ) CH4-LOSS : CH4 removing by OH : kg CH4 : 1
!******************************************************************************
!
IF ( ND19 > 0 ) THEN
UNIT = 'kg'
!==============================================================
! CH4 Loss
!==============================================================
CATEGORY = 'CH4-LOSS'
N = 1
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, N,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LLPAR, IFIRST,
& JFIRST, LFIRST, AD19(:,:,:) )
ENDIF
!
!******************************************************************************
! ND21: Optical depth diagnostics
!
! # : Field : Description : Units : Scale factor
! --------------------------------------------------------------------------
! (1 ) OPTD Cloud Optical Depth : unitless : SCALECHEM
! (2 ) CLMO Max Overlap Cloud Fraction (GEOS1,S): unitless : SCALECHEM
! or CLDF 3-D Total Cloud fraction (GEOS3,4): unitless : SCALECHEM
! (3 ) CLRO Random Overlap Cloud Fraction : unitless : SCALECHEM
! (4 ) OPD Mineral Dust Optical Depth (400 nm) : unitless : none
! (5 ) SD Mineral Dust Surface Area : cm2/cm3 : none
! (6 ) OPSO4 Sulfate Optical Depth (400 nm) : unitless : SCALECHEM
! (7 ) HGSO4 Hygroscopic growth of SO4 : unitless : SCALECHEM
! (8 ) SSO4 Sulfate Surface Area : cm2/cm3 : SCALECHEM
! (9 ) OPBC Black Carbon Optical Depth (400 nm) : unitless : SCALECHEM
! (10) HGBC Hygroscopic growth of BC : unitless : SCALECHEM
! (11) SBC Black Carbon Surface Area : cm2/cm3 : SCALECHEM
! (12) OPOC Organic C Optical Depth (400 nm) : unitless : SCALECHEM
! (13) HGOC Hygroscopic growth of OC : unitless : SCALECHEM
! (14) SOC Organic Carbon Surface Area : cm2/cm3 : SCALECHEM
! (15) OPSSa Sea Salt (accum) Opt Depth (400 nm) : unitless : SCALECHEM
! (16) HGSSa Hygroscopic growth of SSa : unitless : SCALECHEM
! (17) SSSa Sea Salt (accum) Surface Area : cm2/cm3 : SCALECHEM
! (18) OPSSc Sea Salt (coarse) Opt Depth(400 nm) : unitless : SCALECHEM
! (19) HGSSc Hygroscopic growth of SSc : unitless : SCALECHEM
! (20) SSSc Sea Salt (coarse) Surface Area : cm2/cm3 : SCALECHEM
!
! NOTES:
! (1 ) We don't need to add TRCOFFSET to N. These are not CTM tracers.
! (2 ) Don't divide monthly mean AOD by SCALECHEM (rvm, bmy, 12/8/00)
! (3 ) Use SCALE_A6 for GEOS-2, GEOS-3 fields, since optical depths are read
! in from disk every 6 hours. Use SCALECHEM for GEOS-1, GEOS-STRAT
! fields, since optical depths are computed every chemistry timestep.
! Use SCALEDYN for CO-OH parameterization simulation. (bmy, 4/23/01)
! (4 ) Now GEOS-2, GEOS-3 use SCALECHEM for ND21 (bmy, 8/13/01)
! (5 ) Updated tracers for new aerosols from Mian Chin (rvm, bmy, 3/1/02)
! (6 ) Now scale online dust fields by SCALECHEM (bmy, 4/9/04)
! (7 ) Also save out extra diagnostics for cryst sulfur tracers (bmy, 1/5/05)
!******************************************************************************
!
IF ( ND21 > 0 ) THEN
CATEGORY = 'OD-MAP-$'
! ND21 is updated every chem timestep
SCALEX = SCALECHEM
DO M = 1, TMAX(21)
N = TINDEX(21,M)
IF ( N > PD21 ) CYCLE
NN = N
! Select proper unit string (cf list above)
SELECT CASE( N )
CASE ( 5, 8, 11, 14, 17, 20 )
UNIT = 'cm2/cm3'
CASE DEFAULT
UNIT = 'unitless'
END SELECT
IF ( N > 3 .AND. N < 6 ) THEN
! Online or offline dust fields?
IF ( LDUST ) THEN
! If LDUST=T, then we are using online dust fields,
! so we must scale by the chemistry timestep. (4/9/04)
ARRAY(:,:,1:LD21) = AD21(:,:,1:LD21,N) / SCALEX
ELSE
! If LDUST=F, then we are using offline monthly-mean
! dust fields. These don't have to be scaled by
! the chemistry timestep. (bmy, 4/9/04)
ARRAY(:,:,1:LD21) = AD21(:,:,1:LD21,N)
ENDIF
ELSE
! For all other types of optical depths, we need
! to scale by the chemistry timestep (bmy, 4/9/04)
ARRAY(:,:,1:LD21) = AD21(:,:,1:LD21,N) / SCALEX
ENDIF
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD21, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD21) )
ENDDO
!==============================================================
! If we are using the crystalline sulfate tracers (LCRYST=T),
! then also save out the extra ND21 diagnostics:
!
! #21: Opt depth for HYSTERESIS CASE [unitless]
! #22: Opt depth for SOLID CASE [unitless]
! #23: Opt depth for LIQUID CASE [unitless]
! #24: Opt depth HYSTERESIS - Opt depth SOLID [unitless]
! #25: Opt depth HYSTERESIS - Opt depth LIQUID [unitless]
! #26: Radiative forcing [W/m2 ]
!==============================================================
IF ( LCRYST ) THEN
! Category
CATEGORY = 'OD-MAP-$'
! Loop over extra
DO N = 1, 6
! Define unit string
IF ( N == 6 ) THEN
UNIT = 'W/m2'
ELSE
UNIT = 'unitless'
ENDIF
! Scale by chemistry timestep
ARRAY(:,:,1) = AD21_cr(:,:,N) / SCALECHEM
! Save to BPCH file
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, N+PD21,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
ENDDO
ENDIF
ENDIF
!
!******************************************************************************
! ND22: J-value diagnostics
!
! # : Field : Description : Units : Scale factor
! --------------------------------------------------------------------------
! (1 ) JNO2 : NO2 J-Value : s-1 : SCALE_JV
! (2 ) JHNO3 : HNO3 J-Value : s-1 : SCALE_JV
! (3 ) JH2O2 : H2O2 J-Value : s-1 : SCALE_JV
! (4 ) JCH2O : CH2O J-Value : s-1 : SCALE_JV
! (5 ) JO3 : O3 J-Value : s-1 : SCALE_JV
! (6 ) POH : OH-source from O3 photolysis : s-1 : SCALE_JV
! (7 ) JGLYX : GLYX J-Value : s-1 : SCALE
! (8 ) JMGLY : MGLY J-Value : s-1 : SCALE
! (71 ) JCH3I : CH3I J-value (s^-1) : s-1 : SCALE_JV
! (81 ) JHCN : HCN J-value (s^-1) : s-1 : SCALE_JV
!
! NOTES:
! (1) We must add TRCOFFSET for CH3I and HCN runs, so that GAMAP can
! recognize those photo rates as distinct from the NO2, HNO3,
! H2O2, CH2O, O3, and POH photo rates.
! (2) Pick the right tracer field from AD22 if only a subset of tracers
! are requested to be printed out. (ccc, 12/15/08)
! (3) Add GLYX and MGLY tracers (tmf, 3/6/09)
!******************************************************************************
!
IF ( ND22 > 0 ) THEN
CATEGORY = 'JV-MAP-$'
SCALE_TMP = FLOAT( CTJV ) + 1d-20
UNIT = 's-1'
DO M = 1, TMAX(22)
N = TINDEX(22,M)
!-----------------------------------------------------------------
! Prior to 12/15/08:
!IF ( N > PD22 ) CYCLE
!-----------------------------------------------------------------
NN = N
!-----------------------------------------------------------------
! NOTE: We can no longer select "all" in "input.geos", but we
! must specify the tracer #'s for ND22 explicitly:
!
! Fullchem: CH3I HCN
! 1 = NOx 1 = CH3I 1 = HCN
! 7 = HNO3
! 8 = H2O2
! 20 = CH2O
! 55 = GLYX
! 56 = MGLY
! N_TRACERS+1 = O3 & OH
!
! (ccc, bmy, 12/15/08)
!-----------------------------------------------------------------
IF ( NN >= N_TRACERS+1 ) THEN
MM = 5 ! Write 'O3' and 'OH'
ELSE
SELECT CASE ( TRIM( TRACER_NAME(NN) ) )
CASE ( 'NOx', 'HCN', 'CH3I' )
MM = 1
CASE ( 'HNO3' )
MM = 2
CASE ( 'H2O2' )
MM = 3
CASE ( 'CH2O' )
MM = 4
CASE ( 'GLYX' )
MM = 7
CASE ( 'MGLY' )
MM = 8
CASE DEFAULT
MM = 0
END SELECT
ENDIF
! Skip if not a valid index
IF ( MM == 0 ) CYCLE
DO L = 1, LD22
!---------------------------------------------------------------
! Prior to 12/15/08:
!ARRAY(:,:,L) = AD22(:,:,L,N) / SCALE_TMP(:,:)
!---------------------------------------------------------------
ARRAY(:,:,L) = AD22(:,:,L,MM) / SCALE_TMP(:,:)
ENDDO
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, MM,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD22, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD22) )
! If we have just written out O3, then write out OH
! (ccc, bmy, 12/15/08)
IF ( MM == 5 ) THEN
MMB = 6
DO L = 1, LD22
ARRAY(:,:,L) = AD22(:,:,L,MMB) / SCALE_TMP(:,:)
ENDDO
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, MMB,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD22, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD22) )
ENDIF
ENDDO
ENDIF
!
!******************************************************************************
! ND24: Eastward mass flux from transport (TPCORE, XTP)
!
! # : Field : Description : Units : Scale factor
! --------------------------------------------------------------------------
! (1) MASSFLEW : Eastward mass flux - transport : kg/s : SCALEDYN
!
! NOTES:
! (1) MASSFLEW is REAL*8...store to ARRAY, which is REAL*4
! before sending to BPCH or IJSCAL (bey, bmy, 4/23/99)
! (2) Now only write LD24 levels out to the bpch file (bmy, 12/7/00)
!******************************************************************************
!
IF ( ND24 > 0 ) THEN
CATEGORY = 'EW-FLX-$'
UNIT = 'kg/s'
DO M = 1, TMAX(24)
N = TINDEX(24,M)
IF ( N > N_TRACERS ) CYCLE
NN = N
! (dkh, 02/09/12, adj32_022)
!ARRAY(:,:,1:LD24) = MASSFLEW(:,:,1:LD24,N) / SCALEDYN
ARRAY(:,:,1:LD24) = MASSFLEW(:,:,LLPAR:LLPAR-LD24+1:-1,N)
& / SCALEDYN
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD24, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD24) )
ENDDO
ENDIF
!
!******************************************************************************
! ND25: Northward mass flux from transport (TPCORE, YTP)
!
! # : Field : Description : Units : Scale factor
! --------------------------------------------------------------------------
! (1) MASSFLNS : Northward mass flux - transport : kg/s : SCALEDYN
!
! NOTES:
! (1) MASSFLNS is REAL*8...store to ARRAY, which is REAL*4
! before sending to BPCH or IJSCAL (bey, bmy, 4/23/99)
! (2) Now only write LD25 levels out to the bpch file (bmy, 12/7/00)
!******************************************************************************
!
IF ( ND25 > 0 ) THEN
CATEGORY = 'NS-FLX-$'
UNIT = 'kg/s'
DO M = 1, TMAX(25)
N = TINDEX(25,M)
IF ( N > N_TRACERS ) CYCLE
NN = N
! (dkh, 02/09/12, adj32_022)
!ARRAY(:,:,1:LD25) = MASSFLNS(:,:,1:LD25,N) / SCALEDYN
ARRAY(:,:,1:LD25) = MASSFLNS(:,:,LLPAR:LLPAR-LD25+1:-1,N)
& / SCALEDYN
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD25, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD25) )
ENDDO
ENDIF
!
!******************************************************************************
! ND26: Upward mass flux from transport (TPCORE, FZPPM)
!
! # : Field : Description : Units : Scale factor
! --------------------------------------------------------------------------
! (1) MASSFLUP : Upward mass flux - transport : kg/s : SCALEDYN
!
! NOTES:
! (1) MASSFLNS is REAL*8...store to ARRAY, which is REAL*4
! before sending to BPCH or IJSCAL (bey, bmy, 4/23/99)
! (2) Now only write LD26 levels to the bpch file (bmy, 12/7/00)
!******************************************************************************
!
IF ( ND26 > 0 ) THEN
CATEGORY = 'UP-FLX-$'
UNIT = 'kg/s'
DO M = 1, TMAX(26)
N = TINDEX(26,M)
IF ( N > N_TRACERS ) CYCLE
NN = N
! (dkh, 02/09/12, adj32_022)
!ARRAY(:,:,1:LD26) = MASSFLUP(:,:,1:LD26,N) / SCALEDYN
ARRAY(:,:,1:LD26) = MASSFLUP(:,:,LLPAR:LLPAR-LD26+1:-1,N)
& / SCALEDYN
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD26, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD26) )
ENDDO
ENDIF
!
!******************************************************************************
! ND27: Cross-tropopause Stratospheric Influx of Ox
!
! # : Field : Description : Units : Scale factor
! --------------------------------------------------------------------------
! (1) : Ox : Ox from the stratosphere : kg/s : SCALEDYN
!
! NOTES:
! (1) Only print out if we are doing a NOx-Ox-HC run (NSRCX == 3)
! or a single tracer Ox run (NSRCX == 6). (bey, bmy, 11/10/99)
! (2) Now consider the cross-tropopause stratospheric influx of ozone,
! which, in some grid boxes, includes horizontal influxes as well as
! up(down)ward flux. (qli, 1/5/2000)
! (3) Now error check for N > NTRACE (bmy, 10/23/01)
! (4) NOTE: There is a problem with for ND27 with GEOS-4. Djj says that
! the downward flux at the 200 hPa level should be more or less the
! same as the ND27 diagnostic. (bmy, 10/15/04)
! (5) Now provides stratrospheric flux of H2/HD if it is a H2/HD simulation
! (lyj, phs, 9/18/07)
!******************************************************************************
!
#if !defined( GEOS_4 )
IF ( ND27 > 0 .and. IDTOX > 0 ) then
IF ( ( IDTOX > 0 .and.
& ( ITS_A_FULLCHEM_SIM() .or. ITS_A_TAGOX_SIM() ) ) .OR.
& ( ITS_A_H2HD_SIM() ) ) THEN
CATEGORY = 'STRT-FLX'
UNIT = 'kg/s'
! Full chemistry -- compute NOx, Ox, HNO3 fluxes
! H2/HD -- compute H2, HD fluxes
! Single tracer Ox -- compute Ox flux only, hardwire
! to tracer = 1 (bmy, 2/7/00)
IF ( ITS_A_FULLCHEM_SIM() ) THEN
ITEMP = (/ IDTNOX, IDTOX, IDTHNO3 /)
ELSE IF ( ITS_A_H2HD_SIM() ) THEN
ITEMP = (/ IDTH2, IDTHD, 0 /)
ELSE
ITEMP = (/ 1, 0, 0 /)
ENDIF
! Loop over tracers
DO M = 1, 3
N = ITEMP(M)
IF ( N == 0 ) CYCLE
IF ( N > N_TRACERS ) CYCLE
! Loop over grid boxes
DO J = 1, JJPAR
DO I = 1, IIPAR
! Get the level of the tropopause
L = LPAUSE(I,J)
! Initialize integer flags
IS = 0
IN = 0
IW = 0
IE = 0
! Set integer flags based on the value of each bit of IFLX
IF ( BTEST( IFLX(I,J), 0 ) ) IS = 1
IF ( BTEST( IFLX(I,J), 1 ) ) IN = 1
IF ( BTEST( IFLX(I,J), 2 ) ) IW = 1
IF ( BTEST( IFLX(I,J), 3 ) ) IE = 1
! Add fluxes from the top, south, and west
ARRAY(I,J,1) = MASSFLUP(I,J,L,N) +
& ( MASSFLNS(I,J,L,N) * IS ) +
& ( MASSFLEW(I,J,L,N) * IW )
! Add fluxes from the north
! (take poles into account !)
IF ( J < JJPAR ) THEN
ARRAY(I,J,1) = ARRAY(I,J,1) -
& ( MASSFLNS(I,J+1,L,N) * IN )
ELSE
ARRAY(I,J,1) = ARRAY(I,J,1) -
& ( MASSFLNS(I, 1,L,N) * IN )
ENDIF
! Add fluxes from the east
!(wrap around dateline if necessary)
IF ( I < IIPAR ) THEN
ARRAY(I,J,1) = ARRAY(I,J,1) -
& ( MASSFLEW(I+1,J,L,N) * IE )
ELSE
ARRAY(I,J,1) = ARRAY(I,J,1) -
& ( MASSFLEW( 1,J,L,N) * IE )
ENDIF
ENDDO
ENDDO
UNIT = 'kg/s'
NN = N
ARRAY(:,:,1) = ARRAY(:,:,1) / SCALEDYN
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, PD27, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
ENDDO
ENDIF
ENDIF
#endif
!
!******************************************************************************
! ND28: Biomass burning diagnostic
!
! # : Field : Description : Units : Scale factor
! --------------------------------------------------------------------------
! (1 ) NOx : NOx : molec NOx /cm2/s : SCALESRCE
! (4 ) CO : CO : molec CO /cm2/s : SCALESRCE
! (9 ) ACET : Acetone : atoms C /cm2/s : SCALESRCE
! (10) MEK : Ketones(>C3) : atoms C /cm2/s : SCALESRCE
! (11) ALD2 : Acetaldehyde : atoms C /cm2/s : SCALESRCE
! (18) PRPE : Propene : atoms C /cm2/s : SCALESRCE
! (19) C3H8 : Propane : atoms C /cm2/s : SCALESRCE
! (20) C2HO : Formaldehyde : molec CH2O/cm2/s : SCALESRCE
! (21) C2H6 : Ethane : atoms C /cm2/s : SCALESRCE
! (26) SO2 : Sulfur dioxide : molec SO2 /cm2/s : SCALESRCE
! (30) NH3 : Ammonia : molec NH3 /cm2/s : SCALESRCE
! (34) BCPO : Black carbon : atoms C /cm2/s : SCALESRCE
! (35) OCPO : Organic carbon : atoms C /cm2/s : SCALESRCE
!
! NOTES:
! (1) Use the F90 intrinsic "ANY" function to make sure that N
! corresponds to actual biomass burning tracers (bmy, 4/8/99)
! (2) ND28 now uses allocatable array AD28 instead of AIJ. (bmy, 3/16/00)
! (3) Now write biofuel burning tracers to the punch file in the same order
! as they are listed in "diag.dat". (bmy, 4/17/01)
!******************************************************************************
!
IF ( ND28 > 0 ) THEN
CATEGORY = 'BIOBSRCE'
UNIT = ''
DO M = 1, TMAX(28)
N = TINDEX(28,M)
IF ( .not. ANY( BIOTRCE == N ) ) CYCLE
NN = N
DO MM = 1, NBIOMAX
IF ( BIOTRCE(MM) == NN ) THEN
MMB = MM
EXIT
ENDIF
ENDDO
ARRAY(:,:,1) = AD28(:,:,MMB) / SCALESRCE
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
ENDDO
ENDIF
!
!******************************************************************************
! ND29: CO source diagnostics
!
! # Field : Description : Units : Scale factor
! --------------------------------------------------------------------------
! (1) COanth : CO from Anthro Sources : mol/cm2/s : SCALESRCE
! (2) CObb : CO from Biomass Burning : mol/cm2/s : SCALESRCE
! (3) CObf : CO from Biofuel Burning : mol/cm2/s : SCALESRCE
! (4) COmeth : CO from Methanol : mol/cm2/s : SCALESRCE
! (5) COmono : CO from Monoterpenes : mol/cm2/s : SCALESRCE
!
! NOTES:
! (1) We don't need to add TRCOFFSET to N. These are not CTM tracers.
! (2) ND29 now uses allocatable array AD29 instead of AIJ. (bmy, 3/16/00)
! (3) Added CO-sources from isoprene and monoterpenes (bnd, bmy, 1/2/01)
!******************************************************************************
!
IF ( ND29 > 0 ) THEN
CATEGORY ='CO--SRCE'
UNIT = 'mol/cm2/s'
DO M = 1, TMAX(29)
N = TINDEX(29,M)
IF ( N > PD29 ) CYCLE
NN = N
ARRAY(:,:,1) = AD29(:,:,N) / SCALESRCE
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
ENDDO
ENDIF
!
!******************************************************************************
! ND30: Land map diagnostic
!
! # Field : Description : Units : Scale factor
! --------------------------------------------------------------------------
! (1) LWI : GMAO Land-Water indices : unitless : SCALED
!
! NOTES:
! (1) Values are: 0=water; 1=land; 2=ice (bmy, 8/18/05)
!******************************************************************************
!
IF ( ND30 > 0 ) THEN
CATEGORY = 'LANDMAP'
UNIT = 'unitless'
ARRAY(:,:,1) = AD30(:,:) / SCALEDYN
NN = 1
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
ENDIF
!
!******************************************************************************
! ND31: Surface pressure diagnostic
!
! # Field : Description : Units : Scale factor
! --------------------------------------------------------------------------
! (1) Pedge : Pressure at bot edge of level L : mb : SCALEDYN
!
! NOTES:
! (1) The ASCII punch file was using SCALE2 instead of SCALE1.
! This has now been fixed. (hyl, bmy, 12/21/99).
! (2) Now use AD31 dynamically allocatable array (bmy, 2/17/00)
! (3) Bug fix: write out 1 level to the bpch file (bmy, 12/7/00)
! (4) Now remove SCALE1, replace with SCALEDYN (bmy, 2/24/03)
! (5) Now save out true pressure at level edges. Now (bmy, 5/8/07)
!******************************************************************************
!
IF ( ND31 > 0 ) THEN
CATEGORY = 'PEDGE-$'
UNIT = 'mb'
ARRAY(:,:,1:LD31) = AD31(:,:,1:LD31) / SCALEDYN
NN = 1
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD31, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD31) )
ENDIF
!
!******************************************************************************
! ND32: NOx source diagnostic
!
! Levels : Field : Units : Scale Factor
! -------------------------------------------------------------------------
! 1 - LLTROP : Aircraft NOx : molec/cm2/s : SCALESRCE
! 1 - NOXEXTENT : Anthropogenic NOx : molec/cm2/s : SCALESRCE
! Surface : Biomass Burning NOx : molec/cm2/s : SCALESRCE
! Surface : Biofuel Burning NOx : molec/cm2/s : SCALESRCE
! Surface : Fertilizer NOx : molec/cm2/s : SCALESRCE
! 1 - LLCONVM : Lightning NOx : molec/cm2/s : SCALESRCE
! Surface : Soil NOx : molec/cm2/s : SCALESRCE
! Above TP : NOx from upper boundary: molec/cm2/s : SCALEDYN
!
! Print out all of the types of NOx, for all levels.
!
! NOTES:
! (1) Only print out ND32 if for an O3 chemistry run ( NSRCX == 3 ),
! and if NOx is a defined tracer ( IDTNOX > 0 ). (bmy, 5/26/99)
! (2) ND32 now uses allocatable arrays instead of AIJ. (bmy 3/16/00)
! (3) Added biofuel burning to ND32 diagnostic (bmy, 9/12/00)
!******************************************************************************
!
IF ( ND32 > 0 .and. IDTNOX > 0 .and. ITS_A_FULLCHEM_SIM() ) THEN
! All categories of NOx are in molec/cm2/s
UNIT = 'molec/cm2/s'
!==============================================================
! Aircraft NOx
!==============================================================
CATEGORY = 'NOX-AC-$'
DO L = 1, LLTROP
ARRAY(:,:,L) = AD32_ac(:,:,L) / SCALESRCE
ENDDO
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, IDTNOX,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LLTROP, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LLTROP) )
!==============================================================
! Anthropogenic NOx
!==============================================================
CATEGORY = 'NOX-AN-$'
! Add ship NOx to layer 1
! We scale by AD32_ship_count because the ship emission diagnostic
! is recorded every CHEMISTRY timestep when using INSTANT PBL mixing
! and every CONVECTION timestep when using NON-LOCAL PBL mixing
IF ( AD32_SHIP_COUNT >= 1 ) THEN
ARRAY(:,:,1) = AD32_an(:,:,1) / SCALESRCE +
& AD32_SHIP(:,:) / REAL( AD32_SHIP_COUNT )
ARRAY(:,:,2:NOXEXTENT) = AD32_an(:,:,2:NOXEXTENT) / SCALESRCE
ELSE
ARRAY(:,:,1:NOXEXTENT) = AD32_an(:,:,1:NOXEXTENT) / SCALESRCE
ENDIF
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, IDTNOX,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, NOXEXTENT, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:NOXEXTENT) )
!==============================================================
! Biomass Burning NOx
!==============================================================
CATEGORY = 'NOX-BIOB'
ARRAY(:,:,1) = AD32_bb(:,:) / SCALESRCE
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, IDTNOX,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
!==============================================================
! Binary punch file: NOx from Biofuel
!==============================================================
CATEGORY = 'NOX-BIOF'
ARRAY(:,:,1) = AD32_bf(:,:) / SCALESRCE
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, IDTNOX,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
!==============================================================
! Fertilizer NOx
!==============================================================
CATEGORY = 'NOX-FERT'
ARRAY(:,:,1) = AD32_fe(:,:) / SCALESRCE
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, IDTNOX,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
!==============================================================
! Lightning NOx
!==============================================================
CATEGORY = 'NOX-LI-$'
DO L = 1, LLCONVM
ARRAY(:,:,L) = AD32_li(:,:,L) / SCALESRCE
ENDDO
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, IDTNOX,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LLCONVM, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LLCONVM) )
!==============================================================
! Soil NOx
!==============================================================
CATEGORY = 'NOX-SOIL'
ARRAY(:,:,1) = AD32_so(:,:) / SCALESRCE
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, IDTNOX,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
!==============================================================
! Stratospheric NOx (boundary condition)
!==============================================================
CATEGORY = 'NOX-STRT'
ARRAY(:,:,1) = AD32_ub(:,:) / SCALEDYN
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, IDTNOX,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
ENDIF
!
!******************************************************************************
! ND33: Atmospheric column sum of Tracer
!
! # Field : Description : Units : Scale factor
! --------------------------------------------------------------------------
! (1) COLUMN-T : Trop. Column Sum of Tracer : kg : SCALEDYN
!
! NOTES:
! (1) Now use dynamically allocatable array AD33 (bmy, 2/17/00)
! (2) Rename category to COLUMN-T, since this is a column sum of tracer over
! the entire atmosphere, not just the troposphere. (bmy, 4/3/02)
! (3) Now replace SCALE1 with SCALEDYN (bmy, 3/27/03)
!******************************************************************************
!
IF ( ND33 > 0 ) THEN
CATEGORY = 'COLUMN-T'
UNIT = 'kg'
DO M = 1, TMAX(33)
N = TINDEX(33,M)
IF ( N > N_TRACERS ) CYCLE
NN = N
ARRAY(:,:,1) = AD33(:,:,N) / SCALEDYN
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
ENDDO
ENDIF
!
!******************************************************************************
! ND34: Biofuel burning diagnostic
!
! # : Field : Description : Units : Scale factor
! --------------------------------------------------------------------------
! (1 ) NOx : NOx : molec NOx /cm2/s : SCALESRCE
! (4 ) CO : CO : molec CO /cm2/s : SCALESRCE
! (5 ) ALK4 : Alkanes(>C4) : atoms C /cm2/s : SCALESRCE
! (9 ) ACET : Acetone : atoms C /cm2/s : SCALESRCE
! (10) MEK : Metyl Ethyl Ketone : atoms C /cm2/s : SCALESRCE
! (11) ALD2 : Acetaldehyde : atoms C /cm2/s : SCALESRCE
! (18) PRPE : Alkenes(>=C3) : atoms C /cm2/s : SCALESRCE
! (19) C3H8 : Propane : atoms C /cm2/s : SCALESRCE
! (20) CH2O : Formaldehyde : molec CH2O/cm2/s : SCALESRCE
! (21) C2H6 : Ethane : atoms C /cm2/s : SCALESRCE
!
! NOTES:
! (1) Use the F90 intrinsic "ANY" function to make sure that N
! corresponds to actual biofuel burning tracers (bmy, 3/15/01)
! (3) Now write biofuel burning tracers to the punch file in the same order
! as they are listed in "diag.dat". (bmy, 4/17/01)
! (4) Use BFTRACE and NBFTRACE to get the right index for AD34.
! (ccc, 12/8/2008)
!******************************************************************************
!
IF ( ND34 > 0 ) THEN
CATEGORY = 'BIOFSRCE'
UNIT = ''
DO M = 1, TMAX(34)
N = TINDEX(34,M)
IF ( .not. ANY( BFTRACE == N ) ) CYCLE
NN = N
DO MM = 1, NBFTRACE
IF ( BFTRACE(MM) == NN ) THEN
MMB = MM
EXIT
ENDIF
ENDDO
ARRAY(:,:,1) = AD34(:,:,MMB) / SCALESRCE
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
ENDDO
ENDIF
!
!******************************************************************************
! ND35: Tracer concentration at 500 mb
!
! # Field : Description : Units : Scale factor
! --------------------------------------------------------------------------
! (1) 500-AVRG : Tracer at 500 mb : v/v : SCALEDYN
!
! NOTES:
! (1) Now use dynamically allocatable array AD35 (bmy, 2/17/00)
! (2) Now replace SCALE1 with SCALEDYN (bmy, 2/24/03)
!******************************************************************************
!
IF ( ND35 > 0 ) THEN
CATEGORY = '500-AVRG'
UNIT = ''
DO M = 1, TMAX(35)
N = TINDEX(35,M)
IF ( N > N_TRACERS ) CYCLE
NN = N
ARRAY(:,:,1) = AD35(:,:,N) / SCALEDYN
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
ENDDO
ENDIF
!
!******************************************************************************
! ND36: Anthropogenic source diagnostic
!
! # Field : Description : Units : S. Factor
! ---------------------------------------------------------------------------
! (1 ) NOx : NOx : mol/cm2/s : SCALE3
! (4 ) CO : CO : mol/cm2/s : SCALE3
! (5 ) ALK4 : Alkanes(>C4) : atoms C/cm2/s : SCALE3
! (9 ) ACET : Acetone : atoms C/cm2/s : SCALE3
! (10) MEK : Ketones(>C3) : atoms C/cm2/s : SCALE3
! (18) PRPE : Propene : atoms C/cm2/s : SCALE3
! (19) C3H8 : Propane : atoms C/cm2/s : SCALE3
! (21) C2H6 : Ethane : atoms C/cm2/s : SCALE3
! (71) CH3Ioc : Methyl Iodide (oceanic source) : ng/m2/s : SCALE3
! (72) CH3Ibb : Methyl Iodide (biomass burning) : ng/m2/s : SCALE3
! (73) CH3Iwb : Methyl Iodide (wood burning) : ng/m2/s : SCALE3
! (74) CH3Irc : Methyl Iodide (rice paddies) : ng/m2/s : SCALE3
! (75) CH3Iwl : Methyl Iodide (wetlands) : ng/m2/s : SCALE3
!
! NOTES:
! (1) ND36 is also used for CH3I emissions diagnostics when NSRCX=2.
! (2) For an O3 run (NSRCX = 3, the "default" run) make sure that the
! tracer number N matches an entry in the IDEMS emission index
! array (bmy, 4/9/99)
! (3) Write the tracers out to the punch file in the same order as
! they are listed in the IDEMS array. Thus, we have to re-assign
! N = IDEMS(M) after we test to make sure it is a valid tracer
! number (bmy, 4/16/99)
! (4) For a CH3I run, make sure that the tracer number N is not larger
! than NTRACE (bmy, 4/9/99)
! (5) ND36 now uses the AD36 array instead of AIJ. (bmy, 3/16/00)
! (6) Rewritten for clarity; also fixed for CH3I (bmy, 7/25/06)
! (7) Bug fix: given the tracer number, now search for entry in IDEMS
! to jive with historical baggage (bmy, 3/6/07)
!******************************************************************************
!
IF ( ND36 > 0 ) THEN
! Loop over # of tracers
DO M = 1, TMAX(36)
! Get the tracer # from input.geos
N = TINDEX(36,M)
IF ( ITS_A_CH3I_SIM() ) THEN
!--------------------------------------------------------
! For CH3I simulation only
!--------------------------------------------------------
CATEGORY = 'CH3ISRCE'
UNIT = 'ng/m2/s'
IF ( N > NEMANTHRO ) CYCLE
! Tracer number
NN = N
! Index for AD36 array
MM = M
ELSE
!--------------------------------------------------------
! For full-chemistry. Note, due to historical baggage,
! the order of the tracers in AD36 array corresponds to
! the order as given in IDEMS. Therefore, for the given
! tracer number N, we must find the corresponding entry
! in IDEMS. (bmy, 3/5/07)
!--------------------------------------------------------
CATEGORY = 'ANTHSRCE'
UNIT = ''
! reset these
MM = 0
NN = 0
! Given the tracer number N, find the proper entry in the
! IDEMS array and select that for output (bmy, 3/5/07)
DO NMAX = 1, NEMANTHRO
IF ( N == IDEMS(NMAX) ) THEN
MM = NMAX
NN = N
EXIT
ENDIF
ENDDO
! We haven't found a match, skip to next tracer
IF ( MM == 0 ) CYCLE
ENDIF
! Divide by seconds for AD36 and by AD36_SHIP_COUNT for AD36_SHIP
! We scale by AD32_ship_count because the ship emission diagnostic
! is recorded every CHEMISTRY timestep when using INSTANT PBL mixing
! and every CONVECTION timestep when using NON-LOCAL PBL mixing
IF ( AD36_SHIP_COUNT >= 1 ) THEN
ARRAY(:,:,1) = AD36(:,:,MM) / SECONDS +
& AD36_SHIP(:,:,MM) / REAL( AD36_SHIP_COUNT )
ELSE
ARRAY(:,:,1) = AD36(:,:,MM) / SECONDS
ENDIF
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
ENDDO
ENDIF
!
!******************************************************************************
! ND37: Fraction of tracer scavenged in convective cloud updrafts
!
! # Field : Description : Units : Scale factor
! --------------------------------------------------------------------------
! (1) WETCVF-$ : Scavenging fraction : unitless : SCALECONV
!******************************************************************************
!
IF ( ND37 > 0 ) THEN
CATEGORY = 'MC-FRC-$'
UNIT = 'unitless'
! Get actual # of soluble tracers
NMAX = GET_WETDEP_NSOL()
! Loop over soluble tracers
DO N = 1, NMAX
! Tracer number
NN = GET_WETDEP_IDWETD( N )
! To output only the species asked in input.geos
! (ccc, 5/15/09)
MM = 1
MMB = 0
DO WHILE ( MMB /= NN .AND. MM <= TMAX(37) )
MMB = TINDEX(37,MM)
MM = MM + 1
ENDDO
IF ( MMB /= NN ) CYCLE
DO L = 1, LD37
ARRAY(:,:,L) = AD37(:,:,L,N) / SCALECONV
ENDDO
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD37, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD37) )
ENDDO
ENDIF
!
!******************************************************************************
! ND38: Rainout loss of tracer in convective updrafts
!
! # Field : Description : Units : Scale factor
! --------------------------------------------------------------------------
! (1) WETDCV-$ : Rainout loss of tracer : kg/s : SCALECONV
!
! NOTES:
! (1) Now write only LD38 levels to bpch file (bmy, 12/7/00)
!******************************************************************************
!
IF ( ND38 > 0 ) THEN
CATEGORY = 'WETDCV-$'
UNIT = 'kg/s'
! Get actual # of soluble tracers
M = GET_WETDEP_NSOL()
! Loop over soluble tracers
DO N = 1, M
! Tracer number
NN = GET_WETDEP_IDWETD( N )
! To output only the species asked in input.geos
! (ccc, 5/15/09)
MM = 1
MMB = 0
DO WHILE ( MMB /= NN .AND. MM <= TMAX(38) )
MMB = TINDEX(38,MM)
MM = MM + 1
ENDDO
! IF ( MMB /= NN ) CYCLE ! comment out(lz,05/29/13)
! Divide by # of convective timesteps
DO L = 1, LD38
ARRAY(:,:,L) = AD38(:,:,L,N) / SCALECONV
ENDDO
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD38, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD38) )
ENDDO
ENDIF
!
!******************************************************************************
! ND39: Rainout loss of tracer in large scale rains
!
! # Field : Description : Units : Scale factor
! --------------------------------------------------------------------------
! (1) WETDLS-$ : Large-scale loss of tracer : kg/s : SCALEDYN
!******************************************************************************
!
IF ( ND39 > 0 ) THEN
CATEGORY = 'WETDLS-$'
UNIT = 'kg/s'
! Get actual # of soluble tracers
M = GET_WETDEP_NSOL()
! Loop over soluble tracers
DO N = 1, M
! Tracer number
NN = GET_WETDEP_IDWETD( N )
! To output only the species asked in input.geos
! (ccc, 5/15/09)
MM = 1
MMB = 0
DO WHILE ( MMB /= NN .AND. MM <= TMAX(39) )
MMB = TINDEX(39,MM)
MM = MM + 1
ENDDO
! IF ( MMB /= NN ) CYCLE ! comment out(lz,05/29/13)
! Divide by # of wetdep (= dynamic) timesteps
DO L = 1, LD39
ARRAY(:,:,L) = AD39(:,:,L,N) / SCALEDYN
ENDDO
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD39, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD39) )
ENDDO
ENDIF
!
!******************************************************************************
! ND41: Afternoon boundary layer heights
!******************************************************************************
!
IF ( ND41 > 0 ) CALL WRITE_DIAG41
!
!******************************************************************************
! ND42: SOA concentrations [ug/m3]
!******************************************************************************
!
IF ( ND42 > 0 ) CALL WRITE_DIAG42
!
!******************************************************************************
! ND42: Free diagnostic as of 11/24/99
!
! ND43: Chemical production of OH and NO
!
! # : Field : Description : Units : Scale Factor
! ---------------------------------------------------------------------------
! (1) OH : OH Chemical Diagnostic : mol/cm3 : CTOH
! (2) NO : NO Chemical Diagnostic : v/v : CTNO
! (3) HO2 : HO2 Chemical Diagnostic : v/v : CTHO2
! (4) NO2 : NO2 Chemical Diagnostic : v/v : CTNO2
! (5) NO3 : NO3 Chemical Diagnostic : v/v : CTNO3
!
! NOTES:
! (1) Print output for either a NOx-Ox-HC run (NSRCX == 3), or a CO run
! with parameterized OH (NSRCX== 5). (bmy, 4/17/00)
! (2) Add parentheses in IF test since .AND. has higher precedence
! than .OR. (jsw, bmy, 12/5/00)
! (3) Added HO2, NO2 to ND43 (rvm, bmy, 2/27/02)
! (4) Added NO3 to ND43 (bmy, 1/16/03)
! (5) Now uses 3D counters (phs, 1/24/07)
! (6) Now assume that LD43 can't be higher than LD45 (phs, 1/24/07)
! (7) Check that CTxx are not zero, instead of adding 1e-20 (phs, 11/13/07)
!******************************************************************************
!
IF ( ND43 > 0 .and. ITS_A_FULLCHEM_SIM() ) THEN
CATEGORY = 'CHEM-L=$'
DO M = 1, TMAX(43)
N = TINDEX(43,M)
NN = N
! default units
UNIT = 'v/v'
SELECT CASE ( N )
! OH
CASE ( 1 )
WHERE( CTOH /= 0 )
ARRAY(:,:,1:LD43) = AD43(:,:,1:LD43,N) /
$ FLOAT( CTOH )
ELSEWHERE
ARRAY(:,:,1:LD43) = 0.
ENDWHERE
UNIT = 'molec/cm3'
! NO
CASE ( 2 )
WHERE( CTNO /= 0 )
ARRAY(:,:,1:LD43) = AD43(:,:,1:LD43,N) /
$ FLOAT( CTNO )
ELSEWHERE
ARRAY(:,:,1:LD43) = 0.
ENDWHERE
! HO2 (rvm, bmy, 2/27/02)
CASE ( 3 )
WHERE( CTHO2 /= 0 )
ARRAY(:,:,1:LD43) = AD43(:,:,1:LD43,N) /
$ FLOAT( CTHO2 )
ELSEWHERE
ARRAY(:,:,1:LD43) = 0.
ENDWHERE
! NO2 (rvm, bmy, 2/27/02)
CASE ( 4 )
WHERE( CTNO2 /= 0 )
ARRAY(:,:,1:LD43) = AD43(:,:,1:LD43,N) /
$ FLOAT( CTNO2 )
ELSEWHERE
ARRAY(:,:,1:LD43) = 0.
ENDWHERE
!PRINT *, "AD43", ARRAY(:,:,1:ND43)
PRINT *, "N", N
!PRINT *, "CTNO2", FLOAT(CTNO2)
! NO3 (rjp, bmy, 1/16/03)
CASE ( 5 )
WHERE( CTNO3 /= 0 )
ARRAY(:,:,1:LD43) = AD43(:,:,1:LD43,N) /
$ FLOAT( CTNO3 )
ELSEWHERE
ARRAY(:,:,1:LD43) = 0.
ENDWHERE
CASE DEFAULT
CYCLE
END SELECT
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD43, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD43) )
ENDDO
ENDIF
!
!******************************************************************************
! ND44: Drydep flux (molec/cm2/s) and velocity (cm/s) diagnostics
!
! # : Field : Quantity : Units : Scale factor
! -------------------------------------------------------------------------
! (1 ) : DRYD-FLX : drydep fluxes : molec/cm2/s or kg/s : SCALECHEM
! (2 ) : DRYD-VEL : drydep velocities : cm/s : SCALECHEM
!
! NOTES:
! (1 ) Remove diagnostics for wetdep HNO3, H2O2 from ND44.
! (2 ) For NSRCX == 1 (Rn-Pb-Be), save the actual tracer number
! instead of the dry deposition index. Add TRCOFFSET to N.
! (3 ) For NSRCX == 6 (single tracer Ox), drydep fluxes are in kg/s.
! (4 ) ND44 now uses allocatable array AD44 instead of AIJ. (bmy, 3/16/00)
! (5 ) Add code from amf for multi-tracer Ox (bmy, 7/3/01)
! (6 ) Now divide by SCALECHEM since DRYFLX is only called after the
! chemistry routines for all relevant simulations (bmy, 1/27/03)
! (7 ) Now print out NTRACE drydep fluxes for tagged Ox. Also tagged Ox
! now saves drydep in molec/cm2/s. (bmy, 8/19/03)
! (8 ) Rearrange ND44 code for clarity (bmy, 3/24/04)
! (9 ) Add code for H2/HD simulation (phs, 5/8/07)
!******************************************************************************
!
IF ( ND44 > 0 ) THEN
!==============================================================
! Drydep fluxes
!==============================================================
! Category name
CATEGORY = 'DRYD-FLX'
! # of drydep flux tracers
IF ( ITS_A_TAGOX_SIM() .or. ITS_A_MERCURY_SIM() ) THEN
M = N_TRACERS
ELSE
M = NUMDEP
ENDIF
! Loop over drydep tracers
DO N = 1, M
IF ( ITS_A_RnPbBe_SIM() .or. ITS_A_H2HD_SIM() ) THEN
! Radon or H2/HD
UNIT = 'kg/s'
NN = NTRAIND(N)
ELSE IF ( ITS_A_TAGOX_SIM() .or. ITS_A_MERCURY_SIM() ) THEN
! Tagged Ox or Tagged Hg
UNIT = 'molec/cm2/s'
NN = N
ELSE
! Other simulations
UNIT = 'molec/cm2/s'
NN = NTRAIND(N)
ENDIF
! To output only the species asked in input.geos
! (ccc, 5/15/09)
MM = 1
MMB = 0
DO WHILE ( MMB /= NN .AND. MM <= TMAX(44) )
MMB = TINDEX(44,MM)
MM = MM + 1
ENDDO
! IF ( MMB /= NN ) CYCLE ! comment out(lz,05/29/13)
! Save into ARRAY
ARRAY(:,:,1) = ( AD44(:,:,N,1) / SCALECHEM )
! Write to file
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
ENDDO
!==============================================================
! Drydep velocities
!==============================================================
! Category and Unit
CATEGORY = 'DRYD-VEL'
UNIT = 'cm/s'
! # of drydep velocity tracers
IF ( ITS_A_TAGOX_SIM() ) THEN
M = 1
ELSE IF ( ITS_A_MERCURY_SIM() ) THEN
M = 2
ELSE
M = NUMDEP
ENDIF
! Loop over drydep tracers
DO N = 1, M
NN = NTRAIND(N)
! To output only the species asked in input.geos
! (ccc, 5/15/09)
MM = 1
MMB = 0
DO WHILE ( MMB /= NN .AND. MM <= TMAX(44) )
MMB = TINDEX(44,MM)
MM = MM + 1
ENDDO
! IF ( MMB /= NN ) CYCLE ! comment out(lz,05/29/13)
! Tracer number plus GAMAP offset
ARRAY(:,:,1) = AD44(:,:,N,2) / SCALESRCE
! Write to file
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
ENDDO
ENDIF
!
!******************************************************************************
! ND45: Tracer Mixing Ratio (v/v) for Levels L = 1, LD45
! averaged between hours OTH_HR1 and OTH_HR2
!
! # : Field : Description : Units : Scale Factor
! ---------------------------------------------------------------------------
! (1) IJ-AVG-$ : Tracer mixing ratio : v/v : CTOTH
!
! NOTES:
! (1) For NSRCX == 3 (NOx-Ox-HC run), store pure O3 with index NTRACE+1.
! (2) Now store pure O3 as NNPAR+1 (now tracer #32). (bmy, 1/10/03)
! (3) Now uses CTO3 instead of CTOH for pure O3 (phs, 1/24/07)
! (4) Better handling of O3 case (phs, 11/17/08)
!******************************************************************************
!
IF ( ND45 > 0 ) THEN
CATEGORY = 'IJ-AVG-$'
SCALE_TMP = FLOAT( CTOTH ) + 1d-20
UNIT = ''
DO M = 1, TMAX(45)
N = TINDEX(45,M)
IF ( N > N_TRACERS ) CYCLE
NN = N
DO L = 1, LD45
ARRAY(:,:,L) = AD45(:,:,L,N) / SCALE_TMP(:,:)
ENDDO
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD45, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD45) )
! Store pure O3 as NNPAR+1 (bmy, 1/10/03)
IF ( ITS_A_FULLCHEM_SIM() .and. NN == IDTOX ) THEN
WHERE( CTO3 /= 0 )
ARRAY(:,:,1:LD45) = AD45(:,:,1:LD45,N_TRACERS+1) /
$ FLOAT( CTO3 )
ELSEWHERE
ARRAY(:,:,1:LD45) = 0.
ENDWHERE
NN = N_TRACERS + 1
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD45, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD45) )
ENDIF
ENDDO
ENDIF
!
!******************************************************************************
! ND46: Biogenic source diagnostic
!
! # : Field : Description : Units : Scale Factor
! ---------------------------------------------------------------------------
! (1) ISOP : Isoprene : atoms C/cm2/s : SCALE3
! (2) ACET : Acetone : atoms C/cm2/s : SCALE3
! (3) PRPE : Propene : atoms C/cm2/s : SCALE3
! (4) MONOT : Monoterpenes : atoms C/cm2/s : SCALE3
! (5) MBO : Methyl Butenol : atoms C/cm2/s : SCALE3
! (6) C2H4 : Ethene : atoms C/cm2/s : SCALE3
!
! NOTES:
! (1) ND46 now uses allocatable array AD46 instead of AIJ (bmy, 3/16/00)
! (2) Also write out PRPE for CO-OH run (NSRCX == 5), regardless of
! the setting of IDTPRPE. This is to print out monterpene
! diagnostics. (bnd, bmy, 4/18/00)
! (3) Added monoterpenes as tracer #4. This requires updated versions
! of "tracerinfo.dat" and "diaginfo.dat" for GAMAP. (bmy, 1/2/01)
! (4) Added MBO as tracer #5. (tmf, bmy, 10/20/05)
! (5) Added C2H4 as tracer #6. (tmf, 1/20/09)
!******************************************************************************
!
IF ( ND46 > 0 ) THEN
CATEGORY = 'BIOGSRCE'
UNIT = ''
DO M = 1, TMAX(46)
N = TINDEX(46,M)
IF ( N > PD46 ) CYCLE
NN = N
! Skip if ISOP, ACET, PRPE are not tracers
IF ( N == 1 .and. IDTISOP == 0 ) CYCLE
IF ( N == 2 .and. IDTACET == 0 ) CYCLE
IF ( N == 3 .and. IDTPRPE == 0 ) CYCLE
IF ( N == 6 .and. IDTC2H4 == 0 ) CYCLE
ARRAY(:,:,1) = AD46(:,:,N) / SCALESRCE
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
ENDDO
ENDIF
!
!******************************************************************************
! ND47: Tracer Mixing Ratio (v/v) for Levels L = 1, LD47
! *always* averaged between 0000 and 2400 Local time.
!
! # : Field : Description : Units : Scale Factor
! ---------------------------------------------------------------------------
! (1) IJ-24H-$ : 24h avg Tracer mixing ratio : v/v : SCALEDYN
!
! NOTES:
! (1) For NSRCX == 3 (NOx-Ox-HC run), store pure O3 with index NTRACE+1.
! (2) Now store pure O3 as NNPAR+1 (now tracer #32). (bmy, 1/10/03)
! (3) Now replace SCALE1 with SCALEDYN
! (4) Now averaged between 0 and 24 UT. Replace SCALEDYN with CTOH and
! CTO3 (phs, 1/24/07)
! (5) Revert to SCALEDYN for all species, except O3, which uses new
! CTO3_24h counter (phs, 11/17/08)
!******************************************************************************
!
IF ( ND47 > 0 ) THEN
CATEGORY = 'IJ-24H-$'
UNIT = ''
DO M = 1, TMAX(47)
N = TINDEX(47,M)
IF ( N > N_TRACERS ) CYCLE
NN = N
DO L = 1, LD47
ARRAY(:,:,L) = AD47(:,:,L,N) / SCALEDYN
ENDDO
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD47, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD47) )
! Store pure O3 as NNPAR+1 (bmy, 1/10/03)
IF ( ITS_A_FULLCHEM_SIM() .and. NN == IDTOX ) THEN
WHERE( CTO3_24h(:,:,1:LD47) /= 0 )
ARRAY(:,:,1:LD47) = AD47(:,:,1:LD47,N_TRACERS+1) /
$ FLOAT( CTO3_24h(:,:,1:LD47) )
ELSEWHERE
ARRAY(:,:,1:LD47) = 0.
ENDWHERE
NN = N_TRACERS + 1
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD47, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD47) )
ENDIF
ENDDO
ENDIF
!******************************************************************************
! ND52: gamma HO2 and aerosol radius (jaegle 02/26/09)
! # Category
! # : Field : Description : Units : Scale factor
! ----------------------------------------------------------------------------
! (1): GAMMAHO2 : Uptake coef for HO2 : unitless : SCALECHEM
!
!******************************************************************************
IF ( ND52 > 0 ) THEN
CATEGORY = 'GAMMA'
UNIT = 'unitless'
DO L = 1, LD52
ARRAY(:,:,L) = AD52(:,:,L) / SCALECHEM
ENDDO
! Save to disk
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, 1,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD52, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD52) )
ENDIF
!
!******************************************************************************
! ND54: Time-in-the-Troposphere diagnostic
!
! # : Field : Description : Units : Scale Factor
! ---------------------------------------------------------------------------
! (1) TIME-TPS : Time spend in troposphere : fraction : SCALEDYN
!******************************************************************************
!
IF ( ND54 > 0 ) THEN
CATEGORY = 'TIME-TPS'
UNIT = 'unitless'
DO L = 1, LD54
ARRAY(:,:,L) = AD54(:,:,L) / SCALEDYN
ENDDO
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, 1,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD54, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD54) )
ENDIF
!
!******************************************************************************
! ND55: Tropopause diagnostics
!
! # : Field : Description : Units : Scale Factor
! ---------------------------------------------------------------------------
! (1) TP-LEVEL : Tropopause level : unitless : SCALEDYN
! (2) TP-HGHT : Tropopause height : km : SCALEDYN
! (3) TP-PRESS : Tropopause pressure : mb : SCALEDYN
!******************************************************************************
!
IF ( ND55 > 0 ) THEN
CATEGORY = 'TR-PAUSE'
DO M = 1, TMAX(55)
N = TINDEX(55,M)
IF ( N > PD55 ) CYCLE
NN = N
! Pick the appropriate unit string
SELECT CASE ( N )
CASE ( 1 )
UNIT = 'unitless'
CASE ( 2 )
UNIT = 'km'
CASE ( 3 )
UNIT = 'mb'
END SELECT
ARRAY(:,:,1) = AD55(:,:,N) / SCALEDYN
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
ENDDO
ENDIF
!
!******************************************************************************
! ND56: Lightning flash rate diagnostics (ltm, bmy, 5/5/06))
!******************************************************************************
!
IF ( ND56 > 0 ) CALL WRITE_DIAG56
!
!******************************************************************************
! ND58: CH4 Emission Diagnostics
!
! # : Field : Description : Units : Scale Factor
! ---------------------------------------------------------------------------
! (1 ) CH4-TOT : CH4 Emissions total(w/o sab): kg : 1
! (2 ) CH4-GAO : CH4 Emissions gas & oil : kg : 1
! (3 ) CH4-COL : CH4 Emissions coal : kg : 1
! (4 ) CH4-LIV : CH4 Emissions livestock : kg : 1
! (5 ) CH4-WST : CH4 Emissions waste : kg : 1
! (6 ) CH4-BFL : CH4 Emissions biofuel : kg : 1
! (7 ) CH4-RIC : CH4 Emissions rice : kg : 1
! (8 ) CH4-OTA : CH4 Emissions other anthro : kg : 1
! (9 ) CH4-BBN : CH4 Emissions bioburn : kg : 1
! (10) CH4-WTL : CH4 Emissions wetlands : kg : 1
! (11) CH4-SAB : CH4 Emissions soil abs : kg : 1
! (12) CH4-OTN : CH4 Emissions other natural : kg : 1
!******************************************************************************
!
IF ( ND58 > 0 ) THEN
CATEGORY = 'CH4-EMIS'
DO M = 1, TMAX(58)
N = TINDEX(58,M)
IF ( N > PD58 ) CYCLE
NN = N
UNIT = 'kg'
ARRAY(:,:,1) = AD58(:,:,N)
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
ENDDO
ENDIF
!
!******************************************************************************
! ND59: NH3 concentrations [ug/m3] (diag59 added, lz,10/11/10)
!******************************************************************************
!
IF ( ND59 > 0 ) CALL WRITE_DIAG59
!
!******************************************************************************
! ND60: Wetland fraction
!
! # : Field : Description : Units : Scale factor
! --------------------------------------------------------------------------
! (1 ) WET-FRAC : WETLAND FRACTION : unitless : 1
!******************************************************************************
!
IF ( ND60 > 0 ) THEN
UNIT = 'unitless'
CATEGORY = 'WET-FRAC'
ARRAY(:,:,1) = AD60(:,:)
N = 1
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, N,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
ENDIF
!
!*****************************************************************************
! ND62: I-J Instantaneous Column Maps for Tracers (molec/cm^2)
!
! The unit conversion is as follows:
!
! STT (kg) | 6.022e23 molec | mole | 1000 g | 1 | m^2
! ---------+----------------+----------+--------+-------------+----------
! | mole | MOLWT g | kg | AREA_M2 m^2 | 10^4 cm^2
!
!
! which is equivalent to
!
! ( STT * 6.022e22 ) / ( MOLWT * AREA_M2 )
!*****************************************************************************
!
IF ( ND62 > 0 ) THEN
CATEGORY = 'INST-MAP'
DO M = 1, TMAX(62)
N = TINDEX(62,M)
IF ( N > N_TRACERS ) CYCLE
NN = N
DO J = 1, JJPAR
! Grid box surface area [cm2]
AREA_M2 = GET_AREA_M2( J )
DO I = 1, IIPAR
ARRAY(I,J,1) = ( SUM( STT(I,J,:,N) ) * 6.022d22 )
& / ( TRACER_MW_G(N) * AREA_M2 )
ENDDO
ENDDO
! Write the proper unit string
IF ( TRACER_MW_G(N) > 12d0 ) THEN
UNIT = 'molec/cm2'
ELSE
UNIT = 'atoms C/cm2'
ENDIF
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
ENDDO
ENDIF
!
!******************************************************************************
! ND65: Production/Loss of specified chemical families
!
! # : Field : Description : Units : Scale Factor
! ---------------------------------------------------------------------------
! (1) PORL-L=$ : Chemical family P-L rates : mol/cm3/s : SCALECHEM
!
! NOTES:
! (1 ) Make sure the units for NSRCX == 6 (single tracer O3) P-L
! coincide with those in "chemo3.f".
! (2 ) ND65 now uses allocatable array AD65 instead of AIJ. (bmy, 3/16/00)
! (3 ) Add L(CH3I) to the ND65 diagnostic -- do not take the average
! but instead compute the total sum of L(CH3I) (nad, bmy, 3/20/01)
! (4 ) Add updates for multi-tracer Ox run from amf (bmy, 7/3/01)
! (5 ) Now account for time in troposphere for full chemistry. It is
! assumed that LD45 >= LD65 in using CTO3 (phs, 3/6/07)
! (6 ) Do not use CTO3 anymore, but the new CTO3_24h, which is the 3D
! tropospheric chemistry counter (phs, 11/17/08)
!******************************************************************************
!
IF ( ND65 > 0 ) THEN
CATEGORY = 'PORL-L=$'
! Loop over ND65 families
DO N = 1, NFAMILIES
! Don't add TRCOFFSET for single tracer Ox
! Also select proper unit string
IF ( ITS_A_CH3I_SIM() ) THEN
NN = N
UNIT = 'kg/s'
DO L = 1, LD65
ARRAY(:,:,L) = AD65(:,:,L,N)
ENDDO
ELSE IF ( ITS_A_TAGOX_SIM() ) THEN
NN = N
UNIT = 'kg/s'
WHERE( CTO3_24h(:,:,1:LD65) /= 0 )
ARRAY(:,:,1:LD65) = AD65(:,:,1:LD65,N) /
$ FLOAT( CTO3_24h(:,:,1:LD65) )
ELSEWHERE
ARRAY(:,:,1:LD65) = 0.
ENDWHERE
ELSE IF ( ITS_AN_AEROSOL_SIM() ) THEN
NN = N
UNIT = 'mol/cm3/s'
DO L = 1, LD65
ARRAY(:,:,L) = AD65(:,:,L,N) / SCALECHEM
ENDDO
ELSE
NN = N
UNIT = 'mol/cm3/s'
WHERE( CTO3_24h(:,:,1:LD65) /= 0 )
ARRAY(:,:,1:LD65) = AD65(:,:,1:LD65,N) /
$ FLOAT( CTO3_24h(:,:,1:LD65) )
ELSEWHERE
ARRAY(:,:,1:LD65) = 0.
ENDWHERE
ENDIF
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD65, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD65) )
ENDDO
ENDIF
!
!******************************************************************************
! ND66: GMAO 3-D fields
!
! # : Field : Description : Units : Scale factor
! --------------------------------------------------------------------------
! (1) UWND : GMAO Zonal Winds : m/s : SCALE_I6 or _A6
! (2) VWND : GMAO Meridional Winds : m/s : SCALE_I6 or _A6
! (3) TMPU : GMAO Temperatures : K : SCALE_I6 or _A6
! (4) SPHU : GMAO Specific Humidity : g/kg : SCALE_I6 or _A6
! (5) CLDMAS : GMAO Cloud Mass Flux : kg/m2/s : SCALE_A6 or _A6
! (6) DTRAIN : GMAO Detrainment flux : kg/m2/s : SCALE_A6
!
! NOTES:
! (1) We don't need to add TRCOFFSET to N. These are not CTM tracers.
! (2) Add CLDMAS to ND66 diagnostic as field #6, but with tracer index
! #7 (for compatibility with the existing GAMAP). (rvm, bmy, 9/8/00)
! (3) For GEOS-4/fvDAS, UWND, VWND, TMPU, SPHU are A-6 fields. Adjust
! the scale factors accordingly. Also delete KZZ. (bmy, 6/23/03)
! (4) Modified for GEOS-5 and GCAP (bmy, 6/9/05)
!******************************************************************************
!
IF ( ND66 > 0 ) THEN
CATEGORY = 'DAO-3D-$'
!!! (lzh, 11/01/2014, geos-fp)
#if defined( GEOS_FP )
SCALE_ND66 = SCALE_A3 ! For GEOS-FP, ND66 is 3-hr time-avg data
#elif defined( MERRA )
SCALE_ND66 = SCALE_A3 ! For MERRA, ND66 is 3-hr time-avg data
#else
SCALE_ND66 = SCALE_A6 ! Otherwise, ND66 is 6-hr time-avg data
#endif
DO M = 1, TMAX(66)
N = TINDEX(66,M)
NN = N
SELECT CASE ( N )
! UWND, VWND
CASE ( 1,2 )
#if defined( GEOS_3 )
SCALEX = SCALE_I6
#else
!! SCALEX = SCALE_A6
SCALEX = SCALE_ND66 !! (lzh, 11/01/2014)
#endif
UNIT = 'm/s'
! TMPU
CASE ( 3 )
#if defined( GEOS_3 )
SCALEX = SCALE_I6
#elif defined( GEOS_FP )
SCALEX = SCALE_I3 ! T is an I3 field in GEOS-5.7.x !(lzh,11/01/2014)
#else
SCALEX = SCALE_A6
#endif
UNIT = 'K'
! SPHU
CASE ( 4 )
#if defined( GEOS_3 )
SCALEX = SCALE_I6
#elif defined( GEOS_FP )
SCALEX = SCALE_I3 ! SPHU is an I3 field in GEOS-5.7.x
#else
SCALEX = SCALE_A6
#endif
UNIT = 'g/kg'
! CLDMAS, DTRAIN
CASE( 5, 6 )
!! SCALEX = SCALE_A6
SCALEX = SCALE_ND66 ! geos-fp (lzh,11/01/2014)
UNIT = 'kg/m2/s'
CASE DEFAULT
CYCLE
END SELECT
ARRAY(:,:,1:LD66) = AD66(:,:,1:LD66,N) / SCALEX
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD66, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD66) )
ENDDO
ENDIF
!
!******************************************************************************
! ND67: GMAO surface fields
!
! # : Field : Description : Units : Scale factor
! -----------------------------------------------------------------------
! (1 ) HFLUX : GMAO Sensible Heat Flux : W/m2 : SCALE_A3
! (2 ) RADSWG : GMAO Insolation @ Surface : W/m2 : SCALE_A3
! (3 ) PREACC : GMAO Accum Precip @ Surface : mm/day : SCALE_A3
! (4 ) PRECON : GMAO Conv Precip @ Surface : mm/day : SCALE_A3
! (5 ) TS : GMAO Surface Air Temperature : K : SCALE_A3
! (6 ) RADSWT : GMAO Insolation @ Top of Atm : W/m2 : SCALE_A3
! (7 ) USTAR : GMAO Friction Velocity : m/s : SCALE_A3
! (8 ) Z0 : GMAO Roughness Height : m : SCALE_A3
! (9 ) PBL : GMAO PBL depth : mb : SCALE_A3
! (10) CLDFRC : GMAO Cloud Fraction : unitless : SCALE_A3
! (11) U10M : GMAO U-wind @ 10 m : m/s : SCALE_A3
! (12) V10M : GMAO V-wind @ 10 m : m/s : SCALE_A3
! (13) PS-PBL : GMAO Boundary Layer Top Pressure : mb : SCALEDYN
! (14) ALBD : GMAO Surface Albedo : unitless : SCALE_I6
! (15) PHIS : GMAO Geopotential Heights : m : SCALED
! (16) CLTOP : GMAO Cloud Top Height : levels : SCALE_A6
! (17) TROPP : GMAO Tropopause pressure : mb : SCALE_I6
! (18) SLP : GMAO Sea Level pressure : mb : SCALE_I6
! (19) TSKIN : Ground/sea surface temp. : hPa : SCALE_A3
! (20) PARDF : Photosyn active diffuse rad. : W/m2 : SCALE_A3
! (21) PARDR : Photosyn active direct rad. : W/m2 : SCALE_A3
! (22) GWET : Top soil wetness : unitless : SCALE_A3
!
! NOTES:
! (1 ) We don't need to add TRCOFFSET to N. These are not CTM tracers.
! (2 ) Now use AD67 allocatable array (bmy, 2/17/00)
! (3 ) Add TROPP as tracer #17 and SLP as tracer #18 (bmy, 10/11/00)
! (4 ) Now replace SCALE1 with SCALEDYN (bmy, 3/27/03)
! (5 ) Added TSKIN, PARDF, PARDR, GWET for GEOS-4 (bmy, 6/23/03)
! (6 ) Fix SCALEX for ALBEDO: use I6 for GEOS-3 only, and A3 for other
! models (phs, 9/3/08)
!******************************************************************************
!
IF ( ND67 > 0 ) THEN
CATEGORY = 'DAO-FLDS'
! (lzh, 11/01/2014) geos_fp
#if defined( MERRA )
SCALE_ND67 = SCALE_A1 ! For MERRA, ND67 fields are hourly
#elif defined( GEOS_FP )
SCALE_ND67 = SCALE_A1 ! For GEOS-FP, ND67 fields are hourly
#else
SCALE_ND67 = SCALE_A3 ! Otherwise, most ND67 fields are 3-hourly
#endif
! Binary punch file
DO M = 1, TMAX(67)
N = TINDEX(67,M)
NN = N
SELECT CASE ( N )
CASE ( 1, 2, 6 )
!! SCALEX = SCALE_A3
SCALEX = SCALE_ND67
UNIT = 'W/m2'
CASE ( 3, 4 )
!! SCALEX = SCALE_A3
SCALEX = SCALE_ND67
UNIT = 'mm/day'
CASE ( 5 )
!! SCALEX = SCALE_A3
SCALEX = SCALE_ND67
UNIT = 'K'
CASE ( 7, 11, 12 )
!! SCALEX = SCALE_A3
SCALEX = SCALE_ND67
UNIT = 'm/s'
CASE ( 8 )
!! SCALEX = SCALE_A3
SCALEX = SCALE_ND67
UNIT = 'm'
CASE ( 9 )
!! SCALEX = SCALE_A3
SCALEX = SCALE_ND67
UNIT = 'hPa'
CASE ( 10 )
!! SCALEX = SCALE_A3
SCALEX = SCALE_ND67
UNIT = 'unitless'
#if defined( GCAP )
! CLDFRC is a 6-hr field in GCAP, GEOS-STRAT
! (swu, bmy, 6/9/05)
SCALEX = SCALE_A6
#endif
CASE ( 13 )
SCALEX = SCALEDYN
UNIT = 'hPa'
CASE ( 14 )
! Bug fix: For GEOS-3, ALBEDO is an I-6 field, but
! for GEOS-4, GEOS-5, GCAP, it is an A-3 field.
! (lyj, phs, bmy, 10/7/08)
#if defined( GEOS_3 )
SCALEX = SCALE_I6
#else
!! SCALEX = SCALE_A3
SCALEX = SCALE_ND67
#endif
UNIT = 'unitless'
CASE ( 15 )
SCALEX = SCALED
UNIT = 'm'
CASE ( 16 )
! SCALEX = SCALE_A6
#if defined( MERRA ) || defined( GEOS_FP )
SCALEX = SCALE_A3 ! MERRA/GEOS-FP CLDTOPS 3-hr avg'd
#else
SCALEX = SCALE_A6 ! Otherwise CLDTOPS is 6-hr time avg'd
#endif
UNIT = 'levels'
CASE ( 17 )
! SCALEX = SCALE_I6
SCALEX = SCALE_ND67
UNIT = 'hPa'
CASE ( 18 )
! SCALEX = SCALE_I6
#if defined( MERRA ) || defined( GEOS_FP )
SCALEX = SCALE_A1 ! MERRA/GEOS-FP SLP is hourly
#else
SCALEX = SCALE_I6 ! Otherwise SLP is 6-h inst.
#endif
UNIT = 'hPa'
CASE ( 19 )
! SCALEX = SCALE_A3
SCALEX = SCALE_ND67
UNIT = 'K'
CASE ( 20 )
! SCALEX = SCALE_A3
SCALEX = SCALE_ND67
UNIT = 'W/m2'
CASE ( 21 )
! SCALEX = SCALE_A3
SCALEX = SCALE_ND67
UNIT = 'W/m2'
CASE ( 22 )
SCALEX = SCALE_A3
UNIT = 'unitless'
CASE DEFAULT
CYCLE
END SELECT
ARRAY(:,:,1) = AD67(:,:,N) / SCALEX
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1) )
ENDDO
ENDIF
!
!******************************************************************************
! ND68: Grid box diagnostics
!
! # : Field : Description : Units : Scale factor
! --------------------------------------------------------------------------
! (1) BXHEIGHT : Grid box height : m : SCALEDYN
! (2) AD : Air mass in grid box : kg : SCALEDYN
! (3) AVGW : Mixing ratio of water vapor : v/v : SCALEDYN
! (4) N(AIR) : Number density of air : m^-3 : SCALEDYN
!
! NOTES:
! (1) We don't need to add TRCOFFSET to N. These are not CTM tracers.
! (2) Now replaced SCALE1 with SCALEDYN (bmy, 2/24/03)
! (3) Bug fix: replace ND68 with LD68 in call to BPCH2 (swu, bmy, 6/9/05)
!******************************************************************************
!
IF ( ND68 > 0 ) THEN
CATEGORY = 'BXHGHT-$'
UNIT = ''
DO M = 1, TMAX(68)
N = TINDEX(68,M)
IF ( N > PD68 ) CYCLE
NN = N
DO L = 1, LD68
ARRAY(:,:,L) = AD68(:,:,L,N) / SCALEDYN
ENDDO
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, NN,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, LD68, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,1:LD68) )
ENDDO
ENDIF
!
!******************************************************************************
! ND69: Grid Box Surface Areas
!
! # : Field : Description : Units : Scale factor
! --------------------------------------------------------------------------
! (1) DXYP : Surface area of grid box : m^2 : SCALED = 1.0
!
! NOTES:
! (1) Only print DXYP for the first timestep, as it is an invariant field.
! (2) We don't need to add TRCOFFSET to N. This is not a CTM tracer.
! (3) Now use the AD69 dynamically allocatable array (bmy, 2/17/00)
!******************************************************************************
!
IF ( ND69 > 0 ) THEN
CATEGORY = 'DXYP'
UNIT = 'm2'
CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, 1,
& UNIT, DIAGb, DIAGe, RESERVED,
& IIPAR, JJPAR, 1, IFIRST,
& JFIRST, LFIRST, AD69(:,:,1) )
! Set ND69 = 0 so we won't print it out again
ND69 = 0
ENDIF
! Echo output
WRITE( 6, '(a)' ) ' - DIAG3: Diagnostics written to bpch!'
! Return to calling program
END SUBROUTINE DIAG3