3326 lines
117 KiB
Fortran
3326 lines
117 KiB
Fortran
! $Id: global_ch4_mod.f,v 1.1 2012/03/01 22:00:27 daven Exp $
|
||
MODULE GLOBAL_CH4_MOD
|
||
!
|
||
!******************************************************************************
|
||
! Module GLOBAL_CH4_MOD contains variables and routines for simulating
|
||
! CH4 chemistry in the troposphere (jsw, bnd, bmy, 1/17/01, 10/1/09)
|
||
!
|
||
! Module Variables:
|
||
! ===========================================================================
|
||
! (1 ) N_CH4 (INTEGER) : Number of budget items in TCH4
|
||
! (2 ) BAIRDENS (REAL*8 ) : Array for air density [molec/cm3]
|
||
! (3 ) BOH (REAL*8 ) : Array for OH values [molec/cm3]
|
||
! (4 ) COPROD (REAL*8 ) : Array for zonal mean P(CO) [v/v/s]
|
||
! (5 ) PAVG (REAL*8 ) : Array for 24-h avg surface pressure [mb]
|
||
! (6 ) TAVG (REAL*8 ) : Array for 24-h avg temperature [K]
|
||
! (7 ) TCH4 (REAL*8 ) : Array for CH4 budget (N_CH4 items)
|
||
! (8 ) NCMSALTS (INTEGER) : # of altitudes for CMS climatological OH
|
||
! (9 ) NCMSLATS (INTEGER) : # of latitudes for CMS climatological OH
|
||
! (10) CMSALTS (REAL*8 ) : Altitude values for CMS climatological OH
|
||
! (11) CMSLATS (REAL*8 ) : Latitude values for CMS climatological OH
|
||
! (12) AVGOH (REAL*8 ) : Array for CMS climatological OH [molec/cm3]
|
||
! (13) FMOL_CH4 (REAL*8 ) : Molecular weight of CH4 [kg/mole]
|
||
! (14) XNUMOL_CH4 (REAL*8 ) : Molecules CH4 / kg CH4
|
||
! (15) CH4_EMIS (REAL*8 ) : Array for CH4 Emissions
|
||
!
|
||
! Module Routines:
|
||
! ===========================================================================
|
||
! (1 ) GET_GLOBAL_CH4 : Computes latitudinal, yearly CH4 gradient
|
||
! (2 ) CH4_AVGTP : Computes 24-h average pressure & temperature
|
||
! (3 ) EMISSCH4 : Handles CH4 emissions
|
||
! (4 ) CHEMCH4 : Handles CH4 chemistry (various sinks)
|
||
! (7 ) CH4_DECAY : Computes decay of CH4 w/ OH in the troposphere
|
||
! (8 ) CH4_OHSAVE : Saves OH conc. for CH3CCl3 diagnostic
|
||
! (9 ) CH4_STRAT : Computes loss of CH4 in the stratosphere
|
||
! (10) CH4_BUDGET : Computes global CH4 budgets, sources & sinks
|
||
! (11) SUM_CH4 : Sums a sub-region of the TCH4 budget array
|
||
! (12) INIT_CH4 : Allocates and zeroes module arrays
|
||
! (13) CLEANUP_CH4 : Deallocates module arrays
|
||
! (14) WETLAND_EMIS : Computes CH4 emissions from Wetland
|
||
! (16) CH4_DISTRIB : Distributes chemical loss of CH4 to all tracers
|
||
! (17) BIOBURN_EMIS : Gets CH4 emissions from GFED2 biomass burning
|
||
! (18) RICE_EMIS : Gets and scales CH4 rice emissions
|
||
! (19) BIOFUEL_EMIS : Gets CH4 emissions from Yevich and Logan 2003
|
||
! (20) ASEASONAL_ANTHRO_EMIS : Gets aseasonal anthropogenic CH4 emissions
|
||
! (21) ASEASONAL_NATURAL_EMIS: Gets aseasonal natural CH4 emissions
|
||
!
|
||
! GEOS-CHEM modules referenced by global_ch4_mod.f
|
||
! ============================================================================
|
||
! (1 ) bpch2_mod.f : Module containing routines for binary punch file I/O
|
||
! (2 ) diag_mod.f : Module containing GEOS-CHEM diagnostic arrays
|
||
! (3 ) dao_mod.f : Module containing arrays for DAO met fields
|
||
! (4 ) diag_oh_mod.f : Module containing arrays for mean OH & CH3CCl3 life
|
||
! (4 ) error_mod.f : Module containing NaN and other error check routines
|
||
! (5 ) grid_mod.f : Module containing horizontal grid information
|
||
! (6 ) pressure_mod.f : Module containing routines to compute P(I,J,L)
|
||
! (7 ) time_mod.f : Module containing routines to compute date & time
|
||
! (8 ) tracer_mod.f : Module containing information on tracers and
|
||
! concentration array.
|
||
! (9 ) logical_mod.f : Module containing logical variables.
|
||
! (10) directory_mod.f : Module containing directory variables.
|
||
! (11) file_mod.f : Module containing file unit numbers.
|
||
! (12) transfer_mod.f : Module containing routines to change type of array
|
||
! data.
|
||
! (13) regrid_1x1_mod.f : Module containing regridding routines
|
||
! (14) diag_pl_mod.f : Module containing variables and routines for prod
|
||
! and loss of chemical families.
|
||
! (15) diag_oh_mod.f : Module containing routines to archive OH mass.
|
||
!
|
||
! NOTES:
|
||
! (1 ) Merged routines from jsw's CH4 code into "global_ch4_mod.f"
|
||
! (bmy, 1/16/01)
|
||
! (2 ) XNUMOL_CH4 and TCH4 have to be public - all other variables can
|
||
! be made private, so as not to conflict with other common-block
|
||
! definitions (bmy, 1/17/01)
|
||
! (3 ) Minor fixes from jsw added (jsw, bmy, 2/17/01)
|
||
! (4 ) Removed some F90 module references from EMISSCH4 (bmy, 3/20/01)
|
||
! (5 ) Eliminate obsolete commented-out code (bmy, 4/20/01)
|
||
! (6 ) Updated comments (bmy, 9/4/01)
|
||
! (7 ) Fixes for binary punch file in READ_COPROD (bmy, 9/26/01)
|
||
! (8 ) Removed obsolete code from READ_COPROD (bmy, 10/24/01)
|
||
! (9 ) Minor bug fixes for compilation on ALPHA (bmy, 11/15/01)
|
||
! (10) Eliminate obsolete code from 11/01 (bmy, 2/27/02)
|
||
! (11) Now eliminate PS from the arg list to CH4_AVGTP (4/11/02)
|
||
! (12) Now divide module header into MODULE PRIVATE, MODULE VARIABLES, and
|
||
! MODULE ROUTINES sections. Updated comments (bmy, 5/28/02)
|
||
! (13) Replaced all instances of IM with IIPAR and JM with JJPAR, in order
|
||
! to prevent namespace confusion for the new TPCORE (bmy, 6/25/02)
|
||
! (14) Now reference "file_mod.f". Also removed obsolete code. (bmy, 6/27/02)
|
||
! (15) Now references "pressure_mod.f" (bmy, 8/21/02)
|
||
! (16) Now reference AD and T from "dao_mod.f". Now reference "error_mod.f".
|
||
! Remove obsolete code from various routines. Remove reference to
|
||
! header file "comtrid.h" -- it's not used. (bmy, 11/6/02)
|
||
! (17) Minor bug fix in FORMAT statements (bmy, 3/23/03)
|
||
! (18) Now references "grid_mod.f" and "time_mod.f" (bmy, 3/27/03)
|
||
! (19) Updates to GET_GLOBAL_CH4 (bmy, 7/1/03)
|
||
! (20) Now references "directory_mod.f", "tracer_mod.f", and "diag_oh_mod.f"
|
||
! (bmy, 7/20/04)
|
||
! (21) Now can read data for both GEOS and GCAP grids (bmy, 8/16/05)
|
||
! (22) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)
|
||
! (23) Updated CH4 simulation (wecht, cph, ccarouge, 10/1/09)
|
||
! completely replace this file (kjw, dkh, 02/12/12, adj32_023)
|
||
!******************************************************************************
|
||
!
|
||
IMPLICIT NONE
|
||
|
||
PUBLIC
|
||
|
||
!=================================================================
|
||
! MODULE PRIVATE DECLARATIONS -- keep certain internal variables
|
||
! and routines from being seen outside "global_ch4_mod.f"
|
||
!=================================================================
|
||
|
||
! PRIVATE module variables
|
||
PRIVATE :: BAIRDENS, BOH
|
||
PRIVATE :: COPROD, PAVG, TAVG
|
||
PRIVATE :: NSEAS, NCMSALTS, NCMSLATS
|
||
PRIVATE :: CMSALTS, CMSLATS, AVGOH
|
||
PRIVATE :: FMOL_CH4, CH4_EMIS
|
||
|
||
!=================================================================
|
||
! MODULE VARIABLES
|
||
!=================================================================
|
||
|
||
! Number of CH4 budget types
|
||
INTEGER, PARAMETER :: N_CH4 = 12
|
||
|
||
! Various arrays
|
||
REAL*8, ALLOCATABLE :: BAIRDENS(:,:,:)
|
||
REAL*8, ALLOCATABLE :: BOH(:,:,:,:)
|
||
REAL*8, ALLOCATABLE :: CH4LOSS(:,:,:,:)
|
||
REAL*8, ALLOCATABLE :: COPROD(:,:,:)
|
||
REAL*8, ALLOCATABLE :: PAVG(:,:,:)
|
||
REAL*8, ALLOCATABLE :: TAVG(:,:,:)
|
||
REAL*8, ALLOCATABLE :: TCH4(:,:,:,:)
|
||
|
||
! For Clarisa's Climatological OH
|
||
INTEGER, PARAMETER :: NSEAS = 4
|
||
INTEGER, PARAMETER :: NCMSALTS = 7
|
||
INTEGER, PARAMETER :: NCMSLATS = 24
|
||
|
||
REAL*8 :: CMSALTS(NCMSALTS) =
|
||
& (/ 1000d0, 900d0, 800d0, 700d0, 500d0, 300d0, 200d0 /)
|
||
|
||
REAL*8 :: CMSLATS(NCMSLATS) =
|
||
& (/ 90d0, 84d0, 76d0, 68d0, 60d0, 52d0, 44d0, 36d0,
|
||
& 28d0, 20d0, 12d0, 4d0, -4d0, -12d0, -20d0, -28d0,
|
||
& -36d0, -44d0, -52d0, -60d0, -68d0, -76d0, -84d0, -90d0 /)
|
||
|
||
REAL*8, ALLOCATABLE :: AVGOH(:,:,:)
|
||
|
||
! FMOL_CH4 = kg CH4 / mole CH4
|
||
! XNUMOL_CH4 = molec CH4 / kg CH4
|
||
REAL*8, PARAMETER :: FMOL_CH4 = 16d-3
|
||
REAL*8, PARAMETER :: XNUMOL_CH4 = 6.0221d23 / 16d-3
|
||
|
||
REAL*8, ALLOCATABLE :: CH4_EMIS(:,:,:)
|
||
|
||
REAL*8 :: TROPOCH4
|
||
REAL*8 :: STRATOCH4
|
||
|
||
!=================================================================
|
||
! MODULE ROUTINES -- follow below the "CONTAINS" statement
|
||
!=================================================================
|
||
CONTAINS
|
||
|
||
!------------------------------------------------------------------------------
|
||
|
||
SUBROUTINE CH4_AVGTP
|
||
!
|
||
!******************************************************************************
|
||
! Subroutine CH4_AVGTP gets the 24-h average surface pressure and temperature
|
||
! needed for the CH4 simulation. (jsw, bnd, bmy, 1/16/01, 7/20/04)
|
||
!
|
||
! NOTES:
|
||
! (1 ) Created by Bryan Duncan (1/99). Adapted for CH4 chemistry and
|
||
! placed into module "global_ch4_mod.f" by Bob Yantosca. (bmy, 1/16/01)
|
||
! (2 ) CH4_AVGTP is independent of "CMN_OH", "CMN_CO", and "CMN_CO_BUDGET".
|
||
! (bmy, 1/16/01)
|
||
! (3 ) Removed duplicate definition for NTDT, NMIN (bmy, 11/15/01)
|
||
! (4 ) Removed PS from argument list. Now use P(I,J)+PTOP instead of
|
||
! PS, this ensures that we have consistency between P and AD.
|
||
! (bmy, 4/11/02)
|
||
! (5 ) Removed obsolete code (bmy, 6/27/02)
|
||
! (6 ) Now uses GET_PCENTER from "pressure_mod.f" to return the pressure
|
||
! at the midpoint of the box (I,J,L). Also added parallel DO-loops.
|
||
! Updated comments. (dsa, bdf, bmy, 8/21/02)
|
||
! (7 ) Now reference T from "dao_mod.f". Now reference GEOS_CHEM_STOP from
|
||
! "error_mod.f" (bmy, 10/15/02)
|
||
! (8 ) Removed NTDT, NMIN from the arg list. Now uses functions GET_TS_DYN,
|
||
! GET_TS_CHEM, and GET_ELAPSED_MIN from "time_mod.f" (bmy, 3/27/03)
|
||
! (9 ) Remove reference to CMN, it's not needed (bmy, 7/20/04)
|
||
!******************************************************************************
|
||
!
|
||
! References to F90 modules
|
||
USE DAO_MOD, ONLY : T
|
||
USE ERROR_MOD, ONLY : GEOS_CHEM_STOP
|
||
USE PRESSURE_MOD, ONLY : GET_PCENTER
|
||
USE TIME_MOD, ONLY : GET_TS_DYN, GET_TS_CHEM, GET_ELAPSED_MIN
|
||
USE TIME_MOD, ONLY : GET_NYMD, GET_NHMS, GET_NYMDe
|
||
|
||
# include "CMN_SIZE" ! Size parameters
|
||
|
||
! Local variables
|
||
INTEGER :: NTDT, NMIN
|
||
INTEGER :: I, J, L, NTIMES, MNDT, K, M, N
|
||
INTEGER, SAVE :: NNCOUNT
|
||
INTEGER, SAVE :: NNEW
|
||
REAL*8 :: Ptemp(IIPAR,JJPAR,LLPAR)
|
||
|
||
!=================================================================
|
||
! CH4_AVGTP begins here!
|
||
!=================================================================
|
||
|
||
! Get quantities from "time_mod.f"
|
||
NTDT = GET_TS_DYN() * 60
|
||
NMIN = GET_ELAPSED_MIN()
|
||
MNDT = NTDT / 60
|
||
NTIMES = GET_TS_CHEM() / MNDT
|
||
|
||
! NTIMES is the number of dynamic timesteps in a chem timestep
|
||
! If we're in the first day, NTIMES = NTIMES + 1
|
||
|
||
IF ( NMIN .LE. GET_TS_CHEM() ) NTIMES = NTIMES + 1
|
||
! If we're in the final day, NTIMES = NTIMES - 1
|
||
! It doesn't really matter because CH4 chem is not done at the end of the final day.
|
||
! IF ( GET_NYMD()+1 .eq. GET_NYMDe() ) NTIMES = NTIMES - 1
|
||
|
||
|
||
! At the start of the run...
|
||
IF ( NMIN == 0 ) THEN
|
||
|
||
! Initialize NNEW
|
||
NNEW = 0
|
||
|
||
! Error check -- need chem timestep (1440) to be divisible by
|
||
! dyn timestep
|
||
IF ( mod( GET_TS_CHEM(), MNDT ) /= 0 ) THEN
|
||
WRITE(*,*) ' '
|
||
WRITE(*,*) 'CH4-OH parameterization option (i.e., NSRCX=5)!'
|
||
WRITE(*,*) 'The chemistry time step (i.e., 24 hours) is'
|
||
WRITE(*,*) 'not evenly divisible by the meteorological'
|
||
WRITE(*,*) 'data read-in time step (i.e., 6 hours). This'
|
||
WRITE(*,*) 'will mess up SR avgtp which calculates a 24-'
|
||
WRITE(*,*) 'hour average temperature and pressure to be'
|
||
WRITE(*,*) 'used by SR getinfo.'
|
||
WRITE(*,*) ' '
|
||
CALL GEOS_CHEM_STOP
|
||
ENDIF
|
||
|
||
! If NCHEM < NTDT then stop program.
|
||
IF ( GET_TS_CHEM() < MNDT ) THEN
|
||
WRITE(*,*) ' '
|
||
WRITE(*,*) 'When using the CH4-OH parameterization'
|
||
WRITE(*,*) 'option (i.e., NSRCX=5), take a 24-hour'
|
||
WRITE(*,*) 'time step (i.e., NCHEM=1440 min.) because'
|
||
WRITE(*,*) 'the OH parameterization produces a 24-hour'
|
||
WRITE(*,*) 'average [OH]'
|
||
WRITE(*,*) ' '
|
||
CALL GEOS_CHEM_STOP
|
||
ENDIF
|
||
ENDIF
|
||
|
||
!=================================================================
|
||
! If a new 24-hr period, set Pavg = 0, and reset NNEW, NCOUNT
|
||
!=================================================================
|
||
IF ( NNEW == 0 ) THEN
|
||
Pavg(:,:,:) = 0d0
|
||
Tavg(:,:,:) = 0d0
|
||
NNEW = 1
|
||
NNCOUNT = 0
|
||
ENDIF
|
||
|
||
!=================================================================
|
||
! Archive quantities
|
||
!=================================================================
|
||
!$OMP PARALLEL DO
|
||
!$OMP+DEFAULT( SHARED )
|
||
!$OMP+PRIVATE( I, J, L, PTEMP )
|
||
DO L = 1, LLPAR
|
||
DO J = 1, JJPAR
|
||
DO I = 1, IIPAR
|
||
|
||
! Archive pressure
|
||
Pavg(I,J,L) = Pavg(I,J,L) + GET_PCENTER(I,J,L)
|
||
|
||
! Archive temperature
|
||
Tavg(I,J,L) = Tavg(I,J,L) + T(I,J,L)
|
||
ENDDO
|
||
ENDDO
|
||
ENDDO
|
||
!$OMP END PARALLEL DO
|
||
|
||
!================================================================
|
||
! Keep track to see if at end of NCHEM time step.
|
||
! If so, divide PAVG & TAVG by the number of times archived.
|
||
!=================================================================
|
||
|
||
NNCOUNT = NNCOUNT + 1
|
||
|
||
IF ( NNCOUNT == NTIMES ) THEN
|
||
Pavg(:,:,1:LLPAR) = Pavg(:,:,1:LLPAR) / DBLE( NTIMES )
|
||
Tavg(:,:,1:LLPAR) = Tavg(:,:,1:LLPAR) / DBLE( NTIMES )
|
||
NNEW = 0
|
||
ENDIF
|
||
|
||
! Return to calling program
|
||
END SUBROUTINE CH4_AVGTP
|
||
|
||
!------------------------------------------------------------------------------
|
||
|
||
SUBROUTINE EMISSCH4
|
||
!
|
||
!******************************************************************************
|
||
! Subroutine EMISSCH4 places emissions of CH4 [kg] into the STT array.
|
||
! (jsw, bnd, bey, bmy, 1/16/01, 10/3/05)
|
||
!
|
||
! WARNING: Soil absorption has to be the 11th field in CH4_EMIS
|
||
!
|
||
! NOTES:
|
||
! (1 ) Created by Bryan Duncan (1/99). Adapted for CH4 chemistry by
|
||
! James Wang (7/00). Inserted into module "global_ch4_mod.f"
|
||
! by Bob Yantosca. (bmy, 1/16/01)
|
||
! (2 ) EMISSCH4 is independent of "CMN_OH", "CMN_CO", and "CMN_CO_BUDGET".
|
||
! (bmy, 1/16/01)
|
||
! (3 ) GLOBASEAEMIS, GLOBSEAEMIS are diagnostics by jsw.
|
||
! (4 ) Do not multiply CO emissions by 1.28 anymore (jsw, bmy, 2/12/01)
|
||
! (5 ) Renamed input files to CH4_monthly.geos.{RES} and
|
||
! CH4_aseasonal.geos.{RES}. (bmy, 2/12/01)
|
||
! (6 ) Add reference to "CMN_SETUP" for the DATA_DIR variable (bmy, 2/13/01)
|
||
! (7 ) Removed references to "biofuel_mod.f" and "biomass_mod.f"; these
|
||
! weren't necessary (bmy, 3/20/01)
|
||
! (8 ) Now reference IU_FILE and IOERROR from "file_mod.f". Now use IU_FILE
|
||
! instead of IUNIT as the file unit #. (bmy, 6/27/02)
|
||
! (9 ) Now reference BXHEIGHT and SUNCOS from "dao_mod.f". Remove reference
|
||
! to header file "comtrid.h" -- it's not used. Make FIRSTEMISS a local
|
||
! SAVEd variable. Also use MONTH from "CMN" instead of the variable
|
||
! LMN. (bmy, 11/15/02)
|
||
! (10) Now replace DXYP(JREF)*1d4 with routine GET_AREA_CM2 of "grid_mod.f".
|
||
! Now use function GET_MONTH and GET_TS_EMIS from "time_mod.f".
|
||
! Now use functions GET_XOFFSET and GET_YOFFSET from "grid_mod.f".
|
||
! I0 and J0 are now local variables. (bmy, 3/27/03)
|
||
! (11) Now reference STT from "tracer_mod.f". Now reference DATA_DIR from
|
||
! "directory_mod.f". (bmy, 7/20/04)
|
||
! (12) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)
|
||
! (13) Add non-local PBL capability (ccc, 8/31/09)
|
||
! (14) Add adjoint scaling to all emis subroutines called (kjw, 2/22/10)
|
||
!******************************************************************************
|
||
!
|
||
! References to F90 modules
|
||
USE TIME_MOD, ONLY : ITS_A_NEW_MONTH, ITS_A_NEW_YEAR
|
||
USE TIME_MOD, ONLY : GET_MONTH, GET_YEAR
|
||
USE TIME_MOD, ONLY : GET_TS_EMIS, ITS_A_NEW_DAY
|
||
USE GRID_MOD, ONLY : GET_AREA_CM2, GET_XOFFSET
|
||
USE GRID_MOD, ONLY : GET_YOFFSET
|
||
USE TRACER_MOD, ONLY : STT
|
||
USE LOGICAL_MOD, ONLY : LSPLIT
|
||
USE LOGICAL_MOD, ONLY : LGFED3BB, LDAYBB3
|
||
USE DIAG_MOD, ONLY : AD58
|
||
USE ERROR_MOD, ONLY : GEOS_CHEM_STOP, IT_IS_NAN
|
||
USE TRACER_MOD, ONLY : N_TRACERS, ID_TRACER
|
||
! USE LOGICAL_MOD, ONLY : LWETL, LBMCH4, LRICE
|
||
! USE LOGICAL_MOD, ONLY : LBFCH4
|
||
USE ADJ_ARRAYS_MOD, ONLY : ADCH4EMS, EMS_SF, N_CALC
|
||
USE LOGICAL_ADJ_MOD, ONLY : LADJ, LADJ_EMS
|
||
USE TIME_MOD, ONLY : GET_NYMD, GET_NHMS
|
||
USE LOGICAL_ADJ_MOD, ONLY : LFD_GLOB
|
||
!kjw iterative optimization
|
||
!USE LOGICAL_ADJ_MOD, ONLY : LCH4_ITERATE
|
||
|
||
|
||
! Non-Local PBL mixing scheme is not available in adjoint (kjw, 2/20/2010)
|
||
! USE VDIFF_PRE_MOD, ONLY : EMIS_SAVE ! (ccc, 08/31/09)
|
||
! USE LOGICAL_MOD, ONLY : LNLPBL ! (ccc, 08/31/09)
|
||
|
||
|
||
# include "CMN_SIZE" ! Size parameters
|
||
# include "CMN_DIAG" ! Diagnostic switches
|
||
|
||
! Local Variables
|
||
INTEGER :: I, I0, IREF, J, J0, JREF, N, M
|
||
REAL*8 :: DTSRCE, AREA_CM2
|
||
|
||
! Get nested-grid offsets
|
||
I0 = GET_XOFFSET()
|
||
J0 = GET_YOFFSET()
|
||
|
||
|
||
!===================================================================
|
||
! Emissions are read or calculated at the first of every:
|
||
! 1) Emission time step - Natural Wetlands (from J Kaplan)
|
||
! 2) Month - Biomass Burning and Rice
|
||
! 3) Year - All other sources
|
||
!
|
||
! Emissions are stored at each time step in a 3D array:
|
||
! EMIS_CH4(IIPAR,JJPAR,N).
|
||
! Where N = 1:12
|
||
! 1. Total Emissions (including soil absorption, counted neg.)
|
||
! 2. Oil and Gas Processing
|
||
! 3. Coal Mining
|
||
! 4. Livestock
|
||
! 5. Waste
|
||
! 6. Biofuel
|
||
! 7. Rice
|
||
! 8. Other Anthropogenic
|
||
! 9. Biomass Burning
|
||
! 10. Wetlands
|
||
! 11. Soil Absorption
|
||
! 12. Other Natural
|
||
!
|
||
! Emissions are added to STT array and AD58 (emission diagnostic)
|
||
! at every time step.
|
||
! (kjw, 6/4/09)
|
||
!===================================================================
|
||
|
||
|
||
print*,'% --- ENTERING EMISSCH4!'
|
||
|
||
|
||
! ==================================================================
|
||
! 1) Get Wetland Emissions
|
||
! NOTES: (kjw, 5/28/09)
|
||
! Emissions calculated online every timestep in WETLAND_EMIS.
|
||
! WETLAND_EMIS adapted to GEOS-Chem by Jerome Drevet (3/06)
|
||
! from a wetland methane scheme provided by Jed O. Kaplan
|
||
! See subroutine WETLAND_EMIS for more information
|
||
! ==================================================================
|
||
|
||
|
||
!4.1 Wetland emissions
|
||
CALL WETLAND_EMIS( CH4_EMIS )
|
||
|
||
! ==================================================================
|
||
! 2) Get Daily Varying CH4 Emissions
|
||
! NOTES: (kjw, 9/24/12)
|
||
! Biomass burning emissions from GFED3
|
||
! Can be daily or monthly emissions
|
||
! ==================================================================
|
||
IF ( ( ITS_A_NEW_DAY() .AND. LDAYBB3 ) .OR.
|
||
& ( ITS_A_NEW_MONTH() .AND. LGFED3BB ) ) THEN
|
||
|
||
!4.2 Biomass Burning emissions (CH4_BBN, #9)
|
||
CALL BIOBURN_EMIS( CH4_EMIS )
|
||
|
||
ENDIF
|
||
|
||
! ==================================================================
|
||
! 2) Get Monthly Varying CH4 Emissions
|
||
! NOTES: (kjw, 5/28/09)
|
||
! Biomass burning emissions from GFED2 or GFED3
|
||
! Biomass burning available from 1997-2007 (5/28/09)
|
||
! Rice emissions from EDGAR v4, modified by GEOS soil wetness
|
||
! ==================================================================
|
||
IF ( ITS_A_NEW_MONTH() ) THEN
|
||
|
||
!4.3 Rice emissions (CH4_RIC, #7)
|
||
CALL RICE_EMIS( CH4_EMIS )
|
||
|
||
ENDIF
|
||
|
||
|
||
! ==================================================================
|
||
! 3) Get Aseasonal CH4 Emissions
|
||
! NOTES: (kjw, 5/28/09)
|
||
! Anthropogenic emissions from EDGAR v4 except biofuel
|
||
! emissions which are from Yevich and Logan 2003.
|
||
! Soil absorption from Fung et. al. 1991.
|
||
! Other natural emissions include:
|
||
! termites from Fung et. al. 1991
|
||
! ==================================================================
|
||
|
||
IF ( ITS_A_NEW_YEAR() ) THEN
|
||
|
||
!4.4 Biofuel emissions (CH4_BFL, #6)
|
||
!kjw replace with EDGARv4 biofuels in ASEASONAL_ANTHRO_EMIS
|
||
! (kjw, 11/17/11)
|
||
!CALL BIOFUEL_EMIS( CH4_EMIS )
|
||
|
||
!4.5 Aseasonal Anthropogenic emissions
|
||
! (CH4_OAG, #2; CH4_COL, #3; CH4_LIV, #4; CH4_WST, #5; CH4_OTA, #8)
|
||
CALL ASEASONAL_ANTHRO_EMIS( CH4_EMIS )
|
||
|
||
!4.6 Aseasonal Natural emissions (CH4_SAB, #11; CH4_OTN, #12)
|
||
CALL ASEASONAL_NATURAL_EMIS( CH4_EMIS )
|
||
|
||
ENDIF
|
||
|
||
|
||
! Total emission: sum of all emissions - (2*soil absorption)
|
||
! We have to substract soil absorption twice because it is added
|
||
! to other emissions in the SUM function. (ccc, 7/23/09)
|
||
CH4_EMIS(:,:,1) = 0d0
|
||
CH4_EMIS(:,:,1) = SUM(CH4_EMIS, 3) - (2 * CH4_EMIS(:,:,11))
|
||
|
||
! However, since we don't optimize for soil absorption, don't
|
||
! take it out of total emissions yet. Wait until after EMS_SF scaling
|
||
! to remove soil absorption. So, add soil absorption back to give
|
||
! total emissions (excluding soil absorption)
|
||
CH4_EMIS(:,:,1) = CH4_EMIS(:,:,1) + CH4_EMIS(:,:,11)
|
||
|
||
|
||
! =================================================================
|
||
! Do Adjoint Scaling
|
||
! Remove LCH4_ITERATE for compatibility with v35c
|
||
!IF ( LADJ .AND. (LFD_GLOB .OR. LADJ_EMS .OR. LCH4_ITERATE) ) THEN
|
||
IF ( LADJ .AND. (LFD_GLOB .OR. LADJ_EMS) ) THEN
|
||
|
||
! Determine scale group (temporal)
|
||
M = GET_SCALE_GROUP()
|
||
WRITE(6,*) ' % - Rescale emissions: use SCALE_GROUP ', M
|
||
|
||
! Rescale emissions
|
||
DO J = 1, JJPAR
|
||
DO I = 1, IIPAR
|
||
CH4_EMIS(I,J,1) = CH4_EMIS(I,J,1) * EMS_SF(I,J,M,ADCH4EMS)
|
||
ENDDO
|
||
ENDDO
|
||
|
||
ENDIF
|
||
! =================================================================
|
||
|
||
! Now that we've done the emission factor scaling, add soil absorption
|
||
! back to the total emissions array
|
||
CH4_EMIS(:,:,1) = CH4_EMIS(:,:,1) - CH4_EMIS(:,:,11)
|
||
|
||
|
||
! =================================================================
|
||
! Modify the STT with emissions rates. (kjw, 5/29/09)
|
||
! There are 12 tracers in the multi-tracer run.
|
||
! One tracer for total CH4 and one for each emission category.
|
||
!
|
||
! 1. Total CH4
|
||
! 2. Gas and Oil
|
||
! 3. Coal
|
||
! 4. Livestock
|
||
! 5. Waste
|
||
! 6. Biofuel
|
||
! 7. Rice
|
||
! 8. Other Anthropogenic
|
||
! 9. Biomass Burning
|
||
! 10. Wetlands
|
||
! 11. Soil Absorption
|
||
! 12. Other Natural
|
||
! =================================================================
|
||
|
||
WRITE( 6, '(a)' ) '% EMISSCH4 --- Adding Emissions to STT array.'
|
||
|
||
|
||
! Emission timestep [s]
|
||
DTSRCE = GET_TS_EMIS() * 60d0 !timestep in s.
|
||
|
||
! J0 and I0 are global variables, both set = 0.
|
||
DO J = 1, JJPAR
|
||
JREF = J + J0
|
||
|
||
! Grid box surface area [cm2]
|
||
AREA_CM2 = GET_AREA_CM2( J )
|
||
|
||
DO I = 1, IIPAR
|
||
IREF = I + I0
|
||
|
||
DO N = 1, N_TRACERS
|
||
STT(IREF,JREF,1,N) = STT(IREF,JREF,1,N) +
|
||
& CH4_EMIS(IREF,JREF,ID_TRACER(N))
|
||
& / XNUMOL_CH4 * DTSRCE * AREA_CM2
|
||
ENDDO
|
||
|
||
|
||
IF ( ND58 > 0 ) THEN
|
||
! All emission sources except soil absorption
|
||
AD58(IREF,JREF,1) = AD58(IREF,JREF,1) +
|
||
& ( CH4_EMIS(IREF,JREF,1) + CH4_EMIS(IREF,JREF,11) )
|
||
& / XNUMOL_CH4 * DTSRCE * AREA_CM2
|
||
|
||
DO N = 2, PD58
|
||
AD58(IREF,JREF,N) = AD58(IREF,JREF,N) +
|
||
& CH4_EMIS(IREF,JREF,N)
|
||
& / XNUMOL_CH4 * DTSRCE * AREA_CM2
|
||
ENDDO
|
||
|
||
ENDIF
|
||
|
||
ENDDO
|
||
ENDDO
|
||
|
||
|
||
!===============================================================
|
||
! Sum up CH4 budgets
|
||
!
|
||
! TCH4 - # molecules emitted from different sources
|
||
!===============================================================
|
||
|
||
|
||
DO J = 1,JJPAR
|
||
JREF = J + J0
|
||
|
||
! Grid box surface area [cm2]
|
||
AREA_CM2 = GET_AREA_CM2( J )
|
||
|
||
DO I = 1,IIPAR
|
||
IREF = I + I0
|
||
! Gas, oil, mine
|
||
TCH4(I,J,1,5) = TCH4(I,J,1,5) +
|
||
& ( ( CH4_EMIS(I,J,2) + CH4_EMIS(I,J,3) ) *
|
||
& AREA_CM2 * DTSRCE )
|
||
|
||
! agriculture (rice, animals, waste)
|
||
TCH4(I,J,1,6) = TCH4(I,J,1,6) +
|
||
& ( ( CH4_EMIS(I,J,4) + CH4_EMIS(I,J,7) +
|
||
& CH4_EMIS(I,J,5) ) * AREA_CM2 * DTSRCE )
|
||
|
||
! Biomass burning (and biofuel?)
|
||
TCH4(I,J,1,7) = TCH4(I,J,1,7)+
|
||
& ( ( CH4_EMIS(I,J,9) + CH4_EMIS(I,J,6) ) *
|
||
& AREA_CM2 * DTSRCE )
|
||
|
||
! Termites
|
||
TCH4(I,J,1,8) = TCH4(I,J,1,8)+
|
||
& ( CH4_EMIS(I,J,12) * AREA_CM2 * DTSRCE )
|
||
|
||
! Wetlands
|
||
TCH4(I,J,1,9) = TCH4(I,J,1,9)+
|
||
& ( CH4_EMIS(I,J,10) * AREA_CM2 * DTSRCE )
|
||
|
||
! Soil Absorption
|
||
TCH4(I,J,1,10) = TCH4(I,J,1,10)+
|
||
& ( CH4_EMIS(I,J,11) * AREA_CM2 * DTSRCE )
|
||
|
||
|
||
TCH4(I,J,1,4) = TCH4(I,J,1,4) +
|
||
& ( CH4_EMIS(I,J,1) + ( 2 * CH4_EMIS(IREF,JREF,11) ))
|
||
& * AREA_CM2 * DTSRCE
|
||
|
||
ENDDO
|
||
ENDDO
|
||
|
||
! Return to calling program
|
||
END SUBROUTINE EMISSCH4
|
||
|
||
!------------------------------------------------------------------------------
|
||
|
||
SUBROUTINE WETLAND_EMIS( EMIS3D )
|
||
!
|
||
!******************************************************************************
|
||
! Subroutine WETLAND_CH4 calculates emissions of CH4 [kg] by Wetland.
|
||
!
|
||
! NOTES:
|
||
! (1 ) Adapted by J<>r<EFBFBD>me Drevet (3/06) from the BIOME-TG Wetland-Methane
|
||
! scheme provided by Jed O. Kaplan.
|
||
! (2 ) CH4 Emissions from Wetland depend on:
|
||
! a - Soil Carbon content.
|
||
! b - Vegetation type
|
||
! c - Wetland area (%)
|
||
! d - Soil moisture.
|
||
! a, b, c are taken from the LPJ, a vegetation model. Data are provided
|
||
! by J.O.Kaplan. Soil moisture is read from GEOS Met input files.
|
||
!
|
||
! (3 ) Corrected order of DO loops (bmy, 10/1/09)
|
||
! (4 ) Add adjoint scaling to emissions
|
||
!******************************************************************************
|
||
!
|
||
! References to F90 modules
|
||
USE DAO_MOD, ONLY : GWETTOP, LWI
|
||
USE DAO_MOD, ONLY : TSKIN, TS
|
||
USE DAO_MOD, ONLY : FRLAND, FRLAKE
|
||
USE DAO_MOD, ONLY : FROCEAN, FRLANDIC
|
||
USE BPCH2_MOD, ONLY : GET_RES_EXT, GET_MODELNAME
|
||
USE BPCH2_MOD, ONLY : GET_TAU0, READ_BPCH2
|
||
USE BPCH2_MOD, ONLY : GET_NAME_EXT, GET_NAME_EXT_2D
|
||
USE DIRECTORY_MOD, ONLY : DATA_DIR
|
||
USE FILE_MOD, ONLY : IU_FILE, IOERROR
|
||
USE GRID_MOD, ONLY : GET_AREA_M2
|
||
USE TIME_MOD, ONLY : GET_MONTH, GET_YEAR, GET_TS_EMIS
|
||
USE TIME_MOD, ONLY : ITS_A_NEW_MONTH, ITS_A_NEW_YEAR
|
||
USE TRANSFER_MOD, ONLY : TRANSFER_2D
|
||
USE DIAG_MOD, ONLY : AD60, AD58
|
||
USE TIME_MOD, ONLY : GET_DIRECTION
|
||
|
||
# include "CMN_SIZE" ! Size parameters
|
||
# include "CMN_DIAG" ! Diagnostic switches
|
||
# include "CMN" ! PD58
|
||
|
||
! Arguments
|
||
REAL*8, INTENT(INOUT) :: EMIS3D(IIPAR,JJPAR,PD58)
|
||
|
||
! Local Variables
|
||
INTEGER :: I, J, L
|
||
INTEGER :: GM, YEAR
|
||
REAL*4 :: ARRAY(IIPAR,JJPAR)
|
||
REAL*8 :: WETFRAC(IIPAR,JJPAR)
|
||
REAL*8 :: REALWET(IIPAR,JJPAR)
|
||
REAL*8 :: EFF_GWET(IIPAR,JJPAR)
|
||
REAL*8 :: SOIL_C(IIPAR,JJPAR)
|
||
REAL*8 :: LITTER_C(IIPAR,JJPAR)
|
||
REAL*8 :: litterfast
|
||
REAL*8 :: litterslow
|
||
REAL*8 :: soilfast
|
||
REAL*8 :: soilslow
|
||
REAL*8 :: HETEROR
|
||
REAL*8 :: F_TEMP
|
||
REAL*8 :: MEAN_T(IIPAR,JJPAR)
|
||
REAL*8 :: METHANE_OUT(IIPAR,JJPAR)
|
||
REAL*8 :: XTAU
|
||
REAL*8 :: TROPICNESS
|
||
REAL*8 :: EMIT_TROPIC
|
||
REAL*8 :: EMIT_TEMPER
|
||
REAL*8 :: MOIST_SCALE
|
||
REAL*8 :: EMIT_FACT
|
||
INTEGER :: MONTHDATES(12) = (/ 31, 28, 31, 30,
|
||
& 31, 30, 31, 31,
|
||
& 30, 31, 30, 31 /)
|
||
CHARACTER(LEN=255) :: FILENAME
|
||
CHARACTER(LEN=4) :: CYEAR
|
||
|
||
!=================================================================
|
||
! WETLAND_CH4 begins here!
|
||
!=================================================================
|
||
|
||
!4.10 Wetland emissions
|
||
|
||
!===================================================================
|
||
! Get wetland fraction data
|
||
!===================================================================
|
||
|
||
WRITE( 6, '(a)' ) '% EMISSCH4 --- BEGIN WETLAND_EMIS'
|
||
|
||
|
||
|
||
#if defined( GRID05x0666 ) && defined( NESTED_NA )
|
||
FILENAME = TRIM( DATA_DIR ) // 'CH4_201203/wetlands/' //
|
||
& 'Wetfrac.' // GET_RES_EXT() //
|
||
& '_NA.bpch'
|
||
#else
|
||
FILENAME = TRIM( DATA_DIR ) // 'CH4_201203/wetlands/' //
|
||
& 'Wetfrac.' // GET_RES_EXT() //
|
||
& '.bpch'
|
||
#endif
|
||
|
||
WRITE( 6, 91 ) TRIM ( FILENAME )
|
||
91 FORMAT( ' - WL_CH4: Reading WET-FRAC: ', a )
|
||
CALL FLUSH( 6 )
|
||
|
||
XTAU = GET_TAU0( 1, 1, 2000 )
|
||
|
||
CALL READ_BPCH2( FILENAME, 'WET-FRAC', 1,
|
||
& XTAU, IIPAR, JJPAR,
|
||
& 1, ARRAY, QUIET=.TRUE.)
|
||
|
||
CALL TRANSFER_2D( ARRAY(:,:), WETFRAC(:,:) )
|
||
|
||
! WETFRAC is maximum inundatable area in a box
|
||
WETFRAC = WETFRAC / 100d0
|
||
|
||
|
||
!===================================================================
|
||
! Calculate inundated fraction
|
||
!
|
||
! REALWET calculation is based on maximum inundatable area (WETFRAC)
|
||
! and top soil moisture information
|
||
!
|
||
! NOTE: LWI (land/water/ice flag) definition has changed between
|
||
! GEOS4 and GEOS5. This contributes to the variance between GEOS4
|
||
! and GEOS5 wetland emissions. Below is Jerome Drevet's and Jed
|
||
! Kaplan's original calculation of REALWET using GEOS4 and a
|
||
! modified calculation using GEOS5.
|
||
! (kjw, 6/10/09)
|
||
!===================================================================
|
||
|
||
! REALWET is the actual inundated fraction of a box
|
||
REALWET(:,:) = 0d0
|
||
|
||
! GEOS4 calculation
|
||
#if defined( GEOS_4 )
|
||
DO J = 1, JJPAR
|
||
DO I = 1, IIPAR
|
||
! We don't want emissions in frozen regions
|
||
IF (TSKIN(I,J) > 273) THEN
|
||
! We want emissions from land boxes only
|
||
IF (LWI(I,J) == 1) THEN
|
||
! If wetness>0.1, the wetland fraction is equal
|
||
! to the maximal potential wetland fraction
|
||
IF (GWETTOP(I,J) > 0.1) THEN
|
||
REALWET(I,J) = WETFRAC(I,J)
|
||
ELSE
|
||
REALWET(I,J) = 0.
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
ENDDO
|
||
ENDDO
|
||
|
||
! GEOS5 Calculation
|
||
#elif defined( GEOS_5 ) || defined( GEOS_FP )
|
||
|
||
DO J = 1, JJPAR
|
||
DO I = 1, IIPAR
|
||
! We don't want emissions in frozen regions
|
||
IF (TSKIN(I,J) > 273) THEN
|
||
! We want emissions from any box that contains some land
|
||
! FRLAND is fraction of grid box that is land
|
||
IF (FRLAND(I,J) > 0) THEN
|
||
! Actual wetness of land /= GWETTOP because GWETTOP includes
|
||
! wetness in lakes, ocean, and ice. Below is a scheme to
|
||
! calculate effective GWETTOP of the land fraction
|
||
EFF_GWET(I,J) = ( GWETTOP(I,J) -
|
||
& ( FROCEAN(I,J) + FRLAKE(I,J) + FRLANDIC(I,J) ) )
|
||
& / FRLAND(I,J)
|
||
|
||
! Catch for negative EFF_GWET
|
||
IF ( EFF_GWET(I,J) < 0 ) THEN
|
||
EFF_GWET(I,J) = 0d0
|
||
ENDIF
|
||
|
||
! If wetness>0.1, the wetland fraction is equal
|
||
! to the maximal potential wetland fraction
|
||
IF (EFF_GWET(I,J) > 0.1) THEN
|
||
REALWET(I,J) = WETFRAC(I,J)
|
||
ELSE
|
||
REALWET(I,J) = 0.
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
ENDDO
|
||
ENDDO
|
||
|
||
|
||
#endif
|
||
|
||
GM = GET_MONTH()
|
||
!kjw_adjoint
|
||
! Update Wetland Fraction Diagnostic if in the forward simulation
|
||
IF ( GET_DIRECTION() .EQ. 1 ) THEN
|
||
IF ( ND60 > 0 ) THEN
|
||
AD60(:,:) = AD60(:,:) + REALWET(:,:)/(24d0*MONTHDATES(GM))
|
||
ENDIF
|
||
ENDIF
|
||
!kjw_adjoint
|
||
|
||
!===================================================================
|
||
! Get litter carbon and soil carbon from LPJ DGVM (in gC/m2).
|
||
!===================================================================
|
||
|
||
! Carbon litter and carbon soil files both have tau date of
|
||
! Jan. 1, 2000
|
||
|
||
XTAU = GET_TAU0( 1, 1, 2000 )
|
||
|
||
#if defined( GRID05x0666 ) && defined( NESTED_NA )
|
||
FILENAME = TRIM( DATA_DIR ) // 'CH4_201203/wetlands/' //
|
||
& 'Carbon_litter.' // GET_RES_EXT() //
|
||
& '_NA.bpch'
|
||
#else
|
||
FILENAME = TRIM( DATA_DIR ) // 'CH4_201203/wetlands/' //
|
||
& 'Carbon_litter.' // GET_RES_EXT() //
|
||
& '.bpch'
|
||
#endif
|
||
|
||
CALL READ_BPCH2( FILENAME, 'CO--SRCE', 1,
|
||
& XTAU, IIPAR, JJPAR,
|
||
& 1, ARRAY, QUIET=.TRUE.)
|
||
|
||
CALL TRANSFER_2D( ARRAY, LITTER_C )
|
||
|
||
|
||
|
||
#if defined( GRID05x0666 ) && defined( NESTED_NA )
|
||
FILENAME = TRIM( DATA_DIR ) // 'CH4_201203/wetlands/' //
|
||
& 'Carbon_soil.' // GET_RES_EXT() //
|
||
& '_NA.bpch'
|
||
#else
|
||
FILENAME = TRIM( DATA_DIR ) // 'CH4_201203/wetlands/' //
|
||
& 'Carbon_soil.' // GET_RES_EXT() //
|
||
& '.bpch'
|
||
#endif
|
||
|
||
CALL READ_BPCH2( FILENAME, 'CO--SRCE', 1,
|
||
& XTAU, IIPAR, JJPAR,
|
||
& 1, ARRAY, QUIET=.TRUE.)
|
||
|
||
CALL TRANSFER_2D( ARRAY, SOIL_C )
|
||
|
||
|
||
!===================================================================
|
||
! Get annual mean skin temperature.
|
||
!===================================================================
|
||
|
||
YEAR = GET_YEAR()
|
||
|
||
#if defined( GEOS_5 )
|
||
IF ( YEAR .LT. 2004 ) YEAR = 2004
|
||
IF ( YEAR .GT. 2010 ) YEAR = 2010
|
||
WRITE( CYEAR, '(i4)' ) YEAR
|
||
|
||
FILENAME = TRIM( DATA_DIR ) // 'CH4_201305/wetlands/' //
|
||
& 'TSKIN.' // GET_NAME_EXT() //
|
||
& '.' // GET_RES_EXT() //
|
||
& '.' // CYEAR //
|
||
& '.bpch'
|
||
|
||
#elif defined( GEOS_4 )
|
||
IF ( YEAR .LT. 2000 ) YEAR = 2000
|
||
IF ( YEAR .GT. 2006 ) YEAR = 2006
|
||
WRITE( CYEAR, '(i4)' ) YEAR
|
||
|
||
FILENAME = TRIM( DATA_DIR ) // 'CH4_200911/wetlands/' //
|
||
& 'TSKIN.' // CYEAR //
|
||
& '.' // GET_NAME_EXT() //
|
||
& '.' // GET_RES_EXT()
|
||
#endif
|
||
|
||
#if defined( GRID05x0666 ) && defined( NESTED_NA )
|
||
IF ( YEAR .LT. 2004 ) YEAR = 2004
|
||
IF ( YEAR .GT. 2004 ) YEAR = 2009
|
||
IF ( YEAR .GE. 2010 ) YEAR = 2010
|
||
WRITE( CYEAR, '(i4)' ) YEAR
|
||
|
||
FILENAME = TRIM( DATA_DIR ) // 'CH4_201305/wetlands/' //
|
||
& 'TSKIN.' // GET_NAME_EXT() //
|
||
& '.' // GET_RES_EXT() //
|
||
& '_NA.' // CYEAR //
|
||
& '.bpch'
|
||
#endif
|
||
|
||
XTAU = GET_TAU0( 1, 1, YEAR )
|
||
|
||
CALL READ_BPCH2( FILENAME, 'GMAO-2D', 2,
|
||
& XTAU, IIPAR, JJPAR,
|
||
& 1, ARRAY, QUIET=.TRUE.)
|
||
|
||
CALL TRANSFER_2D( ARRAY, MEAN_T )
|
||
|
||
|
||
!===================================================================
|
||
! Calculate CH4 emissions!
|
||
!===================================================================
|
||
|
||
METHANE_OUT = 0d0
|
||
|
||
DO J = 1, JJPAR
|
||
DO I = 1, IIPAR
|
||
|
||
IF ( tskin(I,J) < 233. ) THEN
|
||
F_TEMP = 0
|
||
ELSE
|
||
F_TEMP = exp(308.56*(1.0/56.02-
|
||
& 1.0/(tskin(I,J)-227.13))) !Lloyd & Taylor 1994
|
||
ENDIF
|
||
|
||
! Calculate Heterotrophic respiration
|
||
litterfast = 0.985 * LITTER_C(i,j)
|
||
litterslow = 0.015 * LITTER_C(i,j)
|
||
soilfast = 0.985 * SOIL_C(i,j)
|
||
soilslow = 0.015 * SOIL_C(i,j)
|
||
|
||
HETEROR = 1e3* F_TEMP *( litterfast*0.3
|
||
& + litterslow*0.05
|
||
& + soilfast*0.03
|
||
& + soilslow*0.001 ) * 0.34 / 12.
|
||
|
||
|
||
! Calculate "tropicness" of each box
|
||
TROPICNESS = exp((MEAN_T(I,J) - 303.15) / 8.)
|
||
IF ( TROPICNESS < 0 ) THEN
|
||
TROPICNESS = 0
|
||
ENDIF
|
||
IF ( TROPICNESS > 1 ) THEN
|
||
TROPICNESS = 1
|
||
ENDIF
|
||
|
||
|
||
EMIT_TROPIC = 0.0
|
||
EMIT_TEMPER = 0.0
|
||
|
||
! (moist_scale can be between 0.07 and 0.14)
|
||
! (emit_fact can be between 0.001 and 0.005)
|
||
! the lines above are comments by Jerome. His paper publishes
|
||
! a value of 0.19 for MOIST_SCALE (kjw, 6/9/09)
|
||
MOIST_SCALE = 0.205
|
||
EMIT_FACT = 0.018
|
||
|
||
EMIT_TROPIC = HETEROR * MOIST_SCALE * REALWET(I,J)
|
||
|
||
EMIT_TEMPER = HETEROR * EMIT_FACT * REALWET(I,J)
|
||
|
||
METHANE_OUT(I,J) = TROPICNESS * EMIT_TROPIC +
|
||
& (1 - TROPICNESS) * EMIT_TEMPER !gCH4/m2/mth
|
||
|
||
IF (METHANE_OUT(I,J) < 0 ) THEN
|
||
METHANE_OUT(I,J)=0
|
||
ENDIF
|
||
|
||
ENDDO
|
||
ENDDO
|
||
|
||
|
||
! METHANE_OUT: g/m2/y --> molec/cm2/s
|
||
METHANE_OUT = METHANE_OUT/16d0/1e4/(24d0*MONTHDATES(GM)*3.6e3)
|
||
& * 6.023e23
|
||
|
||
EMIS3D(:,:,10) = METHANE_OUT
|
||
|
||
|
||
! Return to calling program
|
||
END SUBROUTINE WETLAND_EMIS
|
||
|
||
|
||
!------------------------------------------------------------------------------
|
||
|
||
SUBROUTINE BIOBURN_EMIS( EMIS3D )
|
||
!
|
||
!******************************************************************************
|
||
! Subroutine BIOBURN_EMIS calculates CH4 emissions from GFED2 or GFED3 biomass
|
||
! burning. (kjw, 6/03/09)
|
||
!
|
||
! NOTES:
|
||
!
|
||
!******************************************************************************
|
||
!
|
||
! References to F90 modules
|
||
USE BIOMASS_MOD, ONLY : BIOMASS, IDBCH4
|
||
USE LOGICAL_MOD, ONLY : LGFED2BB, LGFED3BB
|
||
|
||
# include "CMN_SIZE" ! Size parameters
|
||
# include "CMN_DIAG" ! Diagnostic switches
|
||
# include "CMN" ! PD58
|
||
|
||
! Arguments
|
||
REAL*8, INTENT(INOUT) :: EMIS3D(IIPAR,JJPAR,PD58)
|
||
|
||
! Local Variables
|
||
REAL*8 :: E_CH4
|
||
INTEGER :: I, J
|
||
|
||
WRITE( 6, '(a)' ) '% EMISSCH4 --- BEGIN BIOBURN_EMIS'
|
||
|
||
!=================================================================
|
||
! BIOBURN_EMIS begins here!
|
||
!=================================================================
|
||
|
||
!4.9 Biomass Burning emissions. Calculate emissions from monthly
|
||
! GFED-2 or GFED-3.
|
||
IF ( LGFED2BB .OR. LGFED3BB ) THEN
|
||
DO I=1,IIPAR
|
||
DO J=1,JJPAR
|
||
! Biomass burning emissions [molec/cm2/s]
|
||
E_CH4 = BIOMASS( I,J,IDBCH4 )
|
||
|
||
! Place into CH4_EMIS array
|
||
CH4_EMIS(I,J,9) = E_CH4
|
||
|
||
ENDDO
|
||
ENDDO
|
||
ENDIF
|
||
|
||
! Return to calling program
|
||
END SUBROUTINE BIOBURN_EMIS
|
||
|
||
|
||
!------------------------------------------------------------------------------
|
||
|
||
SUBROUTINE RICE_EMIS( EMIS3D )
|
||
!
|
||
!******************************************************************************
|
||
! Subroutine RICE_EMIS calculates CH4 emissions from rice and places CH4 [kg]
|
||
! into the STT array. (kjw, 6/03/09)
|
||
!
|
||
! Rice Emissions are scaled to GEOS soil wetness. Scaling sceme developed
|
||
! and implemented by Jerome Drevet.
|
||
! Wetland emissions are modified by the presence of rice emissions. Sceme
|
||
! developed by Jerome Drevet.
|
||
!
|
||
! NOTES:
|
||
! (1 ) CH4 emissions from rice calculated with a routine created by Jerome
|
||
! Drevet. Adapted as its own subroutine by Kevin Wecht (6/03/09)
|
||
! (2 ) Corrected ordering of DO loops (bmy, 10/1/09)
|
||
!******************************************************************************
|
||
!
|
||
! References to F90 modules
|
||
USE BPCH2_MOD, ONLY : GET_RES_EXT, GET_MODELNAME
|
||
USE BPCH2_MOD, ONLY : GET_TAU0, READ_BPCH2
|
||
USE BPCH2_MOD, ONLY : GET_NAME_EXT, GET_NAME_EXT_2D
|
||
USE DIRECTORY_MOD, ONLY : DATA_DIR
|
||
USE GRID_MOD, ONLY : GET_AREA_CM2
|
||
USE TIME_MOD, ONLY : GET_MONTH, GET_YEAR
|
||
USE LOGICAL_MOD, ONLY : LSPLIT
|
||
USE TRANSFER_MOD, ONLY : TRANSFER_2D
|
||
|
||
# include "CMN_SIZE" ! Size parameters
|
||
# include "CMN_DIAG" ! Diagnostic switches
|
||
# include "CMN" ! PD58
|
||
|
||
! Arguments
|
||
REAL*8, INTENT(INOUT) :: EMIS3D(IIPAR,JJPAR,PD58)
|
||
|
||
! Local Variables
|
||
INTEGER :: I,J,M,YEAR
|
||
REAL*4 :: scale
|
||
REAL*4 :: ARRAY(IIPAR,JJPAR)
|
||
REAL*8 :: DTSRCE, AREA_CM2
|
||
REAL*8 :: MEAN_GWETTOP(IIPAR,JJPAR)
|
||
REAL*8 :: MONTH_GWETTOP(IIPAR,JJPAR)
|
||
REAL*8 :: wet_ratio
|
||
REAL*8 :: XTAU
|
||
REAL*8 :: RICE_OUT(IIPAR,JJPAR)
|
||
REAL*8 :: WETL_OUT(IIPAR,JJPAR)
|
||
CHARACTER(LEN=255) :: FILENAME
|
||
CHARACTER(LEN=4) :: CYEAR
|
||
|
||
|
||
WRITE( 6, '(a)' ) '% EMISSCH4 --- BEGIN RICE_EMIS'
|
||
|
||
!=================================================================
|
||
! RICE_EMIS begins here!
|
||
!=================================================================
|
||
|
||
!4.7 Rice Emissions
|
||
! For now, we only have emissions from 2004.
|
||
|
||
WRITE( CYEAR, '(i4)' ) GET_YEAR()
|
||
XTAU = GET_TAU0( 1, 1, GET_YEAR() )
|
||
|
||
IF ( GET_YEAR() .LT. 2004 ) THEN
|
||
CYEAR='2004'
|
||
XTAU = GET_TAU0( 1, 1, 2004 )
|
||
ENDIF
|
||
IF ( GET_YEAR() .GT. 2008 ) THEN
|
||
CYEAR='2008'
|
||
XTAU = GET_TAU0( 1, 1, 2008 )
|
||
ENDIF
|
||
|
||
! Read Rice Emissions
|
||
#if defined( GRID05x0666 ) && defined( NESTED_NA )
|
||
FILENAME = TRIM( DATA_DIR ) // 'CH4_201305/' //
|
||
& 'rice.' // GET_RES_EXT() //
|
||
& '_NA.' // CYEAR //
|
||
& '.bpch'
|
||
#else
|
||
FILENAME = TRIM( DATA_DIR ) // 'CH4_201305/' //
|
||
& 'rice.' // GET_RES_EXT() //
|
||
& '.' // CYEAR //
|
||
& '.bpch'
|
||
#endif
|
||
|
||
CALL READ_BPCH2( FILENAME, 'CH4-EMIS', 1,
|
||
& XTAU, IIPAR, JJPAR,
|
||
& 1, ARRAY, QUIET=.TRUE.)
|
||
CALL TRANSFER_2D( ARRAY, RICE_OUT )
|
||
|
||
! Reset CYEAR to current year
|
||
WRITE( CYEAR, '(i4)' ) GET_YEAR()
|
||
|
||
! Get annual and monthly mean soil wetness from GEOS
|
||
! One file contains both monthly and annual mean GWETTOP
|
||
YEAR = GET_YEAR()
|
||
#if defined( GEOS_5 )
|
||
IF ( YEAR .LT. 2004 ) YEAR = 2004
|
||
IF ( YEAR .GT. 2010 ) YEAR = 2010
|
||
WRITE( CYEAR, '(i4)' ) YEAR
|
||
|
||
FILENAME = TRIM( DATA_DIR ) // 'CH4_201305/wetlands/' //
|
||
& 'GWETTOP.' // GET_NAME_EXT() //
|
||
& '.' // GET_RES_EXT() //
|
||
& '.' // CYEAR //
|
||
& '.bpch'
|
||
|
||
#elif defined( GEOS_4 )
|
||
IF ( YEAR .LT. 2000 ) YEAR = 2000
|
||
IF ( YEAR .GT. 2006 ) YEAR = 2006
|
||
WRITE( CYEAR, '(i4)' ) YEAR
|
||
|
||
FILENAME = TRIM( DATA_DIR ) // 'CH4_200911/GWETTOP/' //
|
||
& 'GWETTOP.' // CYEAR //
|
||
& '.' // GET_NAME_EXT() //
|
||
& '.' // GET_RES_EXT()
|
||
#endif
|
||
|
||
#if defined( GRID05x0666 ) && defined( NESTED_NA )
|
||
IF ( YEAR .LT. 2004 ) YEAR = 2004
|
||
IF ( YEAR .GT. 2004 ) YEAR = 2009
|
||
IF ( YEAR .GE. 2010 ) YEAR = 2010
|
||
WRITE( CYEAR, '(i4)' ) YEAR
|
||
|
||
FILENAME = TRIM( DATA_DIR ) // 'CH4_201305/wetlands/' //
|
||
& 'GWETTOP.' // GET_NAME_EXT() //
|
||
& '.' // GET_RES_EXT() //
|
||
& '_NA.' // CYEAR //
|
||
& '.bpch'
|
||
#endif
|
||
|
||
! Annual mean GWETTOP
|
||
XTAU = GET_TAU0( 1, 1, YEAR )
|
||
CALL READ_BPCH2( FILENAME, 'GMAO-2D', 2,
|
||
& XTAU, IIPAR, JJPAR,
|
||
& 1, ARRAY, QUIET=.TRUE.)
|
||
CALL TRANSFER_2D( ARRAY, MEAN_GWETTOP )
|
||
|
||
! Monthly mean GWETTOP
|
||
XTAU = GET_TAU0( GET_MONTH(), 1, YEAR )
|
||
CALL READ_BPCH2( FILENAME, 'GMAO-2D', 1,
|
||
& XTAU, IIPAR, JJPAR,
|
||
& 1, ARRAY, QUIET=.TRUE.)
|
||
CALL TRANSFER_2D( ARRAY, MONTH_GWETTOP )
|
||
|
||
!scale rice emissions (by Jerome Drevet)
|
||
DO J = 1, JJPAR
|
||
DO I = 1, IIPAR
|
||
wet_ratio = MONTH_GWETTOP(I,J)/MEAN_GWETTOP(I,J)-1
|
||
wet_ratio = wet_ratio * 2.
|
||
wet_ratio = wet_ratio +1.
|
||
if (wet_ratio < 0) wet_ratio = 0
|
||
RICE_OUT(I,J)=RICE_OUT(I,J)*wet_ratio
|
||
ENDDO
|
||
ENDDO
|
||
|
||
! Set Wetland Emissions during this time step to WETL_OUT array
|
||
WETL_OUT = EMIS3D(:,:,10)
|
||
|
||
! Subtract rice contribution from wetland source since wetland maps
|
||
! used count rice paddies in their area (I think). (kjw, 2,20,2010)
|
||
DO J = 1, JJPAR
|
||
DO I = 1, IIPAR
|
||
if (RICE_OUT(I,J) > 0) THEN ! If rice > 0
|
||
if (WETL_OUT(I,J) > 0) THEN ! If wtl > 0
|
||
if (WETL_OUT(I,J) > RICE_OUT(I,J)) THEN
|
||
WETL_OUT(I,J) = WETL_OUT(I,J) - RICE_OUT(I,J)
|
||
endif
|
||
endif
|
||
endif
|
||
enddo
|
||
enddo
|
||
|
||
|
||
EMIS3D(:,:,7) = RICE_OUT
|
||
|
||
|
||
! Return to calling program
|
||
END SUBROUTINE RICE_EMIS
|
||
|
||
|
||
!------------------------------------------------------------------------------
|
||
!
|
||
! SUBROUTINE BIOFUEL_EMIS( EMIS3D )
|
||
!!
|
||
!!******************************************************************************
|
||
!! Subroutine BIOFUEL_EMIS calculates CH4 emissions from anthropogenic
|
||
!! biofuels in the Yevich and Logan 2003 inventory (kjw, 6/03/09)
|
||
!!
|
||
!! CO Emissions are read from the inventory of Yevich and Logan 2003.
|
||
!! CH4 Emissions are calculated from emission factors in
|
||
!! Andreae and Merlet, 2001 (6/4/09).
|
||
!!
|
||
!! NOTES:
|
||
!!
|
||
!!******************************************************************************
|
||
!!
|
||
! ! References to F90 modules
|
||
! USE BPCH2_MOD, ONLY : READ_BPCH2, GET_TAU0
|
||
! USE BPCH2_MOD, ONLY : GET_RES_EXT
|
||
! USE DIRECTORY_MOD, ONLY : DATA_DIR
|
||
! USE GRID_MOD, ONLY : GET_AREA_CM2
|
||
! USE TIME_MOD, ONLY : GET_MONTH, GET_YEAR
|
||
! USE TIME_MOD, ONLY : EXPAND_DATE
|
||
! USE TRANSFER_MOD, ONLY : TRANSFER_2D
|
||
!
|
||
!
|
||
!# include "CMN_SIZE" ! Size parameters
|
||
!# include "CMN_DIAG" ! Diagnostic switches
|
||
!# include "CMN" ! PD58
|
||
!
|
||
! ! Arguments
|
||
! REAL*8, INTENT(INOUT) :: EMIS3D(IIPAR,JJPAR,PD58)
|
||
!
|
||
! ! Local Variables
|
||
! INTEGER :: I, J, YYYY
|
||
! REAL*4 :: ARRAY(IIPAR,JJPAR)
|
||
! REAL*8 :: BIOF_OUT(IIPAR,JJPAR)
|
||
! REAL*8 :: AREA_CM2
|
||
! REAL*8 :: TAU0, TAU1, SECONDS
|
||
! CHARACTER(LEN=255) :: FILENAME
|
||
!
|
||
!
|
||
! WRITE( 6, '(a)' ) '% EMISSCH4 --- BEGIN BIOFUEL_EMIS'
|
||
!
|
||
! !=================================================================
|
||
! ! BIOFUEL_EMIS begins here!
|
||
! !=================================================================
|
||
!
|
||
! !4.6 Biofuel emissions
|
||
!
|
||
! !=================================================================
|
||
! ! Read monthly biofuel emissions [kgCO/box/year]
|
||
! !=================================================================
|
||
!
|
||
! !TAU value for biofuel bpch files in data directory
|
||
! TAU0 = GET_TAU0( 1, 1, 1985 )
|
||
!
|
||
! ! File name with GFED2 C emissions
|
||
! FILENAME = TRIM( DATA_DIR ) // 'biofuel_200202/biofuel.geos.' //
|
||
! & GET_RES_EXT()
|
||
!
|
||
! ! Read CO Biofuel emissions [kg/box/year]
|
||
! CALL READ_BPCH2( FILENAME, 'BIOFSRCE', 4,
|
||
! & TAU0, IIPAR, JJPAR,
|
||
! & 1, ARRAY, QUIET=.TRUE. )
|
||
! CALL TRANSFER_2D( ARRAY, BIOF_OUT )
|
||
!
|
||
! !=================================================================
|
||
! ! Convert [kgCO/box/year] to [molecCH4/cm2/s]
|
||
! !=================================================================
|
||
!
|
||
! ! [kgCO/box/year] --> [kgCO/cm2/year]
|
||
! DO J = 1, JJPAR
|
||
! AREA_CM2 = GET_AREA_CM2( J )
|
||
! BIOF_OUT(:,J) = BIOF_OUT(:,J) / AREA_CM2
|
||
! ENDDO
|
||
!
|
||
! ! [kgCO/cm2/year] --> [kgCO/cm2/s]
|
||
! YYYY = GET_YEAR()
|
||
! TAU0 = GET_TAU0(1, 1, YYYY)
|
||
! YYYY = YYYY + 1
|
||
! TAU1 = GET_TAU0(1, 1, YYYY)
|
||
! SECONDS = ( TAU1 - TAU0 ) * 3600d0 ! # seconds in the current year
|
||
! BIOF_OUT = BIOF_OUT / SECONDS
|
||
!
|
||
! ! [kgCO/cm2/s] --> [kgCH4/cm2/s]
|
||
! BIOF_OUT = BIOF_OUT * 61d-1 / 78d0 ! Andreae and Merlet 2001
|
||
!
|
||
! ! [kgCH4/cm2/s] --> [molecCH4/cm2/s]
|
||
! BIOF_OUT = BIOF_OUT * XNUMOL_CH4
|
||
!
|
||
!
|
||
!
|
||
! EMIS3D(:,:,6) = BIOF_OUT
|
||
!
|
||
!
|
||
! ! Return to calling program
|
||
! END SUBROUTINE BIOFUEL_EMIS
|
||
!
|
||
!
|
||
!------------------------------------------------------------------------------
|
||
|
||
SUBROUTINE ASEASONAL_ANTHRO_EMIS( EMIS3D )
|
||
!
|
||
!******************************************************************************
|
||
!
|
||
! Subroutine ASEASONAL_ANTHRO_EMIS reads CH4 emissions from anthropogenic
|
||
! sources. (kjw, 6/03/09)
|
||
!
|
||
! Aseasonal anthropogenic emissions currently include EDGAR v4 categories
|
||
! that are not called in their own subroutines. Current emission categories
|
||
! read in this subroutine are: gas & oil, coal, livestock, waste, and other
|
||
! anthropogenic sources.
|
||
!
|
||
! NOTES:
|
||
! (1 )
|
||
!
|
||
!******************************************************************************
|
||
|
||
! References to F90 modules
|
||
USE BPCH2_MOD, ONLY : GET_RES_EXT, GET_MODELNAME
|
||
USE BPCH2_MOD, ONLY : GET_NAME_EXT_2D
|
||
USE BPCH2_MOD, ONLY : GET_TAU0, READ_BPCH2
|
||
USE DIRECTORY_MOD, ONLY : DATA_DIR
|
||
USE TIME_MOD, ONLY : GET_YEAR
|
||
USE TRANSFER_MOD, ONLY : TRANSFER_2D
|
||
!USE LOGICAL_MOD, ONLY : LGAO, LCOL, LLIV
|
||
!USE LOGICAL_MOD, ONLY : LWAST, LOTANT
|
||
|
||
|
||
# include "CMN_SIZE" ! Size parameters
|
||
# include "CMN_DIAG" ! Diagnostic switches
|
||
# include "CMN" ! PD58
|
||
|
||
! Arguments
|
||
REAL*8, INTENT(INOUT) :: EMIS3D(IIPAR,JJPAR,PD58)
|
||
|
||
! Local Variables
|
||
REAL*4 :: ARRAY(IIPAR,JJPAR)
|
||
REAL*8 :: XTAU
|
||
REAL*8 :: COAL_OUT(IIPAR,JJPAR)
|
||
REAL*8 :: GAO_OUT(IIPAR,JJPAR)
|
||
REAL*8 :: WST_OUT(IIPAR,JJPAR)
|
||
REAL*8 :: LIV_OUT(IIPAR,JJPAR)
|
||
REAL*8 :: OTH_OUT(IIPAR,JJPAR)
|
||
REAL*8 :: BFL_OUT(IIPAR,JJPAR)
|
||
CHARACTER(LEN=255) :: FILENAME
|
||
CHARACTER(LEN=4 ) :: CYEAR
|
||
|
||
|
||
WRITE( 6, '(a)' ) '% EMISSCH4 --- BEGIN ASEASONAL_ANTHRO_EMIS'
|
||
|
||
!=================================================================
|
||
! ASEASONAL_ANTHRO_EMIS begins here!
|
||
!=================================================================
|
||
|
||
|
||
! For now, we only have emissions from 2004
|
||
WRITE( CYEAR, '(i4)' ) GET_YEAR()
|
||
XTAU = GET_TAU0( 1, 1, GET_YEAR() )
|
||
|
||
IF ( GET_YEAR() .LT. 2004 ) THEN
|
||
CYEAR='2004'
|
||
XTAU = GET_TAU0( 1, 1, 2004 )
|
||
ENDIF
|
||
IF ( GET_YEAR() .GT. 2008 ) THEN
|
||
CYEAR='2008'
|
||
XTAU = GET_TAU0( 1, 1, 2008 )
|
||
ENDIF
|
||
|
||
!4.2 Gas and Oil emissions
|
||
!IF ( LGAO ) THEN
|
||
#if defined( GRID05x0666 ) && defined( NESTED_NA )
|
||
FILENAME = TRIM( DATA_DIR ) // 'CH4_201305/' //
|
||
& 'oil_gas.' // GET_RES_EXT() //
|
||
& '_NA.' // CYEAR //
|
||
& '.bpch'
|
||
#else
|
||
FILENAME = TRIM( DATA_DIR ) // 'CH4_201305/' //
|
||
& 'oil_gas.' // GET_RES_EXT() //
|
||
& '.' // CYEAR //
|
||
& '.bpch'
|
||
#endif
|
||
|
||
CALL READ_BPCH2( FILENAME, 'CH4-EMIS', 1,
|
||
& XTAU, IIPAR, JJPAR,
|
||
& 1, ARRAY, QUIET=.TRUE.)
|
||
CALL TRANSFER_2D( ARRAY, GAO_OUT )
|
||
!ENDIF
|
||
|
||
!4.3 Coal Mine emissions
|
||
!IF ( LCOL ) THEN
|
||
#if defined( GRID05x0666 ) && defined( NESTED_NA )
|
||
FILENAME = TRIM( DATA_DIR ) // 'CH4_201305/' //
|
||
& 'coal.' // GET_RES_EXT() //
|
||
& '_NA.' // CYEAR //
|
||
& '.bpch'
|
||
#else
|
||
FILENAME = TRIM( DATA_DIR ) // 'CH4_201305/' //
|
||
& 'coal.' // GET_RES_EXT() //
|
||
& '.' // CYEAR //
|
||
& '.bpch'
|
||
#endif
|
||
|
||
CALL READ_BPCH2( FILENAME, 'CH4-EMIS', 1,
|
||
& XTAU, IIPAR, JJPAR,
|
||
& 1, ARRAY, QUIET=.TRUE.)
|
||
CALL TRANSFER_2D( ARRAY, COAL_OUT )
|
||
!ENDIF
|
||
|
||
!4.4 Livestock emissions
|
||
!IF ( LLIV ) THEN
|
||
#if defined( GRID05x0666 ) && defined( NESTED_NA )
|
||
FILENAME = TRIM( DATA_DIR ) // 'CH4_201305/' //
|
||
& 'livestock.' // GET_RES_EXT() //
|
||
& '_NA.' // CYEAR //
|
||
& '.bpch'
|
||
#else
|
||
FILENAME = TRIM( DATA_DIR ) // 'CH4_201305/' //
|
||
& 'livestock.' // GET_RES_EXT() //
|
||
& '.' // CYEAR //
|
||
& '.bpch'
|
||
#endif
|
||
|
||
CALL READ_BPCH2( FILENAME, 'CH4-EMIS', 1,
|
||
& XTAU, IIPAR, JJPAR,
|
||
& 1, ARRAY, QUIET=.TRUE.)
|
||
CALL TRANSFER_2D( ARRAY, LIV_OUT )
|
||
!ENDIF
|
||
|
||
|
||
!4.5 Waste emissions
|
||
!IF ( LWAST ) THEN
|
||
#if defined( GRID05x0666 ) && defined( NESTED_NA )
|
||
FILENAME = TRIM( DATA_DIR ) // 'CH4_201305/' //
|
||
& 'waste.' // GET_RES_EXT() //
|
||
& '_NA.' // CYEAR //
|
||
& '.bpch'
|
||
#else
|
||
FILENAME = TRIM( DATA_DIR ) // 'CH4_201305/' //
|
||
& 'waste.' // GET_RES_EXT() //
|
||
& '.' // CYEAR //
|
||
& '.bpch'
|
||
#endif
|
||
|
||
CALL READ_BPCH2( FILENAME, 'CH4-EMIS', 1,
|
||
& XTAU, IIPAR, JJPAR,
|
||
& 1, ARRAY, QUIET=.TRUE.)
|
||
CALL TRANSFER_2D( ARRAY, WST_OUT )
|
||
!ENDIF
|
||
|
||
!4.6 Biofuel emissions
|
||
!IF ( LBFCH4 ) THEN
|
||
#if defined( GRID05x0666 ) && defined( NESTED_NA )
|
||
FILENAME = TRIM( DATA_DIR ) // 'CH4_201305/' //
|
||
& 'resident.' // GET_RES_EXT() //
|
||
& '_NA.' // CYEAR //
|
||
& '.bpch'
|
||
#else
|
||
FILENAME = TRIM( DATA_DIR ) // 'CH4_201305/' //
|
||
& 'resident.' // GET_RES_EXT() //
|
||
& '.' // CYEAR //
|
||
& '.bpch'
|
||
#endif
|
||
|
||
CALL READ_BPCH2( TRIM(FILENAME), 'CH4-EMIS', 1,
|
||
& XTAU, IIPAR, JJPAR,
|
||
& 1, ARRAY, QUIET=.TRUE.)
|
||
|
||
CALL TRANSFER_2D( ARRAY, BFL_OUT )
|
||
!ENDIF
|
||
|
||
!4.8 Other Anthropogenic Emissions
|
||
!IF ( LOTANT ) THEN
|
||
#if defined( GRID05x0666 ) && defined( NESTED_NA )
|
||
FILENAME = TRIM( DATA_DIR ) // 'CH4_201305/' //
|
||
& 'other.' // GET_RES_EXT() //
|
||
& '_NA.' // CYEAR //
|
||
& '.bpch'
|
||
#else
|
||
FILENAME = TRIM( DATA_DIR ) // 'CH4_201305/' //
|
||
& 'other.' // GET_RES_EXT() //
|
||
& '.' // CYEAR //
|
||
& '.bpch'
|
||
#endif
|
||
|
||
CALL READ_BPCH2( FILENAME, 'CH4-EMIS', 1,
|
||
& XTAU, IIPAR, JJPAR,
|
||
& 1, ARRAY, QUIET=.TRUE.)
|
||
CALL TRANSFER_2D( ARRAY, OTH_OUT )
|
||
!ENDIF
|
||
|
||
|
||
! Add emissions to EMIS3D array
|
||
EMIS3D(:,:,2) = GAO_OUT(:,:)
|
||
EMIS3D(:,:,3) = COAL_OUT(:,:)
|
||
EMIS3D(:,:,4) = LIV_OUT(:,:)
|
||
EMIS3D(:,:,5) = WST_OUT(:,:)
|
||
EMIS3D(:,:,6) = BFL_OUT(:,:)
|
||
EMIS3D(:,:,8) = OTH_OUT(:,:)
|
||
|
||
! Return to calling program
|
||
END SUBROUTINE ASEASONAL_ANTHRO_EMIS
|
||
|
||
|
||
!------------------------------------------------------------------------------
|
||
|
||
SUBROUTINE ASEASONAL_NATURAL_EMIS( EMIS3D )
|
||
!
|
||
!******************************************************************************
|
||
! Subroutine ASEASONAL_NATURAL_EMIS reads CH4 emissions from natural sources.
|
||
! (kjw, 6/03/09)
|
||
!
|
||
! Aseasonal natural emissions currently include termites (Fung et. al. 1991)
|
||
! and soil absorption (Fung et. al. 1991). Future additions may include
|
||
! emissions from permafrost, clathrates, thermokarst lakes, or
|
||
! geothermal vents.
|
||
!
|
||
! NOTES:
|
||
!******************************************************************************
|
||
!
|
||
! References to F90 modules
|
||
USE BPCH2_MOD, ONLY : GET_RES_EXT, GET_MODELNAME
|
||
USE BPCH2_MOD, ONLY : GET_NAME_EXT_2D
|
||
USE BPCH2_MOD, ONLY : GET_TAU0, READ_BPCH2
|
||
USE DIRECTORY_MOD, ONLY : DATA_DIR
|
||
USE TIME_MOD, ONLY : GET_YEAR
|
||
USE TRANSFER_MOD, ONLY : TRANSFER_2D
|
||
!USE LOGICAL_MOD, ONLY : LSOABS, LOTNAT
|
||
|
||
# include "CMN_SIZE" ! Size parameters
|
||
# include "CMN_DIAG" ! Diagnostic switches
|
||
# include "CMN" ! PD58
|
||
|
||
! Arguments
|
||
REAL*8, INTENT(INOUT) :: EMIS3D(IIPAR,JJPAR,PD58)
|
||
|
||
! Local Variables
|
||
REAL*4 :: ARRAY(IIPAR,JJPAR)
|
||
REAL*8 :: SOIL_OUT(IIPAR,JJPAR)
|
||
REAL*8 :: OTH_OUT(IIPAR,JJPAR)
|
||
REAL*8 :: XTAU
|
||
CHARACTER(LEN=255) :: FILENAME
|
||
CHARACTER(LEN=4 ) :: CYEAR
|
||
|
||
|
||
WRITE( 6, '(a)' ) '% EMISSCH4 --- BEGIN ASEASONAL_NATURAL_EMIS'
|
||
|
||
!=================================================================
|
||
! ASEASONAL_NATURAL_EMIS begins here!
|
||
!=================================================================
|
||
|
||
|
||
! We only have one year of soil absorption and other natural
|
||
! CH4 emissions. These have the date Jan . 1, 1985
|
||
XTAU = GET_TAU0( 1, 1, 1985 )
|
||
|
||
!4.11 Soil Absorption
|
||
!IF ( LSOABS ) THEN
|
||
#if defined( GRID05x0666 ) && defined( NESTED_NA )
|
||
FILENAME = TRIM( DATA_DIR ) // 'CH4_201203/' //
|
||
& 'soilabs.' // GET_RES_EXT() //
|
||
& '_NA.bpch'
|
||
#else
|
||
FILENAME = TRIM( DATA_DIR ) // 'CH4_200911/' //
|
||
& 'soilabs.' // GET_NAME_EXT_2D() //
|
||
& '.' // GET_RES_EXT()
|
||
#endif
|
||
|
||
CALL READ_BPCH2( FILENAME, 'CH4-EMIS', 1,
|
||
& XTAU, IIPAR, JJPAR,
|
||
& 1, ARRAY, QUIET=.TRUE.)
|
||
CALL TRANSFER_2D( ARRAY, SOIL_OUT )
|
||
!ENDIF
|
||
|
||
!4.12 Other Natural Emissions
|
||
!IF ( LOTNAT ) THEN
|
||
#if defined( GRID05x0666 ) && defined( NESTED_NA )
|
||
FILENAME = TRIM( DATA_DIR ) // 'CH4_201203/' //
|
||
& 'termites.' // GET_RES_EXT() //
|
||
& '_NA.bpch'
|
||
#else
|
||
FILENAME = TRIM( DATA_DIR ) // 'CH4_200911/' //
|
||
& 'termites.' // GET_NAME_EXT_2D() //
|
||
& '.' // GET_RES_EXT()
|
||
#endif
|
||
|
||
CALL READ_BPCH2( FILENAME, 'CH4-EMIS', 1,
|
||
& XTAU, IIPAR, JJPAR,
|
||
& 1, ARRAY, QUIET=.TRUE.)
|
||
CALL TRANSFER_2D( ARRAY, OTH_OUT )
|
||
!ENDIF
|
||
|
||
|
||
! Add emissions to array
|
||
EMIS3D(:,:,11) = SOIL_OUT
|
||
EMIS3D(:,:,12) = OTH_OUT
|
||
|
||
|
||
! Return to calling program
|
||
END SUBROUTINE ASEASONAL_NATURAL_EMIS
|
||
|
||
|
||
!------------------------------------------------------------------------------
|
||
|
||
SUBROUTINE CHEMCH4
|
||
!
|
||
!******************************************************************************
|
||
! Subroutine CHEMCH4 computes the chemical loss of CH4 (sources - sinks).
|
||
! (jsw, bnd, bmy, 6/8/00, 10/3/05)
|
||
!
|
||
! CH4 SOURCES
|
||
! ============================================================================
|
||
! (1 ) Oxidation of methane, isoprene and monoterpenes (SRCO_fromHCs).
|
||
! (2 ) Direct emissions of CO from fossil fuel combustion, biomass
|
||
! burning and wood (for fuel) burning (SR SETEMIS).
|
||
! (3 ) Emissions.
|
||
!
|
||
! CH4 SINKS:
|
||
! ============================================================================
|
||
! (1 ) Removal of CO by OH (SR OHparam & CO_decay).
|
||
! (2 ) CO uptake by soils (neglected).
|
||
! (3 ) Transport of CO to stratosphere from troposphere
|
||
! (in dynamical subroutines).
|
||
! (4 ) Removal by OH (Clarissa's OH--climatol_OH.f and CO_decay.f)
|
||
! (5 ) Transport of CH4 between troposphere and stratosphere, and
|
||
! destruction in strat (CH4_strat.f).
|
||
!
|
||
! NOTES:
|
||
! (1 ) Created by Bryan Duncan (1/99). Adapted for CH4 chemistry by
|
||
! James Wang (6/8/00). Inserted into module "global_ch4_mod.f"
|
||
! by Bob Yantosca. (bmy, 1/16/01)
|
||
! (2 ) CHEMCH4 is independent of "CMN_OH", "CMN_CO", and "CMN_CO_BUDGET".
|
||
! (bmy, 1/16/01)
|
||
! (3 ) Updated comments (jsw, bmy, 2/12/01)
|
||
! (4 ) LD43 is already declared in CMN_DIAG; don't redefine it (bmy, 11/15/01)
|
||
! (5 ) Replaced all instances of IM with IIPAR and JM with JJPAR, in order
|
||
! to prevent namespace confusion for the new TPCORE (bmy, 6/25/02)
|
||
! (6 ) Now reference AD from "dao_mod.f". Now reference GEOS_CHEM_STOP from
|
||
! "error_mod.f" Now make FIRSTCHEM a local SAVEd variable. Now
|
||
! reference ALBD from "dao_mod.f". Now use MONTH and JDATE from "CMN"
|
||
! instead of LMN and LDY. (bmy, 11/15/02)
|
||
! (7 ) Remove NYMDb, NYMDe from the arg list. Now use functions GET_MONTH,
|
||
! GET_NYMDb, GET_NYMDe, GET_MONTH, GET_DAY from the new "time_mod.f"
|
||
! (bmy, 3/27/03)
|
||
! (8 ) Now reference DATA_DIR from "directory_mod.f" (bmy, 7/20/04)
|
||
! (9 ) Remove reference to BPCH2_MOD, it's not needed (bmy, 10/3/05)
|
||
!******************************************************************************
|
||
!
|
||
! References to F90 modules
|
||
USE BPCH2_MOD, ONLY : READ_BPCH2, GET_TAU0
|
||
USE DAO_MOD, ONLY : AD
|
||
USE DIAG_MOD, ONLY : AD43
|
||
USE DIAG_PL_MOD, ONLY : AD65
|
||
USE ERROR_MOD, ONLY : GEOS_CHEM_STOP, IT_IS_NAN, IT_IS_FINITE
|
||
USE TIME_MOD, ONLY : GET_DAY, GET_MONTH, GET_NYMDb, GET_NYMDe
|
||
USE TRACER_MOD, ONLY : STT
|
||
USE LOGICAL_MOD, ONLY : LSPLIT, LCH4BUD
|
||
USE GLOBAL_OH_MOD, ONLY : GET_GLOBAL_OH, OH
|
||
USE TRANSFER_MOD, ONLY : TRANSFER_3D
|
||
|
||
# include "CMN_SIZE" ! Size parameters
|
||
# include "CMN" ! LPAUSE
|
||
# include "CMN_DIAG" ! ND43, AD43
|
||
|
||
! Local variables
|
||
LOGICAL :: FIRSTCHEM = .TRUE.
|
||
INTEGER :: I, J, L, K, M, N
|
||
INTEGER :: IJ, JJ, NPART, III, JJJ
|
||
INTEGER :: NOHDO
|
||
INTEGER, SAVE :: NTALDT
|
||
|
||
CHARACTER(LEN=255) :: FILENAME
|
||
CHARACTER(LEN=4) :: CYEAR
|
||
REAL*4 :: ARRAY(IIPAR,JJPAR,LGLOB)
|
||
INTEGER :: TROPP
|
||
REAL*8 :: XTAU
|
||
INTEGER :: LMN
|
||
REAL*8 :: PREVCH4(IIPAR, JJPAR, LLPAR)
|
||
|
||
|
||
! Number of days per month
|
||
INTEGER :: NODAYS(12) = (/ 31, 28, 31, 30,
|
||
& 31, 30, 31, 31,
|
||
& 30, 31, 30, 31 /)
|
||
|
||
! External functions
|
||
REAL*8 , EXTERNAL :: BOXVL
|
||
|
||
! Weight of air (taken from "comode.h")
|
||
REAL*8, PARAMETER :: WTAIR = 28.966d0
|
||
|
||
!=================================================================
|
||
! CHEMCH4 begins here!
|
||
!=================================================================
|
||
WRITE( 6, '(a)' ) '% --- ENTERING CHEMCH4! ---'
|
||
|
||
!=================================================================
|
||
! (0) Calculate each box's air density [molec/cm3]
|
||
! do this for saving mean OH concentrations (kjw, 6/12/09)
|
||
!=================================================================
|
||
|
||
DO L = 1, LLPAR
|
||
DO J = 1, JJPAR
|
||
DO I = 1, IIPAR
|
||
BAIRDENS(I,J,L) = AD(I,J,L) * 1000d0 / BOXVL(I,J,L) *
|
||
& 6.023D23 / WTAIR
|
||
ENDDO
|
||
ENDDO
|
||
ENDDO
|
||
|
||
!=================================================================
|
||
! (1) If the first time step ...
|
||
!=================================================================
|
||
IF ( FIRSTCHEM ) THEN
|
||
|
||
! Counter for total number of timesteps per month for CO budget.
|
||
NTALDT = 1
|
||
|
||
! Now read CH4 loss frequencies instead of CO production
|
||
! (kjw, 12/2/11)
|
||
! Zero CO Production array
|
||
!COPROD(:,:,:) = 0d0
|
||
!print*,'READ_COPROD'
|
||
!! Read zonally-averaged CO production [v/v/s]
|
||
!CALL READ_COPROD
|
||
!print*,'READ_COPROD DONE'
|
||
CH4LOSS(:,:,:,:) = 0d0
|
||
CALL READ_CH4LOSS
|
||
|
||
! Added following line to increase strat. sink strength
|
||
! Hmm, the values I printed out above for COprod are very small,
|
||
! all less than 1e-15. (jsw)
|
||
c COprod = COprod * 3d0
|
||
! Commented the above line because it was giving me negative CH4
|
||
! concentrations in the stratosphere.
|
||
|
||
! Initialize the CH4 burden TCH4
|
||
! (ccc, 7/23/09)
|
||
TCH4(:,:,:,1) = STT(:,:,:,1) * XNUMOL_CH4
|
||
ENDIF
|
||
|
||
! Initialize current month
|
||
LMN = GET_MONTH()
|
||
|
||
! Increment counter of timesteps
|
||
NTALDT = NTALDT + 1
|
||
|
||
!=================================================================
|
||
! (2) Calculate the production and destruction of CO from
|
||
! gas-phase chemistry only.
|
||
!
|
||
! Concerning O3, there are 3 options: if (m lt 9) then MM_add = '0'
|
||
! else MM_add = ''
|
||
! A) The OH parameterization is calculated using GEOS monthly
|
||
! means (NCLIMATOLOGY=0) for the independent variable O3.
|
||
! The O3 column above independent variable is determined
|
||
! using jal's O3 climatologies for both the tropospheric
|
||
! and stratospheric portions of the O3 column
|
||
! (NCLIMATOLOGY2=1).
|
||
!
|
||
! B) The O3 variable is determined from jal's O3 climatolgies
|
||
! (tropospheric portion) and the o3 column above variable
|
||
! is determined from jal's O3 climatolgies (NCLIMATOLOGY=1 &
|
||
! NCLIMATOLOGY2=1).
|
||
!
|
||
!=================================================================
|
||
|
||
!================================================================
|
||
! (3) get parameterized OH fields or monthly mean fields.
|
||
!
|
||
! Variables of note:
|
||
! ---------------------------------------------------------------
|
||
! (1) BOH = storage array for OH fields.
|
||
!
|
||
! (2) NOHDO = switch
|
||
! ONLY USE CASE 1 as of 5/28/08 (kjw)
|
||
! = 1 : Get GEOS-Chem OH (v5-07-08) (kjw, 5/28/08)
|
||
!
|
||
! (3) LPAUSE = the vertical level of the tropopause. Above this
|
||
! level, no [OH] is calculated. The user can feed this
|
||
! SR a high value for LPAUSE which effectively turns this
|
||
! option off (i.e., LPAUSE > MVRTBX). If the [OH] = -999
|
||
! then the [OH] was not calculated.
|
||
!================================================================
|
||
|
||
! Change value of NOHDO as listed above
|
||
NOHDO = 1
|
||
|
||
SELECT CASE ( NOHDO )
|
||
|
||
! NOHDO = 1: GEOS-Chem OH v5-07-08
|
||
CASE ( 1 )
|
||
|
||
! If first of month, read monthly mean OH
|
||
IF ( FIRSTCHEM ) THEN
|
||
|
||
! 3D OH Field
|
||
BOH(:,:,:,:) = 0d0
|
||
|
||
! Loop over each month, reading OH
|
||
DO M=1,12
|
||
|
||
! Global OH
|
||
CALL GET_GLOBAL_OH( M )
|
||
|
||
! Assign to module variable BOH
|
||
BOH(:,:,:,M) = OH(:,:,:)
|
||
|
||
ENDDO
|
||
|
||
ENDIF
|
||
|
||
CASE DEFAULT
|
||
WRITE( 6, '(a)' ) 'Invalid selection for NOHDO!'
|
||
WRITE( 6, '(a)' ) 'Halting execution in CHEMCH4!'
|
||
CALL GEOS_CHEM_STOP
|
||
|
||
END SELECT
|
||
|
||
!=================================================================
|
||
! (3.1) ND43 diagnostics...save [OH] in molecules/cm3
|
||
!=================================================================
|
||
|
||
IF ( ND43 > 0 ) THEN
|
||
DO L = 1, LD43
|
||
DO J = 1, JJPAR
|
||
DO I = 1, IIPAR
|
||
IF ( L < LPAUSE(I,J) ) THEN
|
||
AD43(I,J,L,1) = AD43(I,J,L,1) + BOH(I,J,L,LMN)
|
||
ENDIF
|
||
ENDDO
|
||
ENDDO
|
||
ENDDO
|
||
ENDIF
|
||
|
||
!=================================================================
|
||
! (4) Save OH concentrations for printing of global mean [OH] at
|
||
! end of simulation.
|
||
!=================================================================
|
||
CALL CH4_OHSAVE
|
||
|
||
!=================================================================
|
||
! (5) If multi-CH4 tracers, we store the CH4 total conc. to
|
||
! distribute the sink after the chemistry. (ccc, 2/10/09)
|
||
!=================================================================
|
||
IF ( LSPLIT ) THEN
|
||
!$OMP PARALLEL DO
|
||
!$OMP+DEFAULT( SHARED )
|
||
!$OMP+PRIVATE( I, J, L )
|
||
DO L = 1, LLPAR
|
||
DO J = 1, JJPAR
|
||
DO I = 1, IIPAR
|
||
PREVCH4(I,J,L) = STT(I,J,L,1)
|
||
ENDDO
|
||
ENDDO
|
||
ENDDO
|
||
!$OMP END PARALLEL DO
|
||
ENDIF
|
||
|
||
!=================================================================
|
||
! (6) calculate rate of decay of CH4 by OH oxidation.
|
||
!=================================================================
|
||
CALL CH4_DECAY
|
||
|
||
!=================================================================
|
||
! (7) calculate CH4 chemistry in layers above tropopause.
|
||
!=================================================================
|
||
CALL CH4_STRAT
|
||
|
||
!=================================================================
|
||
! (8) distribute the chemistry sink from total CH4 to other CH4
|
||
! tracers. (ccc, 2/10/09)
|
||
!=================================================================
|
||
IF ( LSPLIT ) THEN
|
||
CALL CH4_DISTRIB(PREVCH4)
|
||
ENDIF
|
||
|
||
!=================================================================
|
||
! (9) write budget (i.e., monthly average fields).
|
||
!
|
||
! Check to make sure the start and end times are on the
|
||
! first of a month. If not the SR CO_budget will not
|
||
! work properly!
|
||
!=================================================================
|
||
NPART = GET_NYMDb() / 100
|
||
|
||
IF ( LCH4BUD .and. ( GET_NYMDb() - NPART*100 ) /= 1 ) THEN
|
||
print*,'Start date not equal to 1st of month!!!'
|
||
print*,' Therefore, SR CO_budget will not work!!!'
|
||
CALL GEOS_CHEM_STOP
|
||
ENDIF
|
||
|
||
|
||
NPART = GET_NYMDe() /100
|
||
|
||
IF ( LCH4BUD .and. ( GET_NYMDe() - NPART*100 ) /= 1 ) THEN
|
||
print*,'End date not equal to 1st of month!!!'
|
||
print*,' Therefore, SR CO_budget will not work!!!'
|
||
CALL GEOS_CHEM_STOP
|
||
ENDIF
|
||
|
||
! Call CH4_BUDGET on the last day of the month
|
||
IF ( LCH4BUD .and. GET_DAY() == NODAYS( GET_MONTH() ) ) THEN
|
||
CALL FLUSH ( 6 )
|
||
|
||
CALL CH4_BUDGET
|
||
|
||
NTALDT = 0
|
||
call flush(6)
|
||
|
||
ENDIF
|
||
|
||
call flush(6)
|
||
|
||
! Set FIRSTCHEM to FALSE
|
||
FIRSTCHEM = .FALSE.
|
||
|
||
! Return to calling program
|
||
END SUBROUTINE CHEMCH4
|
||
|
||
!------------------------------------------------------------------------------
|
||
|
||
SUBROUTINE READ_COPROD
|
||
!
|
||
!*****************************************************************************
|
||
! Subroutine READ_COPROD reads production and destruction rates for CO in
|
||
! the stratosphere. (bnd, bmy, 1/17/01, 10/3/05)
|
||
!
|
||
! Module Variables:
|
||
! ===========================================================================
|
||
! (1) COPROD (REAL*8) : Array containing P(CO) for all 12 months [v/v/s]
|
||
!
|
||
! NOTES:
|
||
! (1 ) Created by Bryan Duncan (1/99). Adapted for CH4 chemistry by
|
||
! James Wang (6/8/00). Inserted into module "global_ch4_mod.f"
|
||
! by Bob Yantosca. (bmy, 1/16/01)
|
||
! (2 ) READ_COPROD is independent of "CMN_OH", "CMN_CO", and "CMN_CO_BUDGET".
|
||
! (bmy, 1/16/01)
|
||
! (3 ) ARRAY needs to be dimensioned (1,JJPAR,LGLOB) (bmy, 9/26/01)
|
||
! (4 ) Remove obsolete code from 9/01 (bmy, 10/24/01)
|
||
! (5 ) Now reference DATA_DIR from "directory_mod.f" (bmy, 7/20/04)
|
||
! (6 ) Now reads data for both GEOS and GCAP grids (bmy, 8/16/05)
|
||
! (7 ) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)
|
||
!*****************************************************************************
|
||
!
|
||
! References to F90 modules
|
||
USE BPCH2_MOD, ONLY : GET_NAME_EXT_2D, GET_RES_EXT
|
||
USE BPCH2_MOD, ONLY : GET_TAU0, READ_BPCH2
|
||
USE BPCH2_MOD, ONLY : GET_NAME_EXT, GET_MODELNAME
|
||
USE DIRECTORY_MOD, ONLY : DATA_DIR
|
||
USE TRANSFER_MOD, ONLY : TRANSFER_ZONAL
|
||
|
||
IMPLICIT NONE
|
||
|
||
# include "CMN_SIZE" ! Size parameters
|
||
|
||
|
||
! Local variables
|
||
INTEGER :: I, J, L, M
|
||
REAL*4 :: ARRAY(1,JJPAR,LGLOB)
|
||
REAL*4 :: DUMMY_IN(JJPAR,LGLOB)
|
||
REAL*8 :: XTAU
|
||
CHARACTER(LEN=255) :: FILENAME
|
||
REAL*8 :: DUMMY_OUT(JJPAR,LGLOB)
|
||
|
||
|
||
!=================================================================
|
||
! READ_COPROD begins here!
|
||
!
|
||
! Read P(CO) for all 12 months
|
||
!=================================================================
|
||
DO M = 1, 12
|
||
|
||
! TAU value at the start of month M -- Use "generic" year 1985
|
||
XTAU = GET_TAU0( M, 1, 1985 )
|
||
|
||
! Construct filename
|
||
#if defined( GRID05x0666 ) && defined( NESTED_NA )
|
||
FILENAME = TRIM( DATA_DIR ) // 'pco_lco_200203/' //
|
||
& 'COprod.GEOS5.05x0666_NA.trim'
|
||
#else
|
||
FILENAME = TRIM( DATA_DIR ) // 'pco_lco_200203/' //
|
||
& 'COprod.' // GET_NAME_EXT() //
|
||
7 '.' // GET_RES_EXT()
|
||
#endif
|
||
|
||
WRITE( 6, 93 ) TRIM ( FILENAME )
|
||
93 FORMAT( ' - READ_COPROD: Reading COprod: ', a )
|
||
CALL FLUSH( 6 )
|
||
|
||
CALL READ_BPCH2( TRIM(FILENAME), 'PORL-L=$', 9,
|
||
& XTAU, 1, JJPAR,
|
||
& LLPAR, ARRAY, QUIET=.TRUE. )
|
||
|
||
! use 2D arrays for TRANSFER ZONAL
|
||
DUMMY_IN(:,:) = ARRAY(1,:,:)
|
||
|
||
! Copy REAL*4 to REAL*8 data, and resize from (JJPAR,LGLOB)
|
||
! to (JJPAR,LLPAR) -- vertically regrid if necessary
|
||
CALL TRANSFER_ZONAL( DUMMY_IN, DUMMY_OUT )
|
||
|
||
COPROD(:,:,M) = DUMMY_OUT(:,:)
|
||
|
||
ENDDO
|
||
|
||
|
||
! Return to calling program
|
||
END SUBROUTINE READ_COPROD
|
||
|
||
|
||
!------------------------------------------------------------------------------
|
||
|
||
SUBROUTINE READ_CH4LOSS
|
||
!
|
||
!*****************************************************************************
|
||
! Subroutine READ_CH4LOSS reads CH4 loss frequencies in the stratosphere.
|
||
! These values constitute a linearized stratospheric CH4 chemistry scheme.
|
||
! Loss frequencies from 4x5 degree output from the GMI model. Thanks to Lee
|
||
! Murray for the ch4 loss frequencies. (kjw, 11/19/2011)
|
||
!
|
||
! Module Variables:
|
||
! ===========================================================================
|
||
! (1) CH4LOSS (REAL*8) : Array containing ch4 loss frequencies for all 12 months [1/s]
|
||
!
|
||
! NOTES:
|
||
! (1 ) Created by Bryan Duncan (1/99). Adapted for CH4 chemistry by
|
||
! James Wang (6/8/00). Inserted into module "global_ch4_mod.f"
|
||
! by Bob Yantosca. (bmy, 1/16/01)
|
||
! (2 ) READ_CH4LOSS is independent of "F77_CMN_OH", "F77_CMN_CO", and "F77_CMN_CO_BUDGET".
|
||
! (bmy, 1/16/01)
|
||
! (3 ) ARRAY needs to be dimensioned (1,JJPAR,LGLOB) (bmy, 9/26/01)
|
||
! (4 ) Remove obsolete code from 9/01 (bmy, 10/24/01)
|
||
! (5 ) Now reference DATA_DIR from "directory_mod.f" (bmy, 7/20/04)
|
||
! (6 ) Now reads data for both GEOS and GCAP grids (bmy, 8/16/05)
|
||
! (7 ) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)
|
||
! (8 ) Treat MERRA in the same way as for GEOS-5 (bmy, 8/13/10)
|
||
!*****************************************************************************
|
||
!
|
||
! References to F90 modules
|
||
USE BPCH2_MOD, ONLY : GET_NAME_EXT_2D, GET_RES_EXT
|
||
USE BPCH2_MOD, ONLY : GET_TAU0, READ_BPCH2
|
||
USE BPCH2_MOD, ONLY : GET_NAME_EXT, GET_MODELNAME
|
||
USE DIRECTORY_MOD, ONLY : DATA_DIR
|
||
USE TRANSFER_MOD, ONLY : TRANSFER_3D
|
||
|
||
|
||
IMPLICIT NONE
|
||
# include "define.h"
|
||
# include "CMN_SIZE"
|
||
|
||
|
||
! Local variables
|
||
INTEGER :: I, J, L, M
|
||
REAL*4 :: ARRAY(IIPAR,JJPAR,LLPAR)
|
||
REAL*8 :: XTAU
|
||
CHARACTER(LEN=255) :: FILENAME
|
||
|
||
!=================================================================
|
||
! READ_CH4LOSS begins here!
|
||
!
|
||
! Read P(CO) for all 12 months
|
||
!=================================================================
|
||
! Construct filename
|
||
#if defined( GRID05x0666 ) && defined( NESTED_NA )
|
||
FILENAME = TRIM( DATA_DIR ) // 'CH4_201203/' //
|
||
& 'gmi.ch4loss.geos5_47L.' // GET_RES_EXT() //
|
||
& '_NA.bpch'
|
||
#else
|
||
FILENAME = TRIM( DATA_DIR ) // 'CH4_201203/' //
|
||
& 'gmi.ch4loss.geos5_47L.' // GET_RES_EXT() //
|
||
& '.bpch'
|
||
#endif
|
||
|
||
WRITE( 6, 93 ) TRIM ( FILENAME )
|
||
93 FORMAT( ' - READ_CH4LOSS: Reading Ch4loss: ', a )
|
||
CALL FLUSH( 6 )
|
||
|
||
! Read data for each month
|
||
DO M = 1, 12
|
||
|
||
! TAU value at the start of month M -- Use "generic" year 1985
|
||
XTAU = GET_TAU0( M, 1, 1985 )
|
||
|
||
! Read Loss frequencies in units of [1/s]. drevet.
|
||
CALL READ_BPCH2( FILENAME, 'IJ-AVG-$', 1,
|
||
& XTAU, IIPAR, JJPAR,
|
||
& LLPAR, ARRAY, QUIET=.TRUE. )
|
||
|
||
! Place array into CH4LOSS module variable
|
||
CH4LOSS(:,:,:,M) = ARRAY(:,:,:)
|
||
|
||
ENDDO
|
||
|
||
! Return to calling program
|
||
END SUBROUTINE READ_CH4LOSS
|
||
|
||
!------------------------------------------------------------------------------
|
||
|
||
SUBROUTINE CH4_DECAY
|
||
!
|
||
!******************************************************************************
|
||
! Subroutine CH4_DECAY calculates the decay rate of CH4 by OH. OH is the
|
||
! only sink for CH4 considered here. (jsw, bnd, bmy, 1/16/01, 7/20/04)
|
||
!
|
||
! The annual mean tropopause is stored in the LPAUSE array
|
||
! (from header file "CMN"). LPAUSE is defined such that:
|
||
!
|
||
! Levels 1 <= L <= LPAUSE(I,J) - 1 are tropospheric
|
||
! LPAUSE(I,J) <= L <= LLPAR are stratospheric
|
||
!
|
||
! We now use LPAUSE instead of NSKIPL to denote the strat/trop boundary.
|
||
! (bmy, 4/18/00)
|
||
!
|
||
! Monthly loss of CH4 is summed in TCH4(3)
|
||
! TCH4(3) = CH4 sink by OH
|
||
!
|
||
! Module Variables:
|
||
! ============================================================================
|
||
! (1) BOH (REAL*8) : Array holding global OH concentrations
|
||
! (2) XNUMOL_CH4 (REAL*8) : Molec CH4 / kg CH4
|
||
!
|
||
! NOTES:
|
||
! (1 ) Created by Bryan Duncan (1/99). Adapted for CH4 chemistry by
|
||
! James Wang (7/00). Inserted into module "global_ch4_mod.f"
|
||
! by Bob Yantosca. (bmy, 1/16/01)
|
||
! (2 ) CH4_DECAY is independent of "CMN_OH", "CMN_CO", and "CMN_CO_BUDGET".
|
||
! (bmy, 1/16/01)
|
||
! (3 ) Now use function GET_TS_CHEM from "time_mod.f" (bmy, 3/27/03)
|
||
! (4 ) Now references STT from "tracer_mod.f" (bmy, 7/20/04)
|
||
!******************************************************************************
|
||
!
|
||
! References to F90 modules
|
||
USE DAO_MOD, ONLY : AIRVOL, T
|
||
USE TIME_MOD, ONLY : GET_TS_CHEM, ITS_A_NEW_YEAR
|
||
USE TRACER_MOD, ONLY : STT
|
||
cdrevet
|
||
USE DIAG_MOD, ONLY : AD19
|
||
cdrevet
|
||
USE TIME_MOD, ONLY : GET_NYMD, GET_NHMS, GET_MONTH
|
||
|
||
|
||
# include "CMN_SIZE" ! Size parameters
|
||
# include "CMN" ! STT, LPAUSE
|
||
# include "CMN_DIAG" ! ND19
|
||
|
||
! Local variables
|
||
LOGICAL :: FIRST_DECAY=.TRUE.
|
||
INTEGER :: I, J, L, M, N, LMN
|
||
REAL*8 :: DT, GCH4, STT2GCH4, KRATE
|
||
|
||
! External variables
|
||
REAL*8, EXTERNAL :: BOXVL
|
||
|
||
|
||
!=================================================================
|
||
! CH4_DECAY begins here!
|
||
!=================================================================
|
||
|
||
! Chemistry timestep in seconds
|
||
DT = GET_TS_CHEM() * 60d0
|
||
|
||
! Initialize current month
|
||
LMN = GET_MONTH()
|
||
|
||
!=================================================================
|
||
! Compute decay of CH4 by OH in the troposphere
|
||
!
|
||
! The decay for CH4 is calculated by:
|
||
! OH + CH4 -> CH3 + H2O
|
||
! k = 2.45E-12 exp(-1775/T)
|
||
!
|
||
! This is from JPL '97.
|
||
! JPL '00 & '06 do not revise '97 value. (jsw, kjw)
|
||
!=================================================================
|
||
IF (ITS_A_NEW_YEAR()) THEN
|
||
TROPOCH4=0d0
|
||
ENDIF
|
||
|
||
DO L = 1, MAXVAL( LPAUSE )
|
||
DO J = 1, JJPAR
|
||
DO I = 1, IIPAR
|
||
|
||
! Only consider tropospheric boxes
|
||
IF ( L < LPAUSE(I,J) ) THEN
|
||
|
||
! Use 24-hr avg temperature to calc. rate coeff.
|
||
! citation needed
|
||
KRATE = 2.45d-12 * EXP( -1775d0 / T(I,J,L) )
|
||
|
||
! Conversion from [kg/box] --> [molec/cm3]
|
||
! [kg CH4/box] * [box/cm3] * XNUMOL_CH4 [molec CH4/kg CH4]
|
||
STT2GCH4 = 1d0 / AIRVOL(I,J,L) / 1d6 * XNUMOL_CH4
|
||
|
||
! CH4 in [molec/cm3]
|
||
GCH4 = STT(I,J,L,1) * STT2GCH4
|
||
|
||
! Sum loss in TCH4(3) (molecules/box)
|
||
TCH4(I,J,L,3) = TCH4(I,J,L,3)+
|
||
& ( GCH4 * BOXVL(I,J,L)* KRATE * BOH(I,J,L,LMN) * DT)
|
||
|
||
TROPOCH4=TROPOCH4+GCH4*KRATE*BOH(I,J,L,LMN)*DT/STT2GCH4
|
||
|
||
! Modify AD19 Diagnostic
|
||
! How much CH4 (kg) is lost by reaction with OH
|
||
IF ( ND19 > 0 ) THEN ! --> [kg/box]
|
||
AD19(I,J,12) = AD19(I,J,12) +
|
||
& ( GCH4 * KRATE * BOH(I,J,L,LMN) * DT ) / STT2GCH4
|
||
ENDIF
|
||
|
||
! Calculate new CH4 value: [CH4]=[CH4](1-k[OH]*delt)
|
||
GCH4 = GCH4 * ( 1d0 - KRATE * BOH(I,J,L,LMN) * DT )
|
||
|
||
! Convert back from [molec/cm3] --> [kg/box]
|
||
STT(I,J,L,1) = GCH4 / STT2GCH4
|
||
|
||
ENDIF
|
||
ENDDO
|
||
ENDDO
|
||
ENDDO
|
||
|
||
|
||
print*,'% --- CHEMCH4: CH4_DECAY: TROP DECAY (Tg): ',TROPOCH4/1e9
|
||
|
||
|
||
|
||
! Return to calling program
|
||
END SUBROUTINE CH4_DECAY
|
||
|
||
!------------------------------------------------------------------------------
|
||
|
||
SUBROUTINE CH4_OHSAVE
|
||
!
|
||
!*****************************************************************************
|
||
! Subroutine CH4_OHSAVE archives the CH3CCl3 lifetime from the OH
|
||
! used in the CH4 simulation. (bnd, jsw, bmy, 1/16/01, 7/20/04)
|
||
!
|
||
! Subroutine CH4_OHSAVE now ONLY archives OH concentrations to be printed
|
||
! as global mean OH by PRINT_DIAG_OH at the end of the simulation. The
|
||
! CH3CCl3 lifetime capability was disabled many years ago. (kjw, 6/12/09)
|
||
!
|
||
! The annual mean tropopause is stored in the LPAUSE array
|
||
! (from header file "CMN"). LPAUSE is defined such that:
|
||
!
|
||
! Levels 1 <= L <= LPAUSE(I,J) - 1 are tropospheric
|
||
! LPAUSE(I,J) <= L <= LLPAR are stratospheric
|
||
!
|
||
! Module Variables
|
||
! ===========================================================================
|
||
! (1) BOH (REAL*8) : Array containing global OH field
|
||
!
|
||
! NOTES:
|
||
! (1 ) Created by Bryan Duncan (1/99). Adapted for CH4 chemistry by
|
||
! James Wang (7/00). Inserted into module "global_ch4_mod.f"
|
||
! by Bob Yantosca. (bmy, 1/16/01)
|
||
! (2 ) CH4_OHSAVE is independent of "CMN_OH", "CMN_CO", and "CMN_CO_BUDGET".
|
||
! (bmy, 1/16/01)
|
||
! (3 ) Now call DO_DIAG_OH_CH4 to pass OH diagnostic info to the
|
||
! "diag_oh_mod.f" (bmy, 7/20/04)
|
||
!*****************************************************************************
|
||
!
|
||
! References to F90 modules
|
||
USE DIAG_OH_MOD, ONLY : DO_DIAG_OH_CH4
|
||
USE TIME_MOD, ONLY : GET_MONTH
|
||
USE GRID_MOD, ONLY : GET_AREA_CM2
|
||
USE DAO_MOD, ONLY : T
|
||
USE TRACER_MOD, ONLY : STT
|
||
|
||
|
||
# include "CMN_SIZE" ! Size parameters
|
||
# include "CMN" ! LPAUSE
|
||
|
||
! Local variables
|
||
INTEGER :: I, J, L, LMN
|
||
REAL*8 :: MASST, AREA_CM2
|
||
REAL*8 :: KCLO, LOSS, OHMASS
|
||
REAL*8 :: KCH4, CH4LOSS, CH4MASS
|
||
REAL*8 :: CH4EMIS, CH4TROPMASS
|
||
|
||
! External functions
|
||
REAL*8, EXTERNAL :: BOXVL
|
||
|
||
!=================================================================
|
||
! CH4_OHSAVE begins here!
|
||
!
|
||
! (1) Pass OH mass, total air mass, and to "diag_oh_mod.f"
|
||
! (2) ND59: Diagnostic for CH3CCl3 calculation
|
||
!=================================================================
|
||
|
||
! Initialize current month
|
||
LMN = GET_MONTH()
|
||
|
||
! 1. Calculate OH mass and total air mass
|
||
DO L = 1, MAXVAL( LPAUSE )
|
||
DO J = 1, JJPAR
|
||
DO I = 1, IIPAR
|
||
! Only process tropospheric boxes (bmy, 4/17/00)
|
||
IF ( L < LPAUSE(I,J) ) THEN
|
||
|
||
! Calculate OH mass [molec / box]
|
||
OHMASS = BOH(I,J,L,LMN) * BAIRDENS(I,J,L) * BOXVL(I,J,L,LMN)
|
||
|
||
! Calculate total air mass [molec / box]
|
||
MASST = BAIRDENS(I,J,L) * BOXVL(I,J,L,LMN)
|
||
|
||
! Calculate CH3CCl3 + OH rate constant from JPL '06
|
||
! [cm3 / molec / s]
|
||
KCLO = 1.64d-12 * EXP( -1520.d0 / T(I,J,L) )
|
||
|
||
! Calculate Loss term [molec / box / s]
|
||
LOSS = KCLO * BOH(I,J,L,LMN) *
|
||
& BAIRDENS(I,J,L) * BOXVL(I,J,L)
|
||
|
||
|
||
! Calculate CH4 emissions [molec / box / s]
|
||
! Only for surface level
|
||
! Grid box surface area [cm2]
|
||
IF ( L .GT. 1 ) THEN
|
||
CH4EMIS = 0d0
|
||
ELSE
|
||
AREA_CM2 = GET_AREA_CM2( J )
|
||
CH4EMIS = SUM(CH4_EMIS(I,J,2:10)) + CH4_EMIS(I,J,12)
|
||
CH4EMIS = CH4EMIS * AREA_CM2 ! [molec/cm2/s] --> [molec/box/s]
|
||
ENDIF
|
||
|
||
ELSE
|
||
|
||
OHMASS = 0d0
|
||
MASST = 0d0
|
||
LOSS = 0d0
|
||
CH4LOSS = 0d0
|
||
CH4TROPMASS = 0d0
|
||
CH4EMIS = 0d0
|
||
CH4MASS = STT(I,J,L,1) * XNUMOL_CH4
|
||
|
||
ENDIF
|
||
|
||
! Pass OH mass, total mass, and loss to "diag_oh_mod.f",
|
||
! which calculates mass-weighted mean [OH] and CH3CCl3
|
||
! lifetime.
|
||
CALL DO_DIAG_OH_CH4( I, J, L, OHMASS, MASST, LOSS,
|
||
& CH4LOSS, CH4TROPMASS, CH4EMIS, CH4MASS )
|
||
|
||
ENDDO
|
||
ENDDO
|
||
ENDDO
|
||
|
||
|
||
! Return to calling program
|
||
END SUBROUTINE CH4_OHSAVE
|
||
|
||
!------------------------------------------------------------------------------
|
||
|
||
SUBROUTINE CH4_STRAT
|
||
!
|
||
!*****************************************************************************
|
||
! Subroutine CH4_STRAT calculates uses production rates for CH4 to
|
||
! calculate loss of CH4 in above the tropopause.
|
||
! (jsw, bnd, bmy, 1/16/01, 7/20/04)
|
||
!
|
||
! Production (mixing ratio/sec) rate provided by Dylan Jones.
|
||
! Only production by CH4 + OH is considered.
|
||
!
|
||
! The annual mean tropopause is stored in the LPAUSE array
|
||
! (from header file "CMN"). LPAUSE is defined such that:
|
||
!
|
||
! Levels 1 <= L <= LPAUSE(I,J) - 1 are tropospheric
|
||
! LPAUSE(I,J) <= L <= LLPAR are stratospheric (bmy, 4/18/00)
|
||
!
|
||
! NOTES:
|
||
! (1 ) Created by Bryan Duncan (1/99). Adapted for CH4 chemistry by
|
||
! James Wang (7/00). Inserted into module "global_ch4_mod.f"
|
||
! by Bob Yantosca. (bmy, 1/16/01)
|
||
! (2 ) CH4_STRAT is independent of "CMN_OH", "CMN_CO", and "CMN_CO_BUDGET".
|
||
! (bmy, 1/16/01)
|
||
! (3 ) Removed LMN from the arg list and made it a local variable. Now use
|
||
! functions GET_MONTH and GET_TS_CHEM from "time_mod.f" (bmy, 3/27/03)
|
||
! (4 ) Now references STT from "tracer_mod.f" (bmy, 7/20/04)
|
||
!*****************************************************************************
|
||
!
|
||
! References to F90 modules
|
||
USE DAO_MOD, ONLY : AIRVOL
|
||
USE TIME_MOD, ONLY : GET_MONTH, GET_TS_CHEM
|
||
USE TRACER_MOD, ONLY : STT
|
||
|
||
# include "CMN_SIZE" ! Size parameters
|
||
# include "CMN" ! STT, LPAUSE
|
||
|
||
! Local variables
|
||
INTEGER :: I, J, L, LMN
|
||
REAL*8 :: DT, GCH4, STT2GCH4, LRATE
|
||
CHARACTER*20 :: STT_TEST
|
||
CHARACTER*20 :: STT2GCH4_CHAR
|
||
|
||
! External functions
|
||
REAL*8, EXTERNAL :: BOXVL
|
||
|
||
!=================================================================
|
||
! CH4_STRAT begins here!
|
||
!=================================================================
|
||
|
||
! Chemistry timestep [s]
|
||
DT = GET_TS_CHEM() * 60d0
|
||
|
||
! Current month
|
||
LMN = GET_MONTH()
|
||
|
||
!=================================================================
|
||
! Loop over stratospheric boxes only
|
||
!=================================================================
|
||
DO L = MINVAL( LPAUSE ), LLPAR
|
||
DO J = 1, JJPAR
|
||
DO I = 1, IIPAR
|
||
IF ( L >= LPAUSE(I,J) ) THEN
|
||
|
||
! Conversion factor [kg/box] --> [molec/cm3]
|
||
! [kg/box] / [AIRVOL * 1e6 cm3] * [XNUMOL_CH4 molec/mole]
|
||
STT2GCH4 = 1d0 / AIRVOL(I,J,L) / 1d6 * XNUMOL_CH4
|
||
|
||
! CH4 in [molec/cm3]
|
||
GCH4 = STT(I,J,L,1) * STT2GCH4
|
||
|
||
! Loss rate [molec/cm3/s]
|
||
LRATE = GCH4 * CH4LOSS( I,J,L,LMN )
|
||
|
||
! CH4 in [molec/cm3]
|
||
GCH4 = GCH4 - ( LRATE * DT )
|
||
|
||
! Convert back from [molec CH4/cm3] --> [kg/box]
|
||
STT(I,J,L,1) = GCH4 / STT2GCH4
|
||
|
||
ENDIF
|
||
ENDDO
|
||
ENDDO
|
||
ENDDO
|
||
|
||
! Return to calling program
|
||
END SUBROUTINE CH4_STRAT
|
||
|
||
!------------------------------------------------------------------------------
|
||
|
||
SUBROUTINE CH4_BUDGET
|
||
!
|
||
!******************************************************************************
|
||
! Subroutine CH4_BUDGET calculates the budget of CH4. This SR only works
|
||
! for monthly averages, so be sure to start on the first of the month
|
||
! and run to another first of the month!!! (jsw, bnd, bmy, 1/16/01, 10/3/05)
|
||
!
|
||
! Modified for the run with new emissions (j drevet, 03/06)
|
||
!
|
||
! Store the sources/sinks of CH4 in TCH4 in total molecules
|
||
! ( 1) = Initial burden
|
||
! ( 2) = Final burden
|
||
! SINKS
|
||
! ( 3) = Tropospheric CH4 sink by OH
|
||
! SOURCES
|
||
! ( 4) = Total Sources
|
||
! ( 5) = Industrial (Gas+Oil+Mine)
|
||
! ( 6) = Agriculture (Enteric fermentation+Manure+Rice+Waste+Waste water)
|
||
! ( 7) = Biomass burning
|
||
! ( 8) = Termites
|
||
! ( 9) = Wetland
|
||
! (10) = Soil absorption
|
||
! (11) = Interhemispheric Exchange (+ = northward)
|
||
!
|
||
! NOTES:
|
||
! (1 ) Created by Bryan Duncan (1/99). Adapted for CH4 chemistry by
|
||
! James Wang (7/00). Inserted into module "global_ch4_mod.f"
|
||
! by Bob Yantosca. (bmy, 1/16/01)
|
||
! (2 ) CH4_BUDGET is independent of "CMN_OH", "CMN_CO", and "CMN_CO_BUDGET".
|
||
! (bmy, 1/16/01)
|
||
! (3 ) Updated comments (jsw, bmy, 2/13/01)
|
||
! (4 ) Renamed XLABEL to LABEL so as not to conflict w/ "CMN"
|
||
! (5 ) Now use functions GET_MONTH, GET_YEAR, GET_DIAGb, and GET_CT_DYN from
|
||
! "time_mod.f". Removed LMN from the arg list and made it a local
|
||
! variable. Use functions GET_XOFFSET and GET_YOFFSET from
|
||
! "grid_mod.f". (bmy, 3/27/03)
|
||
! (6 ) Now references STT from "tracer_mod.f" (bmy, 7/20/04)
|
||
! (7 ) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)
|
||
!******************************************************************************
|
||
!
|
||
! References to F90 modules
|
||
USE BPCH2_MOD, ONLY : BPCH2, BPCH2_HDR, GET_MODELNAME
|
||
USE GRID_MOD, ONLY : GET_XOFFSET, GET_YOFFSET
|
||
USE TIME_MOD, ONLY : GET_MONTH, GET_YEAR
|
||
USE TIME_MOD, ONLY : GET_DIAGb, GET_CT_DYN
|
||
USE TRACER_MOD, ONLY : STT
|
||
|
||
# include "CMN_SIZE" ! Size parameters
|
||
# include "CMN" ! STT, LPAUSE
|
||
|
||
! Local variables
|
||
INTEGER :: I, J, K, L, M, NERROR, UD, LMN
|
||
|
||
REAL*8 :: STTCONV, TGS, SCALEDYN
|
||
REAL*8 :: NTP, NTQ, NTP2, NTQ2
|
||
REAL*8 :: SOURCES, SINKS
|
||
|
||
CHARACTER(LEN=17) :: MERGE
|
||
CHARACTER(LEN=13) :: MERGE2
|
||
|
||
! For binary punch file, v. 2.0
|
||
REAL*4 :: ARRAY(IIPAR, JJPAR, LLPAR)
|
||
REAL*4 :: LONRES, LATRES
|
||
|
||
INTEGER :: IFIRST, JFIRST, LFIRST
|
||
INTEGER, PARAMETER :: HALFPOLAR = 1
|
||
INTEGER, PARAMETER :: CENTER180 = 1
|
||
|
||
CHARACTER (LEN=20) :: MODELNAME
|
||
CHARACTER (LEN=40) :: UNIT
|
||
CHARACTER (LEN=40) :: RESERVED = ''
|
||
CHARACTER (LEN=40) :: CATEGORY
|
||
CHARACTER (LEN=80) :: LABEL
|
||
|
||
! External functions
|
||
REAL*8, EXTERNAL :: BOXVL
|
||
|
||
!=================================================================
|
||
! CH4_BUDGET begins here!
|
||
!
|
||
! Initialize quantities
|
||
!=================================================================
|
||
IFIRST = GET_XOFFSET() + 1
|
||
JFIRST = GET_YOFFSET() + 1
|
||
LFIRST = 1
|
||
LONRES = DISIZE
|
||
LATRES = DJSIZE
|
||
|
||
! Current month
|
||
LMN = GET_MONTH()
|
||
|
||
! Make up a category name for GAMAP (use 8 characters)
|
||
CATEGORY = 'CH4BUDT'
|
||
|
||
! Get the proper model name for the binary punch file
|
||
MODELNAME = GET_MODELNAME()
|
||
|
||
! Descriptor string
|
||
LABEL = 'GEOS-CHEM -- CH4 Budget output (jsw, bmy, 1/16/01)'
|
||
|
||
! Unit of quantity being saved
|
||
UNIT = 'Tg' !(NOTE: check w/ bnd to get the right units!!!)
|
||
|
||
! Scale factor for dynamic time steps
|
||
SCALEDYN = FLOAT( GET_CT_DYN() ) + 1D-20
|
||
|
||
!=================================================================
|
||
! Store the final burden of CH4 in TCH4(2)
|
||
! Convert kg CH4/box to molecules/box.
|
||
!=================================================================
|
||
TCH4(:,:,:,2) = 0d0
|
||
TCH4(:,:,:,2) = STT(:,:,:,1) * XNUMOL_CH4
|
||
|
||
!=================================================================
|
||
! Write GLOBAL AVERAGES for all layers to ASCII file
|
||
!=================================================================
|
||
WRITE( MERGE, 2 ) GET_MONTH(), GET_YEAR()
|
||
2 FORMAT( 'CH4budget.', I2.2, '.',I4 )
|
||
|
||
OPEN( 189, FILE=MERGE, STATUS='UNKNOWN' )
|
||
REWIND( 189 )
|
||
|
||
TGS = 1.D-9
|
||
STTCONV = XNUMOL_CH4/TGS
|
||
SOURCES = 0.D0
|
||
SINKS = 0.D0
|
||
NERROR = 0
|
||
|
||
WRITE(189,18)
|
||
WRITE(189,1801)
|
||
1801 FORMAT('*************************')
|
||
WRITE(189,1800)
|
||
1800 FORMAT('LAYERS 1 - 20')
|
||
WRITE(189,1801)
|
||
WRITE(189,18)
|
||
|
||
WRITE(189,18)
|
||
WRITE(189,38)
|
||
WRITE(189,18)
|
||
WRITE(189,19)
|
||
WRITE(189,1990)
|
||
1990 FORMAT('Tropospheric Burden')
|
||
|
||
NTP=SUM_CH4(1,IIPAR,1,JJPAR,1,LLPAR,1,1,1)
|
||
WRITE(189,20)NTP,NTP/STTCONV
|
||
|
||
NTP2=SUM_CH4(1,IIPAR,1,JJPAR,1,LLPAR,2,2,1)
|
||
WRITE(189,21)NTP2,NTP2/STTCONV
|
||
|
||
WRITE(189,18)
|
||
WRITE(189,1991)
|
||
1991 FORMAT('Stratospheric Burden')
|
||
|
||
NTP=SUM_CH4(1,IIPAR,1,JJPAR,1,LLPAR,1,1,0)
|
||
WRITE(189,20) NTP,NTP/STTCONV
|
||
|
||
NTP=SUM_CH4(1,IIPAR,1,JJPAR,1,LLPAR,2,2,0)
|
||
WRITE(189,21) NTP,NTP/STTCONV
|
||
|
||
WRITE(189,18)
|
||
WRITE(189,31)
|
||
|
||
c Sinks jsw has checked correctness of code for sinks.
|
||
NTP=SUM_CH4(1,IIPAR,1,JJPAR,1,LLPAR,3,3,1)
|
||
NTQ=SUM_CH4(1,IIPAR,1,JJPAR,1,LLPAR,3,3,0)
|
||
SINKS=NTP+NTQ
|
||
|
||
WRITE(189,22) NTP,NTP/SINKS*100.D0,NTP/STTCONV
|
||
WRITE(189,220) NTQ,NTQ/SINKS*100.D0,NTQ/STTCONV
|
||
WRITE(189,29)
|
||
WRITE(189,34) SINKS,SINKS/STTCONV !Just OH sink
|
||
WRITE(189,18)
|
||
WRITE(189,30)
|
||
|
||
C Sources
|
||
NTP=SUM_CH4(1,IIPAR,1,JJPAR,1,1,4,4,1)
|
||
SOURCES=NTP
|
||
|
||
NTP=SUM_CH4(1,IIPAR,1,JJPAR,1,1,5,5,1)
|
||
WRITE(189,24) NTP,NTP/SOURCES*100.D0,NTP/STTCONV
|
||
|
||
NTP=SUM_CH4(1,IIPAR,1,JJPAR,1,1,9,9,1)
|
||
WRITE(189,27) NTP,NTP/SOURCES*100.D0,NTP/STTCONV
|
||
|
||
NTP=SUM_CH4(1,IIPAR,1,JJPAR,1,1,6,6,1)
|
||
WRITE(189,39) NTP,NTP/SOURCES*100.D0,NTP/STTCONV
|
||
|
||
NTP=SUM_CH4(1,IIPAR,1,JJPAR,1,1,7,7,1)
|
||
WRITE(189,25) NTP,NTP/SOURCES*100.D0,NTP/STTCONV
|
||
|
||
NTP=SUM_CH4(1,IIPAR,1,JJPAR,1,1,8,8,1)
|
||
WRITE(189,26) NTP,NTP/SOURCES*100.D0,NTP/STTCONV
|
||
|
||
Cjsw Following lines added by jsw.
|
||
NTP=SUM_CH4(1,IIPAR,1,JJPAR,1,1,10,10,1)
|
||
WRITE(189,35) NTP,NTP/SOURCES*100.D0,NTP/STTCONV
|
||
|
||
SINKS=SINKS-NTP !Minus sign because soil absorption is negative.
|
||
|
||
WRITE(189,29)
|
||
WRITE(189,28) SOURCES,SOURCES/STTCONV
|
||
WRITE(189,18)
|
||
|
||
NTP=SUM_CH4(1,IIPAR,1,JJPAR,1,LLPAR,1,1,1)
|
||
NTP2=SUM_CH4(1,IIPAR,1,JJPAR,1,LLPAR,2,2,1)
|
||
NTQ=SUM_CH4(1,IIPAR,1,JJPAR,1,LLPAR,1,1,0)
|
||
NTQ2=SUM_CH4(1,IIPAR,1,JJPAR,1,LLPAR,2,2,0)
|
||
WRITE(189,18)
|
||
WRITE(189,288) NTP-NTP2+NTQ-NTQ2+SOURCES-SINKS,
|
||
* (NTP-NTP2+NTQ-NTQ2+SOURCES-SINKS)/STTCONV
|
||
WRITE(189,18)
|
||
WRITE(189,289) -(NTP-NTP2+NTQ-NTQ2),
|
||
* -(NTP-NTP2+NTQ-NTQ2)/STTCONV
|
||
|
||
!=================================================================
|
||
! Write SOUTHERN HEMISPHERE averages to ASCII file
|
||
! jsw: I have not modified the remaining code for CH4.
|
||
!=================================================================
|
||
|
||
SOURCES = 0.D0
|
||
SINKS = 0.D0
|
||
|
||
WRITE(189,18)
|
||
WRITE(189,18)
|
||
WRITE(189,36)
|
||
WRITE(189,18)
|
||
WRITE(189,19)
|
||
WRITE(189,1990)
|
||
|
||
NTP=SUM_CH4(1,IIPAR,1,JJPAR/2,1,LLPAR,1,1,1)
|
||
WRITE(189,20) NTP,NTP/STTCONV
|
||
|
||
NTP=SUM_CH4(1,IIPAR,1,JJPAR/2,1,LLPAR,2,2,1)
|
||
WRITE(189,21) NTP,NTP/STTCONV
|
||
|
||
WRITE(189,18)
|
||
WRITE(189,1991)
|
||
NTP=SUM_CH4(1,IIPAR,1,JJPAR/2,1,LLPAR,1,1,0)
|
||
WRITE(189,20) NTP,NTP/STTCONV
|
||
|
||
NTP=SUM_CH4(1,IIPAR,1,JJPAR/2,1,LLPAR,2,2,0)
|
||
WRITE(189,21) NTP,NTP/STTCONV
|
||
WRITE(189,18)
|
||
WRITE(189,31)
|
||
|
||
! Sinks
|
||
NTP=SUM_CH4(1,IIPAR,JJPAR/2+1,JJPAR/2+1,1,LLPAR,11,11,1)
|
||
IF( NTP > 0d0) SINKS = SINKS + NTP
|
||
|
||
NTP2=SUM_CH4(1,IIPAR,JJPAR/2+1,JJPAR/2+1,1,LLPAR,11,11,0)
|
||
IF( NTP2 > 0d0 ) SINKS = SINKS + NTP2
|
||
|
||
NTQ=SUM_CH4(1,IIPAR,1,JJPAR/2,1,LLPAR,3,3,1)
|
||
NTQ2=SUM_CH4(1,IIPAR,1,JJPAR/2,1,LLPAR,3,3,0)
|
||
SINKS=SINKS+NTQ+NTQ2
|
||
WRITE(189,22) NTQ,NTQ/SINKS*100.D0,NTQ/STTCONV
|
||
WRITE(189,220) NTQ2,NTQ2/SINKS*100.D0,NTQ2/STTCONV
|
||
|
||
IF(NTP.GE.0.D0) THEN
|
||
WRITE(189,270) NTP,NTP/SINKS*100.D0,NTP/STTCONV
|
||
ENDIF
|
||
|
||
IF(NTP.GE.0.D0) THEN
|
||
WRITE(189,2700) NTP,NTP/SINKS*100.D0,NTP/STTCONV
|
||
ENDIF
|
||
|
||
WRITE(189,29)
|
||
WRITE(189,34) SINKS,SINKS/STTCONV
|
||
WRITE(189,18)
|
||
WRITE(189,30)
|
||
|
||
! Sources
|
||
NTQ=SUM_CH4(1,IIPAR,1,JJPAR/2,1,LLPAR,5,9,1)
|
||
NTQ2=SUM_CH4(1,IIPAR,1,JJPAR/2,1,LLPAR,4,4,0)
|
||
SOURCES=NTQ+NTQ2
|
||
NTP=SUM_CH4(1,IIPAR,JJPAR/2+1,JJPAR/2+1,1,LLPAR,11,11,1)
|
||
IF(NTP.LT.0.D0) THEN
|
||
SOURCES=SOURCES-NTP
|
||
ENDIF
|
||
|
||
NTP=SUM_CH4(1,IIPAR,JJPAR/2+1,JJPAR/2+1,1,LLPAR,11,11,0)
|
||
IF(NTP.LT.0.D0) THEN
|
||
SOURCES=SOURCES-NTP
|
||
ENDIF
|
||
|
||
NTP=SUM_CH4(1,IIPAR,1,JJPAR/2,1,LLPAR,4,4,1)
|
||
NTP2=SUM_CH4(1,IIPAR,1,JJPAR/2,1,LLPAR,4,4,0)
|
||
NTP=SUM_CH4(1,IIPAR,1,JJPAR/2,1,1,5,5,1)
|
||
WRITE(189,24) NTP,NTP/SOURCES*100.D0,NTP/STTCONV
|
||
|
||
NTP=SUM_CH4(1,IIPAR,1,JJPAR/2,1,1,6,6,1)
|
||
WRITE(189,39) NTP,NTP/SOURCES*100.D0,NTP/STTCONV
|
||
|
||
NTP=SUM_CH4(1,IIPAR,1,JJPAR/2,1,1,7,7,1)
|
||
WRITE(189,25) NTP,NTP/SOURCES*100.D0,NTP/STTCONV
|
||
|
||
NTP=SUM_CH4(1,IIPAR,1,JJPAR/2,1,1,8,8,1)
|
||
WRITE(189,26) NTP,NTP/SOURCES*100.D0,NTP/STTCONV
|
||
|
||
NTP=SUM_CH4(1,IIPAR,1,JJPAR/2,1,1,9,9,1)
|
||
WRITE(189,27) NTP,NTP/SOURCES*100.D0,NTP/STTCONV
|
||
|
||
NTP=SUM_CH4(1,IIPAR,JJPAR/2+1,JJPAR/2+1,1,LLPAR,11,11,1)
|
||
IF(NTP.LT.0.D0) THEN
|
||
WRITE(189,270) -NTP,-NTP/SOURCES*100.D0,-NTP/STTCONV
|
||
ENDIF
|
||
|
||
NTP=SUM_CH4(1,IIPAR,JJPAR/2+1,JJPAR/2+1,1,LLPAR,11,11,0)
|
||
NTP2=SUM_CH4(1,IIPAR,JJPAR/2+1,JJPAR/2+1,1,LLPAR,11,11,0)
|
||
IF( NTP2 > 0d0 ) SINKS = SINKS + NTP2
|
||
|
||
NTQ=SUM_CH4(1,IIPAR,1,JJPAR/2,1,LLPAR,3,3,1)
|
||
NTQ2=SUM_CH4(1,IIPAR,1,JJPAR/2,1,LLPAR,3,3,0)
|
||
SINKS=SINKS+NTQ+NTQ2
|
||
WRITE(189,22) NTQ,NTQ/SINKS*100.D0,NTQ/STTCONV
|
||
|
||
IF(NTP.LT.0.D0) THEN
|
||
WRITE(189,2700) -NTP,-NTP/SOURCES*100.D0,-NTP/STTCONV
|
||
ENDIF
|
||
|
||
WRITE(189,29)
|
||
WRITE(189,28) SOURCES,SOURCES/STTCONV
|
||
WRITE(189,18)
|
||
|
||
NTP=SUM_CH4(1,IIPAR,1,JJPAR/2,1,LLPAR,1,1,1)
|
||
NTP2=SUM_CH4(1,IIPAR,1,JJPAR/2,1,LLPAR,2,2,1)
|
||
NTQ=SUM_CH4(1,IIPAR,1,JJPAR/2,1,LLPAR,1,1,0)
|
||
NTQ2=SUM_CH4(1,IIPAR,1,JJPAR/2,1,LLPAR,2,2,0)
|
||
WRITE(189,18)
|
||
WRITE(189,288) (NTP-NTP2+NTQ-NTQ2+SOURCES-SINKS),
|
||
* (NTP-NTP2+NTQ-NTQ2+SOURCES-SINKS)/STTCONV
|
||
WRITE(189,18)
|
||
WRITE(189,289) -(NTP-NTP2+NTQ-NTQ2),
|
||
* -(NTP-NTP2+NTQ-NTQ2)/STTCONV
|
||
|
||
!=================================================================
|
||
! Write NORTHERN HEMISPHERE averages to ASCII file
|
||
! jsw: I have not modified the remaining code for CH4.
|
||
!=================================================================
|
||
|
||
SOURCES = 0.D0
|
||
SINKS = 0.D0
|
||
|
||
WRITE(189,18)
|
||
WRITE(189,18)
|
||
WRITE(189,37)
|
||
WRITE(189,18)
|
||
WRITE(189,19)
|
||
WRITE(189,1990)
|
||
|
||
NTP=SUM_CH4(1,IIPAR,JJPAR/2+1,JJPAR,1,LLPAR,1,1,1)
|
||
WRITE(189,20) NTP,NTP/STTCONV
|
||
NTP=SUM_CH4(1,IIPAR,JJPAR/2+1,JJPAR,1,LLPAR,2,2,1)
|
||
WRITE(189,21) NTP,NTP/STTCONV
|
||
|
||
WRITE(189,18)
|
||
WRITE(189,1991)
|
||
|
||
NTP=SUM_CH4(1,IIPAR,JJPAR/2+1,JJPAR,1,LLPAR,1,1,0)
|
||
WRITE(189,20) NTP,NTP/STTCONV
|
||
|
||
NTP=SUM_CH4(1,IIPAR,JJPAR/2+1,JJPAR,1,LLPAR,2,2,0)
|
||
WRITE(189,21) NTP,NTP/STTCONV
|
||
|
||
WRITE(189,18)
|
||
WRITE(189,31)
|
||
c Sinks
|
||
NTQ=SUM_CH4(1,IIPAR,JJPAR/2+1,JJPAR,1,LLPAR,3,3,1)
|
||
NTQ2=SUM_CH4(1,IIPAR,JJPAR/2+1,JJPAR,1,LLPAR,3,3,0)
|
||
SINKS=NTQ+NTQ2
|
||
|
||
NTP=SUM_CH4(1,IIPAR,JJPAR/2+1,JJPAR/2+1,1,LLPAR,11,11,1)
|
||
IF(NTP.LT.0.D0) THEN
|
||
SINKS=SINKS-NTP
|
||
ENDIF
|
||
NTP=SUM_CH4(1,IIPAR,JJPAR/2+1,JJPAR/2+1,1,LLPAR,11,11,0)
|
||
IF(NTP.LT.0.D0) THEN
|
||
SINKS=SINKS-NTP
|
||
ENDIF
|
||
|
||
WRITE(189,22) NTQ,NTQ/SINKS*100.D0,NTQ/STTCONV
|
||
WRITE(189,220) NTQ2,NTQ2/SINKS*100.D0,NTQ2/STTCONV
|
||
|
||
NTP=SUM_CH4(1,IIPAR,JJPAR/2+1,JJPAR/2+1,1,LLPAR,11,11,1)
|
||
IF(NTP.LT.0.D0) THEN
|
||
WRITE(189,270) -NTP,-NTP/SINKS*100.D0,-NTP/STTCONV
|
||
ENDIF
|
||
|
||
NTP=SUM_CH4(1,IIPAR,JJPAR/2+1,JJPAR/2+1,1,LLPAR,11,11,0)
|
||
IF(NTP.LT.0.D0) THEN
|
||
WRITE(189,2700) -NTP,-NTP/SINKS*100.D0,-NTP/STTCONV
|
||
ENDIF
|
||
|
||
WRITE(189,29)
|
||
WRITE(189,34)SINKS,SINKS/STTCONV
|
||
WRITE(189,18)
|
||
WRITE(189,30)
|
||
C Sources
|
||
NTQ=SUM_CH4(1,IIPAR,JJPAR/2+1,JJPAR,1,LLPAR,5,9,1)
|
||
NTQ2=SUM_CH4(1,IIPAR,JJPAR/2+1,JJPAR,1,LLPAR,4,4,0)
|
||
SOURCES=NTQ+NTQ2
|
||
|
||
NTP=SUM_CH4(1,IIPAR,JJPAR/2+1,JJPAR/2+1,1,LLPAR,11,11,1)
|
||
IF(NTP.GE.0.D0) THEN
|
||
SOURCES=SOURCES+NTP
|
||
ENDIF
|
||
NTP=SUM_CH4(1,IIPAR,JJPAR/2+1,JJPAR/2+1,1,LLPAR,11,11,0)
|
||
IF(NTP.GE.0.D0) THEN
|
||
SOURCES=SOURCES+NTP
|
||
ENDIF
|
||
|
||
NTP=SUM_CH4(1,IIPAR,JJPAR/2+1,JJPAR,1,LLPAR,4,4,1)
|
||
|
||
NTP=SUM_CH4(1,IIPAR,JJPAR/2+1,JJPAR,1,LLPAR,4,4,0)
|
||
|
||
NTP=SUM_CH4(1,IIPAR,JJPAR/2+1,JJPAR,1,1,5,5,1)
|
||
WRITE(189,24) NTP,NTP/SOURCES*100.D0,NTP/STTCONV
|
||
|
||
NTP=SUM_CH4(1,IIPAR,JJPAR/2+1,JJPAR,1,1,6,6,1)
|
||
WRITE(189,39) NTP,NTP/SOURCES*100.D0,NTP/STTCONV
|
||
|
||
NTP=SUM_CH4(1,IIPAR,JJPAR/2+1,JJPAR,1,1,7,7,1)
|
||
WRITE(189,25) NTP,NTP/SOURCES*100.D0,NTP/STTCONV
|
||
|
||
NTP=SUM_CH4(1,IIPAR,JJPAR/2+1,JJPAR,1,1,8,8,1)
|
||
WRITE(189,26) NTP,NTP/SOURCES*100.D0,NTP/STTCONV
|
||
|
||
NTP=SUM_CH4(1,IIPAR,JJPAR/2+1,JJPAR,1,1,9,9,1)
|
||
WRITE(189,27) NTP,NTP/SOURCES*100.D0,NTP/STTCONV
|
||
|
||
NTP=SUM_CH4(1,IIPAR,JJPAR/2+1,JJPAR/2+1,1,LLPAR,11,11,1)
|
||
IF(NTP.GE.0.D0) THEN
|
||
WRITE(189,270) NTP,NTP/SOURCES*100.D0,NTP/STTCONV
|
||
ENDIF
|
||
|
||
NTP=SUM_CH4(1,IIPAR,JJPAR/2+1,JJPAR/2+1,1,LLPAR,11,11,0)
|
||
IF(NTP.GE.0.D0) THEN
|
||
WRITE(189,2700) NTP,NTP/SOURCES*100.D0,NTP/STTCONV
|
||
ENDIF
|
||
|
||
WRITE(189,29)
|
||
WRITE(189,28) SOURCES,SOURCES/STTCONV
|
||
WRITE(189,18)
|
||
|
||
NTP=SUM_CH4(1,IIPAR,JJPAR/2+1,JJPAR,1,LLPAR,1,1,1)
|
||
NTP2=SUM_CH4(1,IIPAR,JJPAR/2+1,JJPAR,1,LLPAR,2,2,1)
|
||
NTQ=SUM_CH4(1,IIPAR,JJPAR/2+1,JJPAR,1,LLPAR,1,1,0)
|
||
NTQ2=SUM_CH4(1,IIPAR,JJPAR/2+1,JJPAR,1,LLPAR,2,2,0)
|
||
WRITE(189,18)
|
||
WRITE(189,288) (NTP-NTP2+NTQ-NTQ2+SOURCES-SINKS),
|
||
* (NTP-NTP2+NTQ-NTQ2+SOURCES-SINKS)/STTCONV
|
||
WRITE(189,18)
|
||
WRITE(189,289) -(NTP-NTP2+NTQ-NTQ2),
|
||
* -(NTP-NTP2+NTQ-NTQ2)/STTCONV
|
||
|
||
18 FORMAT()
|
||
19 FORMAT(' #Molecules TG')
|
||
20 FORMAT(' Start of Month :',E10.3,10x,F10.3)
|
||
21 FORMAT(' End of Month :',E10.3,10x,F10.3)
|
||
22 FORMAT(' CH4 decay-trop :',E10.3,2x,F6.1,2x,F10.3)
|
||
220 FORMAT(' CH4 decay-strat :',E10.3,2x,F6.1,2x,F10.3)
|
||
24 FORMAT(' Industrial :',E10.3,2x,F6.1,2x,F10.3)
|
||
25 FORMAT(' Biomass Burning :',E10.3,2x,F6.1,2x,F10.3)
|
||
26 FORMAT(' Termites :',E10.3,2x,F6.1,2x,F10.3)
|
||
27 FORMAT(' Wetland :',E10.3,2x,F6.1,2x,F10.3)
|
||
270 FORMAT(' N-S Ex.-trop :',E10.3,2x,F6.1,2x,F10.3)
|
||
2700 FORMAT(' N-S Ex.-strat :',E10.3,2x,F6.1,2x,F10.3)
|
||
28 FORMAT('Total Sources :',E10.3,10x,F10.3)
|
||
288 FORMAT('Initial-Final+Sources-Sinks=',E10.3,2x,F10.3)
|
||
289 FORMAT('Net Gain : ',E10.3,10x,F10.3)
|
||
29 FORMAT(' ---------')
|
||
30 FORMAT('SOURCES %Source')
|
||
31 FORMAT('SINKS %Sink')
|
||
34 FORMAT('Total Sinks :',E10.3,10x,F10.3)
|
||
35 FORMAT(' Soil absorption :',E10.3,2x,F6.1,2x,F10.3)
|
||
39 FORMAT(' Agriculture :',E10.3,2x,F6.1,2x,F10.3)
|
||
|
||
36 FORMAT('***** Southern Hemisphere *****')
|
||
37 FORMAT('***** Northern Hemisphere *****')
|
||
38 FORMAT('***** Global *****')
|
||
|
||
CLOSE(189)
|
||
|
||
! !=================================================================
|
||
! ! Also save to binary punch file. Don't save the bpunch file
|
||
! ! anymore, because it's not used. Keep the code for reference.
|
||
! ! The code creates the bpunch file fort.190. Should use a diag.
|
||
! ! instead. (ccc, 8/14/09)
|
||
! !=================================================================
|
||
! CALL BPCH2_HDR( 190, LABEL )
|
||
!
|
||
! DO K = 1, N_CH4
|
||
!
|
||
! ! Cast REAL*8 into REAL*4, convert from molec to Tg
|
||
! ARRAY(:,:,:) = TCH4(:,:,:,K) / STTCONV
|
||
!
|
||
! ! Save the data block
|
||
! CALL BPCH2( 190, MODELNAME, LONRES, LATRES,
|
||
! & HALFPOLAR, CENTER180, CATEGORY, K,
|
||
! & UNIT, GET_DIAGB(), GET_DIAGb(), RESERVED,
|
||
! & IIPAR, JJPAR, LLPAR, IFIRST,
|
||
! & JFIRST, LFIRST, ARRAY )
|
||
! ENDDO
|
||
!
|
||
! CLOSE(190)
|
||
|
||
!=================================================================
|
||
! Final burden at last of month equals initial burden
|
||
! of next month. Also set TCH4 = 0 for next month.
|
||
!=================================================================
|
||
TCH4(:,:,:,1 ) = TCH4(:,:,:,2)
|
||
TCH4(:,:,:,2:N_CH4) = 0d0
|
||
|
||
! Return to calling program
|
||
END SUBROUTINE CH4_BUDGET
|
||
|
||
!------------------------------------------------------------------------------
|
||
|
||
REAL*8 FUNCTION SUM_CH4( I1, I2, J1, J2, L1, L2, K1, K2, UPDOWN )
|
||
!
|
||
!******************************************************************************
|
||
! Function SUM_CH4 sums a section of the TCH4 array bounded by the input
|
||
! variables I1, I2, J1, J2, L1, L2, K1, K2. SUM_CH4 is called by
|
||
! module subroutine CH4_BUDGET. (jsw, bnd, bmy, 1/16/01)
|
||
!
|
||
! Store the sources/sinks of CH4 in TCH4 in total molecules
|
||
! ( 1) = Initial burden
|
||
! ( 2) = Final burden
|
||
! SINKS
|
||
! ( 3) = Tropospheric CH4 sink by OH
|
||
! SOURCES
|
||
! ( 4) = Total Source
|
||
! ( 5) = Industral
|
||
! ( 6) = Agriculture
|
||
! ( 7) = Biomass Burning
|
||
! ( 8) = Termites
|
||
! ( 9) = Wetland
|
||
! (10) = Soil absorption
|
||
! (11) = Interhemispheric Exchange (+ = northward)
|
||
! (12) = ...
|
||
!
|
||
! Levels 1 <= L <= LPAUSE(I,J) - 1 are tropospheric
|
||
! LPAUSE(I,J) <= L <= LLPAR are stratospheric (bmy, 4/17/00)
|
||
!
|
||
! Arguments as Input:
|
||
! ============================================================================
|
||
! (1-2) I1, I2 (INTEGER) : Min and max longitude indices of TCH4 to sum
|
||
! (3-4) J1, J2 (INTEGER) : Min and max latitude indices of TCH4 to sum
|
||
! (5-6) L1, L2 (INTEGER) : Min and max altitude indices of TCH4 to sum
|
||
! (7-8) K1, K2 (INTEGER) : Min and max tracer indices of TCH4 to sum
|
||
! (9 ) UPDOWN (INTEGER) : Sum in troposphere (=1) or in stratosphere (=0)
|
||
!
|
||
! NOTES:
|
||
! (1 ) Created by Bryan Duncan (1/99). Adapted for CH4 chemistry by
|
||
! James Wang (7/00). Inserted into module "global_ch4_mod.f"
|
||
! by Bob Yantosca. (bmy, 1/16/01)
|
||
! (2 ) CH4_BUDGET is independent of "CMN_OH", "CMN_CO", and "CMN_CO_BUDGET".
|
||
! (bmy, 1/16/01)
|
||
! (3 ) Updated comments (jsw, bmy, 2/12/01)
|
||
!******************************************************************************
|
||
!
|
||
# include "CMN_SIZE" ! Size parameters
|
||
# include "CMN" ! LPAUSE
|
||
|
||
! Arguments
|
||
INTEGER, INTENT(IN) :: I1, I2, J1, J2, L1, L2
|
||
INTEGER, INTENT(IN) :: K1, K2, UPDOWN
|
||
|
||
! Local variables
|
||
INTEGER :: I, J, K, L, LPAUSE_MIN, LPAUSE_MAX
|
||
|
||
!=================================================================
|
||
! SUM_CH4 begins here!
|
||
!=================================================================
|
||
|
||
! Compute the minimum value of LPAUSE once for use in
|
||
! the DO-loops below (bmy, 4/18/00)
|
||
LPAUSE_MIN = MINVAL( LPAUSE )
|
||
LPAUSE_MAX = MAXVAL( LPAUSE )
|
||
|
||
! Initialize SUM_CH4
|
||
SUM_CH4 = 0d0
|
||
|
||
! Test on UPDOWN
|
||
IF ( UPDOWN == 1 ) THEN
|
||
|
||
!=============================================================
|
||
! UPDOWN = 1: Sum up from the surface to the tropopause
|
||
!=============================================================
|
||
DO K = K1, K2
|
||
DO L = L1, LPAUSE_MAX
|
||
DO J = J1, J2
|
||
DO I = I1, I2
|
||
IF ( L < LPAUSE(I,J) ) THEN
|
||
SUM_CH4 = SUM_CH4 + TCH4(I,J,L,K)
|
||
ENDIF
|
||
ENDDO
|
||
ENDDO
|
||
ENDDO
|
||
ENDDO
|
||
|
||
ELSE
|
||
|
||
!=============================================================
|
||
! UPDOWN = 0: Sum up from the tropopause to the atm top
|
||
!=============================================================
|
||
DO K = K1, K2
|
||
DO L = LPAUSE_MIN, L2
|
||
DO J = J1, J2
|
||
DO I = I1, I2
|
||
IF ( L >= LPAUSE(I,J) ) THEN
|
||
SUM_CH4 = SUM_CH4 + TCH4(I,J,L,K)
|
||
ENDIF
|
||
ENDDO
|
||
ENDDO
|
||
ENDDO
|
||
ENDDO
|
||
ENDIF
|
||
|
||
! Return to calling program
|
||
END FUNCTION SUM_CH4
|
||
|
||
!------------------------------------------------------------------------------
|
||
|
||
SUBROUTINE CH4_DISTRIB(PREVCH4)
|
||
!
|
||
!******************************************************************************
|
||
! Subroutine CH4_DISTRIB allocates the chemistry sink to different
|
||
! emission tracers.
|
||
! (ccc, 10/2/09)
|
||
!
|
||
! Arguments as Input:
|
||
! ============================================================================
|
||
! PREVCH4(IIPAR, JJPAR, LLPAR) (REAL*8) : Store CH4 concentration before
|
||
! chemistry
|
||
!
|
||
!******************************************************************************
|
||
!
|
||
USE TRACER_MOD, ONLY : STT, N_TRACERS
|
||
USE ERROR_MOD, ONLY : SAFE_DIV
|
||
|
||
IMPLICIT NONE
|
||
|
||
# include "CMN_SIZE" ! Size parameters
|
||
|
||
!Arguments
|
||
REAL*8 :: PREVCH4(IIPAR, JJPAR, LLPAR)
|
||
|
||
!Local variables
|
||
INTEGER :: N, I, J, L
|
||
|
||
!========================================================================
|
||
! CH4_DISTRIB begins here
|
||
!========================================================================
|
||
|
||
DO N=2,N_TRACERS
|
||
|
||
!$OMP PARALLEL DO
|
||
!$OMP+DEFAULT( SHARED )
|
||
!$OMP+PRIVATE( I, J, L )
|
||
DO L = 1, LLPAR
|
||
DO J = 1, JJPAR
|
||
DO I = 1, IIPAR
|
||
STT(I,J,L,N) = SAFE_DIV(STT(I,J,L,N),PREVCH4(I,J,L),0.d0)
|
||
& * STT(I,J,L,1)
|
||
ENDDO
|
||
ENDDO
|
||
ENDDO
|
||
!$OMP END PARALLEL DO
|
||
|
||
ENDDO
|
||
|
||
! Return to calling program
|
||
END SUBROUTINE CH4_DISTRIB
|
||
|
||
|
||
!------------------------------------------------------------------------------
|
||
|
||
FUNCTION GET_SCALE_GROUP( ) RESULT( CURRENT_GROUP )
|
||
!
|
||
!********************************************************************************
|
||
! Subroutine GET_SCALE_GROUP determines which predifined scaling index corresponds
|
||
! to the current time and location (dkh, 12/02/04)
|
||
!
|
||
! NOTES
|
||
! (1 ) CURRENT_GROUP is currently only a function of TAU
|
||
! (2 ) Get rid of I,J as argument. (dkh, 03/28/05)
|
||
!
|
||
!********************************************************************************
|
||
|
||
! Reference to f90 modules
|
||
USE TIME_MOD, ONLY : GET_TAU, GET_TAUe, GET_TAUb, GET_MONTH
|
||
USE ADJ_ARRAYS_MOD, ONLY : MMSCL
|
||
|
||
# include "CMN_SIZE" ! Size stuff
|
||
|
||
! Arguments
|
||
INTEGER :: I, J
|
||
|
||
! Local Variables
|
||
REAL*8 :: TOTAL_HR, CURRENT_HR, GROUP_LENGTH
|
||
REAL*8 :: TAU, TAUe, TAUb
|
||
|
||
! Function variable
|
||
INTEGER :: CURRENT_GROUP
|
||
LOGICAL, SAVE :: MONTHLY = .TRUE.
|
||
INTEGER, SAVE :: MONTH_SAVE
|
||
INTEGER, SAVE :: GROUP_SAVE
|
||
LOGICAL, SAVE :: FIRST = .TRUE.
|
||
|
||
!============================================================
|
||
! GET_SCALE_GROUP begins here!
|
||
!============================================================
|
||
|
||
! Currently there is no spatial grouping
|
||
|
||
! Determine temporal grouping
|
||
IF ( MMSCL == 1 ) THEN
|
||
CURRENT_GROUP = 1
|
||
RETURN
|
||
ENDIF
|
||
|
||
IF ( MONTHLY ) THEN
|
||
IF (FIRST) THEN
|
||
MONTH_SAVE = GET_MONTH()
|
||
CURRENT_GROUP = MMSCL
|
||
GROUP_SAVE = MMSCL
|
||
FIRST = .FALSE.
|
||
ENDIF
|
||
IF ( MONTH_SAVE /= GET_MONTH() ) THEN
|
||
MONTH_SAVE = GET_MONTH()
|
||
GROUP_SAVE = GROUP_SAVE - 1
|
||
CURRENT_GROUP = GROUP_SAVE
|
||
ELSE
|
||
CURRENT_GROUP = GROUP_SAVE
|
||
ENDIF
|
||
|
||
ELSE
|
||
! Retrieve time parameters
|
||
TAUe = GET_TAUe()
|
||
TAUb = GET_TAUb()
|
||
TAU = GET_TAU()
|
||
TOTAL_HR = TAUe - TAUb
|
||
CURRENT_HR = TAU - TAUb
|
||
|
||
|
||
! The last time step always belongs to the last group
|
||
IF ( TAU == TAUe ) THEN
|
||
CURRENT_GROUP = MMSCL
|
||
RETURN
|
||
ELSE
|
||
|
||
! Determine the length of each group
|
||
GROUP_LENGTH = REAL( TOTAL_HR / MMSCL )
|
||
|
||
! Index is the current time divided by the group length, plus one
|
||
CURRENT_GROUP = SNGL( CURRENT_HR / GROUP_LENGTH ) + 1
|
||
|
||
ENDIF
|
||
|
||
ENDIF
|
||
|
||
END FUNCTION GET_SCALE_GROUP
|
||
|
||
|
||
!------------------------------------------------------------------------------
|
||
|
||
SUBROUTINE INIT_GLOBAL_CH4
|
||
!
|
||
!******************************************************************************
|
||
! Subroutine INIT_GLOBAL_CH4 allocates and zeroes module arrays.
|
||
! (bmy, 1/16/01, 10/15/02)
|
||
!
|
||
! NOTES:
|
||
! (1 ) Now references ALLOC_ERR from "error_mod.f" (bmy, 10/15/02)
|
||
!******************************************************************************
|
||
!
|
||
! References to F90 modules
|
||
USE ERROR_MOD, ONLY : ALLOC_ERR
|
||
|
||
# include "CMN_SIZE"
|
||
# include "CMN_DIAG"
|
||
|
||
! Local variables
|
||
INTEGER :: AS
|
||
|
||
ALLOCATE( AVGOH( NSEAS, NCMSLATS, NCMSALTS ), STAT=AS )
|
||
IF ( AS /= 0 ) CALL ALLOC_ERR( 'AVGOH' )
|
||
AVGOH = 0d0
|
||
|
||
ALLOCATE( BAIRDENS( IIPAR, JJPAR, LLPAR ), STAT=AS )
|
||
IF ( AS /= 0 ) CALL ALLOC_ERR( 'BAIRDENS' )
|
||
BAIRDENS = 0d0
|
||
|
||
ALLOCATE( BOH( IIPAR, JJPAR, LLPAR, 12 ), STAT=AS )
|
||
IF ( AS /= 0 ) CALL ALLOC_ERR( 'BOH' )
|
||
BOH = 0d0
|
||
|
||
ALLOCATE( COPROD( JJPAR, LLPAR, 12 ), STAT=AS )
|
||
IF ( AS /= 0 ) CALL ALLOC_ERR( 'COPROD' )
|
||
COPROD = 0d0
|
||
|
||
ALLOCATE( PAVG( IIPAR, JJPAR, LLPAR ), STAT=AS )
|
||
IF ( AS /= 0 ) CALL ALLOC_ERR( 'PAVG' )
|
||
PAVG = 0d0
|
||
|
||
ALLOCATE( TAVG( IIPAR, JJPAR, LLPAR ), STAT=AS )
|
||
IF ( AS /= 0 ) CALL ALLOC_ERR( 'TAVG' )
|
||
TAVG = 0d0
|
||
|
||
ALLOCATE( CH4LOSS( IIPAR, JJPAR, LLPAR, 12 ), STAT=AS )
|
||
IF ( AS /= 0 ) CALL ALLOC_ERR( 'CH4LOSS' )
|
||
CH4LOSS = 0d0
|
||
|
||
ALLOCATE( TCH4( IIPAR, JJPAR, LLPAR, N_CH4 ), STAT=AS )
|
||
IF ( AS /= 0 ) CALL ALLOC_ERR( 'TCH4' )
|
||
TCH4 = 0d0
|
||
|
||
ALLOCATE( CH4_EMIS( IIPAR, JJPAR, PD58), STAT=AS )
|
||
IF ( AS /= 0 ) CALL ALLOC_ERR( 'CH4_EMIS' )
|
||
CH4_EMIS = 0d0
|
||
|
||
! Return to calling program
|
||
END SUBROUTINE INIT_GLOBAL_CH4
|
||
|
||
!------------------------------------------------------------------------------
|
||
|
||
SUBROUTINE CLEANUP_GLOBAL_CH4
|
||
!
|
||
!******************************************************************************
|
||
! Subroutine CLEANUP_GLOBAL_CH4 deallocates module arrays. (bmy, 1/16/01)
|
||
!******************************************************************************
|
||
!
|
||
IF ( ALLOCATED( BAIRDENS ) ) DEALLOCATE( BAIRDENS )
|
||
IF ( ALLOCATED( BOH ) ) DEALLOCATE( BOH )
|
||
IF ( ALLOCATED( CH4LOSS ) ) DEALLOCATE( CH4LOSS )
|
||
IF ( ALLOCATED( COPROD ) ) DEALLOCATE( COPROD )
|
||
IF ( ALLOCATED( TCH4 ) ) DEALLOCATE( TCH4 )
|
||
IF ( ALLOCATED( TAVG ) ) DEALLOCATE( TAVG )
|
||
IF ( ALLOCATED( CH4_EMIS ) ) DEALLOCATE( CH4_EMIS )
|
||
|
||
END SUBROUTINE CLEANUP_GLOBAL_CH4
|
||
|
||
!------------------------------------------------------------------------------
|
||
|
||
END MODULE GLOBAL_CH4_MOD
|