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

2250 lines
86 KiB
Fortran

! $Id: gc_biomass_mod.f,v 1.1 2009/06/09 21:51:53 daven Exp $
MODULE GC_BIOMASS_MOD
!
!******************************************************************************
! Module GC_BIOMASS_MOD contains arrays and routines to compute monthly
! biomass burning emissions for NOx, CO, ALK4, ACET, MEK, ALD2, PRPE,
! C3H8, CH2O, C2H6, CH4, and CH3I. (bmy, 9/11/00, 9/28/06)
!
! NOTE: These biomass emissions are based on Bryan Duncan (Duncan et al 2001)
!
! Module Variables:
! ============================================================================
! (1 ) NBIOMAX : maximum # of biomass burning tracers
! (2 ) BIOTRCE : index array of biomass burning tracers
! (4 ) BIOMASS : array of biomass burning emissions [molec/cm3/s]
! (5 ) BIOMASS_SAVE : array of biomass burning emissions [molec/cm2/s]
! (6 ) TOMSAISCALE : array for TOMS aerosol index values
!
! Module Routines:
! ============================================================================
! (1 ) GC_COMPUTE_BIOMASS : reads data, computes gas-phase biomass emissions
! (2 ) GC_READ_BIOMASS_BCOC : reads biomass emissions of BC & OC
! (3 ) GC_READ_BIOMASS_CO2 : reads biomass emissions of CO2
! (4 ) GC_READ_BIOMASS_NH3 : reads biomass emissions of NH3
! (5 ) GC_READ_BIOMASS_SO2 : reads biomass emissions of SO2
! (6 ) READ_BIOMASS : reads gas-phase biomass burning data from disk
! (7 ) SCALE_BIOMASS_ACET : applies scale factors to ACET
! (8 ) SCALE_FUTURE : applies future scale factors to emissions
! (9 ) TOTAL_BIOMASS_TG : prints monthly emission totals in [Tg (C)]
! (10) ADJUST_TO_TOMSAI : wrapper for subroutine TOMSAI
! (11) TOMSAI : adjusts BB for int'annual var'bilty w/ TOMS data
! (12) CLEANUP_BIOMASS : deallocates BURNEMIS, BIOTRCE
!
! GEOS-CHEM modules referenced by "gc_biomass_mod.f"
! ============================================================================
! (1 ) bpch2_mod.f : Module w/ routines for binary punch file I/O
! (2 ) dao_mod.f : Module w/ arrays for DAO met fields
! (3 ) diag_mod.f : Module w/ GEOS-CHEM diagnostic arrays
! (4 ) directory_mod.f : Module w/ GEOS-CHEM data & met field dirs
! (5 ) error_mod.f : Module w/ I/O error and NaN check routines
! (6 ) grid_mod.f : Module w/ horizontal grid information
! (7 ) logical_mod.f : Module w/ GEOS-CHEM logical switches
! (8 ) time_mod.f : Module w/ routines for computing time & date
! (9 ) transfer_mod.f : Module w/ routines to cast & resize arrays
!
! Decision Tree for Biomass Burning Emissions:
! ============================================================================
!
! The cases below are described in "Interannual and Seasonal Variability of
! Biomass Burning Emissions Constrained by Remote-Sensed Observations"
! by Duncan et al.
!
! Case LBBSEA LTOMSAI (LBBSEA and LTOMSAI are flags in "input.geos")
!
! (1) T F Average monthly BB emissions
! ------------------------------------------------------
! Read average monthly BB emissions. The mean monthly
! emissions from biomass burning were estimated from
! about four years of ATSR & AVHRR data. See
! Sections 3.1 and 4 of Duncan et al.
!
!
! (2) T T Interannual varying monthly BB emissions
! ------------------------------------------------------
! (a) Read annual BB emissions (i.e., inventory of
! Jennifer Logan & Rose Yevich) and impose
! time-dependency by scaling to TOMS AI data for
! those regions where TOMS AI was used. This option
! allows the user to account for the interannual
! variability of BB.
!
! (b) Read average monthly BB emissions for Africa and
! areas where TOMS AI is not used.
!
! See Sections 3.2 and 5 of Duncan et al.
!
!
! (3) F T Same as Case 2, except with higher spatial resolution
! ------------------------------------------------------
! (a) Same as Case 2 prior to 8/1/1996.
!
! (b) After 8/1/1996, read monthly BB emissions from
! disk. The emissions are time-dependent as in Case 2
! and account for interannual variation. The spatial
! resolution of emissions is greater than in Case 2
! due to ATSR fire-counts.
!
! See Section 3.3 of Duncan et al.
!
!
! (4) F F Same as Case 3b
! ------------------------------------------------------
! Read interannual variability BB emissions from disk.
!
! See Section 3.3 of Duncan et al.
!
! NOTES:
! (1 ) Now treat BURNEMIS as a true global array of size (IGLOB,JGLOB);
! use offsets IREF = I + I0 and JREF = J + J0 to index it (bmy, 9/12/00)
! (2 ) Added subroutines READ_BIOMASS and TOMSAI (bmy, 9/25/00)
! (3 ) Bug fixes in routines BIOBURN and READ_BIOMASS. Added new decision
! tree in BIOBURN. Added routine ADJUST_TO_TOMSAI. (bmy, 10/12/00)
! (4 ) Updated boundaries of geographic regions in TOMSAI (bnd, bmy, 10/16/00)
! (5 ) Bug fix for CTM_LAT in TOMSAI (bnd, bmy, 11/28/00)
! (6 ) Removed obsolete code in BIOBURN (bmy, 12/21/00)
! (7 ) Now account for extra production of CO from VOC's for Tagged CO
! and CO-OH simulations (bmy, 1/3/01)
! (8 ) Now use routines from "error_mod.f" for trapping NaN's (bmy, 3/8/01)
! (9 ) Moved NBIOMAX here from "CMN_SIZE" (bmy, 3/16/01)
! (10) Now dimension BIOTRCE and to be of size NBIOMAX, instead of having
! them be allocatable. Also change NBIOMAX from 9 to 10, since we
! will be adding ALK4 soon. Elminate LDOBIOEMIT, since that is now
! confusing and unnecessary. (bmy, 4/17/01)
! (11) Bug fix: For option 2 in the decision tree above, scale annual
! BB emissions to the TOMS aerosol index instead of seasonal. This
! will give the correct results. Updated routines ADJUST_TO_TOMSAI
! and TOMSAI accordingly. (bnd, bmy, 6/6/01)
! (12) PRPE is already in molec C, so don't multiply it by 3 as we have
! been doing before. (bmy, 6/29/01)
! (13) Update comments for BB decision tree (bnd, bmy, 7/2/01)
! (14) Now use correct scale factors for CO (bnd, bmy, 8/21/01)
! (15) Bug fix: Make sure to read data from the biomass burning punch file
! with the correct index for runs that have less than NBIOMAX species
! turned on. (bmy, 8/24/01)
! (16) Add new routine: SCALE_BIOMASS_ACET. Also updated comments.
! (bmy, 9/6/01)
! (17) Removed obsolete code (bmy, 9/18/01)
! (18) Removed obsolete code from 9/01 (bmy, 10/23/01)
! (19) Removed duplicate variable definitions. Also now can specify
! biomass burning subdirectory via a variable in BIOBURN (bmy, 11/15/01)
! (20) Now point to new biomass burning files from 10/2001 (bmy, 12/4/01)
! (21) Updated comments (1/15/02)
! (22) Fixed incorrect value for IPICK in "adjust_to_tomsai" (bmy, 2/27/02)
! (23) Bug fix: convert from [molec/cm2/s] to [molec/cm3/s] every timestep.
! Now divide module header into MODULE PRIVATE, MODULE VARIABLES, and
! MODULE ROUTINES sections. Updated comments. Renamed INIT_BURNEMIS
! to INIT_BIOMASS. BIOMASS is now an allocatable module array
! instead of a SAVEd array within routine BIOBURN. (bmy, 5/30/02)
! (24) Now reference BXHEIGHT from "dao_mod.f". Now references "error_mod.f".
! Also deleted obsolete code from various routines. Now references
! "tracerid_mod.f". (bmy, 11/6/02)
! (25) Now references "grid_mod.f" and the new "time_mod.f". Also suppresses
! printing when calling routine READ_BPCH2. Bug fix in routine TOMSAI.
! Fixed bug in BIOBURN when passing arrays BIOMASS_SEA and BIOMASS_ANN
! to routine READ_BIOMASS. (bmy, 4/28/03)
! (26) Now references "directory_mod.f" & "logical_mod.f" (bmy, 7/20/04)
! (27) Bug fix in BIOBURN for TAU w/ interannual emissions (bmy, 3/18/05)
! (28) Now can read data for both GEOS and GCAP grids (bmy, 3/18/05)
! (29) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)
! (30) Renamed to "gc_biomass_mod.f", so that we can use either these
! "default" biomass emissions or GFED2 biomass emissions. Cleaned up
! a lot of obsolete stuff. (bmy, 4/5/06)
! (31) Modified for IPCC future emissions scale factors. Added private
! routine SCALE_FUTURE. (swu, bmy, 5/30/06)
! (32) Added routines for reading BC, OC, SO2, NH3, CO2 biomass emissions.
! (bmy, 9/28/06)
! (33) Add 9 gaseous biomass burning emissions using emission ratios
! w.r.t. CO. Details in Fu et al. [2008] (tmf, 1/7/09)
! (34) CO scaling for VOC production is transfered to biomass_mod.f.
! (jaf, 2/6/09)
!******************************************************************************
!
IMPLICIT NONE
!=================================================================
! MODULE PRIVATE DECLARATIONS -- keep certain internal variables
! and routines from being seen outside "gc_biomass_mod.f"
!=================================================================
! Make everything PRIVATE ...
PRIVATE
! ... except for these routines
PUBLIC :: CLEANUP_GC_BIOMASS
PUBLIC :: GC_COMPUTE_BIOMASS
PUBLIC :: GC_READ_BIOMASS_BCOC
PUBLIC :: GC_READ_BIOMASS_CO2
PUBLIC :: GC_READ_BIOMASS_NH3
PUBLIC :: GC_READ_BIOMASS_SO2
!=================================================================
! MODULE VARIABLES
!=================================================================
! Parameters
! NOTE: This is an internal declaration for the
! gas-phase species only (bmy, 9/28/06)
INTEGER, PARAMETER :: NBIOMAX = 19
! TOMS AI interannual variability in biomass burning emissions
INTEGER, PARAMETER :: NAIREGIONS = 8
INTEGER, PARAMETER :: NAIYEARS = 21
INTEGER, PARAMETER :: NMONTHSAI = NAIYEARS * 12
! Arrays
REAL*8, ALLOCATABLE :: TOMSAISCALE(:,:,:)
!=================================================================
! MODULE ROUTINES -- follow below the "CONTAINS" statement
!=================================================================
CONTAINS
!------------------------------------------------------------------------------
SUBROUTINE GC_COMPUTE_BIOMASS( YEAR, MONTH, BIOMASS )
!
!******************************************************************************
! Subroutine GC_COMPUTE_BIOMASS computes the biomass burning emissions for
! several species for the given month (jal, acs, rvm, bmy, 9/11/00, 4/5/06)
!
! NOTES:
! (1 ) Incorporated original functionality of "bioburn.f" and "biomass.h"
! in F90 module "bioburn_mod.f". Biomass burning arrays now are only
! allocated if biomass burning is turned on. (bmy, 9/11/00)
! (2 ) Split off calls to READ_BPCH2 into separate subroutine READ_BIOMASS
! for clarity. Also now use logical switches LBBSEA and LTOMSAI to
! switch between seasonal or interannual variability. (bmy, 9/28/00)
! (3 ) Bug fixes: (a) Acetone is BIOMASS(5,:,:), not BIOMASS(9,:,:).
! (b) Make sure to read in all biomass burning tracers from the
! binary punch file, regardless of which tracers are actually emitted.
! (bmy, 10/11/00)
! (4 ) Added new decision tree (see comments above) (bmy, 10/12/00)
! (5 ) Removed obsolete code from 10/12/00 (bmy, 12/21/00)
! (6 ) Enhance CO from biomass burning by 10% for Tagged CO and CO-OH
! simulations, to account for extra production of CO from VOC's.
! (bnd, bmy, 1/3/01)
! (7 ) Now use interface IT_IS_NAN (from "error_mod.f") to trap NaN's.
! This will work on DEC/Compaq and SGI platforms. (bmy, 3/8/01)
! (8 ) Now call INIT_BURNEMIS on the very first call to BIOBURN. Also
! read biomass burning species w/o using LDOBIOEMIT, which is
! now unnecessary. Call SCALE_BIOMASS_CO to multiply CO biomass
! burning emissions by jal/bnd scale factors, to account for
! oxidation of VOC's not carried (bmy, 4/17/01)
! (9 ) Now read new biomass burning files (Apr 2001) from the
! "biomass_200104/" subdirectory of DATA_DIR. (bmy, 4/18/01)
! (10) Added BIOMASS_SEA and BIOMASS_ANN arrays for the scaling for Case #2
! in the decision tree above. This will scale the annual BB emissions
! using TOMSAI in selected regions, but use the seasonal emissions
! elsewhere. (bnd, bmy, 6/6/01)
! (11) Now call SCALE_BIOMASS_ACET in order to enhance biomass burning ACET
! by 77%, to match results from Jacob et al 2001. (bdf, bmy, 9/4/01)
! (12) BURNEMIS, BIOMASS, BIOMASS_SEA, and BIOMASS_ANN are now dimensioned
! (NBIOTRCE,IIPAR,JJPAR). BURNEMIS(:,IREF,JREF) is now
! BURNEMIS(:,I,J) and BIOMASS(:,IREF,JREF) is now BIOMASS(:,I,J).
! Remove IREF, JREF, IOFF, JOFF -- these are obsolete. (bmy, 9/28/01)
! (13) Removed obsolete code from 9/01 (bmy, 10/23/01)
! (14) Removed duplicate definition of BOXVL. Also added BIOMASS_DIR
! string to specify the sub-directory of DATA_DIR where biomass
! emissions are kept. (bmy, 11/15/01)
! (15) Now set BIOMASS_MOD = 'biomass_200110/' as the default. This points
! to newer biomass burning emissions from Randall Martin (bmy, 11/30/01
! (16) Now set BIOMASS_DIR = 'biomass_200010/' in order to take advantage of
! new biomass burning files from Randall Martin (w/ firecounts thru
! 2000).
! (17) Bug fix: convert from [molec/cm2/s] to [molec/cm3/s] every timestep.
! Now divide module header into MODULE PRIVATE, MODULE VARIABLES, and
! MODULE ROUTINES sections. Now call INIT_BIOMASS instead of
! INIT_BURNEMIS. Added parallel DO-loops for unit conversion. Now
! archive diagnostics w/ in the parallel loop section. (bmy, 5/31/02)
! (18) Now reference BXHEIGHT from "dao_mod.f". Also call GEOS_CHEM_STOP
! to free memory when stopping with an error. Now call GET_TAU0 with
! 3 arguments instead of 2. Now references IDTNOX, IDBNOX, etc. from
! "tracerid_mod.f". (bmy, 11/6/02)
! (19) Now remove IMONTH from the arg list. Now use functions GET_MONTH,
! GET_TAU, GET_YEAR, and ITS_A_LEAPYEAR from "time_mod.f".
! (bmy, 2/10/03)
! (20) Bug fix: make sure only to pass BIOMASS_SEA(1:NBIOTRCE,:,:) and
! BIOMASS_ANN(1:NBIOTRCE,:,:) to READ_BIOMASS. (bnd, bmy, 5/16/03)
! (21) Added fancy output (bmy, 4/26/04)
! (22) Removed reference to CMN, it's obsolete. Now reference DATA_DIR from
! "directory_mod.f". Now references LBBSEA and LTOMSAI from
! "logical_mod.f". (bmy, 7/20/04)
! (23) Bug fix: if using interannual biomass emissions then get the TAU value
! for the first of the current month & year. This will make sure that
! runs which start mid-month will access the biomass data correctly.
! (bmy, 3/18/05)
! (24) Now can read data from both GEOS and GCAP grids (bmy, 8/16/05)
! (25) Renamed to GC_COMPUTE_BIOMASS. Now takes YEAR, MONTH, BIOMASS
! arguments. (bmy, 4/5/06)
! (26) Add 9 biomass burning species (ccc, 1/7/09)
!******************************************************************************
!
! References to F90 modules
USE BPCH2_MOD, ONLY : GET_NAME_EXT_2D, GET_RES_EXT
USE BPCH2_MOD, ONLY : GET_TAU0, READ_BPCH2
USE DIRECTORY_MOD, ONLY : DATA_DIR
USE LOGICAL_MOD, ONLY : LBBSEA, LTOMSAI
USE LOGICAL_MOD, ONLY : LFUTURE
USE TIME_MOD, ONLY : ITS_A_LEAPYEAR, GET_TAU
# include "CMN_SIZE" ! Size parameters
! Arguments
INTEGER, INTENT(IN) :: YEAR, MONTH
REAL*8, INTENT(OUT) :: BIOMASS(IIPAR,JJPAR,NBIOMAX)
! Local variables
LOGICAL, SAVE :: FIRST = .TRUE.
INTEGER :: I, J, N
INTEGER, SAVE :: MONTHSAVE = -99
REAL*8 :: TIME, XTAU
REAL*8 :: BIOMASS_SEA(IIPAR,JJPAR,NBIOMAX)
REAL*8 :: BIOMASS_ANN(IIPAR,JJPAR,NBIOMAX)
CHARACTER(LEN=4 ) :: CYEAR
CHARACTER(LEN=255) :: FILENAME
CHARACTER(LEN=255) :: BIOMASS_DIR
! MONTHDATES = number of days per month
INTEGER :: MONTHDATES(12) = (/ 31, 28, 31, 30,
& 31, 30, 31, 31,
& 30, 31, 30, 31 /)
! External functions
REAL*8, EXTERNAL :: BOXVL
!=================================================================
! B i o m a s s B u r n i n g B e g i n s H e r e !!
!
! GEOS-CHEM has the following biomass burning species:
!
! Species Index CTM Tracer # Units as read from file
! ---------------------------------------------------------
! NOX 1 1 [molec NOx /cm2/month]
! CO 2 4 [molec CO /cm2/month]
! ALK4 3 5 [molec C /cm2/month]
! ACET 4 9 [molec ACET/cm2/month]
! MEK 5 10 [molec C /cm2/month]
! ALD2 6 11 [molec C /cm2/month]
! PRPE 7 18 [molec C /cm2/month]
! C3H8 8 19 [molec C3H8/cm2/month]
! CH2O 9 20 [molec CH2O/cm2/month]
! C2H6 10 21 [molec C2H6/cm2/month]
! GLYX 15 55 [molec GLYX/cm2/month]
! MGLY 16 56 [molec MGLY/cm2/month]
! BENZ 17 57 [molec C /cm2/month]
! TOLU 18 58 [molec C /cm2/month]
! XYLE 19 59 [molec C /cm2/month]
! C2H4 20 63 [molec C /cm2/month]
! C2H2 21 64 [molec C /cm2/month]
! GLYC 22 66 [molec GLYC/cm2/month]
! HAC 23 67 [molec HAC /cm2/month]
!
! Subsequent unit conversion is done on the following species:
! [molec ACET/cm2/month] --> [molec C/cm2/month]
! [molec C3H8/cm2/month] --> [molec C/cm2/month]
! [molec C2H6/cm2/month] --> [molec C/cm2/month]
!
! There are NBIOMAX=19 biomass burning species in this module.
!
! Biomass burning emissions are first read from disk into the
! BIOMASS array. After unit conversion to [molec/cm3/s] ( or
! [atoms C/cm3/s] for hydrocarbons), the emissions are stored
! in BIOMASS and passed back to the calling program.
!
! Biomass burning data is monthly, so we only have to read
! emissions from disk once each month.
!=================================================================
! Do the following on the first day of a new month...
IF ( MONTH /= MONTHSAVE ) THEN
! Save the current month
MONTHSAVE = MONTH
! Set MONTHDATES(2) = 29 for leapyears, = 28 otherwise (bmy, 4/19/99)
IF ( MONTH == 2 ) THEN
IF( ITS_A_LEAPYEAR() ) THEN
MONTHDATES(2) = 29
ELSE
MONTHDATES(2) = 28
ENDIF
ENDIF
! TIME = conversion from [molec/cm2/month] to [molec/cm2/s]
TIME = ( DBLE( MONTHDATES( MONTH ) ) * 86400d0 )
! Create a string for the 4-digit year
WRITE( CYEAR, '(i4)' ) YEAR
! Fancy output...
WRITE( 6, '(a)' ) REPEAT( '=', 79 )
WRITE( 6, '(a,/)' )
& 'B I O M A S S B U R N I N G E M I S S I O N S'
!==============================================================
! Set BIOMASS_DIR to the subdirectory where the current
! biomass burning files are stored
!==============================================================
!BIOMASS_DIR = 'biomass_200104/'
BIOMASS_DIR = 'biomass_200110/'
!==============================================================
! Case 1: LBBSEA = T and LTOMSAI = F
!
! Read seasonal biomass burning emissions from disk.
!==============================================================
IF ( LBBSEA .and. ( .not. LTOMSAI ) ) THEN
! Get TAU0 value to index the punch file -- use generic year 1985
XTAU = GET_TAU0( MONTH, 1, 1985 )
! Filename for seasonal biomass burning emissions
FILENAME = TRIM( DATA_DIR ) // TRIM( BIOMASS_DIR ) //
& 'bioburn.seasonal.' // GET_NAME_EXT_2D() //
& '.' // GET_RES_EXT()
! Read the seasonal biomass burning emissions from disk
CALL READ_BIOMASS( FILENAME, XTAU, BIOMASS )
!==============================================================
! Case 2: LBBSEA = T and LTOMSAI = T
!
!
! Read annual biomass burning emissions from disk, but use
! TOMS aerosol index data to impose interannual variability.
! Read in seasonal biomass buring emissions for Africa and
! regions outside the regions adjusted by TOMS AI.
!==============================================================
ELSE IF ( LBBSEA .and. LTOMSAI ) THEN
! Get TAU0 value to index the punch file -- use generic year 1985
XTAU = GET_TAU0( MONTH, 1, 1985 )
! Filename for seasonal biomass burning emissions
FILENAME = TRIM( DATA_DIR ) // TRIM( BIOMASS_DIR ) //
& 'bioburn.seasonal.' // GET_NAME_EXT_2D() //
& '.' // GET_RES_EXT()
! Read the seasonal biomass burning emissions into BIOMASS_SEA
CALL READ_BIOMASS( FILENAME, XTAU, BIOMASS_SEA )
! Get TAU0 value to index the punch file -- use generic year 1985
XTAU = GET_TAU0( 1, 1, 1985 )
! Filename for annual biomass burning emissions
FILENAME = TRIM( DATA_DIR ) // TRIM( BIOMASS_DIR ) //
& 'bioburn.annual.' // GET_NAME_EXT_2D() //
& '.' // GET_RES_EXT()
! Read the annual biomass burning emissions into BIOMASS_ANN
CALL READ_BIOMASS( FILENAME, XTAU, BIOMASS_ANN )
! Adjust the annual biomass burning to the TOMS Aerosol
! Index data where necessary. Otherwise, overwrite
! with seasonal data. Save result in the BIOMASS array.
BIOMASS = 0d0
CALL ADJUST_TO_TOMSAI( BIOMASS_ANN, BIOMASS_SEA, BIOMASS )
!==============================================================
! Case 3: LBBSEA = F and LTOMSAI = T
!
! (1) Prior to 8/1/1996, read seasonal biomass burning
! emissions, and use TOMS AI data to impose int. var.
!
! (2) On or after 8/1/1996, read the interannual variability
! biomass burning emissions (computed by Randall Martin:
! rvm@io.harvard.edu) directly from disk.
!==============================================================
ELSE IF ( ( .not. LBBSEA ) .and. LTOMSAI ) THEN
! 8/1/1996 is TAU value 101520
IF ( GET_TAU() < 101520d0 ) THEN
! Get TAU0 value to index the punch file --
! use generic year 1985
XTAU = GET_TAU0( MONTH, 1, 1985 )
! Filename for seasonal biomass burning emissions
FILENAME = TRIM( DATA_DIR ) // TRIM( BIOMASS_DIR ) //
& 'bioburn.seasonal.' // GET_NAME_EXT_2D() //
& '.' // GET_RES_EXT()
! Read the seasonal biomass burning emissions into BIOMASS_SEA
CALL READ_BIOMASS( FILENAME, XTAU, BIOMASS_SEA )
! Get TAU0 value to index the punch file --
! use generic year 1985
XTAU = GET_TAU0( 1, 1, 1985 )
! Filename for annual biomass burning emissions
FILENAME = TRIM( DATA_DIR ) // TRIM( BIOMASS_DIR ) //
& 'bioburn.annual.' // GET_NAME_EXT_2D() //
& '.' // GET_RES_EXT()
! Read the annual biomass burning emissions from disk
CALL READ_BIOMASS( FILENAME, XTAU, BIOMASS_ANN )
! Adjust the annual biomass burning to the TOMS Aerosol
! Index data where necessary. Otherwise, overwrite
! with seasonal data. Save result in the BIOMASS array.
BIOMASS = 0d0
CALL ADJUST_TO_TOMSAI( BIOMASS_ANN, BIOMASS_SEA, BIOMASS)
ELSE
! Use actual TAU0 value to index punch file
XTAU = GET_TAU()
! Filename for interannual variability biomass burning emissions
FILENAME = TRIM( DATA_DIR ) //
& TRIM( BIOMASS_DIR ) //
& 'bioburn.interannual.' // GET_NAME_EXT_2D() //
& '.' // GET_RES_EXT() //
& '.' // CYEAR
! Read interannual variability biomass burning
CALL READ_BIOMASS( FILENAME, XTAU, BIOMASS )
ENDIF
!==============================================================
! Case 4: LBBSEA = F and LTOMSAI = F
!
! Read the interannual variability biomass burning emissions
! (computed by Randall Martin: rvm@io.harvard.edu) from disk.
!==============================================================
ELSE IF ( ( .not. LBBSEA ) .and. ( .not. LTOMSAI ) ) THEN
! TAU0 value for 0 GMT on the first day of this month & year
XTAU = GET_TAU0( MONTH, 1, YEAR )
! Filename for interannual variability biomass burning emissions
FILENAME = TRIM( DATA_DIR ) //
& TRIM( BIOMASS_DIR ) //
& 'bioburn.interannual.' // GET_NAME_EXT_2D() //
& '.' // GET_RES_EXT() //
& '.' // CYEAR
! Read interannual variability biomass burning
CALL READ_BIOMASS( FILENAME, XTAU, BIOMASS )
ENDIF
! Convert to [molec/cm2/s] or [atoms C/cm2/s]
BIOMASS = BIOMASS / TIME
! Fancy output...
WRITE( 6, '(a)' ) REPEAT( '=', 79 )
ENDIF
! Return to calling program
END SUBROUTINE GC_COMPUTE_BIOMASS
!------------------------------------------------------------------------------
SUBROUTINE READ_BIOMASS( FILENAME, TAU0, BIOMASS )
!
!******************************************************************************
! Subroutine READ_BIOMASS reads the biomass burning emissions from disk
! in units of [molec/cm2/month] (or [atoms C/cm2/month] for hydrocarbons).
! (bmy, 9/25/00, 5/30/06)
!
! Arguments as Input:
! ============================================================================
! (1 ) FILENAME (CHARACTER) : Name of the biomass burning file to read
! (2 ) TAU0 (REAL*8 ) : TAU0 value used to index the BB data
!
! Arguments as Output:
! ============================================================================
! (3 ) BIOMASS (REAL*8 ) : Biomass burning emissions (for NBIOMAX tracers)
!
! NOTES:
! (1 ) Split off from "bioburn.f" to reduce code duplication (bmy, 9/25/00)
! (2 ) Now read in all biomass burning tracers from the punch file,
! regardless of whether or not they are actually emitted.
! (bmy, 10/11/00)
! (3 ) Now only read in the NBIOTRCE biomass burning tracers that
! are actually emitted (bmy, 4/17/01)
! (4 ) PRPE is already in molec C, so don't multiply it by 3 as we have
! been doing before. (bmy, 6/29/01)
! (5 ) Bug fix: make sure that tracers get read from the biomass burning
! file w/ the right index number. This was a bug for runs that had
! less than NBIOMAX species specified. (bmy, 8/24/01)
! (6 ) Removed obsolete code from 8/24/01 (bmy, 9/18/01)
! (7 ) BIOMASS is now of size (NBIOMAX,IIPAR,JJPAR). Now call TRANSFER_2D
! to copy data from REAL*4 to REAL*8 and also to resize from
! (IGLOB,JGLOB) to (IIPAR,JJPAR). (bmy, 9/28/01)
! (8 ) Removed obsolete code from 9/01 (bmy, 10/23/01)
! (9 ) BIOMASS needs to be of size (NBIOTRCE,IIPAR,JJPAR) (bmy, 5/31/02)
! (10) Now references IDTNOX, etc. from "tracerid_mod.f" (bmy, 11/6/02)
! (11) Now call READ_BPCH2 with QUIET=.TRUE. flag to suppress extra info
! from being printed (bmy, 3/14/03)
! (12) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)
! (13) Now make BIOMASS array argument (I,J,N) ordered instead of (N,I,J).
! Also now read all NBIOMAX species. (bmy, 4/5/06)
! (14) Now refrerences LFUTURE from "logical_mod.f". Also now calls private
! routine SCALE_FUTURE to compute the future biomass emissions.
! (swu, bmy, 5/30/06)
!******************************************************************************
!
! References to F90 modules
USE BPCH2_MOD, ONLY : READ_BPCH2
USE LOGICAL_MOD, ONLY : LFUTURE
USE TRANSFER_MOD, ONLY : TRANSFER_2D
# include "CMN_SIZE" ! Size parameters
! Arguments
CHARACTER(LEN=*), INTENT(IN) :: FILENAME
REAL*8, INTENT(IN) :: TAU0
REAL*8, INTENT(OUT) :: BIOMASS(IIPAR,JJPAR,NBIOMAX)
! Local variables
INTEGER :: N
REAL*4 :: ARRAY(IGLOB,JGLOB,1)
! Add storage of CO emissions to calculate emissions
! of the 9 new species (tmf, 12/18/06)
REAL*8 :: COEMIS(IIPAR, JJPAR) ! CO emissions before scaling
REAL*8 :: TRCEMIS(IIPAR, JJPAR) ! Tracer emissions scaled from CO
!=================================================================
! READ_BIOMASS begins here!
!=================================================================
! Echo info
WRITE( 6, 110 ) TRIM( FILENAME )
110 FORMAT( 'GC_COMPUTE_BIOMASS: Reading ', a )
! Initialize the BIOMASS array
BIOMASS = 0d0
! Loop over only the emitted biomass tracers
DO N = 1, NBIOMAX
! Do scaling if necessary and print totals in Tg
IF ( N == 1 ) THEN
!----------
! NOx
!----------
! NOx is stored in the biomass file as tracer #1
CALL READ_BPCH2( FILENAME, 'BIOBSRCE', 1,
& TAU0, IGLOB, JGLOB,
& 1, ARRAY, QUIET=.TRUE. )
! Cast from REAL*4 to REAL*8 and resize to (IIPAR,JJPAR)
CALL TRANSFER_2D( ARRAY(:,:,1), BIOMASS(:,:,N) )
! Compute future NOx emissions (if necessary)
IF ( LFUTURE ) THEN
CALL SCALE_FUTURE( 'NOxbb', BIOMASS(:,:,N) )
ENDIF
! NOX -- print totals in [Tg/month]
CALL TOTAL_BIOMASS_TG( BIOMASS(:,:,N), 14d-3, 'NOx' )
ELSE IF ( N == 2 ) THEN
!----------
! CO
!----------
! CO is stored in the biomass file as tracer #4
CALL READ_BPCH2( FILENAME, 'BIOBSRCE', 4,
& TAU0, IGLOB, JGLOB,
& 1, ARRAY, QUIET=.TRUE. )
! Cast from REAL*4 to REAL*8 and resize to (IIPAR,JJPAR)
CALL TRANSFER_2D( ARRAY(:,:,1), BIOMASS(:,:,N) )
! Store CO emissions before scaling
! for new gaseous emissions (tmf, 1/7/09)
CALL TRANSFER_2D( ARRAY(:,:,1), COEMIS(:,:) )
!------------------------------------------------------------------
! Prior to 2/25/09, ccc
! ! CO -- scale to account for oxidation of extra VOC's
! CALL SCALE_BIOMASS_CO( BIOMASS(:,:,N) )
!------------------------------------------------------------------
! Compute future NOx emissions (if necessary)
IF ( LFUTURE ) THEN
CALL SCALE_FUTURE( 'CObb', BIOMASS(:,:,N) )
ENDIF
! Print totals in [Tg/month]
CALL TOTAL_BIOMASS_TG( BIOMASS(:,:,N), 28d-3, 'CO' )
ELSE IF ( N == 3 ) THEN
!----------
! ALK4
!----------
! ALK4 is stored in the biomass file as tracer #5
CALL READ_BPCH2( FILENAME, 'BIOBSRCE', 5,
& TAU0, IGLOB, JGLOB,
& 1, ARRAY, QUIET=.TRUE. )
! Cast from REAL*4 to REAL*8 and resize to (IIPAR,JJPAR)
CALL TRANSFER_2D( ARRAY(:,:,1), BIOMASS(:,:,N) )
! Compute future ALK4 emissions (if necessary)
IF ( LFUTURE ) THEN
CALL SCALE_FUTURE( 'VOCbb', BIOMASS(:,:,N) )
ENDIF
! ALK4 -- print totals in [Tg C/month]
CALL TOTAL_BIOMASS_TG( BIOMASS(:,:,N), 12d-3, 'ALK4' )
ELSE IF ( N == 4 ) THEN
!----------
! ACET
!----------
! ACET is stored in the biomass file as tracer #9
CALL READ_BPCH2( FILENAME, 'BIOBSRCE', 9,
& TAU0, IGLOB, JGLOB,
& 1, ARRAY, QUIET=.TRUE. )
! Cast from REAL*4 to REAL*8 and resize to (IIPAR,JJPAR)
CALL TRANSFER_2D( ARRAY(:,:,1), BIOMASS(:,:,N) )
! ACET -- Convert from [molec/cm2/month] to [molec C/cm2/month]
BIOMASS(:,:,N) = BIOMASS(:,:,N) * 3d0
! Scale to yearly value for biogenic acetone (bdf, bmy, 7/23/01)
CALL SCALE_BIOMASS_ACET( BIOMASS(:,:,N) )
! Compute future ACET emissions (if necessary)
IF ( LFUTURE ) THEN
CALL SCALE_FUTURE( 'VOCbb', BIOMASS(:,:,N) )
ENDIF
! Print totals in [Tg C/month]
CALL TOTAL_BIOMASS_TG( BIOMASS(:,:,N), 12d-3, 'ACET' )
ELSE IF ( N == 5 ) THEN
!----------
! MEK
!----------
! MEK is stored in the biomass file as tracer #10
CALL READ_BPCH2( FILENAME, 'BIOBSRCE', 10,
& TAU0, IGLOB, JGLOB,
& 1, ARRAY, QUIET=.TRUE. )
! Cast from REAL*4 to REAL*8 and resize to (IIPAR,JJPAR)
CALL TRANSFER_2D( ARRAY(:,:,1), BIOMASS(:,:,N) )
! Compute future MEK emissions (if necessary)
IF ( LFUTURE ) THEN
CALL SCALE_FUTURE( 'VOCbb', BIOMASS(:,:,N) )
ENDIF
! MEK -- print totals in [Tg C/month]
CALL TOTAL_BIOMASS_TG( BIOMASS(:,:,N), 12d-3, 'MEK' )
ELSE IF ( N == 6 ) THEN
!----------
! ALD2
!----------
! ALD2 is stored in the biomass file as tracer #11
CALL READ_BPCH2( FILENAME, 'BIOBSRCE', 11,
& TAU0, IGLOB, JGLOB,
& 1, ARRAY, QUIET=.TRUE. )
! Cast from REAL*4 to REAL*8 and resize to (IIPAR,JJPAR)
CALL TRANSFER_2D( ARRAY(:,:,1), BIOMASS(:,:,N) )
! Compute future ALD2 emissions (if necessary)
IF ( LFUTURE ) THEN
CALL SCALE_FUTURE( 'VOCbb', BIOMASS(:,:,N) )
ENDIF
! ALD2 -- print totals in [Tg C/month]
CALL TOTAL_BIOMASS_TG( BIOMASS(:,:,N), 12d-3, 'ALD2' )
ELSE IF ( N == 7 ) THEN
!----------
! PRPE
!----------
! PRPE is stored in the biomass file as tracer #18
CALL READ_BPCH2( FILENAME, 'BIOBSRCE', 18,
& TAU0, IGLOB, JGLOB,
& 1, ARRAY, QUIET=.TRUE. )
! Cast from REAL*4 to REAL*8 and resize to (IIPAR,JJPAR)
CALL TRANSFER_2D( ARRAY(:,:,1), BIOMASS(:,:,N) )
! Compute future PRPE emissions (if necessary)
IF ( LFUTURE ) THEN
CALL SCALE_FUTURE( 'VOCbb', BIOMASS(:,:,N) )
ENDIF
! PRPE -- convert from [molec/cm2/month] to [molec C/cm2/month]
! Print totals in [Tg C/month]
CALL TOTAL_BIOMASS_TG( BIOMASS(:,:,N), 12d-3, 'PRPE' )
ELSE IF ( N == 8 ) THEN
!----------
! C3H8
!----------
! C3H8 is stored in the biomass file as tracer #19
CALL READ_BPCH2( FILENAME, 'BIOBSRCE', 19,
& TAU0, IGLOB, JGLOB,
& 1, ARRAY, QUIET=.TRUE. )
! Cast from REAL*4 to REAL*8 and resize to (IIPAR,JJPAR)
CALL TRANSFER_2D( ARRAY(:,:,1), BIOMASS(:,:,N) )
! C3H8 -- convert from [molec/cm2/month] to [molec C/cm2/month]
BIOMASS(:,:,N) = BIOMASS(:,:,N) * 3d0
! Compute future C3H8 emissions (if necessary)
IF ( LFUTURE ) THEN
CALL SCALE_FUTURE( 'VOCbb', BIOMASS(:,:,N) )
ENDIF
! Print totals in [Tg C]
CALL TOTAL_BIOMASS_TG( BIOMASS(:,:,N), 12d-3, 'C3H8' )
ELSE IF ( N == 9 ) THEN
!----------
! CH2O
!----------
! CH2O is stored in the biomass file as tracer #20
CALL READ_BPCH2( FILENAME, 'BIOBSRCE', 20,
& TAU0, IGLOB, JGLOB,
& 1, ARRAY, QUIET=.TRUE. )
! Cast from REAL*4 to REAL*8 and resize to (IIPAR,JJPAR)
CALL TRANSFER_2D( ARRAY(:,:,1), BIOMASS(:,:,N) )
! Compute future CH2O emissions (if necessary)
IF ( LFUTURE ) THEN
CALL SCALE_FUTURE( 'VOCbb', BIOMASS(:,:,N) )
ENDIF
! CH2O -- print totals in [Tg C/month]
CALL TOTAL_BIOMASS_TG( BIOMASS(:,:,N), 30d-3, 'CH2O' )
ELSE IF ( N == 10 ) THEN
!----------
! C2H6
!----------
! C2H6 is stored in the biomass file as tracer #21
CALL READ_BPCH2( FILENAME, 'BIOBSRCE', 21,
& TAU0, IGLOB, JGLOB,
& 1, ARRAY, QUIET=.TRUE. )
! Cast from REAL*4 to REAL*8 and resize to (IIPAR,JJPAR)
CALL TRANSFER_2D( ARRAY(:,:,1), BIOMASS(:,:,N) )
! C2H6 --convert from [molec/cm2/month] to [molec C/cm2/month]
BIOMASS(:,:,N) = BIOMASS(:,:,N) * 2d0
! Compute future C2H6 emissions (if necessary)
IF ( LFUTURE ) THEN
CALL SCALE_FUTURE( 'VOCbb', BIOMASS(:,:,N) )
ENDIF
! Print totals in [Tg C]
CALL TOTAL_BIOMASS_TG( BIOMASS(:,:,N), 12d-3, 'C2H6' )
!-------------------------------------------------------------------------
! Add 9 gaseous BB emissions (tmf, 1/7/09)
!-------------------------------------------------------------------------
ELSE IF ( N == 15 ) THEN
!----------
! GLYX
!----------
! Estimate GLYC emission by scaling CO emission
! GLYX [mole] / CO [mole] = 0.00662 (from Andreae 2005 update)
TRCEMIS(:,:) =
& COEMIS(:,:) * 0.00662d0 ! [molecule GLYX/cm2/month]
BIOMASS(:,:,N) = TRCEMIS(:,:)
! GLYX -- [molecule GLYX/cm2/month]
! Print totals in [Tg GLYX]
CALL TOTAL_BIOMASS_TG( BIOMASS(:,:,N), 58d-3, 'GLYX' )
ELSE IF ( N == 16 ) THEN
!----------
! MGLY
!----------
! Estimate MGLY emission by scaling CO emission
! MGLY [mole] / CO [mole] = 0.00347 (from Andreae 2005 update)
TRCEMIS(:,:) =
& COEMIS(:,:) * 0.00347d0 ! [molecule MGLY/cm2/month]
BIOMASS(:,:,N) = TRCEMIS(:,:)
! MGLY -- [molecule MGLY/cm2/month]
! Print totals in [Tg MGLY]
CALL TOTAL_BIOMASS_TG( BIOMASS(:,:,N), 72d-3, 'MGLY' )
ELSE IF ( N == 17 ) THEN
!----------
! BENZ
!----------
! Estimate BENZ emission by scaling CO emission
! BENZ [mole] / CO [mole] = 0.00233
TRCEMIS(:,:) =
& COEMIS(:,:) * 0.00233d0 * 6.0d0 ! [molec C/cm2/month]
BIOMASS(:,:,N) = TRCEMIS(:,:)
! BENZ -- [molec C/cm2/month]
! Print totals in [Tg C]
CALL TOTAL_BIOMASS_TG( BIOMASS(:,:,N), 12d-3, 'BENZ' )
ELSE IF ( N == 18 ) THEN
!----------
! TOLU
!----------
! Estimate TOLU emission by scaling CO emission
! TOLU [mole] / CO [mole] = 0.00124
TRCEMIS(:,:) =
& COEMIS(:,:) * 0.00124d0 * 7.0d0 ! [molec C/cm2/month]
BIOMASS(:,:,N) = TRCEMIS(:,:)
! TOLU -- [molec C/cm2/month]
! Print totals in [Tg C]
CALL TOTAL_BIOMASS_TG( BIOMASS(:,:,N), 12d-3, 'TOLU' )
ELSE IF ( N == 19 ) THEN
!----------
! XYLE
!----------
! Estimate XYLE emission by scaling CO emission
! XYLE [mole] / CO [mole] = 0.00048
TRCEMIS(:,:) =
& COEMIS(:,:) * 0.00048d0 * 8.0d0 ! [molec C/cm2/month]
BIOMASS(:,:,N) = TRCEMIS(:,:)
! XYLE -- [molec C/cm2/month]
! Print totals in [Tg C]
CALL TOTAL_BIOMASS_TG( BIOMASS(:,:,N), 12d-3, 'XYLE' )
ELSE IF ( N == 20 ) THEN
!----------
! C2H4
!----------
! Estimate C2H4 emission by scaling CO emission
! C2H4 [mole] / CO [mole] = 0.01381
TRCEMIS(:,:) =
& COEMIS(:,:) * 0.01381d0 * 2.0d0 ! [molec C/cm2/month]
BIOMASS(:,:,N) = TRCEMIS(:,:)
! C2H4 -- [molec C/cm2/month]
! Print totals in [Tg C]
CALL TOTAL_BIOMASS_TG( BIOMASS(:,:,N), 12d-3, 'C2H4' )
ELSE IF ( N == 21 ) THEN
!----------
! C2H2
!----------
! Estimate C2H2 emission by scaling CO emission
! C2H2 [mole] / CO [mole] = 0.004d0 from Xiao et al. [2007]
TRCEMIS(:,:) =
& COEMIS(:,:) * 0.004d0 * 2.0d0 ! [molec C/cm2/month]
BIOMASS(:,:,N) = TRCEMIS(:,:)
! C2H2 -- [molec C/cm2/month]
! Print totals in [Tg C]
CALL TOTAL_BIOMASS_TG( BIOMASS(:,:,N), 12d-3, 'C2H2' )
ELSE IF ( N == 22 ) THEN
!----------
! GLYC
!----------
! Estimate GLYC emission by scaling CO emission
! GLYC [mole] / CO [mole] = 0.00477 (from Andreae 2005 update)
TRCEMIS(:,:) =
& COEMIS(:,:) * 0.00477d0 ! [molecule GLYC/cm2/month]
BIOMASS(:,:,N) = TRCEMIS(:,:)
! GLYC -- [molecule GLYC/cm2/month]
! Print totals in [Tg GLYC]
CALL TOTAL_BIOMASS_TG( BIOMASS(:,:,N), 60d-3, 'GLYC' )
ELSE IF ( N == 23 ) THEN
!----------
! HAC
!----------
! Estimate HAC emission by scaling CO emission
! HAC [mole] / CO [mole] = 0.00331d0 (from Christian et al. [2003] for African biomass)
TRCEMIS(:,:) =
& COEMIS(:,:) * 0.00331d0 ! [molecule HAC/cm2/month]
BIOMASS(:,:,N) = TRCEMIS(:,:)
! HAC -- [molecule HAC/cm2/month]
! Print totals in [Tg HAC]
CALL TOTAL_BIOMASS_TG( BIOMASS(:,:,N), 74d-3, 'HAC' )
ENDIF
ENDDO
! Return to calling program
END SUBROUTINE READ_BIOMASS
!------------------------------------------------------------------------------
SUBROUTINE SCALE_BIOMASS_ACET( BBARRAY )
!
!******************************************************************************
! Subroutine SCALE_BIOMASS_ACET scales the seasonal acetone biomass
! burning emissions (Case 1 in the decision tree above) to a given
! yearly value. This is needed for the new biogenic emission fluxes.
! (bdf, bmy, 9/4/01, 7/20/04)
!
! Arguments as Input:
! ============================================================================
! (1 ) BBARRAY (REAL*8) : Array containing biomass burning CO emissions
!
! Reference:
! ============================================================================
! Jacob, D.J., B.D. Field, E. Jin, I. Bey, Q. Li, J.A. Logan, and
! R.M. Yantosca, Atmospheric budget of acetone, submitted to
! Geophys. Res. Lett., 2001.
!
! NOTES:
! (1 ) Scale factors determined by Brendan Field, in order to match that
! of the acetone paper: Jacob et al, 2001. (bdf, bmy, 9/4/01)
! (2 ) BBARRAY is now dimensioned (IIPAR,JJPAR) (bmy, 9/28/01)
! (3 ) Removed obsolete code from 9/01 (bmy, 10/23/01)
! (4 ) Now reference LBBSEA, LTOMSAI, from "directory_mod.f" (bmy, 7/20/04)
!******************************************************************************
!
! References to F90 modules
USE LOGICAL_MOD, ONLY : LBBSEA, LTOMSAI
# include "CMN_SIZE" ! Size parameters
! Arguments
REAL*8, INTENT(INOUT) :: BBARRAY(IIPAR,JJPAR)
!=================================================================
! SCALE_BIOMASS_ACET begins here!
!
! Apply scale factor from Jacob et al 2001 (bdf)
!=================================================================
IF ( LBBSEA .and. .not. LTOMSAI ) THEN
BBARRAY = BBARRAY * 1.77d0
ENDIF
! Return to calling program
END SUBROUTINE SCALE_BIOMASS_ACET
!------------------------------------------------------------------------------
SUBROUTINE SCALE_FUTURE( NAME, BB )
!
!******************************************************************************
! Subroutine SCALE_FUTURE applies the IPCC future emissions scale factors
! to the biomass burning emisisons to compute the future emissions of biomass
! burning for NOx, CO, and VOC's. (swu, bmy, 5/30/06)
!
! Arguments as Input:
! ============================================================================
! (1 ) NAME (CHARACTER) : Denotes type of scale factor to use (e.g. NOx)
! (2 ) BB (REAL*8 ) : Array w/ biomass burning emissions [molec/cm2]
!
! NOTES:
!******************************************************************************
!
! References to F90 modules
USE FUTURE_EMISSIONS_MOD, ONLY : GET_FUTURE_SCALE_CObb
USE FUTURE_EMISSIONS_MOD, ONLY : GET_FUTURE_SCALE_NOxbb
USE FUTURE_EMISSIONS_MOD, ONLY : GET_FUTURE_SCALE_VOCbb
# include "CMN_SIZE" ! Size parameters
! Arguments
REAL*8, INTENT(INOUT) :: BB(IIPAR,JJPAR)
CHARACTER(LEN=*), INTENT(IN) :: NAME
! Local variables
INTEGER :: I, J
!=================================================================
! SCALE_FUTURE begins here!
!=================================================================
IF ( NAME == 'NOxbb' ) THEN
! Compute future NOx emissions
!$OMP PARALLEL DO
!$OMP+DEFAULT( SHARED )
!$OMP+PRIVATE( I, J )
DO J = 1, JJPAR
DO I = 1, IIPAR
BB(I,J) = BB(I,J) * GET_FUTURE_SCALE_NOxbb( I, J )
ENDDO
ENDDO
!$OMP END PARALLEL DO
ELSE IF ( NAME == 'CObb' ) THEN
! Compute future CO emissions
!$OMP PARALLEL DO
!$OMP+DEFAULT( SHARED )
!$OMP+PRIVATE( I, J )
DO J = 1, JJPAR
DO I = 1, IIPAR
BB(I,J) = BB(I,J) * GET_FUTURE_SCALE_CObb( I, J )
ENDDO
ENDDO
!$OMP END PARALLEL DO
ELSE
! Compute future hydrocarbon emissions
!$OMP PARALLEL DO
!$OMP+DEFAULT( SHARED )
!$OMP+PRIVATE( I, J )
DO J = 1, JJPAR
DO I = 1, IIPAR
BB(I,J) = BB(I,J) * GET_FUTURE_SCALE_VOCbb( I, J )
ENDDO
ENDDO
!$OMP END PARALLEL DO
ENDIF
! Return to calling program
END SUBROUTINE SCALE_FUTURE
!------------------------------------------------------------------------------
SUBROUTINE TOTAL_BIOMASS_TG( BBARRAY, MOLWT, NAME )
!
!******************************************************************************
! Subroutine TOTAL_BIOMASS_TG prints the amount of biomass burning emissions
! that are emitted each month in Tg or Tg C. (bmy, 3/20/01, 4/5/06)
!
! Arguments as Input:
! ============================================================================
! (1 ) BBARRAY (REAL*8) : Biomass burning CO emissions [molec/cm2/month]
!
! NOTES:
! (1 ) BBARRAY is now dimensioned (IIPAR,JJPAR). Also, DXYP is dimensioned
! as JGLOB, so use J+J0 to reference it. (bmy, 9/28/01)
! (2 ) Removed obsolete code from 9/01 (bmy, 10/23/01)
! (3 ) Now use function GET_AREA_CM2 from "grid_mod.f" to compute grid
! box surface area in cm2. Removed reference to CMN header file.
! Cosmetic changes. (bmy, 3/14/03)
! (4 ) Now report sums of NOx as Tg N instead of Tg NOx (bmy, 4/5/06)
! (5 ) Add unit choice for GLYX, MGLY, GLYC, HAC (tmf, 1/7/09)
!******************************************************************************
!
! References to F90 modules
USE GRID_MOD, ONLY : GET_AREA_CM2
# include "CMN_SIZE" ! Size parameters
! Arguments
REAL*8, INTENT(IN) :: BBARRAY(IIPAR,JJPAR)
REAL*8, INTENT(IN) :: MOLWT
CHARACTER(LEN=*), INTENT(IN) :: NAME
! Local variables
INTEGER :: I, J
REAL*8 :: TOTAL, CONV
CHARACTER(LEN=6) :: UNIT
!=================================================================
! TOTAL_BIOMASS_TG begins here!
!=================================================================
! Initialize summing variable
TOTAL = 0d0
! Convert to [Tg/month] (or [Tg C/month] for hydrocarbons)
DO J = 1, JJPAR
! Conversion factor to [Tg/month] (or [Tg C/month] for HC's)
CONV = GET_AREA_CM2( J ) * ( MOLWT / 6.023d23 ) * 1d-9
! Sum the emissions
DO I = 1, IIPAR
TOTAL = TOTAL + ( BBARRAY(I,J) * CONV )
ENDDO
ENDDO
! Define unit string
SELECT CASE( NAME )
CASE( 'NOx' )
UNIT = '[Tg N]'
CASE( 'CO', 'CH2O', 'GLYX', 'MGLY', 'GLYC', 'HAC' )
UNIT = '[Tg ]'
CASE DEFAULT
UNIT = '[Tg C]'
END SELECT
! Write totals
WRITE( 6, 100 ) NAME, TOTAL, UNIT
100 FORMAT( 'Sum Biomass ', a4, 1x, ': ', f9.3, 1x, a9 )
! Return to calling program
END SUBROUTINE TOTAL_BIOMASS_TG
!------------------------------------------------------------------------------
SUBROUTINE GC_READ_BIOMASS_BCOC( YEAR, MONTH,
& BIOMASS_BC, BIOMASS_OC )
!
!******************************************************************************
! Subroutine GC_READ_BIOMASS_BC_OC reads the GEOS-Chem default biomass
! emissions for black carbon and organic carbon. (bmy, 9/28/06)
!
! Arguments as Input:
! ============================================================================
! (1 ) YEAR (INTEGER) : Current year
! (2 ) MONTH (INTEGER) : Current month
!
! Arguments as Output:
! ============================================================================
! (3 ) BIOMASS_BC (REAL*8 ) : Array for biomass BC emissions [atoms C/cm2/s]
! (4 ) BIOMASS_OC (REAL*8 ) : Array for biomass OC emissions [atoms C/cm2/s]
!
! NOTES:
! (1 ) Took the code that reads the emissions from disk from
! BIOMASS_CARB_GEOS in "carbon_mod.f". (bmy, 9/28/06)
!******************************************************************************
!
! References to F90 modules
USE BPCH2_MOD, ONLY : GET_NAME_EXT_2D, GET_RES_EXT
USE BPCH2_MOD, ONLY : GET_TAU0, READ_BPCH2
USE DIRECTORY_MOD, ONLY : DATA_DIR
USE FUTURE_EMISSIONS_MOD, ONLY : GET_FUTURE_SCALE_BCbb
USE FUTURE_EMISSIONS_MOD, ONLY : GET_FUTURE_SCALE_OCbb
USE GRID_MOD, ONLY : GET_AREA_CM2
USE LOGICAL_MOD, ONLY : LBBSEA, LFUTURE
USE TIME_MOD, ONLY : ITS_A_LEAPYEAR
USE TRACER_MOD, ONLY : XNUMOL
USE TRACERID_MOD, ONLY : IDTBCPO, IDTOCPO
USE TRANSFER_MOD, ONLY : TRANSFER_2D
# include "CMN_SIZE" ! Size parameters
! Arguments
INTEGER :: YEAR, MONTH
REAL*8 :: BIOMASS_BC(IIPAR,JJPAR)
REAL*8 :: BIOMASS_OC(IIPAR,JJPAR)
! Local variables
INTEGER :: I, J
REAL*4 :: ARRAY(IGLOB,JGLOB,1)
REAL*8 :: CONV, XTAU, SEC_PER_MONTH
CHARACTER(LEN=4) :: CYEAR
CHARACTER(LEN=255) :: BC_FILE, OC_FILE
! Days per month (based on 1998)
REAL*8 :: NDAYS(12) = (/ 31d0, 28d0, 31d0, 30d0, 31d0, 30d0,
& 31d0, 31d0, 30d0, 31d0, 30d0, 31d0 /)
!=================================================================
! GC_READ_BIOMASS_BC_OC begins here!
!=================================================================
! Make sure BCPO, OCPO tracers are defined
IF ( IDTBCPO == 0 .and. IDTOCPO == 0 ) THEN
BIOMASS_BC = 0d0
BIOMASS_OC = 0d0
RETURN
ENDIF
! Test for leap year
IF ( MONTH == 2 ) THEN
IF( ITS_A_LEAPYEAR( YEAR ) ) THEN
NDAYS(2) = 29d0
ELSE
NDAYS(2) = 28d0
ENDIF
ENDIF
! Number of seconds in this month
SEC_PER_MONTH = 86400d0 * NDAYS(MONTH)
! Year string
WRITE( CYEAR, '(i4)' ) YEAR
!=================================================================
! Read BC/OC biomass burning [kg C/month] as tracers #34, 35
!=================================================================
! Use seasonal or interannual emissions?
IF ( LBBSEA ) THEN
!------------------------------------
! Use seasonal biomass emissions
!------------------------------------
! File name for seasonal BCPO biomass emissions
BC_FILE = TRIM( DATA_DIR ) //
& 'biomass_200110/BCPO.bioburn.seasonal.' //
& GET_NAME_EXT_2D() // '.' // GET_RES_EXT()
! File name for seasonal OCPO biomass emissions
OC_FILE = TRIM( DATA_DIR ) //
& 'biomass_200110/OCPO.bioburn.seasonal.' //
& GET_NAME_EXT_2D() // '.' // GET_RES_EXT()
! Get TAU0 value (use generic year 1985)
XTAU = GET_TAU0( MONTH, 1, 1985 )
ELSE
!------------------------------------
! Use interannual biomass emissions
! for years between 1996 and 2002
!------------------------------------
! File name for interannual BCPO biomass burning emissions`
BC_FILE = TRIM( DATA_DIR ) //
& 'biomass_200110/BCPO.bioburn.interannual.' //
& GET_NAME_EXT_2D() // '.' //
& GET_RES_EXT() // '.' // CYEAR
! File name for interannual BCPO biomass burning emissions
OC_FILE = TRIM( DATA_DIR ) //
& 'biomass_200110/OCPO.bioburn.interannual.' //
& GET_NAME_EXT_2D() // '.' //
& GET_RES_EXT() // '.' // CYEAR
! Use TAU0 value on the 1st of this month to index bpch file
XTAU = GET_TAU0( MONTH, 1, YEAR )
ENDIF
!------------------
! Read BC biomass
!------------------
! Echo info
WRITE( 6, 100 ) TRIM( BC_FILE )
100 FORMAT( ' - GC_READ_BIOMASS_BC_OC: Reading ', a )
! Read BC emission data [kg/mon]
CALL READ_BPCH2( BC_FILE, 'BIOBSRCE', 34,
& XTAU, IGLOB, JGLOB,
& 1, ARRAY, QUIET=.TRUE. )
! Cast to REAL*8 and resize
CALL TRANSFER_2D ( ARRAY(:,:,1), BIOMASS_BC )
!------------------
! Read OC biomass
!------------------
! Echo info
WRITE( 6, 100 ) TRIM( OC_FILE )
! Read OC emission data [kg/mon]
CALL READ_BPCH2( OC_FILE, 'BIOBSRCE', 35,
& XTAU, IGLOB, JGLOB,
& 1, ARRAY, QUIET=.TRUE. )
! Cast to REAL*8 and resize
CALL TRANSFER_2D ( ARRAY(:,:,1), BIOMASS_OC )
!=================================================================
! Convert from [kg C/mon] to [atoms C/cm2/s]
!=================================================================
!$OMP PARALLEL DO
!$OMP+DEFAULT( SHARED )
!$OMP+PRIVATE( I, J, CONV )
! Loop over latitudes
DO J = 1, JJPAR
! Conversion factor for [1/cm2/s]
CONV = 1d0 / ( GET_AREA_CM2( J ) * SEC_PER_MONTH )
! Loop over longitudes
DO I = 1, IIPAR
! Convert [kg C/month] -> [atoms C/cm2/s]
BIOMASS_BC(I,J) = BIOMASS_BC(I,J) * XNUMOL(IDTBCPO) * CONV
BIOMASS_OC(I,J) = BIOMASS_OC(I,J) * XNUMOL(IDTOCPO) * CONV
! Scale to IPCC future scenario (if necessary)
IF ( LFUTURE ) THEN
! Future scale BC biomass
BIOMASS_BC(I,J) = BIOMASS_BC(I,J) *
& GET_FUTURE_SCALE_BCbb( I, J )
! Future scale OC biomass
BIOMASS_OC(I,J) = BIOMASS_OC(I,J) *
& GET_FUTURE_SCALE_OCbb( I, J )
ENDIF
ENDDO
ENDDO
!$OMP END PARALLEL DO
! Return to calling program
END SUBROUTINE GC_READ_BIOMASS_BCOC
!------------------------------------------------------------------------------
SUBROUTINE GC_READ_BIOMASS_SO2( YEAR, MONTH, BIOMASS_SO2 )
!
!******************************************************************************
! Subroutine GC_READ_BIOMASS_SO2 reads monthly mean biomass burning SO2
! emissions. (bmy, 9/28/06)
!
! Arguments as Input:
! ===========================================================================
! (1 ) YEAR (INTEGER) : Current year
! (2 ) MONTH (INTEGER) : Current month
!
! Arguments as Input:
! ===========================================================================
! (3 ) BIOMASS_SO2 (REAL*8 ) : Array for biomass SO2 [molec SO2/cm2/s]
!
! NOTES:
! (1 ) Took file reading code out of READ_BIOMASS_SO2 of "sulfate_mod.f"
! and inserted here (bmy, 9/28/06)
!******************************************************************************
!
! References to F90 modules
USE BPCH2_MOD, ONLY : GET_NAME_EXT_2D, GET_RES_EXT
USE BPCH2_MOD, ONLY : GET_TAU0, READ_BPCH2
USE DIRECTORY_MOD, ONLY : DATA_DIR
USE FUTURE_EMISSIONS_MOD, ONLY : GET_FUTURE_SCALE_SO2bb
USE GRID_MOD, ONLY : GET_AREA_CM2
USE LOGICAL_MOD, ONLY : LBBSEA, LFUTURE
USE TIME_MOD, ONLY : ITS_A_LEAPYEAR
USE TRACER_MOD, ONLY : XNUMOL
USE TRACERID_MOD, ONLY : IDTSO2
USE TRANSFER_MOD, ONLY : TRANSFER_2D
# include "CMN_SIZE" ! Size parameters
! Arguments
INTEGER, INTENT(IN) :: YEAR, MONTH
REAL*8, INTENT(OUT) :: BIOMASS_SO2(IIPAR,JJPAR)
! Local variables
INTEGER :: I, J, THISYEAR
REAL*4 :: ARRAY(IGLOB,JGLOB,1)
REAL*8 :: CONV, XTAU, SEC_PER_MONTH
CHARACTER(LEN=4 ) :: CYEAR
CHARACTER(LEN=255) :: FILENAME
! Days per month
REAL*8 :: NDAYS(12) = (/ 31d0, 28d0, 31d0, 30d0, 31d0, 30d0,
& 31d0, 31d0, 30d0, 31d0, 30d0, 31d0 /)
!=================================================================
! GC_READ_BIOMASS_SO2 begins here!
!=================================================================
! Make sure BCPO, OCPO tracers are defined
IF ( IDTSO2 == 0 ) THEN
BIOMASS_SO2 = 0d0
RETURN
ENDIF
! Test for leap year
IF ( MONTH == 2 ) THEN
IF( ITS_A_LEAPYEAR( YEAR ) ) THEN
NDAYS(2) = 29d0
ELSE
NDAYS(2) = 28d0
ENDIF
ENDIF
! Seconds in this month
SEC_PER_MONTH = ( 86400d0 * NDAYS(MONTH) )
! Create a string for the 4-digit year
WRITE( CYEAR, '(i4)' ) YEAR
!=================================================================
! Read SO2 biomass emissions [kg SO2/month]
!=================================================================
! Use seasonal or interannual emisisons?
IF ( LBBSEA ) THEN
!------------------------------------
! Use seasonal biomass emissions
!------------------------------------
! File name for seasonal BB emissions
FILENAME = TRIM( DATA_DIR ) //
& 'biomass_200110/SO2.bioburn.seasonal.' //
& GET_NAME_EXT_2D() // '.' // GET_RES_EXT()
! Get TAU0 value (use generic year 1985)
XTAU = GET_TAU0( MONTH, 1, 1985 )
ELSE
!------------------------------------
! Use interannual biomass emissions
! for years between 1996 and 2002
!------------------------------------
! File name for interannual biomass burning emissions
FILENAME = TRIM( DATA_DIR ) //
& 'biomass_200110/SO2.bioburn.interannual.' //
& GET_NAME_EXT_2D() // '.' //
& GET_RES_EXT() // '.' // CYEAR
! Use TAU0 value at start of this month to index punch file
XTAU = GET_TAU0( MONTH, 1, YEAR )
ENDIF
!---------------------------------------
! Read biomass SO2 [kg SO2/month]
!---------------------------------------
! Echo info
WRITE( 6, 100 ) TRIM( FILENAME )
100 FORMAT( ' - GC_READ_BIOMASS_SO2: Reading ', a )
! Read SO2 emission data [kg/month]
CALL READ_BPCH2( FILENAME, 'BIOBSRCE', 26,
& XTAU, IGLOB, JGLOB,
& 1, ARRAY(:,:,1), QUIET=.TRUE. )
! Cast to REAL*8 and resize
CALL TRANSFER_2D ( ARRAY(:,:,1), BIOMASS_SO2 )
!=================================================================
! Convert units [kg SO2/month] -> [molec SO2/cm2/s]
!=================================================================
!$OMP PARALLEL DO
!$OMP+DEFAULT( SHARED )
!$OMP+PRIVATE( I, J, CONV )
! Loop over latitudes
DO J = 1, JJPAR
! Conversion factor for [kg/month] -> [molec/cm2/s]
CONV = XNUMOL(IDTSO2) / ( GET_AREA_CM2( J ) * SEC_PER_MONTH )
! Loop over longitudes
DO I = 1, IIPAR
! Convert [kg SO2/month] -> [molec SO2/cm2/s]
BIOMASS_SO2(I,J) = BIOMASS_SO2(I,J) * CONV
! Scale to IPCC future scenario (if necessary)
IF ( LFUTURE ) THEN
BIOMASS_SO2(I,J) = BIOMASS_SO2(I,J) *
& GET_FUTURE_SCALE_SO2bb( I, J )
ENDIF
ENDDO
ENDDO
!$OMP END PARALLEL DO
! Return to calling program
END SUBROUTINE GC_READ_BIOMASS_SO2
!------------------------------------------------------------------------------
SUBROUTINE GC_READ_BIOMASS_NH3( YEAR, MONTH, BIOMASS_NH3 )
!
!******************************************************************************
! Subroutine GC_READ_BIOMASS_NH3 reads the monthly mean biomass NH3
! and biofuel emissions from disk and converts to [molec NH3/cm2/s].
! (bmy, 9/28/06)
!
! Arguments as Input:
! ===========================================================================
! (1 ) YEAR (INTEGER) : Current year
! (2 ) MONTH (INTEGER) : Current month
!
! Arguments as Input:
! ===========================================================================
! (3 ) BIOMASS_NH3 (REAL*8 ) : Array for biomass NH3 [molec SO2/cm2/s]
!
! NOTES:
! (1 ) Took file reading code out of READ_BIOMASS_NH3 of "sulfate_mod.f"
! and inserted here (bmy, 9/28/06)
!******************************************************************************
!
! References to F90 modules
USE BPCH2_MOD, ONLY : GET_NAME_EXT_2D, GET_RES_EXT
USE BPCH2_MOD, ONLY : GET_TAU0, READ_BPCH2
USE DIRECTORY_MOD, ONLY : DATA_DIR
USE FUTURE_EMISSIONS_MOD, ONLY : GET_FUTURE_SCALE_NH3bb
USE LOGICAL_MOD, ONLY : LBBSEA, LFUTURE
USE GRID_MOD, ONLY : GET_AREA_CM2
USE TIME_MOD, ONLY : ITS_A_LEAPYEAR
USE TRACER_MOD, ONLY : XNUMOL
USE TRACERID_MOD, ONLY : IDTNH3
USE TRANSFER_MOD, ONLY : TRANSFER_2D
# include "CMN_SIZE" ! Size parameters
! Arguments
INTEGER, INTENT(IN) :: YEAR, MONTH
REAL*8, INTENT(OUT) :: BIOMASS_NH3(IIPAR,JJPAR)
! Local variables
INTEGER :: I, J
REAL*4 :: ARRAY(IGLOB,JGLOB,1)
REAL*8 :: CONV, SEC_PER_MONTH, XTAU
CHARACTER(LEN=4 ) :: CYEAR
CHARACTER(LEN=255) :: FILENAME
! Number of days in the month
REAL*8 :: NDAYS(12) = (/ 31d0, 28d0, 31d0, 30d0, 31d0, 30d0,
& 31d0, 31d0, 30d0, 31d0, 30d0, 31d0 /)
!=================================================================
! READ_BIOMASS_NH3 begins here!
!=================================================================
! Make sure BCPO, OCPO tracers are defined
IF ( IDTNH3 == 0 ) THEN
BIOMASS_NH3 = 0d0
RETURN
ENDIF
! Test for leap year
IF ( MONTH == 2 ) THEN
IF( ITS_A_LEAPYEAR( YEAR ) ) THEN
NDAYS(2) = 29d0
ELSE
NDAYS(2) = 28d0
ENDIF
ENDIF
! Number of seconds in this month
SEC_PER_MONTH = 86400d0 * NDAYS(MONTH)
! Create a string for the 4-digit year
WRITE( CYEAR, '(i4)' ) YEAR
!=================================================================
! Read biomass NH3 emissions [kg NH3/month]
!=================================================================
! Use seasonal or interannual emisisons?
IF ( LBBSEA ) THEN
!------------------------------------
! Use seasonal biomass emissions
!------------------------------------
! File name for seasonal BB emissions
FILENAME = TRIM( DATA_DIR ) //
& 'biomass_200110/NH3.bioburn.seasonal.' //
& GET_NAME_EXT_2D() // '.' // GET_RES_EXT()
! Get TAU0 value (use generic year 1985)
XTAU = GET_TAU0( MONTH, 1, 1985 )
ELSE
!------------------------------------
! Use interannual biomass emissions
! for years between 1996 and 2002
!------------------------------------
! File name for interannual biomass burning emissions
FILENAME = TRIM( DATA_DIR ) //
& 'biomass_200110/NH3.bioburn.interannual.' //
& GET_NAME_EXT_2D() // '.' //
& GET_RES_EXT() // '.' // CYEAR
! Use TAU0 value on 1st day of this month to index bpch file
XTAU = GET_TAU0( MONTH, 1, YEAR )
ENDIF
!---------------------------------------
! Read NH3 biomass [kg NH3/month]
!---------------------------------------
! Echo filename
WRITE( 6, 100 ) TRIM( FILENAME )
100 FORMAT( ' - READ_BIOMASS_NH3: Reading ', a )
! Read NH3 emission data [kg/mon] as tracer 29
CALL READ_BPCH2( FILENAME, 'BIOBSRCE', 29,
& XTAU, IGLOB, JGLOB,
& 1, ARRAY(:,:,1), QUIET=.TRUE. )
! Cast from REAL*4 to REAL*8 and resize if necessary
CALL TRANSFER_2D( ARRAY(:,:,1), BIOMASS_NH3 )
!=================================================================
! Compute IPCC future emissions (if necessary)
!=================================================================
!$OMP PARALLEL DO
!$OMP+DEFAULT( SHARED )
!$OMP+PRIVATE( I, J, CONV )
! Loop over latitudes
DO J = 1, JJPAR
! Conversion factor for [kg/month] -> [molec/cm2/s]
CONV = XNUMOL(IDTNH3) / ( GET_AREA_CM2( J ) * SEC_PER_MONTH )
! Loop over longitudes
DO I = 1, IIPAR
! Convert [kg NH3/month] -> [molec NH3/cm2/s]
BIOMASS_NH3(I,J) = BIOMASS_NH3(I,J) * CONV
! Scale to IPCC future scenario (if necessary)
IF ( LFUTURE ) THEN
BIOMASS_NH3(I,J) = BIOMASS_NH3(I,J) *
& GET_FUTURE_SCALE_NH3bb( I, J )
ENDIF
ENDDO
ENDDO
!$OMP END PARALLEL DO
! Return to calling program
END SUBROUTINE GC_READ_BIOMASS_NH3
!------------------------------------------------------------------------------
SUBROUTINE GC_READ_BIOMASS_CO2( YEAR, MONTH, BIOMASS_CO2 )
!
!******************************************************************************
! Subroutine GC_READ_BIOMASS_CO2 reads in monthly values of CO for
! biomass burning from a binary punch file. (pns, bmy, 8/16/05, 9/28/06)
!
! Arguments as Input:
! ============================================================================
! (1 ) MONTH (INTEGER) : Current month of year (1-12)
! (2 ) YEAR (INTEGER) : Current year (e.g. 1990)
!
! NOTES:
! (1 ) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)
! (2 ) Moved here from "co2_mod.f" (bmy, 9/28/06)
!******************************************************************************
!
! References to F90 modules
USE BPCH2_MOD, ONLY : GET_NAME_EXT_2D, GET_RES_EXT
USE BPCH2_MOD, ONLY : GET_TAU0, READ_BPCH2
USE DIRECTORY_MOD, ONLY : DATA_DIR
USE LOGICAL_MOD, ONLY : LBBSEA
USE TIME_MOD, ONLY : ITS_A_LEAPYEAR
USE TRACER_MOD, ONLY : ITS_A_CO2_SIM
USE TRANSFER_MOD, ONLY : TRANSFER_2D
# include "CMN_SIZE" ! Size parameters
! Arguments
INTEGER, INTENT(IN) :: YEAR, MONTH
REAL*8, INTENT(OUT) :: BIOMASS_CO2(IIPAR,JJPAR)
! Local variables
INTEGER :: I, J
REAL*4 :: ARRAY(IGLOB,JGLOB,1)
REAL*8 :: EMFACTCO2CO, TAU, SEC_PER_MONTH
CHARACTER(LEN=4) :: SYEAR
CHARACTER(LEN=255) :: FILENAME
! Number of days in the month
REAL*8 :: NDAYS(12) = (/ 31d0, 28d0, 31d0, 30d0, 31d0, 30d0,
& 31d0, 31d0, 30d0, 31d0, 30d0, 31d0 /)
!=================================================================
! READ_BIOMASS_CO2 begins here!
!=================================================================
! Make sure it's a CO2 simulation
IF ( .not. ITS_A_CO2_SIM() ) THEN
BIOMASS_CO2 = 0d0
RETURN
ENDIF
! Test for leap year
IF ( MONTH == 2 ) THEN
IF( ITS_A_LEAPYEAR( YEAR ) ) THEN
NDAYS(2) = 29d0
ELSE
NDAYS(2) = 28d0
ENDIF
ENDIF
! Seconds per month
SEC_PER_MONTH = 86400d0 * NDAYS(MONTH)
! Currently calculate CO2 emissions as a function of CO emissions
! from biomass burning. Set Emission factor (CO2 to CO)
! Calculation based on global totals of
! 5524.7 Tg dry matter (of which 45% is carbon)
! 438.08 Tg CO (of which 187.75 Tg is carbon), and
! 32.6 Tg C of other species
!Refs : Staudt et al., Rose Yevich tables
!Check with Rose Yevich for most recent estimates on emission factors
EMFACTCO2CO = 12.068d0
! Test for climatological or interannual emissions
IF ( LBBSEA ) THEN
!--------------------------------------
! Climatological biomass emissions
!--------------------------------------
! TAU value for this month of "generic" year 1985
TAU = GET_TAU0( MONTH, 1, 1985 )
! Name of climatological biomass burning file
FILENAME = TRIM( DATA_DIR ) //
& 'biomass_200110/bioburn.seasonal.' //
& GET_NAME_EXT_2D() // '.' // GET_RES_EXT()
ELSE
!--------------------------------------
! Interannual biomass emissions
!--------------------------------------
! Make a string for YEAR
WRITE( SYEAR, '(i4)' ) YEAR
! TAU value for the given month of this year
TAU = GET_TAU0( MONTH, 1, YEAR )
! Name of interannual biomass burning file
FILENAME = TRIM( DATA_DIR ) //
& 'biomass_200110/bioburn.interannual.' //
& GET_NAME_EXT_2D() // '.' //
& GET_RES_EXT() // '.' // SYEAR
ENDIF
!-----------------------------------------
! Read data from disk
!-----------------------------------------
! Initialize ARRAY
ARRAY = 0e0
! Read CO biomass emissions [molec CO/cm2/month]
CALL READ_BPCH2( FILENAME, 'BIOBSRCE', 4,
& TAU, IGLOB, JGLOB,
& 1, ARRAY, QUIET=.TRUE. )
! Cast from REAL*4 to REAL*8 and resize to (IIPAR,JJPAR)
CALL TRANSFER_2D( ARRAY(:,:,1), BIOMASS_CO2 )
! Convert from [molec CO/cm2/month] to [molec CO2/cm2/month]
BIOMASS_CO2 = BIOMASS_CO2 * EMFACTCO2CO
! Print total CO2 biomass in Tg
CALL TOTAL_BIOMASS_TG( BIOMASS_CO2, 44d-3, 'CO2' )
! Convert from [molec CO2/cm2/month] to [molec CO2/cm2/s]
BIOMASS_CO2 = BIOMASS_CO2 / SEC_PER_MONTH
! Return to calling program
END SUBROUTINE GC_READ_BIOMASS_CO2
!------------------------------------------------------------------------------
SUBROUTINE ADJUST_TO_TOMSAI( BIOMASS_ANN, BIOMASS_SEA, BIOMASS )
!
!******************************************************************************
! Subroutine ADJUST_TO_TOMSAI is a wrapper for subroutine TOMSAI.
! (bmy, 10/12/00, 4/5/06)
!
! Arguments as Input:
! ============================================================================
! (1 ) BIOMASS_ANN (REAL*8 ) : Annual biomass emissions [molec/cm2/month]
! (2 ) BIOMASS_SEA (REAL*8 ) : Seasonal biomass emissions [molec/cm2/month]
!
! Arguments as Output:
! ============================================================================
! (3 ) BIOMASS (REAL*8 ) : Adjusted biomass emisssions [molec/cm2/month]
!
! NOTES:
! (1 ) Bug fix: Now scale annual BB emissions to TOMS for selected
! regions, and overwrite w/ seasonal BB emissions elsewhere.
! (bnd, bmy, 6/6/01)
! (2 ) BIOMASS_ANN, BIOMASS_SEA, and BIOMASS are now all of size
! (NBIOMAX,IIPAR,JJPAR). (bmy, 9/28/01)
! (3 ) Removed obsolete code from 9/01 (bmy, 10/23/01)
! (4 ) Remove IMONTH from arg list. Remove IMONTH from call to TOMSAI
! (bmy, 2/11/03)
! (5 ) Now dimension arrays (I,J,N) instead of (N,I,J) (bmy, 4/5/06)
!******************************************************************************
!
# include "CMN_SIZE"
! Arguments
REAL*8, INTENT(INOUT) :: BIOMASS_ANN(IIPAR,JJPAR,NBIOMAX)
REAL*8, INTENT(INOUT) :: BIOMASS_SEA(IIPAR,JJPAR,NBIOMAX)
REAL*8, INTENT(INOUT) :: BIOMASS(IIPAR,JJPAR,NBIOMAX)
! Local variables
INTEGER :: I, J, N
! ADJUST_TO_TOMSAI begins here!
WRITE( 6, '(a)' ) 'BIOBURN: Adjusting to TOMS AI data...'
! Loop over all tracers & boxes -- adjust to TOMS Aerosol index
DO N = 1, NBIOMAX
DO J = 1, JJPAR
DO I = 1, IIPAR
CALL TOMSAI( I, J, BIOMASS_ANN(I,J,N),
& BIOMASS_SEA(I,J,N), BIOMASS(I,J,N) )
ENDDO
ENDDO
ENDDO
! Return to calling program
END SUBROUTINE ADJUST_TO_TOMSAI
!------------------------------------------------------------------------------
SUBROUTINE TOMSAI( I, J, VAL_ANN, VAL_SEAS, ADJUSTED_VALUE )
!
!******************************************************************************
! Subroutine TOMSAI uses TOMS aerosol index for the last two decades as a
! surrogate for biomass burning. The biomass burning emission climatology
! is adjusted for each month and year. For months without information,
! the climatology is used. There is no TOMS AI data for July-August 1990
! and May 1993 - August 1996.
!
! Written by Bryan Duncan 8/2000.
! Inserted into F90 module "biomass_mod.f" (bmy, 9/25/00, 12/1/04)
!
! Subroutine TOMSAI is called from routine BIOBURN of "biomass_mod.f".
!
! Arguments as Input:
! ===========================================================================
! (1-2) I, J (INTEGER) : indices of box
! (3 ) VAL_SEAS (REAL*4 ) : Seasonal biomass value
! (4 ) VAL_ANN (REAL*4 ) : Annual biomass value
!
! Arguments as Output:
! ===========================================================================
! (5 ) ADJUSTED_VALUE (REAL*4) : CO emission for box(I,J) after adjustment.
!
!
! Other variables:
! ===========================================================================
! TOMSAISCALE = scaling factor by region for a specific month and year.
! NAIREGIONS = number of regions for which there is data.
! NAIYEARS = number of years for which there is data.
! NAIMONTHS = 12*NAIYEARS; number of months for which there is data.
!
! NOTES:
! (1 ) Remove references to "CMN_CO", "CMN_OH", and "CMN". (bmy, 9/25/00)
! (2 ) Updated lat/lon boundaries of geographic regions (bnd, bmy, 10/16/00)
! (3 ) Now references ALLOC_ERR from "error_mod.f" (bmy, 10/15/02)
! (4 ) Now use functions GET_MONTH, GET_TAU, GET_YEAR from "time_mod.f"
! Removed IMONTH from the arg list. IMONTH, JYEAR, and TAU are now
! local variables. (bmy, 2/11/03)
! (5 ) Change VAL_ANN and VAL_SEAS to INTENT(IN). (bmy, 4/28/03)
! (6 ) Now reference DATA_DIR from "directory_mod.f" (bmy, 7/20/04)
! (7 ) Added space in #ifdef block for 1 x 1.25 grid (bmy, 12/1/04)
!******************************************************************************
!
! References to F90 modules
USE DIRECTORY_MOD, ONLY : DATA_DIR
USE ERROR_MOD, ONLY : ALLOC_ERR
USE TIME_MOD, ONLY : GET_MONTH, GET_TAU, GET_YEAR
# include "CMN_SIZE" ! Size parameters
! Arguments
INTEGER, INTENT(IN) :: I, J
REAL*8, INTENT(INOUT) :: ADJUSTED_VALUE
REAL*8, INTENT(IN) :: VAL_ANN
REAL*8, INTENT(IN) :: VAL_SEAS
! Local variables
INTEGER :: THEYEAR, IPICK, CTM_lat, CTM_lon
INTEGER :: II, JJ, KK, LL, AS, IMONTH, JYEAR
INTEGER, SAVE :: IFIRSTCALL = 1
REAL*8 :: CONVERT_lon, READINTOMS(NMONTHSAI), TAU
!=================================================================
! TOMSAI begins here!
!=================================================================
! Get time quantities
IMONTH = GET_MONTH()
JYEAR = GET_YEAR()
TAU = GET_TAU()
!=================================================================
! Read in scaling factors on first call to SR.
! The scaling factors are stored in TOMSAI.
! They run from Jan 1979 to Dec 1999 = 252 months total.
!=================================================================
IF(IFIRSTCALL.EQ.1) THEN
IFIRSTCALL = 0
! Allocate TOMSAISCALE array
ALLOCATE( TOMSAISCALE( NAIREGIONS, NAIYEARS, 12 ), STAT=AS )
IF ( AS / = 0 ) CALL ALLOC_ERR( 'TOMSAISCALE' )
! Read TOMS Aerosol index data
OPEN( 199, FILE = TRIM( DATA_DIR ) // 'TOMSAI', STATUS='OLD' )
DO JJ=1,NAIREGIONS
READ( 199, * ) readinTOMS
II=0
DO KK=1,NAIYEARS
DO LL=1,12
II=II+1
TOMSAISCALE(JJ,KK,LL)=readinTOMS(II)
ENDDO
ENDDO
ENDDO
CLOSE(199)
ENDIF
!=================================================================
! The AI data is on a 1.25 x 1 degree grid (lon,lat). Therefore,
! convert the box number from the code to the corresponding box
! number of the AI data.
!=================================================================
#if defined( GRID4x5 )
CONVERT_lon = ( DBLE(I) * 5.d0 ) * 1.d0 / 1.25d0
CTM_lon = INT( CONVERT_lon )
CTM_lat = ( J * 4 ) - 2
IF (J == 1 ) CTM_LAT = 2
IF (J == JJPAR ) CTM_LAT = 88 + 90
#elif defined( GRID2x25 )
CONVERT_lon = ( DBLE(I) * 2.5d0 ) * 1.d0 / 1.25d0
CTM_LON = INT( CONVERT_LON )
CTM_LAT = ( J * 2 ) - 1
IF (J == 1 ) CTM_LAT = 1
IF (J == JJPAR ) CTM_LAT = 89 + 90
#elif defined( GRID1x125 )
PRINT*, 'Need to compute CONVERT_LON for 1 x 1.25 grid!'
PRINT*, 'STOP in TOMSAI (biomass_mod.f)'
STOP
#elif defined( GRID1x1 )
PRINT*, 'Need to compute CONVERT_LON for 1 x 1 grid!'
PRINT*, 'STOP in TOMSAI (biomass_mod.f)'
STOP
#endif
!=================================================================
! See what region the box falls in to pick the appropriate
! regional scaling factor.
!=================================================================
IPICK=0
! Indonesia
IF(CTM_lat.GE.83.and.CTM_lat.LE.99) THEN
IF(CTM_lon.GE.221.and.CTM_lon.LE.269) THEN
IPICK=1
ENDIF
ENDIF
! Brazil
IF(CTM_lat.GE.59.and.CTM_lat.LE.91) THEN
IF(CTM_lon.GE.96.and.CTM_lon.LE.116) THEN
IF(IMONTH.GE.6.AND.IMONTH.LE.12) THEN
IPICK=2
ELSE
IPICK=20
ENDIF
ENDIF
ENDIF
! Southern Africa
IF(CTM_lat.GE.50.and.CTM_lat.LE.90) THEN
IF(CTM_lon.GE.128.and.CTM_lon.LE.184) THEN
IPICK=3
ENDIF
ENDIF
! Northern Africa
IF(CTM_lat.GE.91.and.CTM_lat.LE.110) THEN
IF(CTM_lon.GE.128.and.CTM_lon.LE.184) THEN
IPICK=4
ENDIF
ENDIF
! Central America and Mexico
IF(CTM_lat.GE.96.and.CTM_lat.LE.115) THEN
IF(CTM_lon.GE.61.and.CTM_lon.LE.85) THEN
IF(IMONTH.GE.2.AND.IMONTH.LE.5) THEN
IPICK=5
ELSE
IPICK=20
ENDIF
ENDIF
ENDIF
! Canada and Alaska
! We have fire burn estimates for Canada, so we can use
! this data to fill in the TOMS data gap.
IF(CTM_lat.GE.141.and.CTM_lat.LE.161) THEN
IF(CTM_lon.GE.16.and.CTM_lon.LE.96) THEN
IF(IMONTH.GE.5.AND.IMONTH.LE.9) THEN
IPICK=6
ELSE
IPICK=20
ENDIF
ENDIF
ENDIF
! Asiatic Russia
IF(CTM_lat.GE.136.and.CTM_lat.LE.161) THEN
IF(CTM_lon.GE.211.and.CTM_lon.LE.291) THEN
IF(IMONTH.GE.5.AND.IMONTH.LE.9) THEN
IPICK=7
ELSE
IPICK=20
ENDIF
ENDIF
ENDIF
! Southeast Asia
IF(CTM_lat.GE.99.and.CTM_lat.LE.119) THEN
IF(CTM_lon.GE.221.and.CTM_lon.LE.239) THEN
IF(IMONTH.GE.1.AND.IMONTH.LE.5) THEN
IPICK=8
ELSE
IPICK=20
ENDIF
ENDIF
ENDIF
! Error Check.
IF(IMONTH.LT.1.OR.IMONTH.GT.12) THEN
PRINT*,'Error in SR TOMSAI: Value of IMONTH is wrong.'
PRINT*,'IMONTH = ',IMONTH
STOP
ENDIF
!=================================================================
! During the TOMS data gaps, set IPICK = 0; emissions are
! not rescaled for the box and the seasonal variation is used,
! except for Indonesia and Canada & Alaska.
!=================================================================
! July - August 1990
IF ( IPICK /= 6 ) THEN
IF ( TAU == 48168d0 ) IPICK = 0
IF ( TAU == 48912d0 ) IPICK = 0
ENDIF
! May 1993 - July 1996
IF ( IPICK /= 6 .AND. IPICK /= 1 ) THEN
IF ( TAU >= 73008d0 .AND. TAU <= 100776d0 ) IPICK = 0
ENDIF
!=================================================================
! Rescale CO emission. If IPICK = 0 then emissions are
! not rescaled for the box and the seasonal variation is used.
!=================================================================
! Adjust with TOMS AI
IF( IPICK > 0 .AND. IPICK /= 3 .AND. IPICK /= 4 ) THEN
THEYEAR = JYEAR - 1978
IF ( THEYEAR > NAIYEARS .OR. THEYEAR < 0 ) THEN
PRINT*,'Error in SR TOMSAI: You have picked a year less'
PRINT*,'than 1979 or greater than 1999. The data in this'
PRINT*,'SR used to scale biomass burning emissions is only'
PRINT*,'good for 1979-1999. You may need to comment out'
PRINT*,'the call to this SR in SR bioburn.'
PRINT*,'Your year is ',JYEAR,'.'
STOP
ENDIF
! Do not adjust Africa with TOMSAI!!!!
IF ( IPICK /= 20 ) THEN
ADJUSTED_VALUE = VAL_ANN *
& TOMSAISCALE(IPICK,THEYEAR,IMONTH)
ELSE
! Zero out IPICK regions when the biomass burning
! season is not occuring.
ADJUSTED_VALUE = 0d0
ENDIF
ELSE ! IPICK=0; IPICK=3; IPICK=4
! Use seasonal emissions instead
ADJUSTED_VALUE = VAL_SEAS
ENDIF
! Return to calling program
END SUBROUTINE TOMSAI
!------------------------------------------------------------------------------
SUBROUTINE CLEANUP_GC_BIOMASS
!
!******************************************************************************
! Subroutine CLEANUP_BIOMASS deallocates the BURNEMIS and
! TOMSAISCALE arrays (bmy, 4/5/06)
!
! NOTES:
!******************************************************************************
!
!=================================================================
! CLEANUP_GC_BIOMASS begins here!
!=================================================================
IF ( ALLOCATED( TOMSAISCALE ) ) DEALLOCATE( TOMSAISCALE )
! Return to calling program
END SUBROUTINE CLEANUP_GC_BIOMASS
!------------------------------------------------------------------------------
! End of module
END MODULE GC_BIOMASS_MOD