1114 lines
42 KiB
Fortran
1114 lines
42 KiB
Fortran
! $Id: geia_mod.f,v 1.1 2009/06/09 21:51:51 daven Exp $
|
|
MODULE GEIA_MOD
|
|
!
|
|
!******************************************************************************
|
|
! Module GEIA_MOD contains routines used to read and scale the GEIA fossil
|
|
! fuel emissions for NOx, CO, and hydrocarbons (bmy, 7/28/00, 11/6/08)
|
|
!
|
|
! Module Routines:
|
|
! ============================================================================
|
|
! (1 ) READ_TOTCO2 : reads total CO2 scale factors (for FF NOx)
|
|
! (2 ) READ_LIQCO2 : reads liquid CO2 scale factors (for CO, HC's)
|
|
! (3 ) READ_TODX : reads "time-of-day" scale factors for GEIA em's
|
|
! (4 ) READ_GEIA_ASCII : reads GEIA fossil fuel emissions from ASCII file
|
|
! (5 ) READ_GEIA : reads GEIA fossil fuel emissions from binary file
|
|
! (6 ) READ_C3H8_C2H6_NGAS : reads C2H6 and C3H8 based on Natural Gas em's
|
|
! (7 ) GET_DAY_INDEX : Determines if today is a weekday, Sat., or Sun.
|
|
! (8 ) GET_IHOUR : Returns index for the "time-of-day" scale factor
|
|
! (9 ) TOTAL_FOSSIL_TG : Computes total fossil fuel emissions in Tg
|
|
!
|
|
! GEOS-CHEM modules referenced by geia_mod.f
|
|
! ============================================================================
|
|
! (1 ) bpch2_mod.f : Module containing routines for binary punch file I/O
|
|
! (2 ) directory_mod.f : Module containing GEOS-CHEM data & met field dirs
|
|
! (3 ) file_mod.f : Module containing file unit numbers and error checks
|
|
! (4 ) grid_mod.f : Module containing horizontal grid information
|
|
!
|
|
! NOTES:
|
|
! (1 ) Renamed original READ_GEIA to READ_GEIA_ASCII. The new READ_GEIA
|
|
! now reads fossil fuel emissions from the newer binary punch
|
|
! file format. (bmy, 4/23/01)
|
|
! (2 ) Added new routine TOTAL_FOSSIL_TG (bmy, 4/27/01)
|
|
! (3 ) Bug fix: now read C2H6 from punch file correctly (bmy, 7/2/01)
|
|
! (4 ) Added new routine: READ_C3H8_C2H6_NGAS. Also updated comments.
|
|
! (bmy, 9/4/01)
|
|
! (5 ) Deleted obsolete code from 9/01 (bmy, 11/15/01)
|
|
! (6 ) Now read scalefoss* files directly from the DATA_DIR filesystem,
|
|
! instead of relying on symbolic links. Also updated comments.
|
|
! (bmy, 1/25/02)
|
|
! (7 ) Eliminated obsolete code (bmy, 2/27/02)
|
|
! (8 ) Routine READ_TODX now reads files from DATA_DIR/fossil_200104/, and
|
|
! routine READ_GEIA_ASCII now reads files from DATA_DIR/fossil_obsolete.
|
|
! This eliminates the need for symbolic file links. (bmy, 4/3/02)
|
|
! (9 ) Updated comments (bmy, 5/28/02)
|
|
! (10) Now references "file_mod.f" (bmy, 6/27/02)
|
|
! (11) Now references "grid_mod.f" and the new "time_mod.f" (bmy, 2/10/03)
|
|
! (12) Now references "directory_mod.f" (bmy, 7/20/04)
|
|
! (13) Now can read data from both GEOS and GCAP grids (bmy, 8/16/05)
|
|
! (14) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)
|
|
! (15) Modifications for 0.5 x 0.666 nested grids (yxw, dan, bmy, 11/6/08)
|
|
!******************************************************************************
|
|
!
|
|
IMPLICIT NONE
|
|
|
|
!=================================================================
|
|
! MODULE ROUTINES -- follow below the "CONTAINS" statement
|
|
!=================================================================
|
|
CONTAINS
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE READ_TOTCO2( SCALEYEAR, TOTCO2 )
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine READ_TOTCO2 reads in the scale factors (SCALEYEAR/1985) based
|
|
! on total CO2 emissions. These are used to scale anthropogenic NOx
|
|
! emissions from 1985 to the present. (bmy, 9/13/00, 7/20/04)
|
|
!
|
|
! NOTES:
|
|
! (1 ) Now use IOS /= 0 to trap both I/O errors and EOF. (bmy, 9/13/00)
|
|
! (2 ) Make sure parentheses end before column 73 (bmy, 9/25/00)
|
|
! (3 ) Now read the "scalefoss.tot*" files directly from the
|
|
! scalefoss_200202/ subdirectory of DATA_DIR, w/o relying on
|
|
! symbolic links. Also updated comments. (bmy, 1/24/02)
|
|
! (4 ) Eliminated obsolete code from 1/02 (bmy, 2/27/02)
|
|
! (5 ) Now write file name to stdout (bmy, 4/3/02)
|
|
! (6 ) Now use IU_FILE instead of IUNIT. Also reference IU_FILE and IOERROR
|
|
! from "file_mod.f" (bmy, 6/27/02)
|
|
! (7 ) Now use ENCODE to define CYEAR string for PGI/Linux (bmy, 9/29/03)
|
|
! (8 ) Now references DATA_DIR from "directory_mod.f" (bmy, 7/20/04)
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE BPCH2_MOD, ONLY : GET_RES_EXT
|
|
USE DIRECTORY_MOD, ONLY : DATA_DIR
|
|
USE FILE_MOD, ONLY : IU_FILE, IOERROR
|
|
|
|
# include "CMN_SIZE" ! Size parameters
|
|
|
|
! Arguments
|
|
INTEGER, INTENT(IN) :: SCALEYEAR
|
|
REAL*4, INTENT(OUT) :: TOTCO2(IGLOB,JGLOB)
|
|
|
|
! Local variables
|
|
INTEGER :: I, J, IX, JX, IOS
|
|
CHARACTER(LEN=4 ) :: CYEAR
|
|
CHARACTER(LEN=255) :: FILENAME
|
|
|
|
!=================================================================
|
|
! READ_TOTCO2 begins here!
|
|
!=================================================================
|
|
WRITE( 6, 10 ) SCALEYEAR
|
|
10 FORMAT( 'READ_TOTCO2: Year for Total CO2 scale factor: ', i4 )
|
|
|
|
! Define the file name and the file unit
|
|
! Now use ENCODE for PGI/F90 on Linux (bmy, 9/29/03)
|
|
#if defined( LINUX )
|
|
ENCODE( 4, '(i4)', CYEAR ) SCALEYEAR
|
|
#else
|
|
WRITE( CYEAR, '(i4)' ) SCALEYEAR
|
|
#endif
|
|
|
|
FILENAME = TRIM( DATA_DIR ) //
|
|
& 'scalefoss_200202/scalefoss.tot.' //
|
|
& GET_RES_EXT() // '.' // CYEAR
|
|
|
|
! 1985 is the base year -- TOTCO2 = 1 in 1985!
|
|
IF ( SCALEYEAR == 1985 ) THEN
|
|
TOTCO2 = 1d0
|
|
|
|
ELSE
|
|
|
|
! Echo filename to stdout
|
|
WRITE( 6, 20 ) TRIM( FILENAME )
|
|
20 FORMAT( 'READ_TOTCO2: Reading ', a )
|
|
|
|
! Open the file containing liquid CO2 scale factors
|
|
OPEN( IU_FILE, FILE=TRIM( FILENAME ), STATUS='OLD',
|
|
& FORM='UNFORMATTED', IOSTAT=IOS )
|
|
IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_FILE,'read_totco2_file:1')
|
|
|
|
! Read the array dimensions IX, JX
|
|
READ( IU_FILE, IOSTAT=IOS ) IX, JX
|
|
IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_FILE,'read_totco2_file:2')
|
|
|
|
! Read the data block of Liquid CO2 scale factors
|
|
READ( IU_FILE, IOSTAT=IOS ) ( ( TOTCO2(I,J), I=1,IX ), J=1,JX )
|
|
IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_FILE,'read_totco2_file:3')
|
|
|
|
! Close the file
|
|
CLOSE( IU_FILE )
|
|
|
|
ENDIF
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE READ_TOTCO2
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE READ_LIQCO2( SCALEYEAR, LIQCO2 )
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine READ_LIQCO2 reads in the scale factors (SCALEYEAR/1985) based
|
|
! on liquid CO2 emissions. These are used to scale anthropogenic CO and
|
|
! hydrocarbon emissions from 1985 to the present. (bmy, 9/13/00, 7/20/04)
|
|
!
|
|
! NOTES:
|
|
! (1 ) Now use IOS /= 0 to trap both I/O errors and EOF. (bmy, 9/13/00)
|
|
! (2 ) Make sure parentheses end before column 73 (bmy, 9/25/00)
|
|
! (3 ) Now read the "scalefoss.liq*" files directly from the
|
|
! scalefoss_200202/ subdirectory of DATA_DIR, w/o relying on
|
|
! symbolic links. Also updated comments. (bmy, 1/24/02)
|
|
! (4 ) Eliminated obsolete code from 1/02 (bmy, 2/27/02)
|
|
! (5 ) Now write file name to stdout (bmy, 4/3/02)
|
|
! (6 ) Now use IU_FILE instead of IUNIT. Also reference IU_FILE and IOERROR
|
|
! from "file_mod.f" (bmy, 6/27/02)
|
|
! (7 ) Now use ENCODE to define CYEAR string for PGI/Linux (bmy, 9/29/03)
|
|
! (8 ) Now references DATA_DIR from "directory_mod.f" (bmy, 7/20/04)
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE BPCH2_MOD, ONLY : GET_RES_EXT
|
|
USE DIRECTORY_MOD, ONLY : DATA_DIR
|
|
USE FILE_MOD, ONLY : IU_FILE, IOERROR
|
|
USE BPCH2_MOD, ONLY : GET_RES_EXT
|
|
|
|
|
|
|
|
# include "CMN_SIZE" ! Size parameters
|
|
|
|
! Arguments
|
|
INTEGER, INTENT(IN) :: SCALEYEAR
|
|
REAL*4, INTENT(OUT) :: LIQCO2(IGLOB,JGLOB)
|
|
|
|
! Local variables
|
|
INTEGER :: I, J, IX, JX, IOS
|
|
CHARACTER(LEN=4 ) :: CYEAR
|
|
CHARACTER(LEN=255) :: FILENAME
|
|
|
|
!=================================================================
|
|
! READ_LIQCO2 begins here!
|
|
!=================================================================
|
|
WRITE( 6, 10 ) SCALEYEAR
|
|
10 FORMAT( 'READ_LIQCO2: Year for Liquid CO2 scale factor: ', i4 )
|
|
|
|
! Define the file name and the file unit
|
|
! Now use ENCODE to define CYEAR string for Linux (bmy, 9/29/03)
|
|
#if defined( LINUX )
|
|
ENCODE( 4, '(i4)', CYEAR ) SCALEYEAR
|
|
#else
|
|
WRITE( CYEAR, '(i4)' ) SCALEYEAR
|
|
#endif
|
|
FILENAME = TRIM( DATA_DIR ) //
|
|
& 'scalefoss_200202/scalefoss.liq.' //
|
|
& GET_RES_EXT() // '.' // CYEAR
|
|
|
|
! 1985 is the base year -- LIQCO2 = 1 in 1985!
|
|
IF ( SCALEYEAR == 1985 ) THEN
|
|
LIQCO2 = 1d0
|
|
|
|
ELSE
|
|
|
|
! Echo filename to stdout
|
|
WRITE( 6, 20 ) TRIM( FILENAME )
|
|
20 FORMAT( 'READ_TOTCO2: Reading ', a )
|
|
|
|
! Open the file containing liquid CO2 scale factors
|
|
OPEN( IU_FILE, FILE=TRIM( FILENAME ), STATUS='OLD',
|
|
& FORM='UNFORMATTED', IOSTAT=IOS )
|
|
IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_FILE,'read_liqco2_file:1')
|
|
|
|
! Read the array dimensions IX, JX
|
|
READ( IU_FILE, IOSTAT=IOS ) IX, JX
|
|
IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_FILE,'read_liqco2_file:2')
|
|
|
|
! Read the data block of Liquid CO2 scale factors
|
|
READ( IU_FILE, IOSTAT=IOS ) ( ( LIQCO2(I,J), I=1,IX ), J=1,JX )
|
|
IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_FILE,'read_liqco2_file:3')
|
|
|
|
! Close the file
|
|
CLOSE( IU_FILE )
|
|
ENDIF
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE READ_LIQCO2
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE READ_TODX( TODN, TODH, TODB, SCNR89 )
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine READ_TODX reads the time-of-day emission scale factors and
|
|
! weekday/weekend scale factors for GEIA emissions. (bmy, 7/18/00, 11/6/08)
|
|
!
|
|
! Arguments as Input:
|
|
! ============================================================================
|
|
! (1 ) TODN (REAL*8) : Time-of-day scale factor for NOx
|
|
! (2 ) TODH (REAL*8) : Time-of-day scale factor for hydrocarbons
|
|
! (3 ) TODB (REAL*8) : Time-of-day scale factor for biogenic species
|
|
! (4 ) SCNR89 (REAL*8) : Weekday/Saturday/Sunday emission scale factors
|
|
!
|
|
! NOTES:
|
|
! (1 ) Copied from routine "anthroems.f" (bmy, 7/18/00)
|
|
! (2 ) Added code for 1 x 1 GEOS grid (bmy, 8/7/00)
|
|
! (3 ) Now use IOS /= 0 to trap both I/O errors and EOF (bmy, 9/13/00)
|
|
! (4 ) Now read files directly from DATA_DIR/fossil_200104 subdirectory.
|
|
! Also echo the file name to stdout. Now reference DATA_DIR from
|
|
! the "CMN_SETUP" header file. (bmy, 4/3/02)
|
|
! (5 ) Now reference IU_FILE and IOERROR from "file_mod.f". Also deleted
|
|
! obsolete code from April 2002 (bmy, 6/27/02)
|
|
! (6 ) Now references DATA_DIR from "directory_mod.f" (bmy, 7/20/04)
|
|
! (7 ) Added space in the #ifdef block for 1 x 1.25 grid (bmy, 12/1/04)
|
|
! (8 ) Now reads appropriate file for 0.5 x 0.666 nested grid simulations
|
|
! (yxw, dan, bmy, 11/6/08)
|
|
! (9) BUG: Jintai Lin reported issues with some of the data read here. The
|
|
! sum of TODB is not 6, which points to a problem. However this is not
|
|
! used in the code. (phs, 4/16/09)
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE DIRECTORY_MOD, ONLY : DATA_DIR
|
|
USE FILE_MOD, ONLY : IU_FILE, IOERROR
|
|
|
|
# include "CMN_SIZE" ! Size parameters
|
|
|
|
! Arguments
|
|
REAL*8, INTENT(OUT) :: TODH(6), TODN(6), TODB(6), SCNR89(3,3)
|
|
|
|
! Local variables
|
|
INTEGER :: I, J, K, IOS, IUNIT
|
|
REAL*4 :: DUMMY(IGLOB,JGLOB)
|
|
CHARACTER(LEN=255) :: FILENAME
|
|
|
|
!=================================================================
|
|
! READ_TODX begins here!
|
|
!=================================================================
|
|
|
|
! File name unit
|
|
IUNIT = IU_FILE
|
|
|
|
#if defined( GRID4x5 )
|
|
|
|
! Define the file name
|
|
FILENAME = TRIM( DATA_DIR ) // 'fossil_200104/MELD_N96_70_HC'
|
|
|
|
! Echo file name to stdout
|
|
WRITE( 6, 100 ) TRIM( FILENAME )
|
|
100 FORMAT( 'READ_TODX: Reading ', a )
|
|
|
|
! Open the 4 x 5 file
|
|
OPEN( IUNIT, FILE=TRIM( FILENAME ), STATUS='OLD',
|
|
& FORM='FORMATTED', IOSTAT=IOS )
|
|
IF ( IOS /= 0 ) CALL IOERROR( IOS, IUNIT, 'read_todx:1' )
|
|
|
|
! For 4 x 5 grid, skip over plume data
|
|
DO K = 1, 2
|
|
READ( IUNIT, '(6e12.4)', IOSTAT=IOS )
|
|
& ( ( DUMMY(I+3,J+23), I=1,29 ), J=1,15 )
|
|
IF ( IOS /= 0 ) CALL IOERROR( IOS, IUNIT, 'read_todx:2' )
|
|
ENDDO
|
|
|
|
! Read time-of-day emission scale factors
|
|
READ( IUNIT, '(6e12.4)', IOSTAT=IOS ) TODN, TODH, TODB
|
|
IF ( IOS /= 0 ) CALL IOERROR( IOS, IUNIT, 'read_todx:3' )
|
|
|
|
! Read weekday/saturday/sunday emission scale factors
|
|
READ( IUNIT, '(2f6.3, f7.4)', IOSTAT=IOS )
|
|
& ( ( SCNR89(I,J), J=1,3 ), I=1,3 )
|
|
IF ( IOS /= 0 ) CALL IOERROR( IOS, IUNIT, 'read_todx:4' )
|
|
|
|
! Close the 4 x 5 file
|
|
CLOSE( IUNIT )
|
|
|
|
#elif defined( GRID2x25 )
|
|
|
|
! Define the file name
|
|
FILENAME = TRIM( DATA_DIR ) // 'fossil_200104/MELD2x25'
|
|
|
|
! Echo file name to stdout
|
|
WRITE( 6, 100 ) TRIM( FILENAME )
|
|
100 FORMAT( 'READ_TODX: Reading: ', a )
|
|
|
|
! Open the 2 x 2.5 file
|
|
OPEN( IUNIT, FILE=TRIM( FILENAME ), STATUS='OLD',
|
|
& FORM='FORMATTED', IOSTAT=IOS )
|
|
IF ( IOS /= 0 ) CALL IOERROR( IOS, IUNIT, 'read_todx:5' )
|
|
|
|
! Read time-of-day scale factors
|
|
READ( IUNIT, '(6E12.4)', IOSTAT=IOS ) TODN, TODH, TODB
|
|
IF ( IOS /= 0 ) CALL IOERROR( IOS, IUNIT, 'read_todx:6' )
|
|
|
|
! Read Weekday/Saturday/Sunday emission scale factors
|
|
READ( IUNIT, '(3F7.4)', IOSTAT=IOS )
|
|
& ( ( SCNR89(I,J), J=1,3 ), I=1,3 )
|
|
IF ( IOS /= 0 ) CALL IOERROR( IOS, IUNIT, 'read_todx:7' )
|
|
|
|
! Close the file
|
|
CLOSE( IUNIT )
|
|
|
|
#elif defined( GRID1x125 )
|
|
|
|
! NOTE: Need to define this!
|
|
|
|
#elif defined( GRID1x1 )
|
|
|
|
! Define the file name
|
|
FILENAME = TRIM( DATA_DIR ) // 'fossil_200104/MELD1x1'
|
|
|
|
WRITE( 6, 100 ) TRIM( FILENAME )
|
|
100 FORMAT( 'READ_TODX: Reading: ', a )
|
|
|
|
! Open the 1 x 1 file
|
|
OPEN( IUNIT, FILE=TRIM( FILENAME ), STATUS='OLD',
|
|
& FORM='FORMATTED', IOSTAT=IOS )
|
|
IF ( IOS /= 0 ) CALL IOERROR( IOS, IUNIT, 'read_todx:5' )
|
|
|
|
! Read time-of-day scale factors
|
|
READ( IUNIT, '(6E12.4)', IOSTAT=IOS ) TODN, TODH, TODB
|
|
IF ( IOS /= 0 ) CALL IOERROR( IOS, IUNIT, 'read_todx:6' )
|
|
|
|
! Read Weekday/Saturday/Sunday emission scale factors
|
|
READ( IUNIT, '(3F7.4)', IOSTAT=IOS )
|
|
& ( ( SCNR89(I,J), J=1,3 ), I=1,3 )
|
|
IF ( IOS /= 0 ) CALL IOERROR( IOS, IUNIT, 'read_todx:7' )
|
|
|
|
! Close the file
|
|
CLOSE( IUNIT )
|
|
|
|
#elif defined( GRID05x0666 )
|
|
|
|
! Define the file name
|
|
FILENAME = TRIM( DATA_DIR ) // 'fossil_200104/MELD05x0666'
|
|
|
|
WRITE( 6, 100 ) TRIM( FILENAME )
|
|
100 FORMAT( 'READ_TODX: Reading: ', a )
|
|
|
|
! Open the 05x0666 file
|
|
OPEN( IUNIT, FILE=TRIM( FILENAME ), STATUS='OLD',
|
|
& FORM='FORMATTED', IOSTAT=IOS )
|
|
IF ( IOS /= 0 ) CALL IOERROR( IOS, IUNIT, 'read_todx:5' )
|
|
|
|
! Read time-of-day scale factors
|
|
READ( IUNIT, '(6E12.4)', IOSTAT=IOS ) TODN, TODH, TODB
|
|
IF ( IOS /= 0 ) CALL IOERROR( IOS, IUNIT, 'read_todx:6' )
|
|
|
|
|
|
! Read Weekday/Saturday/Sunday emission scale factors
|
|
READ( IUNIT, '(3F7.4)', IOSTAT=IOS )
|
|
& ( ( SCNR89(I,J), J=1,3 ), I=1,3 )
|
|
IF ( IOS /= 0 ) CALL IOERROR( IOS, IUNIT, 'read_todx:7' )
|
|
|
|
! Close the file
|
|
CLOSE( IUNIT )
|
|
|
|
!!===== (lzh, 02/01/2015) add 025x03125 the same as 05x0666 =====
|
|
#elif defined( GRID025x03125 )
|
|
|
|
! Define the file name
|
|
FILENAME = TRIM( DATA_DIR ) // 'fossil_200104/MELD025x03125'
|
|
|
|
WRITE( 6, 100 ) TRIM( FILENAME )
|
|
100 FORMAT( 'READ_TODX: Reading: ', a )
|
|
|
|
! Open the 05x0666 file
|
|
OPEN( IUNIT, FILE=TRIM( FILENAME ), STATUS='OLD',
|
|
& FORM='FORMATTED', IOSTAT=IOS )
|
|
IF ( IOS /= 0 ) CALL IOERROR( IOS, IUNIT, 'read_todx:5' )
|
|
|
|
! Read time-of-day scale factors
|
|
READ( IUNIT, '(6E12.4)', IOSTAT=IOS ) TODN, TODH, TODB
|
|
IF ( IOS /= 0 ) CALL IOERROR( IOS, IUNIT, 'read_todx:6' )
|
|
|
|
|
|
! Read Weekday/Saturday/Sunday emission scale factors
|
|
READ( IUNIT, '(3F7.4)', IOSTAT=IOS )
|
|
& ( ( SCNR89(I,J), J=1,3 ), I=1,3 )
|
|
IF ( IOS /= 0 ) CALL IOERROR( IOS, IUNIT, 'read_todx:7' )
|
|
|
|
! Close the file
|
|
CLOSE( IUNIT )
|
|
|
|
#endif
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE READ_TODX
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE READ_GEIA_ASCII( E_NOX, E_CO, E_ETHE, E_PRPE,
|
|
& E_C2H6, E_C3H8, E_ALK4, E_ACET,
|
|
& E_MEK, E_SOX )
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine READ_GEIA_ASCII reads the anthropogenic GEIA emissions from
|
|
! from the old-style ASCII "merge file". (bmy, 7/18/00, 7/20/04)
|
|
!
|
|
! Arguments as Output:
|
|
! ============================================================================
|
|
! (1 ) E_NOX (REAL*4) : GEIA anthro NOx (4 seasons, 2 levels)
|
|
! (2 ) E_CO (REAL*4) : GEIA anthro CO (no seasonality, 1 level )
|
|
! (3 ) E_ETHE (REAL*4) : GEIA anthro ETHE (no seasonality, 1 level )
|
|
! (4 ) E_PRPE (REAL*4) : GEIA anthro PRPE (no seasonality, 1 level )
|
|
! (5 ) E_C2H6 (REAL*4) : GEIA anthro C2H6 (no seasonality, 1 level )
|
|
! (6 ) E_C3H8 (REAL*4) : GEIA anthro C3H8 (no seasonality, 1 level )
|
|
! (7 ) E_ALK4 (REAL*4) : GEIA anthro ALK4 (no seasonality, 1 level )
|
|
! (8 ) E_ACET (REAL*4) : GEIA anthro ACET (no seasonality, 1 level )
|
|
! (9 ) E_MEK (REAL*4) : GEIA anthro MEK (no seasonality, 1 level )
|
|
! (10) E_SOX (REAL*4) : GEIA anthro SOx (4 seasons, 2 levels)
|
|
!
|
|
! NOTES:
|
|
! (1 ) All arguments are optional.
|
|
! (2 ) Copied from routine "anthroems.f" (bmy, 7/18/00)
|
|
! (3 ) Now use IOS /= 0 to trap both I/O errors and EOF (bmy, 9/13/00)
|
|
! (4 ) Renamed to READ_GEIA_ASCII, since this only reads the old-style
|
|
! ASCII merge file (bmy, 4/23/01)
|
|
! (5 ) Now read files directly from DATA_DIR/fossil_obsolete subdirectory.
|
|
! Also echo the file name to stdout. Now reference DATA_DIR from
|
|
! the "CMN_SETUP" header file. (bmy, 4/3/02)
|
|
! (6 ) Now reference IU_FILE and IOERROR from "file_mod.f". Also deleted
|
|
! obsolete code from April 2002 (bmy, 6/27/02)
|
|
! (7 ) Now references DATA_DIR from "directory_mod.f" (bmy, 7/20/04)
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE BPCH2_MOD, ONLY : GET_RES_EXT
|
|
USE DIRECTORY_MOD, ONLY : DATA_DIR
|
|
USE FILE_MOD, ONLY : IU_FILE, IOERROR
|
|
|
|
# include "CMN_SIZE" ! Size parameters
|
|
|
|
! Arguments
|
|
REAL*4, INTENT(OUT), OPTIONAL :: E_NOX (IGLOB,JGLOB,4,2)
|
|
REAL*4, INTENT(OUT), OPTIONAL :: E_CO (IGLOB,JGLOB )
|
|
REAL*4, INTENT(OUT), OPTIONAL :: E_ETHE(IGLOB,JGLOB )
|
|
REAL*4, INTENT(OUT), OPTIONAL :: E_PRPE(IGLOB,JGLOB )
|
|
REAL*4, INTENT(OUT), OPTIONAL :: E_C2H6(IGLOB,JGLOB )
|
|
REAL*4, INTENT(OUT), OPTIONAL :: E_C3H8(IGLOB,JGLOB )
|
|
REAL*4, INTENT(OUT), OPTIONAL :: E_ALK4(IGLOB,JGLOB )
|
|
REAL*4, INTENT(OUT), OPTIONAL :: E_ACET(IGLOB,JGLOB )
|
|
REAL*4, INTENT(OUT), OPTIONAL :: E_MEK (IGLOB,JGLOB )
|
|
REAL*4, INTENT(OUT), OPTIONAL :: E_SOX (IGLOB,JGLOB,4,2)
|
|
|
|
! Local variables
|
|
INTEGER :: IOS, IUNIT
|
|
|
|
REAL*4 :: T_NOX (IGLOB,JGLOB,4,2)
|
|
REAL*4 :: T_CO (IGLOB,JGLOB )
|
|
REAL*4 :: T_ETHE(IGLOB,JGLOB )
|
|
REAL*4 :: T_PRPE(IGLOB,JGLOB )
|
|
REAL*4 :: T_C2H6(IGLOB,JGLOB )
|
|
REAL*4 :: T_C3H8(IGLOB,JGLOB )
|
|
REAL*4 :: T_ALK4(IGLOB,JGLOB )
|
|
REAL*4 :: T_ACET(IGLOB,JGLOB )
|
|
REAL*4 :: T_MEK (IGLOB,JGLOB )
|
|
REAL*4 :: T_SOX (IGLOB,JGLOB,4,2)
|
|
|
|
CHARACTER(LEN=255) :: FILENAME
|
|
|
|
!=================================================================
|
|
! READ_GEIA_ASCII begins here!
|
|
!=================================================================
|
|
|
|
! Define the file name
|
|
FILENAME = TRIM( DATA_DIR ) // 'fossil_obsolete/merge.' //
|
|
& GET_RES_EXT() // '_CTM'
|
|
|
|
#if defined( GRID4x5 )
|
|
! For 4x5, the old ASCII file had the "_SASS" extension.
|
|
! This is historical baggage (bmy, 4/3/02)
|
|
FILENAME = TRIM( FILENAME ) // '_SASS'
|
|
#endif
|
|
|
|
! Define the file unit
|
|
IUNIT = IU_FILE
|
|
|
|
! Echo the filename to stdout
|
|
WRITE( 6, 100 ) TRIM( FILENAME )
|
|
100 FORMAT( 'READ_GEIA_ASCII: Reading ', a )
|
|
|
|
! Open the GEIA emissions merge file
|
|
OPEN( IUNIT, FILE=TRIM( FILENAME ), STATUS='OLD',
|
|
& FORM='FORMATTED', IOSTAT=IOS )
|
|
IF ( IOS /= 0 ) CALL IOERROR( IOS, IUNIT, 'read_geia:1' )
|
|
|
|
! Read data into temporary arrays
|
|
READ( IUNIT, '(7e10.3)', IOSTAT=IOS )
|
|
& T_NOX, T_CO, T_ETHE, T_PRPE, T_C2H6,
|
|
& T_C3H8, T_ALK4, T_ACET, T_MEK, T_SOX
|
|
IF ( IOS /= 0 ) CALL IOERROR( IOS, IUNIT, 'read_geia:2' )
|
|
|
|
! Close the merge file
|
|
CLOSE( IUNIT )
|
|
|
|
! Assign data from temporary arrays into optional arguments
|
|
IF ( PRESENT( E_NOX ) ) E_NOX = T_NOX
|
|
IF ( PRESENT( E_CO ) ) E_CO = T_CO
|
|
IF ( PRESENT( E_ETHE ) ) E_ETHE = T_ETHE
|
|
IF ( PRESENT( E_PRPE ) ) E_PRPE = T_PRPE
|
|
IF ( PRESENT( E_C2H6 ) ) E_C2H6 = T_C2H6
|
|
IF ( PRESENT( E_C3H8 ) ) E_C3H8 = T_C3H8
|
|
IF ( PRESENT( E_ALK4 ) ) E_ALK4 = T_ALK4
|
|
IF ( PRESENT( E_ACET ) ) E_ACET = T_ACET
|
|
IF ( PRESENT( E_MEK ) ) E_MEK = T_MEK
|
|
IF ( PRESENT( E_SOX ) ) E_SOX = T_SOX
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE READ_GEIA_ASCII
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE READ_GEIA( E_NOX, E_CO, E_ALK4, E_ACET, E_MEK,
|
|
& E_PRPE, E_C3H8, E_C2H6, E_ETHE, E_SOX )
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine READ_GEIA reads the anthropogenic GEIA emissions
|
|
! from a binary punch file. (bmy, 4/23/01, 8/16/05)
|
|
!
|
|
! Arguments as Output:
|
|
! ============================================================================
|
|
! (1 ) E_NOX (REAL*4) : GEIA anthro NOx (4 seasons, 2 levels)
|
|
! (2 ) E_CO (REAL*4) : GEIA anthro CO (no seasonality, 1 level )
|
|
! (3 ) E_ALK4 (REAL*4) : GEIA anthro ALK4 (no seasonality, 1 level )
|
|
! (4 ) E_ACET (REAL*4) : GEIA anthro ACET (no seasonality, 1 level )
|
|
! (5 ) E_MEK (REAL*4) : GEIA anthro MEK (no seasonality, 1 level )
|
|
! (6 ) E_PRPE (REAL*4) : GEIA anthro PRPE (no seasonality, 1 level )
|
|
! (7 ) E_C3H8 (REAL*4) : GEIA anthro C3H8 (no seasonality, 1 level )
|
|
! (8 ) E_C2H6 (REAL*4) : GEIA anthro C2H6 (no seasonality, 1 level )
|
|
! (9 ) E_ETHE (REAL*4) : GEIA anthro ETHE (no seasonality, 1 level )
|
|
! (10) E_SOX (REAL*4) : GEIA anthro SOx (4 seasons, 2 levels)
|
|
!
|
|
! NOTES:
|
|
! (1 ) Now reads from binary punch file format. This is more convenient,
|
|
! and is readable directly into GAMAP. Read directly from the
|
|
! DATA_DIR/fossil_200104/ subdirectory. (bmy, 4/23/01)
|
|
! (2 ) Bug fix: T_C2H6 was being overwritten with T_ETHE. This has now
|
|
! been corrected. (bmy, 7/2/01)
|
|
! (3 ) Now only read emissions for tracers whose keywords have been passed
|
|
! (bmy, 9/6/01)
|
|
! (4 ) Now write file name to stdout (bmy, 4/3/02)
|
|
! (5 ) Now call READ_BPCH2 with QUIET=.TRUE. (bmy, 3/14/03)
|
|
! (6 ) Now references DATA_DIR from "directory_mod.f" (bmy, 7/20/04)
|
|
! (7 ) Now can read data for both GEOS and GCAP grids (bmy, 8/16/05)
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE BPCH2_MOD, ONLY : GET_NAME_EXT_2D, GET_RES_EXT, READ_BPCH2
|
|
USE DIRECTORY_MOD, ONLY : DATA_DIR
|
|
|
|
# include "CMN_SIZE" ! Size parameters
|
|
|
|
! Arguments
|
|
REAL*4, INTENT(OUT), OPTIONAL :: E_NOX (IGLOB,JGLOB,4,2)
|
|
REAL*4, INTENT(OUT), OPTIONAL :: E_CO (IGLOB,JGLOB )
|
|
REAL*4, INTENT(OUT), OPTIONAL :: E_ALK4(IGLOB,JGLOB )
|
|
REAL*4, INTENT(OUT), OPTIONAL :: E_ACET(IGLOB,JGLOB )
|
|
REAL*4, INTENT(OUT), OPTIONAL :: E_MEK (IGLOB,JGLOB )
|
|
REAL*4, INTENT(OUT), OPTIONAL :: E_PRPE(IGLOB,JGLOB )
|
|
REAL*4, INTENT(OUT), OPTIONAL :: E_C3H8(IGLOB,JGLOB )
|
|
REAL*4, INTENT(OUT), OPTIONAL :: E_C2H6(IGLOB,JGLOB )
|
|
REAL*4, INTENT(OUT), OPTIONAL :: E_ETHE(IGLOB,JGLOB )
|
|
REAL*4, INTENT(OUT), OPTIONAL :: E_SOX (IGLOB,JGLOB,4,2)
|
|
|
|
! Local variables
|
|
INTEGER :: L
|
|
REAL*4 :: ARRAY(IGLOB,JGLOB,2)
|
|
CHARACTER(LEN=255) :: FILENAME
|
|
|
|
!=================================================================
|
|
! READ_GEIA begins here!
|
|
!=================================================================
|
|
|
|
! Define the binary punch file name
|
|
FILENAME = TRIM( DATA_DIR ) //
|
|
& 'fossil_200104/merge_nobiofuels.' //
|
|
& GET_NAME_EXT_2D() // '.' // GET_RES_EXT()
|
|
|
|
! Write file name to stdout
|
|
WRITE( 6, 100 ) TRIM( FILENAME )
|
|
100 FORMAT( 'READ_GEIA: Reading ', a )
|
|
|
|
!=================================================================
|
|
! Read NOx (tracer #1): 4 seasons, 2 levels
|
|
!=================================================================
|
|
IF ( PRESENT( E_NOX ) ) THEN
|
|
|
|
! Read winter NOx (DJF)
|
|
CALL READ_BPCH2( FILENAME, 'ANTHSRCE', 1,
|
|
& -744d0, IGLOB, JGLOB,
|
|
& 2, ARRAY, QUIET=.TRUE. )
|
|
|
|
DO L = 1, 2
|
|
E_NOX(:,:,1,L) = ARRAY(:,:,L)
|
|
ENDDO
|
|
|
|
! Read spring NOx (MAM)
|
|
CALL READ_BPCH2( FILENAME, 'ANTHSRCE', 1,
|
|
& 1416d0, IGLOB, JGLOB,
|
|
& 2, ARRAY, QUIET=.TRUE. )
|
|
|
|
DO L = 1, 2
|
|
E_NOX(:,:,2,L) = ARRAY(:,:,L)
|
|
ENDDO
|
|
|
|
! Read summer NOx (JJA)
|
|
CALL READ_BPCH2( FILENAME, 'ANTHSRCE', 1,
|
|
& 3624d0, IGLOB, JGLOB,
|
|
& 2, ARRAY, QUIET=.TRUE. )
|
|
|
|
DO L = 1, 2
|
|
E_NOX(:,:,3,L) = ARRAY(:,:,L)
|
|
ENDDO
|
|
|
|
! Read autumn NOx (SON)
|
|
CALL READ_BPCH2( FILENAME, 'ANTHSRCE', 1,
|
|
& 5832d0, IGLOB, JGLOB,
|
|
& 2, ARRAY, QUIET=.TRUE. )
|
|
|
|
DO L = 1, 2
|
|
E_NOX(:,:,4,L) = ARRAY(:,:,L)
|
|
ENDDO
|
|
ENDIF
|
|
|
|
!=================================================================
|
|
! Read CO (tracer #4): aseasonal
|
|
!=================================================================
|
|
IF ( PRESENT( E_CO ) ) THEN
|
|
CALL READ_BPCH2( FILENAME, 'ANTHSRCE', 4,
|
|
& 0d0, IGLOB, JGLOB,
|
|
& 1, ARRAY(:,:,1), QUIET=.TRUE. )
|
|
|
|
E_CO(:,:) = ARRAY(:,:,1)
|
|
ENDIF
|
|
|
|
!=================================================================
|
|
! Read ALK4 (tracer #5): aseasonal
|
|
!=================================================================
|
|
IF ( PRESENT( E_ALK4 ) ) THEN
|
|
CALL READ_BPCH2( FILENAME, 'ANTHSRCE', 5,
|
|
& 0d0, IGLOB, JGLOB,
|
|
& 1, ARRAY(:,:,1), QUIET=.TRUE. )
|
|
|
|
E_ALK4(:,:) = ARRAY(:,:,1)
|
|
ENDIF
|
|
|
|
!=================================================================
|
|
! Read ACET (tracer #9): aseasonal
|
|
!=================================================================
|
|
IF ( PRESENT( E_ACET ) ) THEN
|
|
CALL READ_BPCH2( FILENAME, 'ANTHSRCE', 9,
|
|
& 0d0, IGLOB, JGLOB,
|
|
& 1, ARRAY(:,:,1), QUIET=.TRUE. )
|
|
|
|
E_ACET(:,:) = ARRAY(:,:,1)
|
|
ENDIF
|
|
|
|
!=================================================================
|
|
! Read MEK (tracer #10): aseasonal
|
|
!=================================================================
|
|
IF ( PRESENT( E_MEK ) ) THEN
|
|
CALL READ_BPCH2( FILENAME, 'ANTHSRCE', 10,
|
|
& 0d0, IGLOB, JGLOB,
|
|
& 1, ARRAY(:,:,1), QUIET=.TRUE. )
|
|
|
|
E_MEK(:,:) = ARRAY(:,:,1)
|
|
ENDIF
|
|
|
|
!=================================================================
|
|
! Read PRPE (tracer #18): aseasonal
|
|
!=================================================================
|
|
IF ( PRESENT( E_PRPE ) ) THEN
|
|
CALL READ_BPCH2( FILENAME, 'ANTHSRCE', 18,
|
|
& 0d0, IGLOB, JGLOB,
|
|
& 1, ARRAY(:,:,1), QUIET=.TRUE. )
|
|
|
|
E_PRPE(:,:) = ARRAY(:,:,1)
|
|
ENDIF
|
|
|
|
!=================================================================
|
|
! Read C3H8 (tracer #19): aseasonal
|
|
!=================================================================
|
|
IF ( PRESENT( E_C3H8 ) ) THEN
|
|
CALL READ_BPCH2( FILENAME, 'ANTHSRCE', 19,
|
|
& 0d0, IGLOB, JGLOB,
|
|
& 1, ARRAY(:,:,1), QUIET=.TRUE. )
|
|
|
|
E_C3H8(:,:) = ARRAY(:,:,1)
|
|
ENDIF
|
|
|
|
!=================================================================
|
|
! Read C2H6 (tracer #20): aseasonal
|
|
!=================================================================
|
|
IF ( PRESENT( E_C2H6 ) ) THEN
|
|
CALL READ_BPCH2( FILENAME, 'ANTHSRCE', 21,
|
|
& 0d0, IGLOB, JGLOB,
|
|
& 1, ARRAY(:,:,1), QUIET=.TRUE. )
|
|
|
|
E_C2H6(:,:) = ARRAY(:,:,1)
|
|
ENDIF
|
|
|
|
!=================================================================
|
|
! Read ETHE (tracer #26): aseasonal
|
|
!=================================================================
|
|
IF ( PRESENT( E_ETHE ) ) THEN
|
|
CALL READ_BPCH2( FILENAME, 'ANTHSRCE', 26,
|
|
& 0d0, IGLOB, JGLOB,
|
|
& 1, ARRAY(:,:,1), QUIET=.TRUE. )
|
|
|
|
E_ETHE(:,:) = ARRAY(:,:,1)
|
|
ENDIF
|
|
|
|
!=================================================================
|
|
! Read SOx (tracer #27): 4 seasons, 2 levels
|
|
!=================================================================
|
|
IF ( PRESENT( E_SOX ) ) THEN
|
|
|
|
! Read winter SOx (DJF)
|
|
CALL READ_BPCH2( FILENAME, 'ANTHSRCE', 27,
|
|
& -744d0, IGLOB, JGLOB,
|
|
& 2, ARRAY, QUIET=.TRUE. )
|
|
|
|
DO L = 1, 2
|
|
E_SOX(:,:,1,L) = ARRAY(:,:,L)
|
|
ENDDO
|
|
|
|
! Read spring SOx (MAM)
|
|
CALL READ_BPCH2( FILENAME, 'ANTHSRCE', 27,
|
|
& 1416d0, IGLOB, JGLOB,
|
|
& 2, ARRAY, QUIET=.TRUE. )
|
|
|
|
DO L = 1, 2
|
|
E_SOX(:,:,2,L) = ARRAY(:,:,L)
|
|
ENDDO
|
|
|
|
! Read summer SOx (JJA)
|
|
CALL READ_BPCH2( FILENAME, 'ANTHSRCE', 27,
|
|
& 3624d0, IGLOB, JGLOB,
|
|
& 2, ARRAY, QUIET=.TRUE. )
|
|
|
|
DO L = 1, 2
|
|
E_SOX(:,:,3,L) = ARRAY(:,:,L)
|
|
ENDDO
|
|
|
|
! Read autumn SOx (SON)
|
|
CALL READ_BPCH2( FILENAME, 'ANTHSRCE', 27,
|
|
& 5832d0, IGLOB, JGLOB,
|
|
& 2, ARRAY, QUIET=.TRUE. )
|
|
|
|
DO L = 1, 2
|
|
E_SOX(:,:,4,L) = ARRAY(:,:,L)
|
|
ENDDO
|
|
ENDIF
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE READ_GEIA
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE READ_C3H8_C2H6_NGAS( E_C3H8, E_C2H6 )
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine READ_C3H8_C2H6_NGAS reads the anthropogenic C3H8 and C2H6
|
|
! emissions, which are scaled from Natural Gas (CH4) (bmy, 9/6/01, 8/16/05)
|
|
!
|
|
! Emissions files are from Yaping Xiao (9/01) Their path names are:
|
|
! /data/ctm/GEOS_2x2.5/C3H8_C2H6_200109/C3H8_C2H6_ngas.geos.2x25
|
|
! /data/ctm/GEOS_4x5/C3H8/C2H6_200109/C3H8_C2H6_ngas.geos.4x5
|
|
!
|
|
! Arguments as Output:
|
|
! ============================================================================
|
|
! (1 ) E_C3H8 (REAL*4) : Anthro C3H8 scaled from CH4 (aseasonal, 1 level)
|
|
! (2 ) E_C2H6 (REAL*4) : Anthro C2H6 scaled from CH4 (aseasonal, 1 level)
|
|
!
|
|
! NOTES:
|
|
! (1 ) Adapted from READ_GEIA (bmy, 9/6/01)
|
|
! (2 ) Now echo filename to standard output (bmy, 1/25/02)
|
|
! (3 ) Now call READ_BPCH2 with QUIET=.TRUE. (bmy, 3/11/03)
|
|
! (4 ) Now references DATA_DIR from "directory_mod.f" (bmy, 7/20/04)
|
|
! (5 ) Now can read data for both GEOS and GCAP grids (bmy, 8/16/05)
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE BPCH2_MOD
|
|
USE DIRECTORY_MOD, ONLY : DATA_DIR
|
|
|
|
# include "CMN_SIZE" ! Size parameters
|
|
|
|
! Arguments
|
|
REAL*4, INTENT(OUT), OPTIONAL :: E_C3H8(IGLOB,JGLOB)
|
|
REAL*4, INTENT(OUT), OPTIONAL :: E_C2H6(IGLOB,JGLOB)
|
|
|
|
! Local variables
|
|
INTEGER :: I, J, L, S
|
|
REAL*4 :: ARRAY(IGLOB,JGLOB,1)
|
|
CHARACTER(LEN=255) :: FILENAME
|
|
|
|
!=================================================================
|
|
! READ_GEIA begins here!
|
|
!=================================================================
|
|
|
|
! Define the binary punch file name
|
|
FILENAME = TRIM( DATA_DIR ) //
|
|
& 'C3H8_C2H6_200109/C3H8_C2H6_ngas.' //
|
|
& GET_NAME_EXT_2D() // '.' // GET_RES_EXT()
|
|
|
|
! Echo filename to std output
|
|
WRITE( 6, 110 ) TRIM( FILENAME )
|
|
110 FORMAT( 'READ_C3H8_C2H6_NGAS: Reading ', a )
|
|
|
|
! Read C3H8 (tracer #19): aseasonal
|
|
IF ( PRESENT( E_C3H8 ) ) THEN
|
|
CALL READ_BPCH2( FILENAME, 'ANTHSRCE', 19,
|
|
& 0d0, IGLOB, JGLOB,
|
|
& 1, ARRAY, QUIET=.TRUE. )
|
|
|
|
E_C3H8(:,:) = ARRAY(:,:,1)
|
|
ENDIF
|
|
|
|
! Read C2H6 (tracer #21): aseasonal
|
|
IF ( PRESENT( E_C2H6 ) ) THEN
|
|
CALL READ_BPCH2( FILENAME, 'ANTHSRCE', 21,
|
|
& 0d0, IGLOB, JGLOB,
|
|
& 1, ARRAY, QUIET=.TRUE. )
|
|
|
|
E_C2H6(:,:) = ARRAY(:,:,1)
|
|
ENDIF
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE READ_C3H8_C2H6_NGAS
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
FUNCTION GET_DAY_INDEX( NTAU ) RESULT( JSCEN )
|
|
!
|
|
!*****************************************************************************
|
|
! Function GET_DAY_INDEX returns the day index (Saturday/Sunday/Weekday)
|
|
! for the given time. This is used to scale GEIA emissions. (bmy, 7/28/00)
|
|
!
|
|
! Arguments as Input:
|
|
! ===========================================================================
|
|
! (1) NTAU (INTEGER) : Integral hours since 0h, 1 Jan 1985
|
|
!
|
|
! Return value:
|
|
! ===========================================================================
|
|
! (1) JSCEN (INTEGER) : Flag for Saturday (1), Sunday (2), or Weekday (3)
|
|
!
|
|
! NOTES:
|
|
! (1) Scale factors for Saturday/Sunday/Weekday must average out to 1!
|
|
!*****************************************************************************
|
|
!
|
|
! Arguments
|
|
INTEGER, INTENT(IN) :: NTAU
|
|
|
|
! Local variables
|
|
INTEGER :: NDAY
|
|
|
|
! Return value
|
|
INTEGER :: JSCEN
|
|
|
|
!=================================================================
|
|
! GET_DAY_INDEX begins here!
|
|
!=================================================================
|
|
|
|
! NDAY is the day of the week
|
|
NDAY = NTAU / 24
|
|
|
|
! 1 Jan 1980 and 1 Jan 1985 were both Tuesdays, so NDAY mod 7 = 4 is a
|
|
! Saturday and NDAY mod 7 = 5 is a Sunday (bmy, 3/23/98)
|
|
SELECT CASE ( MOD( NDAY, 7 ) )
|
|
|
|
! Saturday
|
|
CASE ( 4 )
|
|
JSCEN = 1
|
|
|
|
! Sunday
|
|
CASE ( 5 )
|
|
JSCEN = 2
|
|
|
|
! Weekday
|
|
CASE DEFAULT
|
|
JSCEN = 3
|
|
|
|
END SELECT
|
|
|
|
! Return to calling program
|
|
END FUNCTION GET_DAY_INDEX
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
FUNCTION GET_IHOUR( I ) RESULT( IHOUR )
|
|
!
|
|
!******************************************************************************
|
|
! Function GET_IHOUR returns the index for the TODH, TODN, TODB scale
|
|
! factors which are read by subroutine GET_TODX. (bmy, 7/28/00, 4/23/01)
|
|
!
|
|
! Arguments as Input:
|
|
! ============================================================================
|
|
! (1 ) I (INTEGER) : Grid box longitude index
|
|
!
|
|
! Return value
|
|
! ============================================================================
|
|
! (1 ) IHOUR (INTEGER) : Index for scale factor arrays
|
|
!
|
|
! NOTES:
|
|
! (1 ) COMPUTE IHOUR TO DETERMINE TIME OF DAY FACTOR FOR EMISSIONS
|
|
! THIS TOFDAY IS IN GREENWICH TIME(GMT); WE NEED TO CHANGE IT TO
|
|
! (I,J)BOX TIME=XLOCTM
|
|
! TOFDAY is GMT at the BEGINNING of the time step.
|
|
! (TOFDAY and NTAU do not refer to the end of time step until they
|
|
! are updated at line 300 of the main driver, just before the
|
|
! diagnostics are written.)
|
|
! The 0.001 is added to remove roundoff amibuity when timestep
|
|
! is exactly on boundary for emissions change.
|
|
! 1hr changed NCHEM->NDYN in following line
|
|
! (2 ) For GEOS-CTM, NDYN is in minutes, NDYN/60 is in hours (bmy, 2/26/98)
|
|
! (3 ) Make sure 0 <= XLOCTM < 24, to avoid subscript errors (bmy, 6/11/98)
|
|
! (4 ) Middle of time step is between 10pm-2am when IHOUR = 1
|
|
! (5 ) Updated comments (bmy, 4/23/01)
|
|
! (6 ) Now use function GET_LOCALTIME from the new "time_mod.f". Remove
|
|
! IREF, NDYN, TOFDAY, DISIZE from arg list. Add I to the arg list.
|
|
! Removed XLOCTM variable. (bmy, 2/10/03)
|
|
! (7 ) Modified to use NINT instead of INT to calculate the local time
|
|
! (ccc, 4/15/09)
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE TIME_MOD, ONLY : GET_LOCALTIME
|
|
|
|
! Arguments
|
|
INTEGER, INTENT(IN) :: I
|
|
|
|
! Return value
|
|
INTEGER :: IHOUR
|
|
|
|
!=================================================================
|
|
! GET_IHOUR begins here!
|
|
!=================================================================
|
|
|
|
! IHOUR ranges from 1-6
|
|
! Modified to use NINT instead of INT (ccc, 4/15/09)
|
|
! prior to 4/15/09 ---------------------------------
|
|
! IHOUR = INT( ( GET_LOCALTIME( I ) ) / 4 ) + 1
|
|
IHOUR = NINT( ( GET_LOCALTIME( I ) ) / 4 ) + 1
|
|
IF ( IHOUR == 7 ) IHOUR = 1
|
|
|
|
! Return to calling program
|
|
END FUNCTION GET_IHOUR
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE TOTAL_FOSSIL_TG( FFARRAY, IX, JX, LX,
|
|
& MOLWT, NAME, NSEASON )
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine TOTAL_FOSSIL_TG prints the amount of biomass burning
|
|
! emissions that are emitted each month in Tg or Tg C. (bmy, 4/27/01, 2/4/03)
|
|
!
|
|
! Arguments as Input:
|
|
! ============================================================================
|
|
! (1 ) FFARRAY (REAL*8 ) : Fossil Fuel CO emissions [molec (C)/cm2/month]
|
|
! (2-4) IX,JX,LX (INTEGER) : Dimensions of FFARRAY
|
|
! (5 ) MOLWT (REAL*8 ) : Molecular wt [kg/mole] for the given tracer
|
|
! (6 ) NAME (REAL*8 ) : Tracer name
|
|
! (7 ) NSEASON (INTEGER) : Number of the season, for seasonal NOx/SOX
|
|
!
|
|
! NOTES:
|
|
! (1) Scale factors were determined by Jennifer Logan (jal@io.harvard.edu),
|
|
! Bryan Duncan (bnd@io.harvard.edu), and Daniel Jacob (djj@io.harvard.edu)
|
|
! (2) Now replace DXYP(J)*1d4 with routine GET_AREA_CM2 from "grid_mod.f".
|
|
! (bmy, 2/4/03)
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE GRID_MOD, ONLY : GET_AREA_CM2
|
|
|
|
# include "CMN_SIZE" ! Size parameters
|
|
|
|
! Arguments
|
|
INTEGER, INTENT(IN) :: IX, JX, LX
|
|
INTEGER, OPTIONAL, INTENT(IN) :: NSEASON
|
|
REAL*8, INTENT(IN) :: FFARRAY(IX,JX,LX)
|
|
REAL*8, INTENT(IN) :: MOLWT
|
|
CHARACTER(LEN=*), INTENT(IN) :: NAME
|
|
|
|
! Local variables
|
|
INTEGER :: I, J, L
|
|
REAL*8 :: TOTAL, A_CM2
|
|
CHARACTER(LEN=6) :: UNIT
|
|
|
|
!=================================================================
|
|
! TOTAL_FOSSIL_TG begins here!
|
|
!=================================================================
|
|
|
|
! Initialize summing variable
|
|
TOTAL = 0d0
|
|
|
|
DO L = 1, LX
|
|
DO J = 1, JX
|
|
|
|
! Grid box surface area [cm2]
|
|
A_CM2 = GET_AREA_CM2( J )
|
|
|
|
DO I = 1, IX
|
|
TOTAL = TOTAL + FFARRAY(I,J,L) * A_CM2 * ( MOLWT/ 6.023d23 )
|
|
ENDDO
|
|
ENDDO
|
|
ENDDO
|
|
|
|
IF ( PRESENT( NSEASON ) ) THEN
|
|
|
|
! Total for each season
|
|
SELECT CASE( NSEASON )
|
|
|
|
! DJF is 90 days long
|
|
CASE ( 1 )
|
|
TOTAL = TOTAL * 1d-9 * 90d0 * 86400d0
|
|
|
|
! MAM, JJA are 92 days long
|
|
CASE ( 2, 3 )
|
|
TOTAL = TOTAL * 1d-9 * 92d0 * 86400d0
|
|
|
|
! SON is 91 days long
|
|
CASE ( 4 )
|
|
TOTAL = TOTAL * 1d-9 * 91d0 * 86400d0
|
|
END SELECT
|
|
|
|
ELSE
|
|
|
|
! Convert from kg --> Tg for aseasonal emissions
|
|
TOTAL = TOTAL * 1d-9 * 365.25d0 * 86400d0
|
|
|
|
ENDIF
|
|
|
|
! Define unit string
|
|
SELECT CASE( TRIM( NAME ) )
|
|
CASE ( 'NOx' )
|
|
UNIT = '[Tg N]'
|
|
CASE ( 'CO', 'CH2O' )
|
|
UNIT = '[Tg ]'
|
|
CASE DEFAULT
|
|
UNIT = '[Tg C]'
|
|
END SELECT
|
|
|
|
! Write totals
|
|
IF ( PRESENT( NSEASON ) ) THEN
|
|
|
|
! Seasonal
|
|
WRITE( 6, 100 ) NAME, TOTAL, UNIT, NSEASON
|
|
100 FORMAT( 'Total Anthropogenic ', a4, ': ', f9.3, 1x, a,
|
|
& ' Season =', i3 )
|
|
|
|
ELSE
|
|
|
|
! Aseasonal
|
|
WRITE( 6, 110 ) NAME, TOTAL, UNIT
|
|
110 FORMAT( 'Total Anthropogenic ', a4, ': ', f9.3, 1x, a )
|
|
|
|
ENDIF
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE TOTAL_FOSSIL_TG
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
END MODULE GEIA_MOD
|