2250 lines
86 KiB
Fortran
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
|