6123 lines
230 KiB
Fortran
6123 lines
230 KiB
Fortran
! $Id: input_mod.f,v 1.7 2012/03/01 22:00:27 daven Exp $
|
|
MODULE INPUT_MOD
|
|
!
|
|
!******************************************************************************
|
|
! Module INPUT_MOD reads the GEOS-Chem input file at the start of the run
|
|
! and passes the information to several other GEOS-Chem F90 modules.
|
|
! (bmy, 7/20/04, 2/10/09)
|
|
!
|
|
! Module Variables:
|
|
! ============================================================================
|
|
! (1 ) VERBOSE (LOGICAL ) : Turns on echo-back of lines read from disk.
|
|
! (2 ) FIRSTCOL (INTEGER ) : First column of the input file (default=26)
|
|
! (3 ) MAXDIM (INTEGER ) : Maximum number of substrings to read in
|
|
! (4 ) TS_CHEM (INTEGER ) : Placeholder for chemistry timestep [min]
|
|
! (5 ) TS_DYN (INTEGER ) : Placeholder for dynamic timestep [min]
|
|
! (6 ) TS_CONV (INTEGER ) : Placeholder for convection timestep [min]
|
|
! (7 ) TS_EMIS (INTEGER ) : Placeholder for emissions timestep [min]
|
|
! (8 ) TS_UNIT (INTEGER ) : Placeholder for unit conv timestep [min]
|
|
! (9 ) FILENAME (CHAR*255) : GEOS-CHEM input file name
|
|
! (10) TOPTITLE (CHAR*255) : Top line of input file
|
|
!
|
|
! Module Routines:
|
|
! ============================================================================
|
|
! (1 ) READ_INPUT_FILE : Driver routine for reading GEOS-CHEM input file
|
|
! (2 ) READ_ONE_LINE : Reads one line at a time
|
|
! (3 ) SPLIT_ONE_LINE : Splits one line into substrings (by spaces)
|
|
! (4 ) READ_SIMULATION_MENU : Reads the GEOS-Chem simulation menu
|
|
! (4 ) READ_TRACER_MENU : Reads the GEOS-Chem tracer menu
|
|
! (6 ) READ_AEROSOL_MENU : Reads the GEOS-Chem aerosol menu
|
|
! (7 ) READ_EMISSIONS_MENU : Reads the GEOS-Chem emission menu
|
|
! (8 ) READ_FUTURE_MENU : Reads the GEOS-Chem future emissions menu
|
|
! (9 ) READ_CHEMISTRY_MENU : Reads the GEOS-Chem chemistry menu
|
|
! (10) READ_TRANSPORT_MENU : Reads the GEOS-Chem transport menu
|
|
! (11) READ_CONVECTION_MENU : Reads the GEOS-Chem convection menu
|
|
! (12) READ_DEPOSITION_MENU : Reads the GEOS-Chem deposition menu
|
|
! (13) READ_OUTPUT_MENU : Reads the GEOS-Chem output menu
|
|
! (14) READ_DIAGNOSTIC_MENU : Reads the GEOS-Chem diagnostic menu
|
|
! (15) SET_TINDEX : Defines which tracers to print to the BPCH file
|
|
! (16) READ_ND49_MENU : Reads the GEOS-Chem ND49 timeseries menu
|
|
! (17) READ_ND50_MENU : Reads the GEOS-Chem ND50 timeseries menu
|
|
! (18) READ_ND51_MENU : Reads the GEOS-Chem ND51 timeseries menu
|
|
! (19) READ_PROD_LOSS_MENU : Reads the GEOS-Chem ND65 timeseries menu
|
|
! (20) READ_UNIX_CMDS_MENU : Reads the GEOS-Chem unix commands menu
|
|
! (21) READ_NESTED_GRID_MENU : Reads the GEOS-Chem nested grid menu
|
|
! (22) READ_ARCHIVED_OH_MENU : Reads the GEOS-Chem archived OH menu
|
|
! (23) READ_O3PL_MENU : Reads the GEOS-CHEM O3 P/L menu
|
|
! (24) READ_BENCHMARK_MENU : Reads the GEOS-CHEM benchmark cmds menu
|
|
! (25) VALIDATE_DIRECTORIES : Makes sure all given directories are valid
|
|
! (26) CHECK_DIRECTORY : Checks a single directory for errors
|
|
! (27) CHECK_TIME_STEPS : Sets the GEOS_CHEM timesteps
|
|
! (28) IS_LAST_DAY_GOOD : Makes sure we have output on last day of run
|
|
! (29) INIT_INPUT : Initializes directory & logical variables
|
|
!
|
|
! GEOS-CHEM modules referenced by "input_mod.f"
|
|
! ============================================================================
|
|
! (1 ) biofuel_mod.f : Module w/ routines to read biofuel emissions
|
|
! (2 ) biomass_mod.f : Module w/ routines to read biomass emissions
|
|
! (3 ) bpch2_mod.f : Module w/ routines for binary punch file I/O
|
|
! (4 ) charpak_mod.f : Module w/ string handling routines
|
|
! (5 ) dao_mod.f : Module w/ arrays for DAO met fields
|
|
! (6 ) diag_mod.f : Module w/ GEOS-CHEM diagnostic arrays
|
|
! (7 ) diag03_mod.f : Module w/ routines for mercury diagnostics
|
|
! (8 ) diag41_mod.f : Module w/ routines for afternoon PBL diag's
|
|
! (9 ) diag49_mod.f : Module w/ routines for inst timeseries
|
|
! (10) diag50_mod.f : Module w/ routines for 24hr avg timeseries
|
|
! (11) diag51_mod.f : Module w/ routines for morning/aft t-series
|
|
! (12) diag_oh_mod.f : Module w/ arrays & routines for mean OH diag
|
|
! (13) diag_pl_mod.f : Module w/ routines for prod & loss diag's
|
|
! (14) directory_mod.f : Module w/ GEOS-CHEM data & met field dirs
|
|
! (15) drydep_mod.f : Module w/ GEOS-CHEM drydep routines
|
|
! (16) error_mod.f : Module w/ I/O error and NaN check routines
|
|
! (17) file_mod.f : Module w/ file unit numbers and error checks
|
|
! (19) future_emissions_mod.f: Module w/ routines for IPCC future scale facs
|
|
! (20) grid_mod.f : Module w/ horizontal grid information
|
|
! (21) logical_mod.f : Module w/ GEOS-CHEM logical switches
|
|
! (22) ocean_mercury_mod.f : Module w/ routines for ocean flux of Hg0
|
|
! (23) planeflight_mod.f : Module w/ routines for flight track diag
|
|
! (24) pressure_mod.f : Module w/ routines to compute P(I,J,L)
|
|
! (25) restart_mod.f : Module w/ routines for restart file I/O
|
|
! (26) time_mod.f : Module w/ routines for computing time & date
|
|
! (27) tpcore_bc_mod.f : Module w/ routines to read/write TPCORE BC's
|
|
! (28) tracer_mod.f : Module w/ GEOS-CHEM tracer array STT etc.
|
|
! (29) tracerid_mod.f : Module w/ pointers to tracers & emissions
|
|
! (30) transport_mod.f : Module w/ driver routine for TPCORE
|
|
! (31) unix_cmds_mod.f : Module w/ Unix commands for unzipping etc
|
|
! (32) upbdflx_mod.f : Module w/ routines for strat O3, NOy BC's
|
|
! (33) wetscav_mod.f : Module w/ routines for wetdep/scavenging
|
|
!
|
|
! NOTES:
|
|
! (1 ) Now references LSOA in READ_AEROSOL_MENU (bmy, 9/28/04)
|
|
! (2 ) Fixed error checks and assign LSPLIT for tagged Hg. Also now
|
|
! refernces LAVHRRLAI from "logical_mod.f" (eck, bmy, 12/20/04)
|
|
! (3 ) Updated for crystalline/aqueous aerosol tracers. Also moved routine
|
|
! IS_LAST_DAY_GOOD here from "main.f". Also now references
|
|
! "ocean_mercury_mod.f". Also now open the bpch file for output in
|
|
! READ_DIAGNOSTIC_MENU instead of in "main.f". (cas, sas, bmy, 2/3/05)
|
|
! (4 ) Now references "diag03_mod.f" and "diag41_mod.f". Fixed minor
|
|
! bugs. Now references FILE_EXISTS from "file_mod.f". Updated
|
|
! comments. (bmy, 3/28/05)
|
|
! (5 ) Now modified for GEOS-5 and GCAP met fields. Also now set LSPLIT
|
|
! correctly for HCN/CH3CN simulation. (swu, xyp, bmy, 6/30/05)
|
|
! (6 ) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)
|
|
! (7 ) Now read LMEGAN switch for MEGAN biogenics. Now read variable
|
|
! DATA_DIR_1x1 for 1x1 emissions files, etc. Now reference XNUMOL and
|
|
! XNUMOLAIR from "tracer_mod.f" (tmf, bmy, 10/25/05)
|
|
! (8 ) Now read LEMEP switch for EMEP emissions (bdf, bmy, 11/1/05)
|
|
! (9 ) Now added MERCURY MENU section. Also fixed bug in READ_ND48_MENU.
|
|
! (eck, cdh, bmy, 3/6/06)
|
|
! (10) Now read LGFED2BB switch for GFED2 biomass emissions (bmy, 4/5/06)
|
|
! (11) Bug fix for GCAP in IS_LAST_DAY_GOOD. Also now read LCTH, LMFLUX,
|
|
! LPRECON in READ_EMISSIONS_MENU. (bmy, 5/10/06)
|
|
! (12) Updated for ND42 SOA concentration diagnostic (dkh, bmy, 5/22/06)
|
|
! (13) Modified for future emissions (swu, bmy, 6/1/06)
|
|
! (14) Modified for BRAVO emissions (rjp, kfb, bmy, 6/26/06)
|
|
! (15) Remove support for GEOS-1 and GEOS-STRAT met fields. Also modified
|
|
! for David Streets' emissions. (bmy, 8/17/06)
|
|
! (16) Modified for variable tropopause. Also set dimension of ND28 diag
|
|
! for GFED2 or default biomass burning. Now read if Time Spent in
|
|
! Troposphere is wanted (phs, bmy, 10/17/06)
|
|
! (17) Now modified for OTD-LIS local redistribution. Remove references
|
|
! to GEOS-1 and GEOS-STRAT run dirs. (bmy, 11/5/07)
|
|
! (18) New error traps for OTD-LIS scaling, dependent on met field type.
|
|
! Bug fix, create string variables for ERROR_STOP. Bug fix: use ND52
|
|
! in call to SET_TINDEX in READ_DIAGNOSTIC_MENU. (ltm, bmy, 2/11/08)
|
|
! (19) Bug fix: use (0,0) in call to INIT_TRANSFER (phs, 6/17/08)
|
|
! (20) Minor fix in READ_TRANSPORT_MENU (cdh, bmy, 7/7/08)
|
|
! (21) Fixed typo READ_EMISSIONS_MENU for GEOS-3 (bmy, 10/30/08)
|
|
! (22) Set upper limit on dynamic timestep for 0.5 x 0.666 nested
|
|
! grids (yxw, bmy, dan, 11/6/08)
|
|
! (23) Now read LCAC switch for CAC emissions (amv, 1/09/2008)
|
|
! (24) Move the call to NDXX_SETUP (phs, 11/18/08)
|
|
! (25) Minor bug fix in READ_DIAGNOSTIC_MENU (tmf, 2/10/09)
|
|
! (26) Add LMEGANMONO switch in emission menu (ccc, 3/2/09)
|
|
! (27) Add LDICARB switch in aerosol menu (ccc, tmf, 3/10/09)
|
|
! (28) Now read LCOOKE in aerosol menu (phs, 5/18/09)
|
|
! 07 Sep 2011 - P. Kasibhatla - Modified to include monthly GFED3
|
|
! 17 Jan 2012 - P. Kasibhatla - Modified to include daily and 3-hourly GFED3
|
|
!******************************************************************************
|
|
!
|
|
IMPLICIT NONE
|
|
|
|
!=================================================================
|
|
! MODULE PRIVATE DECLARATIONS -- keep certain internal variables
|
|
! and routines from being seen outside "input_mod.f"
|
|
!=================================================================
|
|
|
|
! Make everything PRIVATE ...
|
|
PRIVATE
|
|
|
|
! ... except these routines
|
|
PUBLIC :: READ_INPUT_FILE
|
|
|
|
! adj_group:
|
|
PUBLIC :: DIAGINFO
|
|
PUBLIC :: TRACERINFO
|
|
|
|
!=================================================================
|
|
! MODULE VARIABLES
|
|
!=================================================================
|
|
LOGICAL :: VERBOSE = .FALSE.
|
|
INTEGER, PARAMETER :: FIRSTCOL = 26
|
|
INTEGER, PARAMETER :: MAXDIM = 255
|
|
INTEGER :: TS_CHEM
|
|
INTEGER :: TS_DYN
|
|
INTEGER :: TS_CONV
|
|
INTEGER :: TS_EMIS
|
|
INTEGER :: TS_UNIT
|
|
INTEGER :: CT1, CT2, CT3
|
|
CHARACTER(LEN=255) :: FILENAME = 'input.geos'
|
|
CHARACTER(LEN=255) :: TOPTITLE
|
|
CHARACTER(LEN=255) :: BPCH_FILE
|
|
CHARACTER(LEN=255) :: DIAGINFO
|
|
CHARACTER(LEN=255) :: TRACERINFO
|
|
|
|
!=================================================================
|
|
! MODULE ROUTINES -- follow below the "CONTAINS" statement
|
|
!=================================================================
|
|
CONTAINS
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE READ_INPUT_FILE
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine READ_INPUT_FILE is the driver program for reading the GEOS_CHEM
|
|
! input file "input.geos" from disk. (bmy, 7/20/04)
|
|
!
|
|
! NOTES:
|
|
! (1 ) Now call DO_GAMAP from "gamap_mod.f" to create "diaginfo.dat" and
|
|
! "tracerinfo.dat" files after all diagnostic menus have been read in
|
|
! (2 ) Now call NDXX_setup from this routine (phs, 11/18/08)
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE CHARPAK_MOD, ONLY : STRREPL
|
|
USE FILE_MOD, ONLY : IU_GEOS, IOERROR
|
|
USE GAMAP_MOD, ONLY : DO_GAMAP
|
|
|
|
! Local variables
|
|
LOGICAL :: EOF
|
|
INTEGER :: IOS
|
|
CHARACTER(LEN=1) :: TAB = ACHAR(9)
|
|
CHARACTER(LEN=1) :: SPACE = ' '
|
|
CHARACTER(LEN=255) :: LINE
|
|
|
|
!=================================================================
|
|
! READ_INPUT_FILE begins here!
|
|
!=================================================================
|
|
|
|
! Echo output
|
|
WRITE( 6, '(a )' ) REPEAT( '=', 79 )
|
|
WRITE( 6, '(a,/)' ) 'G E O S - C H E M U S E R I N P U T'
|
|
WRITE( 6, 100 ) TRIM( FILENAME )
|
|
100 FORMAT( 'READ_INPUT_FILE: Reading ', a )
|
|
|
|
! Initialize directory & logical variables
|
|
CALL INIT_INPUT
|
|
|
|
! Open file
|
|
OPEN( IU_GEOS, FILE=TRIM( FILENAME ), STATUS='OLD', IOSTAT=IOS )
|
|
IF ( IOS /= 0 ) CALL IOERROR( IOS, IU_GEOS, 'read_input_file:1' )
|
|
|
|
! Read TOPTITLE for binary punch file
|
|
TOPTITLE = READ_ONE_LINE( EOF )
|
|
IF ( EOF ) RETURN
|
|
|
|
! Loop until EOF
|
|
DO
|
|
|
|
! Read a line from the file, exit if EOF
|
|
LINE = READ_ONE_LINE( EOF )
|
|
IF ( EOF ) EXIT
|
|
|
|
! Replace tab characters in LINE (if any) w/ spaces
|
|
CALL STRREPL( LINE, TAB, SPACE )
|
|
|
|
!=============================================================
|
|
! Call individual subroutines to read sections of the file
|
|
!
|
|
! NOTE: You are pretty flexible in setting the order of the
|
|
! menus in the input file; however, a few guidelines apply:
|
|
!
|
|
! (1) SIMULATION MENU should be listed first.
|
|
! (2) TRACER MENU should be listed second.
|
|
! (3) EMISSIONS, AEROSOL, CHEMISTRY, TRANSPORT, CONVECTION,
|
|
! and DEPOSITION menus (in any order) should follow.
|
|
! (4) Diagnostic menus, including OUTPUT, DIAGNOSTIC,
|
|
! PLANEFLIGHT, ND48, ND49, ND50, ND51, and PROD_LOSS
|
|
! menus (in any order) should follow next.
|
|
! (5) The following menus have no other restriction and
|
|
! can be placed anywhere (but by convention we will
|
|
! place them after the diagnostic menu): NESTED GRID
|
|
! UNIX CMDS, ARCHIVED OH, and O3PL menus.
|
|
!=============================================================
|
|
IF ( INDEX( LINE, 'SIMULATION MENU' ) > 0 ) THEN
|
|
CALL READ_SIMULATION_MENU
|
|
|
|
ELSE IF ( INDEX( LINE, 'TRACER MENU' ) > 0 ) THEN
|
|
CALL READ_TRACER_MENU
|
|
|
|
ELSE IF ( INDEX( LINE, 'AEROSOL MENU' ) > 0 ) THEN
|
|
CALL READ_AEROSOL_MENU
|
|
|
|
ELSE IF ( INDEX( LINE, 'EMISSIONS MENU' ) > 0 ) THEN
|
|
CALL READ_EMISSIONS_MENU
|
|
|
|
ELSE IF ( INDEX( LINE, 'FUTURE MENU' ) > 0 ) THEN
|
|
CALL READ_FUTURE_MENU
|
|
|
|
ELSE IF ( INDEX( LINE, 'CHEMISTRY MENU' ) > 0 ) THEN
|
|
CALL READ_CHEMISTRY_MENU
|
|
|
|
ELSE IF ( INDEX( LINE, 'TRANSPORT MENU' ) > 0 ) THEN
|
|
CALL READ_TRANSPORT_MENU
|
|
|
|
ELSE IF ( INDEX( LINE, 'CONVECTION MENU' ) > 0 ) THEN
|
|
CALL READ_CONVECTION_MENU
|
|
|
|
ELSE IF ( INDEX( LINE, 'DEPOSITION MENU' ) > 0 ) THEN
|
|
CALL READ_DEPOSITION_MENU
|
|
|
|
ELSE IF ( INDEX( LINE, 'CO2 SIM MENU' ) > 0 ) THEN !Ray Nassar
|
|
CALL READ_CO2_SIM_MENU
|
|
|
|
ELSE IF ( INDEX( LINE, 'HTAP SIM MENU' ) > 0 ) THEN
|
|
CALL READ_HTAP_SIM_MENU
|
|
|
|
ELSE IF ( INDEX( LINE, 'GAMAP MENU' ) > 0 ) THEN
|
|
CALL READ_GAMAP_MENU
|
|
|
|
ELSE IF ( INDEX( LINE, 'OUTPUT MENU' ) > 0 ) THEN
|
|
CALL READ_OUTPUT_MENU
|
|
|
|
ELSE IF ( INDEX( LINE, 'DIAGNOSTIC MENU' ) > 0 ) THEN
|
|
CALL READ_DIAGNOSTIC_MENU
|
|
|
|
ELSE IF ( INDEX( LINE, 'PLANEFLIGHT MENU' ) > 0 ) THEN
|
|
CALL READ_PLANEFLIGHT_MENU
|
|
|
|
ELSE IF ( INDEX( LINE, 'ND48 MENU' ) > 0 ) THEN
|
|
CALL READ_ND48_MENU
|
|
|
|
ELSE IF ( INDEX( LINE, 'ND49 MENU' ) > 0 ) THEN
|
|
CALL READ_ND49_MENU
|
|
|
|
ELSE IF ( INDEX( LINE, 'ND50 MENU' ) > 0 ) THEN
|
|
CALL READ_ND50_MENU
|
|
|
|
ELSE IF ( INDEX( LINE, 'ND51 MENU' ) > 0 ) THEN
|
|
CALL READ_ND51_MENU
|
|
|
|
ELSE IF ( INDEX( LINE, 'ND51b MENU' ) > 0 ) THEN
|
|
CALL READ_ND51b_MENU
|
|
|
|
ELSE IF ( INDEX( LINE, 'ND51c MENU' ) > 0 ) THEN
|
|
CALL READ_ND51c_MENU
|
|
|
|
ELSE IF ( INDEX( LINE, 'ND51d MENU' ) > 0 ) THEN
|
|
CALL READ_ND51d_MENU
|
|
|
|
ELSE IF ( INDEX( LINE, 'PROD & LOSS MENU' ) > 0 ) THEN
|
|
CALL READ_PROD_LOSS_MENU
|
|
|
|
ELSE IF ( INDEX( LINE, 'UNIX CMDS MENU' ) > 0 ) THEN
|
|
CALL READ_UNIX_CMDS_MENU
|
|
|
|
ELSE IF ( INDEX( LINE, 'NESTED GRID MENU' ) > 0 ) THEN
|
|
CALL READ_NESTED_GRID_MENU
|
|
|
|
ELSE IF ( INDEX( LINE, 'ARCHIVED OH MENU' ) > 0 ) THEN
|
|
CALL READ_ARCHIVED_OH_MENU
|
|
|
|
ELSE IF ( INDEX( LINE, 'O3 P/L MENU' ) > 0 ) THEN
|
|
CALL READ_O3PL_MENU
|
|
|
|
ELSE IF ( INDEX( LINE, 'BENCHMARK MENU' ) > 0 ) THEN
|
|
CALL READ_BENCHMARK_MENU
|
|
|
|
ELSE IF ( INDEX( LINE, 'MERCURY MENU' ) > 0 ) THEN
|
|
CALL READ_MERCURY_MENU
|
|
|
|
ELSE IF ( INDEX( LINE, 'END OF FILE' ) > 0 ) THEN
|
|
EXIT
|
|
|
|
ENDIF
|
|
ENDDO
|
|
|
|
! Close input file
|
|
CLOSE( IU_GEOS )
|
|
|
|
! Allocate diagnostic arrays (phs, 11/18/08)
|
|
CALL NDXX_SETUP
|
|
|
|
!=================================================================
|
|
! Further error-checking and initialization
|
|
!=================================================================
|
|
|
|
! Make sure all directories are valid
|
|
CALL VALIDATE_DIRECTORIES
|
|
|
|
! Check GEOS-CHEM timesteps
|
|
CALL CHECK_TIME_STEPS
|
|
|
|
! Create "diaginfo.dat" and "tracerinfo.dat" files for GAMAP
|
|
! adj_group: need to read adjoint input file first, so
|
|
! do this from input_adj_mod.f (dkh, 02/09/10)
|
|
|
|
!CALL DO_GAMAP( DIAGINFO, TRACERINFO )
|
|
|
|
! Echo output
|
|
WRITE( 6, '(a)' ) REPEAT( '=', 79 )
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE READ_INPUT_FILE
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
FUNCTION READ_ONE_LINE( EOF, LOCATION ) RESULT( LINE )
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine READ_ONE_LINE reads a line from the input file. If the global
|
|
! variable VERBOSE is set, the line will be printed to stdout. READ_ONE_LINE
|
|
! can trap an unexpected EOF if LOCATION is passed. Otherwise, it will pass
|
|
! a logical flag back to the calling routine, where the error trapping will
|
|
! be done. (bmy, 7/20/04)
|
|
!
|
|
! Arguments as Output:
|
|
! ===========================================================================
|
|
! (1 ) EOF (CHARACTER) : Logical flag denoting EOF condition
|
|
! (2 ) LOCATION (CHARACTER) : Name of calling routine; traps premature EOF
|
|
!
|
|
! Function value:
|
|
! ===========================================================================
|
|
! (1 ) LINE (CHARACTER) : A line of text as read from the file
|
|
!
|
|
! NOTES:
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE FILE_MOD, ONLY : IU_GEOS, IOERROR
|
|
|
|
! Arguments
|
|
LOGICAL, INTENT(OUT) :: EOF
|
|
CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: LOCATION
|
|
|
|
! Local variables
|
|
INTEGER :: IOS
|
|
CHARACTER(LEN=255) :: LINE, MSG
|
|
|
|
!=================================================================
|
|
! READ_ONE_LINE begins here!
|
|
!=================================================================
|
|
|
|
! Initialize
|
|
EOF = .FALSE.
|
|
|
|
! Read a line from the file
|
|
READ( IU_GEOS, '(a)', IOSTAT=IOS ) LINE
|
|
|
|
! IO Status < 0: EOF condition
|
|
IF ( IOS < 0 ) THEN
|
|
EOF = .TRUE.
|
|
|
|
! Trap unexpected EOF -- stop w/ error msg if LOCATION is passed
|
|
! Otherwise, return EOF to the calling program
|
|
IF ( PRESENT( LOCATION ) ) THEN
|
|
MSG = 'READ_ONE_LINE: error at: ' // TRIM( LOCATION )
|
|
WRITE( 6, '(a)' ) MSG
|
|
WRITE( 6, '(a)' ) 'Unexpected end of file encountered!'
|
|
WRITE( 6, '(a)' ) 'STOP in READ_ONE_LINE (input_mod.f)'
|
|
WRITE( 6, '(a)' ) REPEAT( '=', 79 )
|
|
STOP
|
|
ELSE
|
|
RETURN
|
|
ENDIF
|
|
ENDIF
|
|
|
|
! IO Status > 0: true I/O error condition
|
|
IF ( IOS > 0 ) CALL IOERROR( IOS, IU_GEOS, 'read_one_line:1' )
|
|
|
|
! Print the line (if necessary)
|
|
IF ( VERBOSE ) WRITE( 6, '(a)' ) TRIM( LINE )
|
|
|
|
! Return to calling program
|
|
END FUNCTION READ_ONE_LINE
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE SPLIT_ONE_LINE( SUBSTRS, N_SUBSTRS, N_EXP, LOCATION )
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine SPLIT_ONE_LINE reads a line from the input file (via routine
|
|
! READ_ONE_LINE), and separates it into substrings. (bmy, 7/20/04)
|
|
!
|
|
! SPLIT_ONE_LINE also checks to see if the number of substrings found is
|
|
! equal to the number of substrings that we expected to find. However, if
|
|
! you don't know a-priori how many substrings to expect a-priori,
|
|
! you can skip the error check.
|
|
!
|
|
! Arguments as Input:
|
|
! ===========================================================================
|
|
! (3 ) N_EXP (INTEGER ) : Number of substrings we expect to find
|
|
! (N_EXP < 0 will skip the error check!)
|
|
! (4 ) LOCATION (CHARACTER) : Name of routine that called SPLIT_ONE_LINE
|
|
!
|
|
! Arguments as Output:
|
|
! ===========================================================================
|
|
! (1 ) SUBSTRS (CHARACTER) : Array of substrings (separated by " ")
|
|
! (2 ) N_SUBSTRS (INTEGER ) : Number of substrings actually found
|
|
!
|
|
! NOTES:
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE CHARPAK_MOD, ONLY: STRSPLIT
|
|
|
|
! Arguments
|
|
CHARACTER(LEN=255), INTENT(OUT) :: SUBSTRS(MAXDIM)
|
|
INTEGER, INTENT(OUT) :: N_SUBSTRS
|
|
INTEGER, INTENT(IN) :: N_EXP
|
|
CHARACTER(LEN=*), INTENT(IN) :: LOCATION
|
|
|
|
! Local varaibles
|
|
LOGICAL :: EOF
|
|
CHARACTER(LEN=255) :: LINE, MSG
|
|
|
|
!=================================================================
|
|
! SPLIT_ONE_LINE begins here!
|
|
!=================================================================
|
|
|
|
! Create error msg
|
|
MSG = 'SPLIT_ONE_LINE: error at ' // TRIM( LOCATION )
|
|
|
|
!=================================================================
|
|
! Read a line from disk
|
|
!=================================================================
|
|
LINE = READ_ONE_LINE( EOF )
|
|
|
|
! STOP on End-of-File w/ error msg
|
|
IF ( EOF ) THEN
|
|
WRITE( 6, '(a)' ) TRIM( MSG )
|
|
WRITE( 6, '(a)' ) 'End of file encountered!'
|
|
WRITE( 6, '(a)' ) 'STOP in SPLIT_ONE_LINE (input_mod.f)!'
|
|
WRITE( 6, '(a)' ) REPEAT( '=', 79 )
|
|
STOP
|
|
ENDIF
|
|
|
|
!=================================================================
|
|
! Split the lines between spaces -- start at column FIRSTCOL
|
|
!=================================================================
|
|
CALL STRSPLIT( LINE(FIRSTCOL:), ' ', SUBSTRS, N_SUBSTRS )
|
|
|
|
! Sometimes we don't know how many substrings to expect,
|
|
! if N_EXP is greater than MAXDIM, then skip the error check
|
|
IF ( N_EXP < 0 ) RETURN
|
|
|
|
! Stop if we found the wrong
|
|
IF ( N_EXP /= N_SUBSTRS ) THEN
|
|
WRITE( 6, '(a)' ) TRIM( MSG )
|
|
WRITE( 6, 100 ) N_EXP, N_SUBSTRS
|
|
WRITE( 6, '(a)' ) 'STOP in SPLIT_ONE_LINE (input_mod.f)!'
|
|
WRITE( 6, '(a)' ) REPEAT( '=', 79 )
|
|
STOP
|
|
100 FORMAT( 'Expected ',i2, ' substrs but found ',i3 )
|
|
ENDIF
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE SPLIT_ONE_LINE
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE READ_SIMULATION_MENU
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine READ_SIMULATION_MENU reads the SIMULATION MENU section of
|
|
! the GEOS-CHEM input file (bmy, 7/20/04, 6/17/08)
|
|
!
|
|
! NOTES:
|
|
! (1 ) Bug fix: Read LSVGLB w/ the * format and not w/ '(a)'. (bmy, 2/23/05)
|
|
! (2 ) Now read GEOS_5_DIR and GCAP_DIR from input.geos (swu, bmy, 5/25/05)
|
|
! (3 ) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)
|
|
! (4 ) Now references DATA_DIR_1x1 for 1x1 emissions files (bmy, 10/24/05)
|
|
! (5 ) Now read switch for using variable tropopause or not (phs, 9/14/06)
|
|
! (6 ) Remove references to GEOS-1 and GEOS-STRAT run dirs. Now calls
|
|
! INIT_TRANSFER (bmy, 11/5/07)
|
|
! (7 ) Fix typo in "print to screen" section (phs, 6/1/08)
|
|
! (8 ) Call INIT_TRANSFER w/ (0,0) instead of (I0,J0) (phs, 6/17/08)
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE DIRECTORY_MOD, ONLY : DATA_DIR, DATA_DIR_1x1, GCAP_DIR
|
|
USE DIRECTORY_MOD, ONLY : GEOS_3_DIR, GEOS_4_DIR, GEOS_5_DIR
|
|
USE DIRECTORY_MOD, ONLY : GEOS_FP_DIR !! (lzh,11/01/2014) geos-fp
|
|
USE DIRECTORY_MOD, ONLY : RUN_DIR
|
|
USE DIRECTORY_MOD, ONLY : TEMP_DIR
|
|
USE GRID_MOD, ONLY : SET_XOFFSET, SET_YOFFSET, COMPUTE_GRID
|
|
USE LOGICAL_MOD, ONLY : LSVGLB, LUNZIP, LWAIT
|
|
USE LOGICAL_MOD, ONLY : LVARTROP
|
|
USE RESTART_MOD, ONLY : SET_RESTART
|
|
USE TIME_MOD, ONLY : SET_BEGIN_TIME, SET_END_TIME
|
|
USE TIME_MOD, ONLY : SET_CURRENT_TIME, SET_DIAGb
|
|
USE TIME_MOD, ONLY : SET_NDIAGTIME, GET_TAU
|
|
USE TRANSFER_MOD, ONLY : INIT_TRANSFER
|
|
|
|
! Local variables
|
|
INTEGER :: I0, J0
|
|
INTEGER :: N, NDIAGTIME
|
|
INTEGER :: NYMDb, NHMSb
|
|
INTEGER :: NYMDe, NHMSe
|
|
CHARACTER(LEN=255) :: SUBSTRS(MAXDIM)
|
|
CHARACTER(LEN=255) :: IN_RST_FILE
|
|
CHARACTER(LEN=255) :: OUT_RST_FILE
|
|
|
|
!=================================================================
|
|
! READ_SIMULATION_MENU begins here!
|
|
!=================================================================
|
|
|
|
! Start YYYYMMDD, HHMMSS
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 2, 'read_simulation_menu:1' )
|
|
READ( SUBSTRS(1:N), * ) NYMDb, NHMSb
|
|
|
|
! End YYYYMMDD, HHMMSS
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 2, 'read_simulation_menu:2' )
|
|
READ( SUBSTRS(1:N), * ) NYMDe, NHMSe
|
|
|
|
! Run directory
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_simulation_menu:3' )
|
|
READ( SUBSTRS(1:N), '(a)' ) RUN_DIR
|
|
|
|
! Input restart file
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_simulation_menu:4' )
|
|
READ( SUBSTRS(1:N), '(a)' ) IN_RST_FILE
|
|
|
|
! Make new restart file?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_simulation_menu:5' )
|
|
READ( SUBSTRS(1:N), * ) LSVGLB
|
|
|
|
! Output restart file(s)
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_simulation_menu:6' )
|
|
READ( SUBSTRS(1:N), '(a)' ) OUT_RST_FILE
|
|
|
|
! Root data dir
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_simulation_menu:7' )
|
|
READ( SUBSTRS(1:N), '(a)' ) DATA_DIR
|
|
|
|
! GCAP subdir
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_simulation_menu:8' )
|
|
READ( SUBSTRS(1:N), '(a)' ) GCAP_DIR
|
|
|
|
! GEOS-3 subdir
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_simulation_menu:9' )
|
|
READ( SUBSTRS(1:N), '(a)' ) GEOS_3_DIR
|
|
|
|
! GEOS-4 subdir
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_simulation_menu:10' )
|
|
READ( SUBSTRS(1:N), '(a)' ) GEOS_4_DIR
|
|
|
|
! GEOS-5 subdir
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_simulation_menu:11' )
|
|
READ( SUBSTRS(1:N), '(a)' ) GEOS_5_DIR
|
|
|
|
! GEOS-5.7.x subdir (lzh, 11/01/2014)
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_simulation_menu:11b' )
|
|
READ( SUBSTRS(1:N), '(a)' ) GEOS_FP_DIR
|
|
|
|
! Temp dir
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_simulation_menu:12' )
|
|
READ( SUBSTRS(1:N), '(a)' ) DATA_DIR_1x1
|
|
|
|
! Temp dir
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_simulation_menu:13' )
|
|
READ( SUBSTRS(1:N), '(a)' ) TEMP_DIR
|
|
|
|
! Unzip met fields
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_simulation_menu:14' )
|
|
READ( SUBSTRS(1:N), * ) LUNZIP
|
|
|
|
! Wait for met fields?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_simulation_menu:15' )
|
|
READ( SUBSTRS(1:N), * ) LWAIT
|
|
|
|
! Variable Tropopause
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_simulation_menu:16' )
|
|
READ( SUBSTRS(1:N), * ) LVARTROP
|
|
|
|
! I0, J0
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 2, 'read_simulation_menu:17' )
|
|
READ( SUBSTRS(1:N), * ) I0, J0
|
|
|
|
! Separator line
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_simulation_menu:18' )
|
|
|
|
!=================================================================
|
|
! Print to screen
|
|
!=================================================================
|
|
WRITE( 6, '(/,a)' ) 'SIMULATION MENU'
|
|
WRITE( 6, '( a)' ) '---------------'
|
|
WRITE( 6, 100 ) 'Start time of run : ', NYMDb, NHMSb
|
|
WRITE( 6, 100 ) 'End time of run : ', NYMDe, NHMSe
|
|
WRITE( 6, 110 ) 'Run directory : ',
|
|
& TRIM( RUN_DIR )
|
|
WRITE( 6, 110 ) 'Data Directory : ',
|
|
& TRIM( DATA_DIR )
|
|
WRITE( 6, 110 ) 'GCAP sub-directory : ',
|
|
& TRIM( GCAP_DIR )
|
|
WRITE( 6, 110 ) 'GEOS-3 sub-directory : ',
|
|
& TRIM( GEOS_3_DIR )
|
|
WRITE( 6, 110 ) 'GEOS-4 sub-directory : ',
|
|
& TRIM( GEOS_4_DIR )
|
|
WRITE( 6, 110 ) 'GEOS-5 sub-directory : ',
|
|
& TRIM( GEOS_5_DIR )
|
|
WRITE( 6, 110 ) 'GEOS-FP sub-directory : ',
|
|
& TRIM( GEOS_FP_DIR )
|
|
WRITE( 6, 110 ) '1x1 Emissions etc Data Dir : ',
|
|
& TRIM( DATA_DIR_1x1 )
|
|
WRITE( 6, 110 ) 'Temporary Directory : ',
|
|
& TRIM( TEMP_DIR )
|
|
WRITE( 6, 110 ) 'Input restart file : ',
|
|
& TRIM( IN_RST_FILE )
|
|
WRITE( 6, 120 ) 'Create restart file? : ', LSVGLB
|
|
WRITE( 6, 110 ) 'Output restart file(s) : ',
|
|
& TRIM( OUT_RST_FILE )
|
|
WRITE( 6, 120 ) 'Unzip met fields? : ', LUNZIP
|
|
WRITE( 6, 120 ) 'Wait for met fields? : ', LWAIT
|
|
WRITE( 6, 120 ) 'Use variable tropopause? : ', LVARTROP
|
|
WRITE( 6, 130 ) 'Global offsets I0, J0 : ', I0, J0
|
|
|
|
! Format statements
|
|
100 FORMAT( A, I8.8, 1X, I6.6 )
|
|
110 FORMAT( A, A )
|
|
120 FORMAT( A, L5 )
|
|
130 FORMAT( A, 2I5 )
|
|
|
|
!=================================================================
|
|
! Call setup routines from other GEOS-CHEM modules
|
|
!=================================================================
|
|
|
|
! Set start time of run in "time_mod.f"
|
|
CALL SET_BEGIN_TIME( NYMDb, NHMSb )
|
|
|
|
! Set end time of run in "time_mod.f"
|
|
CALL SET_END_TIME( NYMDe, NHMSe )
|
|
|
|
! Set the current time
|
|
CALL SET_CURRENT_TIME()
|
|
|
|
! Set the time of day for writing bpch files
|
|
NDIAGTIME = NHMSe !### test
|
|
CALL SET_NDIAGTIME( NDIAGTIME )
|
|
|
|
! Set the start of the 1st diagnostic interval
|
|
CALL SET_DIAGb( GET_TAU() )
|
|
|
|
! Set input & output restart file names
|
|
CALL SET_RESTART( IN_RST_FILE, OUT_RST_FILE )
|
|
|
|
! Set global offsets
|
|
CALL SET_XOFFSET( I0 )
|
|
CALL SET_YOFFSET( J0 )
|
|
|
|
! Compute lat/lon/surface area variables
|
|
CALL COMPUTE_GRID
|
|
|
|
! Initialze quantities for "transfer_mod.f"
|
|
CALL INIT_TRANSFER( 0, 0 )
|
|
|
|
! Set counter
|
|
CT1 = CT1 + 1
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE READ_SIMULATION_MENU
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE READ_TRACER_MENU
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine READ_TRACER_MENU reads the TRACER MENU section of the
|
|
! GEOS-CHEM input file (bmy, 7/20/04, 4/5/06)
|
|
!
|
|
! NOTES:
|
|
! (1 ) Now set LSPLIT correctly for Tagged Hg simulation (eck, bmy, 12/13/04)
|
|
! (2 ) Now initialize ocean mercury module (sas, bmy, 1/20/05)
|
|
! (3 ) Now set LSPLIT correctly for Tagged HCN/CH3CN sim (xyp, bmy, 6/30/05)
|
|
! (4 ) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)
|
|
! (5 ) Now reference XNUMOLAIR from "tracer_mod.f" (bmy, 10/25/05)
|
|
! (6 ) Now move call to INIT_OCEAN_MERCURY to READ_MERCURY_MENU (bmy, 2/24/06)
|
|
! (7 ) Now do not call SET_BIOTRCE anymore; it's obsolete (bmy, 4/5/06)
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE CHARPAK_MOD, ONLY : ISDIGIT
|
|
USE BIOFUEL_MOD, ONLY : SET_BFTRACE
|
|
USE ERROR_MOD, ONLY : ALLOC_ERR, ERROR_STOP
|
|
USE LOGICAL_MOD, ONLY : LSPLIT
|
|
USE OCEAN_MERCURY_MOD, ONLY : INIT_OCEAN_MERCURY
|
|
USE TRACER_MOD, ONLY : ID_EMITTED, ID_TRACER
|
|
USE TRACER_MOD, ONLY : SIM_TYPE, N_TRACERS
|
|
USE TRACER_MOD, ONLY : TCVV, TRACER_COEFF
|
|
USE TRACER_MOD, ONLY : TRACER_CONST, TRACER_MW_G
|
|
USE TRACER_MOD, ONLY : TRACER_MW_KG, TRACER_N_CONST
|
|
USE TRACER_MOD, ONLY : TRACER_NAME, INIT_TRACER
|
|
USE TRACER_MOD, ONLY : XNUMOL, XNUMOLAIR
|
|
USE TRACER_MOD, ONLY : ITS_A_FULLCHEM_SIM
|
|
USE TRACER_MOD, ONLY : ITS_A_HCN_SIM
|
|
USE TRACER_MOD, ONLY : ITS_A_MERCURY_SIM
|
|
USE TRACERID_MOD, ONLY : TRACERID
|
|
|
|
# include "CMN_SIZE" ! Size parameters
|
|
|
|
! Local variables
|
|
INTEGER :: N, T, C
|
|
CHARACTER(LEN=255) :: C1, C2, LINE, NAME
|
|
CHARACTER(LEN=255) :: SUBSTRS(MAXDIM)
|
|
|
|
!=================================================================
|
|
! READ_TRACER_MENU begins here!
|
|
!=================================================================
|
|
|
|
! NSRCX
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_tracer_menu:1' )
|
|
READ( SUBSTRS(1:N), * ) SIM_TYPE
|
|
|
|
! NTRACE
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_tracer_menu:2' )
|
|
READ( SUBSTRS(1:N), * ) N_TRACERS
|
|
|
|
! Separator line
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_tracer_menu:3' )
|
|
|
|
! NTRACE cannot exceed NNPAR
|
|
IF ( N_TRACERS > NNPAR ) THEN
|
|
CALL ERROR_STOP( 'Error: N_TRACERS > NNPAR!',
|
|
& 'read_tracer_menu (input_mod.f)' )
|
|
ENDIF
|
|
|
|
! Initialize tracer arrays in tracer_mod.f
|
|
CALL INIT_TRACER
|
|
|
|
!=================================================================
|
|
! Read tracer ID, emission ID, biomass ID, biofuel ID, & mol wt
|
|
!=================================================================
|
|
DO T = 1, N_TRACERS
|
|
|
|
! Split line into substrings
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_tracer_menu:4' )
|
|
|
|
! Save tracer number
|
|
READ( SUBSTRS(1), * ) ID_TRACER(T)
|
|
|
|
! Save tracer name
|
|
TRACER_NAME(T) = TRIM( SUBSTRS(2) )
|
|
|
|
! Save tracer molecular wt [g/mole]
|
|
READ( SUBSTRS(3), * ) TRACER_MW_G(T)
|
|
|
|
! Save tracer molecular wt [kg/mole]
|
|
TRACER_MW_KG(T) = TRACER_MW_G(T) * 1d-3
|
|
|
|
! Ratio of MW air / MW tracer
|
|
TCVV(T) = 28.97d0 / TRACER_MW_G(T)
|
|
|
|
! Molecules tracer / kg tracer
|
|
XNUMOL(T) = 6.022d+23 / TRACER_MW_KG(T)
|
|
|
|
!----------------------------------------------------
|
|
! If this is a family tracer, get member species
|
|
!----------------------------------------------------
|
|
IF ( N > 3 ) THEN
|
|
|
|
! Number of species in this family
|
|
TRACER_N_CONST(T) = N-3
|
|
|
|
! Loop over substrings
|
|
DO C = 1, N-3
|
|
|
|
! Trim the name
|
|
NAME = TRIM( SUBSTRS(C+3) )
|
|
|
|
!--------------------------------
|
|
! Emitted species denoted by ()
|
|
!--------------------------------
|
|
IF ( NAME(1:1) == '(' ) THEN
|
|
|
|
! Pull out the text between parentheses
|
|
NAME = NAME( 2:LEN_TRIM( NAME )-1 )
|
|
|
|
! Set coeff of emitted tracer to 1 for now
|
|
TRACER_COEFF(T,C) = 1d0
|
|
|
|
! Index of which family member is the emitted species
|
|
ID_EMITTED(T) = C
|
|
|
|
! 2nd character of name is a number
|
|
IF ( ISDIGIT( NAME(1:1) ) ) THEN
|
|
|
|
! Allow for tracers that contain >= 10C (tmf, 12/09/04)
|
|
! If 3rd character of name is a number
|
|
IF ( ISDIGIT( NAME(2:2) ) ) THEN
|
|
|
|
! Coefficient of emitted tracer
|
|
READ( NAME(1:2), * ) TRACER_COEFF(T,C)
|
|
|
|
! Get the rest of the name
|
|
NAME = NAME( 3:LEN_TRIM( NAME ) )
|
|
|
|
ELSE
|
|
|
|
! Coefficient of emitted tracer
|
|
READ( NAME(1:1), * ) TRACER_COEFF(T,C)
|
|
|
|
! Get the rest of the name
|
|
NAME = NAME( 2:LEN_TRIM( NAME ) )
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
! Tracer constituent name
|
|
TRACER_CONST(T,C) = NAME
|
|
|
|
!--------------------------------
|
|
! Non-emitted species
|
|
!--------------------------------
|
|
ELSE
|
|
|
|
! Set coeff of emitted tracer to 1 for now
|
|
TRACER_COEFF(T,C) = 1d0
|
|
|
|
! 2nd character of name is a number
|
|
IF ( ISDIGIT( NAME(1:1) ) ) THEN
|
|
|
|
! Allow for tracers that contain >= 10C (tmf, 12/09/04)
|
|
! If 3rd character of name is a number
|
|
IF ( ISDIGIT( NAME(2:2) ) ) THEN
|
|
|
|
! Coefficient of emitted tracer
|
|
READ( NAME(1:2), * ) TRACER_COEFF(T,C)
|
|
|
|
! Get the rest of the name
|
|
NAME = NAME( 3:LEN_TRIM( NAME ) )
|
|
|
|
ELSE
|
|
|
|
! Coefficient of emitted tracer
|
|
READ( NAME(1:1), * ) TRACER_COEFF(T,C)
|
|
|
|
! Get the rest of the name
|
|
NAME = NAME( 2:LEN_TRIM( NAME ) )
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
! Tracer constituent name
|
|
TRACER_CONST(T,C) = NAME
|
|
|
|
ENDIF
|
|
|
|
ENDDO
|
|
|
|
!----------------------------------------------------
|
|
! If not a family tracer, there is only one member
|
|
!----------------------------------------------------
|
|
ELSE
|
|
|
|
! Number of species in this family
|
|
TRACER_N_CONST(T) = 1
|
|
|
|
! Index of which member is the emitted species
|
|
ID_EMITTED(T) = 0
|
|
|
|
! Coefficient of each tracer constituent
|
|
TRACER_COEFF(T,1) = 1d0
|
|
|
|
! Tracer constituent name
|
|
TRACER_CONST(T,1) = TRACER_NAME(T)
|
|
|
|
ENDIF
|
|
|
|
ENDDO
|
|
|
|
! Separator line
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_tracer_menu:5' )
|
|
|
|
!=================================================================
|
|
! Print to screen
|
|
!=================================================================
|
|
WRITE( 6, '(/,a)' )
|
|
& 'TRACER MENU (==> denotes SMVGEAR emitted species)'
|
|
WRITE( 6, '( a)' ) REPEAT( '-', 48 )
|
|
WRITE( 6, '( a)' ) ' # Tracer g/mole'
|
|
|
|
! Print info about each tracer
|
|
DO T = 1, N_TRACERS
|
|
|
|
! Write tracer number, name, & mol wt
|
|
WRITE( 6, 100 ) ID_TRACER(T), TRACER_NAME(T), TRACER_MW_G(T)
|
|
|
|
! If a family tracer (or just a tracer w/ emission)
|
|
! then also print info about species
|
|
IF ( TRACER_N_CONST(T) > 1 .or. ID_EMITTED(T) > 0 ) THEN
|
|
|
|
! Loop over member species
|
|
DO C = 1, TRACER_N_CONST(T)
|
|
|
|
! Also flag which is the emitted tracer
|
|
IF ( ID_EMITTED(T) == C ) THEN
|
|
WRITE( 6, 110 ) TRACER_COEFF(T,C), TRACER_CONST(T,C)
|
|
ELSE
|
|
WRITE( 6, 120 ) TRACER_COEFF(T,C), TRACER_CONST(T,C)
|
|
ENDIF
|
|
ENDDO
|
|
ENDIF
|
|
ENDDO
|
|
|
|
! Format statement
|
|
100 FORMAT( I3, 1x, A10, 6x, F6.1 )
|
|
110 FORMAT( 5x, '===> ', f4.1, 1x, A4 )
|
|
120 FORMAT( 5x, '---> ', f4.1, 1x, A4 )
|
|
|
|
!=================================================================
|
|
! Call setup routines from other F90 modules
|
|
!=================================================================
|
|
|
|
! Split into tagged tracers (turn off for full-chemistry)
|
|
IF ( ITS_A_FULLCHEM_SIM() ) THEN
|
|
|
|
! There are no tagged tracers for fullchem
|
|
LSPLIT = .FALSE.
|
|
|
|
ELSE IF ( ITS_A_MERCURY_SIM() ) THEN
|
|
|
|
! Need Hg0, Hg2, HgP for tagged Mercury
|
|
LSPLIT = ( N_TRACERS > 3 )
|
|
|
|
ELSE IF ( ITS_A_HCN_SIM() ) THEN
|
|
|
|
! Need HCN, CH3CN for HCN simulation
|
|
LSPLIT = ( N_TRACERS > 2 )
|
|
|
|
ELSE
|
|
LSPLIT = ( N_TRACERS > 1 )
|
|
|
|
ENDIF
|
|
|
|
! Set up tracer flags
|
|
CALL TRACERID
|
|
|
|
! Set NBFTRACE in "biofuel_mod.f"
|
|
CALL SET_BFTRACE
|
|
|
|
! Set counter
|
|
CT1 = CT1 + 1
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE READ_TRACER_MENU
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE READ_AEROSOL_MENU
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine READ_AEROSOL_MENU reads the AEROSOL MENU section of
|
|
! the GEOS-CHEM input file. (bmy, 7/20/04, 6/1/06)
|
|
!
|
|
! NOTES:
|
|
! (1 ) Now reference LSOA (bmy, 9/28/04)
|
|
! (2 ) Now stop run if LSOA=T and SOA tracers are undefined (bmy, 11/19/04)
|
|
! (3 ) Now reference LCRYST from "logical_mod.f". Also now check to make
|
|
! prevent aerosol tracers from being undefined if the corresponding
|
|
! logical switch is set. (cas, bmy, 1/14/05)
|
|
! (4 ) Now also require LSSALT=T when LSULF=T, since we now compute the
|
|
! production of SO4 and NIT w/in the seasalt aerosol (bec, bmy, 4/13/05)
|
|
! (5 ) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)
|
|
! (6 ) Now update error check for SOG4, SOA4 (dkh, bmy, 6/1/06)
|
|
! (7 ) Add LDICARB switch to cancel SOG condensation onto OC aerosols.
|
|
! (ccc, tmf, 3/10/09)
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE ERROR_MOD, ONLY : ERROR_STOP
|
|
USE LOGICAL_MOD, ONLY : LSULF, LCARB, LSOA
|
|
USE LOGICAL_MOD, ONLY : LDUST, LDEAD, LSSALT, LCRYST
|
|
USE LOGICAL_MOD, ONLY : LDICARB
|
|
USE TRACER_MOD, ONLY : N_TRACERS
|
|
USE TRACER_MOD, ONLY : SALA_REDGE_um, SALC_REDGE_um
|
|
USE TRACER_MOD, ONLY : ITS_AN_AEROSOL_SIM, ITS_A_FULLCHEM_SIM
|
|
USE TRACERID_MOD, ONLY : IDTDMS, IDTSO2, IDTSO4, IDTSO4s
|
|
USE TRACERID_MOD, ONLY : IDTMSA, IDTNH3, IDTNH4, IDTNITs
|
|
USE TRACERID_MOD, ONLY : IDTAS, IDTAHS, IDTLET, IDTNH4aq
|
|
USE TRACERID_MOD, ONLY : IDTSO4aq, IDTBCPO, IDTBCPI, IDTOCPO
|
|
USE TRACERID_MOD, ONLY : IDTOCPI, IDTALPH, IDTLIMO, IDTALCO
|
|
USE TRACERID_MOD, ONLY : IDTSOG1, IDTSOG2, IDTSOG3, IDTSOG4
|
|
USE TRACERID_MOD, ONLY : IDTSOA1, IDTSOA2, IDTSOA3, IDTSOA4
|
|
USE TRACERID_MOD, ONLY : IDTDST1, IDTDST2, IDTDST3, IDTDST4
|
|
USE TRACERID_MOD, ONLY : IDTSALA, IDTSALC
|
|
USE TRACERID_MOD, ONLY : IDTSOAG, IDTSOAM
|
|
|
|
! Local variables
|
|
INTEGER :: N, T, I
|
|
CHARACTER(LEN=255) :: SUBSTRS(MAXDIM), MSG, LOCATION
|
|
|
|
!=================================================================
|
|
! READ_AEROSOL_MENU begins here!
|
|
!=================================================================
|
|
|
|
! Location string for ERROR_STOP
|
|
LOCATION = 'READ_AEROSOL_MENU ("input_mod.f")'
|
|
|
|
! Error check
|
|
IF ( CT1 /= 2 ) THEN
|
|
MSG = 'SIMULATION MENU & TRACER MENU must be read in first!'
|
|
CALL ERROR_STOP( MSG, LOCATION )
|
|
ENDIF
|
|
|
|
! Use online sulfate aerosols
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_aerosol_menu:1' )
|
|
READ( SUBSTRS(1:N), * ) LSULF
|
|
|
|
! Use crystalline sulfate aerosols
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_aerosol_menu:2' )
|
|
READ( SUBSTRS(1:N), * ) LCRYST
|
|
|
|
! Use online carbon aerosols
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_aerosol_menu:3' )
|
|
READ( SUBSTRS(1:N), * ) LCARB
|
|
|
|
! Use secondary organic aerosols?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_aerosol_menu:4' )
|
|
READ( SUBSTRS(1:N), * ) LSOA
|
|
|
|
! Use online dust aerosols
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_aerosol_menu:5' )
|
|
READ( SUBSTRS(1:N), * ) LDUST
|
|
|
|
! Use DEAD dust mobilization (=T) or GINOUX (=F)
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_aerosol_menu:6' )
|
|
READ( SUBSTRS(1:N), * ) LDEAD
|
|
|
|
! Use online sea-salt aerosols?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_aerosol_menu:7' )
|
|
READ( SUBSTRS(1:N), * ) LSSALT
|
|
|
|
! Accum mode seasalt radii bin edges [um]
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 2, 'read_aerosol_menu:8' )
|
|
DO T = 1, N
|
|
READ( SUBSTRS(T), * ) SALA_REDGE_um(T)
|
|
ENDDO
|
|
|
|
! Coarse mode seasalt radii bin edges [um]
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 2, 'read_aerosol_menu:9' )
|
|
DO T = 1, N
|
|
READ( SUBSTRS(T), * ) SALC_REDGE_um(T)
|
|
ENDDO
|
|
|
|
! Switch to comment the SOG condensation in carbon_mod.f (ccc, 3/10/09)
|
|
! Use online dicarbonyl chemistry
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_aerosol_menu:10' )
|
|
READ( SUBSTRS(1:N), * ) LDICARB
|
|
|
|
! Separator line
|
|
! CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_aerosol_menu:10' )
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_aerosol_menu:11' )
|
|
|
|
!=================================================================
|
|
! Error checks
|
|
!=================================================================
|
|
|
|
! Make sure that SALA, SALC bins are contiguous
|
|
IF ( SALA_REDGE_um(2) /= SALC_REDGE_um(1) ) THEN
|
|
MSG = 'SALA and SALC bin edges are not contiguous!'
|
|
CALL ERROR_STOP( MSG, LOCATION )
|
|
ENDIF
|
|
|
|
! Turn off switches for simulations that don't use aerosols
|
|
IF ( ( .not. ITS_A_FULLCHEM_SIM() ) .and.
|
|
& ( .not. ITS_AN_AEROSOL_SIM() ) ) THEN
|
|
LSULF = .FALSE.
|
|
LCRYST = .FALSE.
|
|
LCARB = .FALSE.
|
|
LSOA = .FALSE.
|
|
LDUST = .FALSE.
|
|
LDEAD = .FALSE.
|
|
LSSALT = .FALSE.
|
|
ENDIF
|
|
|
|
!%%% The cryst/aq code is currently under development so make
|
|
!%%% sure that LCRYST = FALSE for now until further notice
|
|
!%%% (rjp, bmy, 3/15/05)
|
|
LCRYST = .FALSE.
|
|
|
|
!---------------------------------
|
|
! Error check SEASALT AEROSOLS
|
|
!---------------------------------
|
|
I = IDTSALA + IDTSALC
|
|
|
|
IF ( LSSALT ) THEN
|
|
IF ( I == 0 ) THEN
|
|
MSG = 'LSSALT=T but ONLINE SEASALT AEROSOLS are undefined!'
|
|
CALL ERROR_STOP( MSG, LOCATION )
|
|
ENDIF
|
|
ELSE
|
|
IF ( I > 0 ) THEN
|
|
MSG = 'Cannot use ONLINE SEASALT AEROSOLS if LSSALT=F!'
|
|
CALL ERROR_STOP( MSG, LOCATION )
|
|
ENDIF
|
|
ENDIF
|
|
|
|
!---------------------------------
|
|
! Error check SULFUR AEROSOLS
|
|
!---------------------------------
|
|
I = IDTDMS + IDTSO2 + IDTSO4 + IDTSO4s +
|
|
& IDTMSA + IDTNH3 + IDTNH4 + IDTNITs
|
|
|
|
IF ( LSULF ) THEN
|
|
|
|
! We now compute the production of SO4s and NITs, so when
|
|
! LSULF=T, then we must also have LSSALT=T (bec, bmy, 4/13/05)
|
|
IF ( .not. LSSALT ) THEN
|
|
MSG = 'LSULF=T now also requires LSSALT=T!'
|
|
CALL ERROR_STOP( MSG, LOCATION )
|
|
ENDIF
|
|
|
|
! Stop w/ error if everything is undefined
|
|
IF ( I == 0 ) THEN
|
|
MSG = 'LSULF=T but ONLINE SULFUR AEROSOLS are undefined!'
|
|
CALL ERROR_STOP( MSG, LOCATION )
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
! If LSULF=F but we have defined tracers, stop w/ error
|
|
IF ( I > 0 ) THEN
|
|
MSG = 'Cannot use ONLINE SULFUR AEROSOLS if LSULF=F!'
|
|
CALL ERROR_STOP( MSG, LOCATION )
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
!---------------------------------
|
|
! Error check CRYST /AQ AEROSOLS
|
|
!---------------------------------
|
|
I = IDTAS + IDTAHS + IDTLET + IDTNH4aq + IDTSO4aq
|
|
|
|
IF ( LCRYST ) THEN
|
|
IF ( I == 0 ) THEN
|
|
MSG = 'LCRYST=T but ONLINE CRYST/AQ AEROSOLS are undefined!'
|
|
CALL ERROR_STOP( MSG, LOCATION )
|
|
ENDIF
|
|
ELSE
|
|
IF ( I > 0 ) THEN
|
|
MSG = 'Cannot use ONLINE CRYST/AQ AEROSOLS if LCRYST=F!'
|
|
CALL ERROR_STOP( MSG, LOCATION )
|
|
ENDIF
|
|
ENDIF
|
|
|
|
!---------------------------------
|
|
! Error check CARBON AEROSOLS
|
|
!---------------------------------
|
|
I = IDTBCPO + IDTBCPI + IDTOCPO + IDTOCPI
|
|
|
|
IF ( LCARB ) THEN
|
|
IF ( I == 0 ) THEN
|
|
MSG = 'LCARB=T but ONLINE CARBON AEROSOLS are undefined!'
|
|
CALL ERROR_STOP( MSG, LOCATION )
|
|
ENDIF
|
|
ELSE
|
|
IF ( I > 0 ) THEN
|
|
MSG = 'Cannot use ONLINE CARBON AEROSOLS if LCARB=F!'
|
|
CALL ERROR_STOP( MSG, LOCATION )
|
|
ENDIF
|
|
ENDIF
|
|
|
|
!---------------------------------
|
|
! Error check 2dy ORG AEROSOLS
|
|
!---------------------------------
|
|
I = IDTALPH + IDTLIMO + IDTALCO +
|
|
& IDTSOG1 + IDTSOG2 + IDTSOG3 + IDTSOG4 +
|
|
& IDTSOA1 + IDTSOA2 + IDTSOA3 + IDTSOA4 +
|
|
& IDTSOAG + IDTSOAM
|
|
|
|
IF ( LSOA ) THEN
|
|
IF ( I == 0 ) THEN
|
|
MSG = 'LSOA=T but ONLINE 2dy ORG AEROSOLS are undefined!'
|
|
CALL ERROR_STOP( MSG, LOCATION )
|
|
ENDIF
|
|
ELSE
|
|
IF ( I > 0 ) THEN
|
|
MSG = 'Cannot use ONLINE 2dy ORG AEROSOLS if LSOA=F!'
|
|
CALL ERROR_STOP( MSG, LOCATION )
|
|
ENDIF
|
|
ENDIF
|
|
|
|
!---------------------------------
|
|
! Error check DUST AEROSOLS
|
|
!---------------------------------
|
|
I = IDTDST1 + IDTDST2 + IDTDST3 + IDTDST4
|
|
|
|
IF ( LDUST ) THEN
|
|
IF ( I == 0 ) THEN
|
|
MSG = 'LDUST=T but ONLINE DUST AEROSOLS are undefined!'
|
|
CALL ERROR_STOP( MSG, LOCATION )
|
|
ENDIF
|
|
ELSE
|
|
IF ( I > 0 ) THEN
|
|
MSG = 'Cannot use ONLINE DUST AEROSOLS if LDUST=F!'
|
|
CALL ERROR_STOP( MSG, LOCATION )
|
|
ENDIF
|
|
ENDIF
|
|
|
|
!---------------------------------
|
|
! Error check SEASALT AEROSOLS
|
|
!---------------------------------
|
|
I = IDTSALA + IDTSALC
|
|
|
|
IF ( LSSALT ) THEN
|
|
IF ( I == 0 ) THEN
|
|
MSG = 'LSSALT=T but ONLINE SEASALT AEROSOLS are undefined!'
|
|
CALL ERROR_STOP( MSG, LOCATION )
|
|
ENDIF
|
|
ELSE
|
|
IF ( I > 0 ) THEN
|
|
MSG = 'Cannot use ONLINE SEASALT AEROSOLS if LSSALT=F!'
|
|
CALL ERROR_STOP( MSG, LOCATION )
|
|
ENDIF
|
|
ENDIF
|
|
|
|
!=================================================================
|
|
! Print to screen
|
|
!=================================================================
|
|
WRITE( 6, '(/,a)' ) 'AEROSOL MENU'
|
|
WRITE( 6, '( a)' ) '------------'
|
|
WRITE( 6, 100 ) 'Online SULFATE AEROSOLS? : ', LSULF
|
|
WRITE( 6, 100 ) 'Online CRYST & AQ AEROSOLS? : ', LCRYST
|
|
WRITE( 6, 100 ) 'Online CARBON AEROSOLS? : ', LCARB
|
|
WRITE( 6, 100 ) 'Online 2dy ORGANIC AEROSOLS?: ', LSOA
|
|
WRITE( 6, 100 ) 'Online DUST AEROSOLS? : ', LDUST
|
|
WRITE( 6, 100 ) 'Use DEAD dust emissions? : ', LDEAD
|
|
WRITE( 6, 100 ) 'Online SEA SALT AEROSOLS? : ', LSSALT
|
|
WRITE( 6, 110 ) 'Accum SEA SALT radii [um] : ',
|
|
& SALA_REDGE_um(1), SALA_REDGE_um(2)
|
|
WRITE( 6, 110 ) 'Coarse SEA SALT radii [um] : ',
|
|
& SALC_REDGE_um(1), SALC_REDGE_um(2)
|
|
100 FORMAT( A, L5 )
|
|
110 FORMAT( A, f6.2, ' - ', f6.2 )
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE READ_AEROSOL_MENU
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE READ_EMISSIONS_MENU
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine READ_EMISSIONS_MENU reads the EMISSIONS MENU section of
|
|
! the GEOS-Chem input file. (bmy, 7/20/04, 10/30/08)
|
|
!
|
|
! NOTES:
|
|
! (1 ) Now read LNEI99 -- switch for EPA/NEI99 emissions (bmy, 11/5/04)
|
|
! (2 ) Now read LAVHRRLAI-switch for using AVHRR-derived LAI (bmy, 12/20/04)
|
|
! (3 ) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)
|
|
! (4 ) Now read LMEGAN -- switch for MEGAN biogenics (tmf, bmy, 10/20/05)
|
|
! (5 ) Now read LEMEP -- switch for EMEP emissions (bdf, bmy, 11/1/05)
|
|
! (6 ) Now read LGFED2BB -- switch for GFED2 biomass emissions (bmy, 4/5/06)
|
|
! (7 ) Now read LOTDLIS, LCTH, LMFLUX, LPRECON for lightning options
|
|
! (bmy, 5/10/06)
|
|
! (8 ) Now read LBRAVO for BRAVO Mexican emissions (rjp, kfb, bmy, 6/26/06)
|
|
! (9 ) Now read LEDGAR for EDGAR emissions (avd, bmy, 7/11/06)
|
|
! (10) Now read LSTREETS for David Streets' emissions (bmy, 8/17/06)
|
|
! (11) Kludge: Reset LMFLUX or LPRECON to LCTH, as the MFLUX and PRECON
|
|
! lightning schemes have not yet been implemented. Rename LOTDLIS
|
|
! to LOTDREG. Also read LOTDLOC for the OTD-LIS local redistribution
|
|
! of lightning flashes (cf B. Sauvage). Make sure LOTDREG and
|
|
! LOTDLOC are not both turned on at the same time. (bmy, 1/31/07)
|
|
! (12) Add LOTDSCALE to the list of LNOx options (ltm, bmy, 9/24/07)
|
|
! (13) Add new error traps for OTD-LIS options, dependent on met field type
|
|
! (ltm, bmy, 11/29/07)
|
|
! (14) Bug fix, create string variables for ERROR_STOP (bmy, 1/24/08)
|
|
! (15) Now read LCAC for CAC emissions (amv, 1/09/2008)
|
|
! (16) Now read LEDGARSHIP, LARCSHIP and LEMEPSHIP (phs, 12/5/08)
|
|
! (17) Fixed typo in message for GEOS-3 (bmy, 10/30/08)
|
|
! (18) Now read LVISTAS (amv, 12/2/08)
|
|
! (19) Now read L8DAYBB, L3HRBB and LSYNOPBB for GFED2 8-days and 3hr
|
|
! emissions, and LICARTT for corrected EPA (phs, yc, 12/17/08)
|
|
! (20) Add a specific switch for MEGAN emissions for monoterpenes and MBO
|
|
! (ccc, 2/2/09)
|
|
! (23) Now accounts for NEI2005 (amv, phs, 10/9/09)
|
|
! 07 Sep 2011 - P. Kasibhatla - Add modifications for GFED3
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE ERROR_MOD, ONLY : ERROR_STOP
|
|
USE LOGICAL_MOD, ONLY : LAIRNOX, LANTHRO, LAVHRRLAI, LBBSEA
|
|
USE LOGICAL_MOD, ONLY : LBIOFUEL, LBIOGENIC, LBIOMASS, LBIONOX
|
|
USE LOGICAL_MOD, ONLY : LCOOKE
|
|
USE LOGICAL_MOD, ONLY : LEMIS, LFOSSIL, LLIGHTNOX, LMONOT
|
|
USE LOGICAL_MOD, ONLY : LNEI99, LSHIPSO2, LSOILNOX, LTOMSAI
|
|
USE LOGICAL_MOD, ONLY : LWOODCO, LMEGAN, LMEGANMONO,LEMEP
|
|
USE LOGICAL_MOD, ONLY : LOTDREG, LOTDLOC, LCTH, LMFLUX
|
|
USE LOGICAL_MOD, ONLY : LOTDSCALE, LPRECON, LBRAVO, LEDGAR
|
|
USE LOGICAL_MOD, ONLY : LEDGARNOx, LEDGARCO, LEDGARSOx
|
|
USE LOGICAL_MOD, ONLY : LEDGARSHIP, LSTREETS, LCAC, LVISTAS
|
|
USE LOGICAL_MOD, ONLY : LARCSHIP, LEMEPSHIP, LICARTT, LGFED2BB
|
|
USE LOGICAL_MOD, ONLY : L8DAYBB, L3HRBB, LSYNOPBB
|
|
USE LOGICAL_MOD, ONLY : LGFED3BB, LDAYBB3, L3HRBB3
|
|
USE TRACER_MOD, ONLY : ITS_A_FULLCHEM_SIM
|
|
USE LOGICAL_MOD, ONLY : LICOADSSHIP,LNEI05,LNEI08,LRETRO, LHTAP
|
|
USE LOGICAL_MOD, ONLY : LRCP, LRCPSHIP, LRCPAIR
|
|
USE RCP_MOD, ONLY : RCPNAME, RCPYEAR
|
|
|
|
# include "CMN_SIZE" ! Size parameters
|
|
# include "CMN_O3" ! FSCALYR
|
|
|
|
! Local variables
|
|
INTEGER :: N
|
|
CHARACTER(LEN=255) :: SUBSTRS(MAXDIM), MSG, LOC
|
|
|
|
!=================================================================
|
|
! READ_EMISSIONS_MENU begins here!
|
|
!=================================================================
|
|
|
|
! Location for error messages
|
|
LOC = 'READ_EMISSIONS_MENU ("input_mod.f")'
|
|
|
|
! Error check
|
|
IF ( CT1 /= 2 ) THEN
|
|
MSG = 'SIMULATION MENU & TRACER MENU must be read in first!'
|
|
CALL ERROR_STOP( MSG, LOC )
|
|
ENDIF
|
|
|
|
! Turn on emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:1' )
|
|
READ( SUBSTRS(1:N), * ) LEMIS
|
|
|
|
! Emissions timestep
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:2' )
|
|
READ( SUBSTRS(1:N), * ) TS_EMIS
|
|
|
|
! Include anthropogenic emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:3' )
|
|
READ( SUBSTRS(1:N), * ) LANTHRO
|
|
|
|
! Scale 1985 to year ____ ?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:4' )
|
|
READ( SUBSTRS(1:N), * ) FSCALYR
|
|
|
|
! Include EMEP (Europe) anthro emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:5' )
|
|
READ( SUBSTRS(1:N), * ) LEMEP
|
|
|
|
! Include BRAVO (Mexico) anthro emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:6' )
|
|
READ( SUBSTRS(1:N), * ) LBRAVO
|
|
|
|
! Include EDGAR anthro emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:7' )
|
|
READ( SUBSTRS(1:N), * ) LEDGAR
|
|
|
|
! Include David Streets anthro emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:8' )
|
|
READ( SUBSTRS(1:N), * ) LSTREETS
|
|
|
|
! Include CAC anthro emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:9' )
|
|
READ( SUBSTRS(1:N), * ) LCAC
|
|
|
|
! Include NEI2005 emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:9b' )
|
|
READ( SUBSTRS(1:N), * ) LNEI05
|
|
|
|
! Include NEI2008 emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:10' )
|
|
READ( SUBSTRS(1:N), * ) LNEI08
|
|
|
|
! Use RETRO emissions? (wfr, 3/8/11)
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:11' )
|
|
READ( SUBSTRS(1:N), * ) LRETRO
|
|
|
|
! Use RCP emissions? (cdh, 10/18/11)
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:11b' )
|
|
READ( SUBSTRS(1:N), * ) LRCP
|
|
|
|
! Which RCP scenario? (cdh, 10/18/11)
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:11c' )
|
|
READ( SUBSTRS(1:N), * ) RCPNAME
|
|
|
|
! Which RCP year? (cdh, 10/18/11)
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:11d' )
|
|
READ( SUBSTRS(1:N), * ) RCPYEAR
|
|
|
|
! Use EPA/NEI99 emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:12' )
|
|
READ( SUBSTRS(1:N), * ) LNEI99
|
|
|
|
! Include ICARTT-based corrections ?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:13' )
|
|
READ( SUBSTRS(1:N), * ) LICARTT
|
|
|
|
! Include VISTAS anthro emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:14' )
|
|
READ( SUBSTRS(1:N), * ) LVISTAS
|
|
|
|
! Include biofuel emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:15' )
|
|
READ( SUBSTRS(1:N), * ) LBIOFUEL
|
|
|
|
! Include biogenic emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:16' )
|
|
READ( SUBSTRS(1:N), * ) LBIOGENIC
|
|
|
|
! Use MEGAN biogenic emissions for ISOP?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:17' )
|
|
READ( SUBSTRS(1:N), * ) LMEGAN
|
|
|
|
! Use MEGAN biogenic emissions for MONOT and MBO ? (ccc, 2/2/09)
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:18' )
|
|
READ( SUBSTRS(1:N), * ) LMEGANMONO
|
|
|
|
! Include biomass emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:19' )
|
|
READ( SUBSTRS(1:N), * ) LBIOMASS
|
|
|
|
! Seasonal biomass?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:20' )
|
|
READ( SUBSTRS(1:N), * ) LBBSEA
|
|
|
|
! Scaled to TOMSAI?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:21' )
|
|
READ( SUBSTRS(1:N), * ) LTOMSAI
|
|
|
|
! Separator line (start of GFED2 biomass emissions)
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:22' )
|
|
|
|
! Use monthly GFED2 biomass emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:23' )
|
|
READ( SUBSTRS(1:N), * ) LGFED2BB
|
|
|
|
! Use 8-day GFED2 biomass emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:24' )
|
|
READ( SUBSTRS(1:N), * ) L8DAYBB
|
|
|
|
! Use 3-hr GFED2 biomass emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:25' )
|
|
READ( SUBSTRS(1:N), * ) L3HRBB
|
|
|
|
! Use 3-hr synoptic GFED2 biomass emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:26' )
|
|
READ( SUBSTRS(1:N), * ) LSYNOPBB
|
|
|
|
! Separator line (start of GFED3 biomass emissions)
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:27' )
|
|
|
|
! Use monthly GFED3 biomass emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:28' )
|
|
READ( SUBSTRS(1:N), * ) LGFED3BB
|
|
|
|
! Use daily GFED3 biomass emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:29' )
|
|
READ( SUBSTRS(1:N), * ) LDAYBB3
|
|
|
|
! Use 3-hr GFED3 biomass emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:30' )
|
|
READ( SUBSTRS(1:N), * ) L3HRBB3
|
|
|
|
! Separator line
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:31' )
|
|
|
|
! Use aircraft NOx
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:32' )
|
|
READ( SUBSTRS(1:N), * ) LAIRNOX
|
|
|
|
! Use aircraft NOx from RCP
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:32b' )
|
|
READ( SUBSTRS(1:N), * ) LRCPAIR
|
|
|
|
! Use lightning NOx
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:33' )
|
|
READ( SUBSTRS(1:N), * ) LLIGHTNOX
|
|
|
|
! Scale lightning flash rate to OTD-LIS annual averate rate?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:34' )
|
|
READ( SUBSTRS(1:N), * ) LOTDSCALE
|
|
|
|
! Use OTD-LIS regional redistribution for lightning flash rates
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:35' )
|
|
READ( SUBSTRS(1:N), * ) LOTDREG
|
|
|
|
! Use OTD-LIS local redistribution for lightning flash rates
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:36' )
|
|
READ( SUBSTRS(1:N), * ) LOTDLOC
|
|
|
|
! Use Cloud-top-height (CTH) lightning parameterization
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:37' )
|
|
READ( SUBSTRS(1:N), * ) LCTH
|
|
|
|
! Use Mass-flux (MFLUX) lightning parameterization
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:38' )
|
|
READ( SUBSTRS(1:N), * ) LMFLUX
|
|
|
|
! Use Convective precip (PRECON) lightning parameterization
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:39' )
|
|
READ( SUBSTRS(1:N), * ) LPRECON
|
|
|
|
! Use soil NOx
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:40' )
|
|
READ( SUBSTRS(1:N), * ) LSOILNOX
|
|
|
|
! Separator line (start of ship emissions)
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:41' )
|
|
|
|
! Use ship EDGAR ship emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:42' )
|
|
READ( SUBSTRS(1:N), * ) LEDGARSHIP
|
|
|
|
! Use ICOADS (NOx, SO2, CO) ship emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:43' )
|
|
READ( SUBSTRS(1:N), * ) LICOADSSHIP
|
|
|
|
! Use RCP (NOx, SO2, CO) ship emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:43b' )
|
|
READ( SUBSTRS(1:N), * ) LRCPSHIP
|
|
|
|
! Use ship EMEP emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:44' )
|
|
READ( SUBSTRS(1:N), * ) LEMEPSHIP
|
|
|
|
! Use ship SO2 Corbett emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:45' )
|
|
READ( SUBSTRS(1:N), * ) LSHIPSO2
|
|
|
|
! Use ship ARCTAS (SO2, CO2) emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:46' )
|
|
READ( SUBSTRS(1:N), * ) LARCSHIP
|
|
|
|
! Use COOKE over North AMerica for BC/OC?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:47' )
|
|
READ( SUBSTRS(1:N), * ) LCOOKE
|
|
|
|
! Use AVHRR-derived LAI fields?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:48' )
|
|
|
|
! Separator line
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_emissions_menu:49' )
|
|
|
|
!=================================================================
|
|
! Error check logical flags
|
|
!=================================================================
|
|
|
|
! Define these flags for backwards compatibility
|
|
LFOSSIL = LANTHRO
|
|
LWOODCO = LBIOFUEL
|
|
LBIONOX = LBIOMASS
|
|
|
|
! Set LMEGAN=F if emissions are turned off
|
|
LMEGAN = ( LMEGAN .and. LEMIS )
|
|
|
|
! Set LMEGANMONO=F if emissions are turned off (ccc, 1/20/09)
|
|
LMEGANMONO = ( LMEGANMONO .and. LEMIS )
|
|
|
|
! Set all GFED2 flags to F if emissions are turned off
|
|
LGFED2BB = ( LGFED2BB .and. LEMIS )
|
|
L8DAYBB = ( L8DAYBB .and. LEMIS )
|
|
LSYNOPBB = ( LSYNOPBB .and. LEMIS )
|
|
L3HRBB = ( L3HRBB .and. LEMIS )
|
|
LGFED3BB = ( LGFED3BB .and. LEMIS )
|
|
LDAYBB3 = ( LDAYBB3 .and. LEMIS )
|
|
L3HRBB3 = ( L3HRBB3 .and. LEMIS )
|
|
|
|
! Turn off full-chem only switches
|
|
IF ( .not. ITS_A_FULLCHEM_SIM() ) THEN
|
|
LLIGHTNOX = .FALSE.
|
|
LAIRNOX = .FALSE.
|
|
LSOILNOX = .FALSE.
|
|
ENDIF
|
|
|
|
! Set other EDGAR switches (for now set all together)
|
|
IF ( LEDGAR ) THEN
|
|
LEDGARNOx = .TRUE.
|
|
LEDGARCO = .TRUE.
|
|
!LEDGARSHIP = .TRUE. ! This is read in now (phs, 12/17/08)
|
|
LEDGARSOx = .TRUE.
|
|
ENDIF
|
|
|
|
! RCP: Test for conflicts with other switches (cdh, 6/14/12)
|
|
IF ( LRCP ) THEN
|
|
|
|
! Force user to choose just 1 global inventory
|
|
IF ( LEDGAR )
|
|
& CALL ERROR_STOP( 'INPUT.GEOS WARNING!! '//
|
|
& 'Choose either RCP or EDGAR for global emissions',
|
|
& 'READ_EMISSIONS_MENU' )
|
|
|
|
! Force user to choose just 1 global inventory
|
|
IF ( LRETRO )
|
|
& CALL ERROR_STOP( 'INPUT.GEOS WARNING!! '//
|
|
& 'Choose either RCP or RETRO for global emissions',
|
|
& 'READ_EMISSIONS_MENU' )
|
|
|
|
! Force user to choose just 1 global ship inventory
|
|
IF ( LEDGARSHIP .OR. LICOADSSHIP )
|
|
& CALL ERROR_STOP( 'INPUT.GEOS WARNING!! '//
|
|
& 'Choose only 1 global ship emissions: '//
|
|
& 'RCP, EDGAR, or ICOADS',
|
|
& 'READ_EMISSIONS_MENU' )
|
|
|
|
|
|
! Dont use regional inventories
|
|
IF ( LSTREETS .OR. LCAC .OR. LBRAVO .OR. LEMEP .OR. LNEI08 .OR.
|
|
& LNEI05 )
|
|
& CALL ERROR_STOP( 'INPUT.GEOS WARNING!!'//
|
|
& 'Regional Emissions must be turned off: '//
|
|
& 'STREETS, CAC, BRAVO, EMEP, NEI ',
|
|
& 'READ_EMISSIONS_MENU' )
|
|
|
|
! Dont use HTAP as it will overwrite everything
|
|
IF ( LHTAP )
|
|
& CALL ERROR_STOP( 'INPUT.GEOS WARNING!!'//
|
|
& 'HTAP Emissions must be turned off',
|
|
& 'READ_EMISSIONS_MENU' )
|
|
|
|
! Avoid double fertilizer NOx emissions
|
|
!IF ( LFERTILIZERNOX ) THEN
|
|
! WRITE( 6, '(a)' ) REPEAT( '=', 79 )
|
|
! WRITE( 6, '(a)' ) 'WARNING! RCP inventory already includes,'
|
|
! WRITE( 6, '(a)' ) '~0.7 Tg(N) from agriculture for y2010.'
|
|
! WRITE( 6, '(a)' ) 'Turning off "Fertilizer NOx"'
|
|
! WRITE( 6, '(a)' ) 'to avoid duplicate emissions!'
|
|
! WRITE( 6, '(a)' ) REPEAT( '=', 79 )
|
|
! LFERTILIZERNOX = .FALSE.
|
|
!ENDIF
|
|
|
|
ENDIF
|
|
|
|
!%%% Bug fix! If LEMEPSHIP is turned on but LEMEP is turned %%%
|
|
!%%% off, this will cause an error (because arrays are not %%%
|
|
!%%% allocated, etc.). For now, just turn off LEMEPSHIP %%%
|
|
!%%% and print a warning message. Whoever wants to fix this %%%
|
|
!%%% in a more robust way is welcome to do so. %%%
|
|
!%%% (mak, bmy, 10/19/09) %%%
|
|
IF ( LEMEPSHIP .and. ( .not. LEMEP ) ) THEN
|
|
LEMEPSHIP = .FALSE.
|
|
WRITE( 6, '(a)' ) REPEAT( '=', 79 )
|
|
WRITE( 6, '(a)' ) 'WARNING! EMEP emissions are turned off,'
|
|
WRITE( 6, '(a)' ) 'so also turn off EMEP ship emissions'
|
|
WRITE( 6, '(a)' ) 'in order to avoid crashing GEOS-Chem!'
|
|
WRITE( 6, '(a)' ) REPEAT( '=', 79 )
|
|
ENDIF
|
|
|
|
|
|
!=================================================================
|
|
! Enforce emissions options for Nested China on native GEOS-5 grid
|
|
!=================================================================
|
|
|
|
#if defined( NESTED_NA ) || defined( NESTED_EU )
|
|
|
|
IF ( LHTAP ) CALL ERROR_STOP( 'INPUT.GEOS WARNING !!' //
|
|
& 'HTAP Nested is only suported for China:'
|
|
& ,'READ_EMISSIONS_MENU' )
|
|
|
|
#endif
|
|
|
|
! adj_group: (zhej, dkh, 01/17/12, adj32_015)
|
|
!#if defined( GRID05x0666 ) || defined( NESTED_CH )
|
|
#if defined( NESTED_CH )
|
|
|
|
LEDGAR = .FALSE.
|
|
LEMEP = .FALSE.
|
|
LBRAVO = .FALSE.
|
|
LCAC = .FALSE.
|
|
LNEI99 = .FALSE.
|
|
LVISTAS = .FALSE.
|
|
LICARTT = .FALSE.
|
|
|
|
! adj_group: (zhej, dkh, 01/17/12, adj32_015)
|
|
LNEI05 = .FALSE.
|
|
LNEI08 = .FALSE.
|
|
LEMEPSHIP= .FALSE.
|
|
|
|
#endif
|
|
|
|
! adj_group: (zhej, dkh, 01/17/12, adj32_015)
|
|
#if defined( NESTED_NA )
|
|
|
|
LSTREETS = .FALSE.
|
|
LEMEP = .FALSE.
|
|
LEMEPSHIP= .FALSE.
|
|
|
|
#endif
|
|
|
|
! (lzh, 02/01/2015)
|
|
#if defined( NESTED_EU )
|
|
|
|
LSTREETS = .FALSE.
|
|
LEDGAR = .FALSE.
|
|
LBRAVO = .FALSE.
|
|
LCAC = .FALSE.
|
|
LNEI99 = .FALSE.
|
|
LVISTAS = .FALSE.
|
|
LICARTT = .FALSE.
|
|
|
|
#endif
|
|
|
|
!=================================================================
|
|
! Check SO2 ship emissions options
|
|
!=================================================================
|
|
IF ( LARCSHIP ) LSHIPSO2 = .FALSE.
|
|
|
|
!=================================================================
|
|
! Check global ship emissions options
|
|
!=================================================================
|
|
! Add an ship emissions options (cklee, 6/30/09)
|
|
! Replace with ICOADS ship emissions
|
|
! User can still use regional EMEP, and ARCTAS-SO2 if he wants (phs)
|
|
IF ( LICOADSSHIP ) THEN
|
|
LEDGARSHIP = .FALSE. ! ICOADS precedes EDGAR
|
|
LSHIPSO2 = .FALSE. ! SO2-ICOADS precedes SO2-Corbett
|
|
ENDIF
|
|
|
|
|
|
!=================================================================
|
|
! Check EPA options
|
|
!=================================================================
|
|
|
|
! VISTAS and ICARTT assumes that EPA/NEI is ON
|
|
IF ( ( ( LVISTAS ) .OR. ( LICARTT )) .AND. .NOT.( LNEI99 ) ) THEN
|
|
LNEI99 = .TRUE.
|
|
WRITE( 6, '(/,a,/)' ) ' EPA/NEI99 has been automatically ' //
|
|
$ 'switched ON to use V.I.S.T.A.S. or/and ICARTT-based' //
|
|
$ ' modifications'
|
|
ENDIF
|
|
|
|
|
|
! ICARTT correction are NOT available at high resolution
|
|
|
|
#if !defined(GRID2x25) && !defined(GRID4x5)
|
|
|
|
IF ( LICARTT ) THEN
|
|
LICARTT = .FALSE.
|
|
WRITE( 6, '(/,a,/)' ) ' ICARTT-based corrections to ' //
|
|
$ 'EPA-NEI99 are not available at high resolution.'
|
|
ENDIF
|
|
|
|
#endif
|
|
|
|
! NEI 2005 precedes NEI 1999
|
|
IF ( LNEI05 .AND. LNEI99 ) THEN
|
|
LNEI99 = .FALSE.
|
|
LVISTAS = .FALSE.
|
|
LICARTT = .FALSE.
|
|
WRITE( 6, '(/,a,/)' ) ' EPA/NEI99 (incl. VISTAS and ICARTT' //
|
|
$ 'options) has been automatically ' //
|
|
$ 'switched OFF to use NEI 2005.'
|
|
ENDIF
|
|
|
|
! NEI 2008 precedes NEI 1999
|
|
IF ( LNEI08 .AND. LNEI99 ) THEN
|
|
LNEI99 = .FALSE.
|
|
LVISTAS = .FALSE.
|
|
LICARTT = .FALSE.
|
|
WRITE( 6, '(/,a,/)' ) ' EPA/NEI99 (incl. VISTAS and ICARTT' //
|
|
$ 'options) has been automatically ' //
|
|
$ 'switched OFF to use NEI 2008.'
|
|
ENDIF
|
|
|
|
! NEI 2008 precedes NEI 2005
|
|
IF ( LNEI08 .AND. LNEI05 ) THEN
|
|
LNEI05 = .FALSE.
|
|
LVISTAS = .FALSE.
|
|
LICARTT = .FALSE.
|
|
WRITE( 6, '(/,a,/)' ) ' EPA/NEI05 (incl. VISTAS and ICARTT' //
|
|
$ 'options) has been automatically ' //
|
|
$ 'switched OFF to use NEI 2008.'
|
|
ENDIF
|
|
|
|
!=================================================================
|
|
! Error check GFED switches (mpayer, 11/7/11)
|
|
!=================================================================
|
|
IF ( ( LGFED2BB .or. L8DAYBB .or. LSYNOPBB .or. L3HRBB ) .AND.
|
|
& ( LGFED3BB .or. LDAYBB3 .or. L3HRBB3 ) ) THEN
|
|
|
|
MSG = 'GFED2 and GFED3 emissions cannot both be turned on.'
|
|
CALL ERROR_STOP( MSG, LOC )
|
|
ENDIF
|
|
|
|
IF ( LDAYBB3 ) THEN
|
|
IF ( .not. LGFED3BB) THEN
|
|
MSG = 'To use daily GFED3, also select monthly GFED3.'
|
|
CALL ERROR_STOP( MSG, LOC )
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( L3HRBB3 ) THEN
|
|
IF ( .not. LGFED3BB) THEN
|
|
MSG = 'To use 3-hourly GFED3, also select monthly GFED3.'
|
|
CALL ERROR_STOP( MSG, LOC )
|
|
ENDIF
|
|
IF ( .not. LDAYBB3) THEN
|
|
MSG = 'To use 3-hourly GFED3, also select daily GFED3.'
|
|
CALL ERROR_STOP( MSG, LOC )
|
|
ENDIF
|
|
ENDIF
|
|
|
|
!=================================================================
|
|
! Prioritize GFED2
|
|
!=================================================================
|
|
IF ( L3HRBB ) THEN
|
|
LGFED2BB = .FALSE.
|
|
L8DAYBB = .FALSE.
|
|
LSYNOPBB = .FALSE.
|
|
ELSE IF ( LSYNOPBB ) THEN
|
|
LGFED2BB = .FALSE.
|
|
L8DAYBB = .FALSE.
|
|
ELSE IF ( L8DAYBB ) THEN
|
|
LGFED2BB = .FALSE.
|
|
ENDIF
|
|
|
|
!=================================================================
|
|
! Error check lightning switches
|
|
!=================================================================
|
|
IF ( LLIGHTNOX ) THEN
|
|
|
|
! Make sure people don't set both LOTDREG=T and LOTDLOC=T
|
|
IF ( LOTDREG .and. LOTDLOC ) THEN
|
|
MSG = 'LOTDREG, LOTDLOC cannot both be turned on!'
|
|
CALL ERROR_STOP( MSG, LOC )
|
|
ENDIF
|
|
|
|
IF ( LOTDREG ) THEN
|
|
MSG = 'Regional redistribution of lightning not yet ' //
|
|
& 'available for OTD-LIS. Use local redist or none.'
|
|
CALL ERROR_STOP( MSG, LOC )
|
|
ENDIF
|
|
|
|
#if defined( GEOS_5 )
|
|
|
|
!--------------------------------
|
|
! GEOS-5 warnings & error traps
|
|
!--------------------------------
|
|
|
|
! Display warning
|
|
IF ( LOTDLOC .or. LOTDREG .or. LOTDSCALE ) THEN
|
|
WRITE( 6, 150 )
|
|
150 FORMAT(
|
|
& '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%',/
|
|
& '% Warning: GEOS-5 redistribution calculated from %',/
|
|
& '% one year (2005) of model simulation versus %',/
|
|
& '% the 11-year satellite climatology (1995-2005) %',/
|
|
& '% because of GEOS-5 availability. %',/
|
|
& '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%' )
|
|
ENDIF
|
|
|
|
! Error trap if wrong options selected
|
|
IF ( LMFLUX .or. LPRECON ) THEN
|
|
MSG = 'MFLUX or PRECON not available for GEOS-5 yet. ' //
|
|
& 'Select CTH instead.'
|
|
CALL ERROR_STOP( MSG, LOC )
|
|
ENDIF
|
|
|
|
#elif defined( GEOS_3 )
|
|
|
|
!--------------------------------
|
|
! GEOS-3 error trap
|
|
!--------------------------------
|
|
|
|
IF ( LOTDLOC .or. LOTDREG .or. LOTDSCALE ) THEN
|
|
MSG = 'Lightning rescaling not available for GEOS-3. ' //
|
|
& 'Use one of the parameterizations without ' //
|
|
& 'redist/scale. CTH performs best on GEOS-4 and ' //
|
|
& 'GEOS-5, though MFLUX and PRECON were developed ' //
|
|
& ' w/ GEOS-STRAT met fields.'
|
|
CALL ERROR_STOP( MSG, LOC )
|
|
ENDIF
|
|
|
|
#elif defined( GCAP )
|
|
|
|
!--------------------------------
|
|
! GCAP error message
|
|
!--------------------------------
|
|
|
|
IF ( LOTDLOC .or. LOTDREG .or. LOTDSCALE ) THEN
|
|
MSG = 'Lightning rescaling not available nor very ' //
|
|
& 'appropriate for GCAP sim because of window ' //
|
|
& 'of OTD/LIS satellite observations. Select ' //
|
|
& 'one of the raw params without redist/rescaling.'
|
|
CALL ERROR_STOP( MSG, LOC )
|
|
ENDIF
|
|
|
|
#endif
|
|
|
|
! Make sure one of LCTH, LMFLUX, LPRECON is selected
|
|
IF ( .not. LCTH .and. .not. LMFLUX .and. .not. LPRECON ) THEN
|
|
MSG = 'One of LCTH, LMFLUX, LPRECON must be T!'
|
|
CALL ERROR_STOP( MSG, LOC )
|
|
ENDIF
|
|
ENDIF
|
|
|
|
!=================================================================
|
|
! Print to screen
|
|
!=================================================================
|
|
WRITE( 6, '(/,a)' ) 'EMISSIONS MENU'
|
|
WRITE( 6, '( a)' ) '--------------'
|
|
WRITE( 6, 100 ) 'Turn on emissions? : ', LEMIS
|
|
WRITE( 6, 110 ) 'Emissions timestep [min] : ', TS_EMIS
|
|
WRITE( 6, 100 ) 'Turn on ANTHRO emissions : ', LANTHRO
|
|
WRITE( 6, 110 ) ' ANTHRO scale factor year : ', FSCALYR
|
|
WRITE( 6, 100 ) ' Use EDGAR anthro emissions: ', LEDGAR
|
|
WRITE( 6, 100 ) ' Use EMEP anthro emissions : ', LEMEP
|
|
WRITE( 6, 100 ) ' Use BRAVO anthro emissions: ', LBRAVO
|
|
WRITE( 6, 100 ) ' Use CAC anthro emissions : ', LCAC
|
|
WRITE( 6, 100 ) ' Use STREETS anthro emiss. : ', LSTREETS
|
|
WRITE( 6, 100 ) ' Use EPA/NEI 2005 : ', LNEI05
|
|
WRITE( 6, 100 ) ' Use EPA/NEI 2008 : ', LNEI08
|
|
WRITE( 6, 100 ) ' Use RETRO emissions : ', LRETRO
|
|
WRITE( 6, 100 ) ' Use RCP emissions : ', LRCP
|
|
WRITE( 6, 90 ) ' RCP scenario? : ', RCPNAME
|
|
WRITE( 6, 110 ) ' RCP year? : ', RCPYEAR
|
|
WRITE( 6, 100 ) 'Use EPA/NEI99 (ANTH + BF) : ', LNEI99
|
|
WRITE( 6, 100 ) ' --> with NOx VISTAS? : ', LVISTAS
|
|
WRITE( 6, 100 ) ' --> with ICARTT modif?: ', LICARTT
|
|
WRITE( 6, 100 ) 'Turn on BIOFUEL emissions? : ', LFOSSIL
|
|
WRITE( 6, 100 ) 'Turn on BIOGENIC emissions? : ', LBIOGENIC
|
|
WRITE( 6, 100 ) 'Use MEGAN biogenic emissions: ', LMEGAN
|
|
WRITE( 6, 100 ) 'Use MEGAN bio emissions MONO: ', LMEGANMONO
|
|
WRITE( 6, 100 ) 'Turn on BIOMASS EMISSIONS : ', LBIOMASS
|
|
WRITE( 6, 100 ) 'Use seasonal BIOMASS emiss? : ', LBBSEA
|
|
WRITE( 6, 100 ) 'Scale BIOMASS to TOMS-AI? : ', LTOMSAI
|
|
WRITE( 6, 100 ) 'Use GFED2 BIOMASS emissions?: ',
|
|
$ LGFED2BB .or. L8DAYBB .or. LSYNOPBB .or. L3HRBB
|
|
WRITE( 6, 100 ) ' monthly GFED emissions? : ', LGFED2BB
|
|
WRITE( 6, 100 ) ' 8-day GFED emission? : ', L8DAYBB
|
|
WRITE( 6, 100 ) ' 3hr GFED emission? : ', L3HRBB
|
|
WRITE( 6, 100 ) ' synoptic GFED ? : ', LSYNOPBB
|
|
WRITE( 6, 100 ) 'Use GFED3 BIOMASS emissions?: ',
|
|
$ LGFED3BB .or. LDAYBB3 .or. L3HRBB3
|
|
WRITE( 6, 100 ) ' monthly GFED3 emissions?: ', LGFED3BB
|
|
WRITE( 6, 100 ) ' daily GFED3 emission? : ', LDAYBB3
|
|
WRITE( 6, 100 ) ' 3hr GFED3 emission? : ', L3HRBB3
|
|
WRITE( 6, 100 ) 'Turn on AIRCRAFT NOx? : ', LAIRNOX
|
|
WRITE( 6, 100 ) 'Use AIRCRAFT NOx from RCP? : ', LRCPAIR
|
|
WRITE( 6, 100 ) 'Turn on LIGHTNING NOx? : ', LLIGHTNOX
|
|
WRITE( 6, 100 ) 'Scale to OTD-LIS avg flrte? : ', LOTDSCALE
|
|
WRITE( 6, 100 ) 'Use OTD-LIS regional redist : ', LOTDREG
|
|
WRITE( 6, 100 ) 'Use OTD-LIS local redist? : ', LOTDLOC
|
|
WRITE( 6, 100 ) 'Use CTH LIGHTNING Param? : ', LCTH
|
|
WRITE( 6, 100 ) 'Use MFLUX LIGHTNING Param? : ', LMFLUX
|
|
WRITE( 6, 100 ) 'Use PRECON LIGHTNING Param? : ', LPRECON
|
|
WRITE( 6, 100 ) 'Turn on SOIL NOx? : ', LSOILNOX
|
|
WRITE( 6, 100 ) 'Turn on EDGAR SHIP emiss.?: ', LEDGARSHIP
|
|
WRITE( 6, 100 ) 'Turn on ICOADS SHIP emiss.?: ', LICOADSSHIP
|
|
WRITE( 6, 100 ) 'Turn on RCP SHIP emiss.?: ', LRCPSHIP
|
|
WRITE( 6, 100 ) 'Turn on EMEP SHIP emiss.?: ', LEMEPSHIP
|
|
WRITE( 6, 100 ) 'Turn on Corbett SHIP SO2 ? : ', LSHIPSO2
|
|
WRITE( 6, 100 ) ' or ARCTAS SHIP SO2 ? : ', LARCSHIP
|
|
WRITE( 6, 100 ) 'Use COOKE for OC/BC N.-Amer.: ', LCOOKE
|
|
WRITE( 6, 100 ) 'Turn on AVHRR-derived LAI? : ', LAVHRRLAI
|
|
|
|
! FORMAT statements
|
|
90 FORMAT( A, A )
|
|
100 FORMAT( A, L5 )
|
|
110 FORMAT( A, I5 )
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE READ_EMISSIONS_MENU
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE READ_CO2_SIM_MENU
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine READ_CO2_SIM_MENU reads the CO2 SIM MENU section of
|
|
! the GEOS-Chem input file. (R Nassar, 2009-03-02)
|
|
!
|
|
! NOTES:
|
|
! 07 Sep 2011 - P. Kasibhatla - Modified for GFED3
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
|
|
USE ERROR_MOD, ONLY : ERROR_STOP
|
|
|
|
USE LOGICAL_MOD, ONLY : LANTHRO, LFOSSIL
|
|
USE LOGICAL_MOD, ONLY : LGENFF, LANNFF, LMONFF, LSTREETS
|
|
USE LOGICAL_MOD, ONLY : LSEASBB, LGFED2BB, L8DAYBB, LBIOFUEL
|
|
USE LOGICAL_MOD, ONLY : LGFED3BB, LDAYBB3
|
|
USE LOGICAL_MOD, ONLY : LBIODAILY, LBIODIURNAL
|
|
USE LOGICAL_MOD, ONLY : LBIONETORIG, LBIONETCLIM
|
|
USE LOGICAL_MOD, ONLY : LOCN1997, LOCN2009ANN, LOCN2009MON
|
|
USE LOGICAL_MOD, ONLY : LFFBKGRD
|
|
USE LOGICAL_MOD, ONLY : LSHIPEDG, LSHIPICO, LPLANE
|
|
USE LOGICAL_MOD, ONLY : LBIOSPHTAG, LFOSSILTAG
|
|
USE LOGICAL_MOD, ONLY : LSHIPTAG, LPLANETAG
|
|
USE LOGICAL_MOD, ONLY : LSHIPSCALE, LPLANESCALE
|
|
USE LOGICAL_MOD, ONLY : LCHEMCO2
|
|
|
|
USE TRACER_MOD, ONLY : ITS_A_CO2_SIM
|
|
|
|
# include "CMN_SIZE" ! Size parameters
|
|
# include "CMN_O3" ! FSCALYR
|
|
|
|
! Local variables
|
|
INTEGER :: N
|
|
CHARACTER(LEN=255) :: SUBSTRS(MAXDIM), MSG, LOC
|
|
|
|
!=================================================================
|
|
! READ_CO2_SIM_MENU begins here!
|
|
!=================================================================
|
|
|
|
! Location for error messages
|
|
LOC = 'READ_CO2_SIM_MENU ("input_mod.f")'
|
|
|
|
! Error check
|
|
IF ( CT1 /= 2 ) THEN
|
|
MSG = 'SIMULATION MENU & TRACER MENU must be read in first!'
|
|
CALL ERROR_STOP( MSG, LOC )
|
|
ENDIF
|
|
|
|
!---------------------------------------------------------------
|
|
! Fossil Fuel Emissions
|
|
!---------------------------------------------------------------
|
|
! Separator line
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_CO2_sim_menu:1' )
|
|
|
|
! Use Generic Fossil Fuel emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_CO2_sim_menu:2' )
|
|
READ( SUBSTRS(1:N), * ) LGENFF
|
|
|
|
! Use annual Fossil Fuel emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_CO2_sim_menu:3' )
|
|
READ( SUBSTRS(1:N), * ) LANNFF
|
|
|
|
! Use monthly Fossil Fuel emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_CO2_sim_menu:4' )
|
|
READ( SUBSTRS(1:N), * ) LMONFF
|
|
|
|
!---------------------------------------------------------------
|
|
! Chemical source of CO2 from oxidation of fossil fuel CO, CH4 etc.
|
|
!---------------------------------------------------------------
|
|
! Chemical source of CO2 from oxidation of CO, CH4 and organics?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_CO2_sim_menu:5' )
|
|
READ( SUBSTRS(1:N), * ) LCHEMCO2
|
|
|
|
!---------------------------------------------------------------
|
|
! Biomass and Biofuel Emissions
|
|
!---------------------------------------------------------------
|
|
! Separator line
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_CO2_sim_menu:6' )
|
|
|
|
! Use seasonal only biomass emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_CO2_sim_menu:7' )
|
|
READ( SUBSTRS(1:N), * ) LSEASBB
|
|
|
|
! Use GFED2 monthly biomass emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_CO2_sim_menu:8' )
|
|
READ( SUBSTRS(1:N), * ) LGFED2BB
|
|
|
|
! Use GFED2 8-day biomass emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_CO2_sim_menu:9' )
|
|
READ( SUBSTRS(1:N), * ) L8DAYBB
|
|
|
|
! Use GFED3 monthly biomass emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_CO2_sim_menu:10' )
|
|
READ( SUBSTRS(1:N), * ) LGFED3BB
|
|
|
|
! Use GFED3 daily biomass emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_CO2_sim_menu:11' )
|
|
READ( SUBSTRS(1:N), * ) LDAYBB3
|
|
|
|
! Include biofuel emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_CO2_sim_menu:12' )
|
|
READ( SUBSTRS(1:N), * ) LBIOFUEL
|
|
|
|
!---------------------------------------------------------------
|
|
! Terrestrial Exchange
|
|
!---------------------------------------------------------------
|
|
! Separator line
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_CO2_sim_menu:13' )
|
|
|
|
! Turn on CASA biosphere daily average?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_CO2_sim_menu:14' )
|
|
READ( SUBSTRS(1:N), * ) LBIODAILY
|
|
|
|
! Turn on CASA biosphere with diurnal cycle?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_CO2_sim_menu:15' )
|
|
READ( SUBSTRS(1:N), * ) LBIODIURNAL
|
|
|
|
! Use original Net Terrestrial Exchange?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_CO2_sim_menu:16' )
|
|
READ( SUBSTRS(1:N), * ) LBIONETORIG
|
|
|
|
! Use Net Terrestrial Exchange Climatology?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_CO2_sim_menu:17' )
|
|
READ( SUBSTRS(1:N), * ) LBIONETCLIM
|
|
|
|
!---------------------------------------------------------------
|
|
! Ocean Exchange
|
|
!---------------------------------------------------------------
|
|
! Separator line
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_CO2_sim_menu:18' )
|
|
|
|
! Use Ocean Exchange from Takahashi 1997?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_CO2_sim_menu:19' )
|
|
READ( SUBSTRS(1:N), * ) LOCN1997
|
|
|
|
! Use annual Ocean Exchange from Takahashi 2009?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_CO2_sim_menu:20' )
|
|
READ( SUBSTRS(1:N), * ) LOCN2009ANN
|
|
|
|
! Use monthly Ocean Exchange from Takahashi 2009?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_CO2_sim_menu:21' )
|
|
READ( SUBSTRS(1:N), * ) LOCN2009MON
|
|
|
|
!---------------------------------------------------------------
|
|
! Ship and Aircraft CO2 Emissions
|
|
!---------------------------------------------------------------
|
|
! Separator line
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_CO2_sim_menu:22' )
|
|
|
|
! Turn on EDGAR ship emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_CO2_sim_menu:23' )
|
|
READ( SUBSTRS(1:N), * ) LSHIPEDG
|
|
|
|
! Turn on ICOADS ship emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_CO2_sim_menu:24' )
|
|
READ( SUBSTRS(1:N), * ) LSHIPICO
|
|
|
|
! Turn on Aircraft emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_CO2_sim_menu:25' )
|
|
READ( SUBSTRS(1:N), * ) LPLANE
|
|
|
|
!---------------------------------------------------------------
|
|
! Tagged CO2
|
|
!---------------------------------------------------------------
|
|
! Separator line
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_CO2_sim_menu:26' )
|
|
|
|
!Background CO2 (no emissions or exchange) for Tagged-CO2 runs
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_CO2_sim_menu:27' )
|
|
READ( SUBSTRS(1:N), * ) LFFBKGRD
|
|
|
|
! Turn on biosphere and ocean exchange region tagged tracers?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_CO2_sim_menu:28' )
|
|
READ( SUBSTRS(1:N), * ) LBIOSPHTAG
|
|
|
|
! Turn on fossil fuel emission region tagged tracers?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_CO2_sim_menu:29' )
|
|
READ( SUBSTRS(1:N), * ) LFOSSILTAG
|
|
|
|
! Turn on global ship emissions tagged tracer?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_CO2_sim_menu:30' )
|
|
READ( SUBSTRS(1:N), * ) LSHIPTAG
|
|
|
|
! Turn on global aircraft emissions tagged tracer?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_CO2_sim_menu:31' )
|
|
READ( SUBSTRS(1:N), * ) LPLANETAG
|
|
|
|
!=================================================================
|
|
! Resolve conflicting selections by assuming the 'best' choice
|
|
!=================================================================
|
|
|
|
!--- Fossil Fuel ----------------
|
|
IF (LMONFF) THEN
|
|
LGENFF = .FALSE.
|
|
LANNFF = .FALSE.
|
|
ENDIF
|
|
IF (LANNFF) THEN
|
|
LGENFF = .FALSE.
|
|
ENDIF
|
|
|
|
!--- Biomass Burning ------------
|
|
IF (L8DAYBB) THEN
|
|
LGFED2BB = .FALSE.
|
|
LSEASBB = .FALSE.
|
|
ENDIF
|
|
IF (LGFED2BB) THEN
|
|
LSEASBB = .FALSE.
|
|
ENDIF
|
|
|
|
!--- CASA Biosphere -------------
|
|
IF (LBIODIURNAL) THEN
|
|
LBIODAILY = .FALSE.
|
|
ENDIF
|
|
|
|
!--- Net Terrestrial Exchange ---
|
|
IF (LBIONETCLIM) THEN
|
|
LBIONETORIG = .FALSE.
|
|
ENDIF
|
|
|
|
!--- Ocean Exchange -------------
|
|
IF (LOCN2009MON) THEN
|
|
LOCN2009ANN = .FALSE.
|
|
LOCN1997 = .FALSE.
|
|
ENDIF
|
|
IF (LOCN2009ANN) THEN
|
|
LOCN1997 = .FALSE.
|
|
ENDIF
|
|
|
|
!--- Ship Emissions -------------
|
|
IF (LSHIPICO) THEN
|
|
LSHIPEDG = .FALSE.
|
|
ENDIF
|
|
|
|
!=================================================================
|
|
! Print to screen
|
|
!=================================================================
|
|
IF (ITS_A_CO2_SIM() ) THEN
|
|
WRITE(6,'(/,a)') 'CO2 SIMULATION MENU ' //
|
|
& '(overwrites any other settings related to CO2)'
|
|
WRITE(6,'( a)') '-------------------------------------'
|
|
WRITE(6, 90 ) 'Fossil Fuel emissions'
|
|
WRITE(6,100 ) ' Generic FF emissions :', LGENFF
|
|
WRITE(6,100 ) ' Annual FF emissions :', LANNFF
|
|
WRITE(6,100 ) ' Monthly FF emissions :', LMONFF
|
|
WRITE(6,100 ) 'CO2 from oxidation (CO,CH4,..):', LCHEMCO2
|
|
WRITE(6, 90 ) 'Biomass Burning emissions'
|
|
WRITE(6,100 ) ' Seasonal only biomass :', LSEASBB
|
|
WRITE(6,100 ) ' GFED2 monthly biomass :', LGFED2BB
|
|
WRITE(6,100 ) ' GFED2 8-day biomass :', L8DAYBB
|
|
WRITE(6,100 ) ' GFED3 monthly biomass :', LGFED3BB
|
|
WRITE(6,100 ) ' GFED3 daily biomass :', LDAYBB3
|
|
WRITE(6,100 ) 'Biofuel emissions :', LBIOFUEL
|
|
WRITE(6, 90 ) 'Terrestrial Exchange'
|
|
WRITE(6,100 ) ' CASA Biosphere daily average:', LBIODAILY
|
|
WRITE(6,100 ) ' CASA Biosphere diurnal cycle:', LBIODIURNAL
|
|
WRITE(6,100 ) ' Net Terr Exch - Original :', LBIONETORIG
|
|
WRITE(6,100 ) ' Net Terr Exch - Climatology :', LBIONETCLIM
|
|
WRITE(6,90 ) 'Ocean Exchange'
|
|
WRITE(6,100 ) ' Takahashi 1997 :', LOCN1997
|
|
WRITE(6,100 ) ' Takahashi 2009 annual :', LOCN2009ANN
|
|
WRITE(6,100 ) ' Takahashi 2009 monthly :', LOCN2009MON
|
|
WRITE(6,90 ) 'Ship and Plane Emissions'
|
|
WRITE(6,100 ) ' EDGAR ship emissions :', LSHIPEDG
|
|
WRITE(6,100 ) ' ICOADS ship emissions :', LSHIPICO
|
|
WRITE(6,100 ) ' Aviation emissions :', LPLANE
|
|
WRITE(6, 90 ) 'Tagged CO2 settings'
|
|
WRITE(6,100 ) ' Save Fossil CO2 in Bckgrnd :', LFFBKGRD
|
|
WRITE(6,100 ) ' Tag Biosphere/Ocean CO2 :', LBIOSPHTAG
|
|
WRITE(6,100 ) ' Tag Fossil Fuel CO2 :', LFOSSILTAG
|
|
WRITE(6,100 ) ' Tag Global Ship CO2 :', LSHIPTAG
|
|
WRITE(6,100 ) ' Tag Global Aviation CO2 :', LPLANETAG
|
|
WRITE(6,'( a)') '-------------------------------------'
|
|
ENDIF
|
|
|
|
! FORMAT statements
|
|
90 FORMAT( A )
|
|
100 FORMAT( A, L5 )
|
|
110 FORMAT( A, L5, A )
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE READ_CO2_SIM_MENU
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE READ_HTAP_SIM_MENU
|
|
!
|
|
!******************************************************************************
|
|
!
|
|
! Subroutine READ_HTAP_SIM_MENU reads the HTAP SIM MENU section of
|
|
! the GEOS-Chem input file. (Y Davila, 2013-11-8)
|
|
!
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
|
|
USE ERROR_MOD, ONLY : ERROR_STOP
|
|
USE LOGICAL_MOD, ONLY : LHTAP, LRCPTR_MASK
|
|
USE HTAP_MOD, ONLY : SC_BC, SC_CO, SC_OC, SC_NH3
|
|
USE HTAP_MOD, ONLY : SC_NOX, SC_SO2, SC_CH2O
|
|
USE HTAP_MOD, ONLY : SC_AIR, SC_SHIPS, SC_ENERGY
|
|
USE HTAP_MOD, ONLY : SC_INDUSTRY, SC_TRANSPORT
|
|
USE HTAP_MOD, ONLY : SC_RESIDENTIAL, SC_AGRICULTURE
|
|
USE HTAP_MOD, ONLY : LOCN, LNAM, LEUR, LSAS, LEAS
|
|
USE HTAP_MOD, ONLY : LSEA, LPAN, LNAF, LSAF, LMDE
|
|
USE HTAP_MOD, ONLY : LSAM, LRBU, LCAS, LNPO, LSPO
|
|
USE HTAP_MOD, ONLY : LMCA
|
|
USE HTAP_MOD, ONLY : LOCN20, LOCN21, LOCN22, LOCN23, LOCN24
|
|
USE HTAP_MOD, ONLY : LOCN25, LOCN26, LOCN27, LOCN28
|
|
USE HTAP_MOD, ONLY : LNAM31, LNAM32, LNAM33, LNAM34, LNAM35
|
|
USE HTAP_MOD, ONLY : LNAM36, LEUR41, LEUR42, LEUR43, LEUR44
|
|
USE HTAP_MOD, ONLY : LSAS51, LSAS52, LSAS53, LEAS61, LEAS62
|
|
USE HTAP_MOD, ONLY : LEAS63, LEAS64, LEAS65, LEAS66, LSEA71
|
|
USE HTAP_MOD, ONLY : LSEA72, LPAN81, LPAN82, LPAN83, LNAF91
|
|
USE HTAP_MOD, ONLY : LNAF92, LNAF93, LMDE112
|
|
USE HTAP_MOD, ONLY : LSAF101, LSAF102, LSAF103, LMDE111
|
|
USE HTAP_MOD, ONLY : LMDE113, LMCA121, LMCA122, LMCA123
|
|
USE HTAP_MOD, ONLY : LSAM131, LSAM132, LSAM133, LSAM134
|
|
USE HTAP_MOD, ONLY : LRBU142, LRBU143, LCAS151, LNPO150
|
|
USE HTAP_MOD, ONLY : LSPO161, LSPO160, LRBU141, LMCA124
|
|
|
|
|
|
# include "CMN_SIZE" ! Size parameters
|
|
|
|
! Local variables
|
|
INTEGER :: N
|
|
CHARACTER(LEN=255) :: SUBSTRS(MAXDIM), MSG, LOC
|
|
|
|
!=================================================================
|
|
! READ_HTAP_SIM_MENU begins here!
|
|
!=================================================================
|
|
|
|
! Location for error messages
|
|
LOC = 'READ_HTAP_SIM_MENU ("input_mod.f")'
|
|
|
|
! Error check
|
|
IF ( CT1 /= 2 ) THEN
|
|
MSG = 'SIMULATION MENU & TRACER MENU must be read in first!'
|
|
CALL ERROR_STOP( MSG, LOC )
|
|
ENDIF
|
|
|
|
!---------------------------------------------------------------
|
|
! Use HTAP Emissions ?
|
|
!---------------------------------------------------------------
|
|
! READ LHTAP
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:1' )
|
|
READ( SUBSTRS(1:N), * ) LHTAP
|
|
|
|
!---------------------------------------------------------------
|
|
! HTAP Sector Scaling Factors
|
|
!---------------------------------------------------------------
|
|
! Separator line
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:2' )
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:3' )
|
|
READ( SUBSTRS(1:N), * ) SC_AIR
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:4' )
|
|
READ( SUBSTRS(1:N), * ) SC_SHIPS
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:5' )
|
|
READ( SUBSTRS(1:N), * ) SC_ENERGY
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:6' )
|
|
READ( SUBSTRS(1:N), * ) SC_INDUSTRY
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:7' )
|
|
READ( SUBSTRS(1:N), * ) SC_TRANSPORT
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:8' )
|
|
READ( SUBSTRS(1:N), * ) SC_RESIDENTIAL
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:9' )
|
|
READ( SUBSTRS(1:N), * ) SC_AGRICULTURE
|
|
|
|
!---------------------------------------------------------------
|
|
! HTAP Species Scaling Factor
|
|
!---------------------------------------------------------------
|
|
! Separator line
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:10' )
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:11' )
|
|
READ( SUBSTRS(1:N), * ) SC_BC
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:12' )
|
|
READ( SUBSTRS(1:N), * ) SC_CO
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:13' )
|
|
READ( SUBSTRS(1:N), * ) SC_OC
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:14' )
|
|
READ( SUBSTRS(1:N), * ) SC_NH3
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:15' )
|
|
READ( SUBSTRS(1:N), * ) SC_NOX
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:16' )
|
|
READ( SUBSTRS(1:N), * ) SC_SO2
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:17' )
|
|
READ( SUBSTRS(1:N), * ) SC_CH2O
|
|
|
|
!---------------------------------------------------------------
|
|
! Source Mask
|
|
!---------------------------------------------------------------
|
|
! Separator line
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:18' )
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:19' )
|
|
READ( SUBSTRS(1:N), * ) LOCN
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:20' )
|
|
READ( SUBSTRS(1:N), * ) LNAM
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:21' )
|
|
READ( SUBSTRS(1:N), * ) LEUR
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:22' )
|
|
READ( SUBSTRS(1:N), * ) LSAS
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:23' )
|
|
READ( SUBSTRS(1:N), * ) LEAS
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:24' )
|
|
READ( SUBSTRS(1:N), * ) LSEA
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:25' )
|
|
READ( SUBSTRS(1:N), * ) LPAN
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:26' )
|
|
READ( SUBSTRS(1:N), * ) LNAF
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:27' )
|
|
READ( SUBSTRS(1:N), * ) LSAF
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:28' )
|
|
READ( SUBSTRS(1:N), * ) LMDE
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:29' )
|
|
READ( SUBSTRS(1:N), * ) LMCA
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:30' )
|
|
READ( SUBSTRS(1:N), * ) LSAM
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:31' )
|
|
READ( SUBSTRS(1:N), * ) LRBU
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:32' )
|
|
READ( SUBSTRS(1:N), * ) LCAS
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:33' )
|
|
READ( SUBSTRS(1:N), * ) LNPO
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:34' )
|
|
READ( SUBSTRS(1:N), * ) LSPO
|
|
|
|
!---------------------------------------------------------------
|
|
! Receptor Mask
|
|
!---------------------------------------------------------------
|
|
! Separator line
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:35' )
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:36' )
|
|
READ( SUBSTRS(1:N), * ) LRCPTR_MASK
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:37' )
|
|
READ( SUBSTRS(1:N), * ) LOCN20
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:38' )
|
|
READ( SUBSTRS(1:N), * ) LOCN21
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:39' )
|
|
READ( SUBSTRS(1:N), * ) LOCN22
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:40' )
|
|
READ( SUBSTRS(1:N), * ) LOCN23
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:41' )
|
|
READ( SUBSTRS(1:N), * ) LOCN24
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:42' )
|
|
READ( SUBSTRS(1:N), * ) LOCN25
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:43' )
|
|
READ( SUBSTRS(1:N), * ) LOCN26
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:44' )
|
|
READ( SUBSTRS(1:N), * ) LOCN27
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:45' )
|
|
READ( SUBSTRS(1:N), * ) LOCN28
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:46' )
|
|
READ( SUBSTRS(1:N), * ) LNAM31
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:47' )
|
|
READ( SUBSTRS(1:N), * ) LNAM32
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:48' )
|
|
READ( SUBSTRS(1:N), * ) LNAM33
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:49' )
|
|
READ( SUBSTRS(1:N), * ) LNAM34
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:50' )
|
|
READ( SUBSTRS(1:N), * ) LNAM35
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:51' )
|
|
READ( SUBSTRS(1:N), * ) LNAM36
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:52' )
|
|
READ( SUBSTRS(1:N), * ) LEUR41
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:53' )
|
|
READ( SUBSTRS(1:N), * ) LEUR42
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:54' )
|
|
READ( SUBSTRS(1:N), * ) LEUR43
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:55' )
|
|
READ( SUBSTRS(1:N), * ) LEUR44
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:56' )
|
|
READ( SUBSTRS(1:N), * ) LSAS51
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:57' )
|
|
READ( SUBSTRS(1:N), * ) LSAS52
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:58' )
|
|
READ( SUBSTRS(1:N), * ) LSAS53
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:59' )
|
|
READ( SUBSTRS(1:N), * ) LEAS61
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:60' )
|
|
READ( SUBSTRS(1:N), * ) LEAS62
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:61' )
|
|
READ( SUBSTRS(1:N), * ) LEAS63
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:62' )
|
|
READ( SUBSTRS(1:N), * ) LEAS64
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:63' )
|
|
READ( SUBSTRS(1:N), * ) LEAS65
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:64' )
|
|
READ( SUBSTRS(1:N), * ) LEAS66
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:65' )
|
|
READ( SUBSTRS(1:N), * ) LSEA71
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:66' )
|
|
READ( SUBSTRS(1:N), * ) LSEA72
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:67' )
|
|
READ( SUBSTRS(1:N), * ) LPAN81
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:68' )
|
|
READ( SUBSTRS(1:N), * ) LPAN82
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:69' )
|
|
READ( SUBSTRS(1:N), * ) LPAN83
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:70' )
|
|
READ( SUBSTRS(1:N), * ) LNAF91
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:71' )
|
|
READ( SUBSTRS(1:N), * ) LNAF92
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:72' )
|
|
READ( SUBSTRS(1:N), * ) LNAF93
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:73' )
|
|
READ( SUBSTRS(1:N), * ) LSAF101
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:74' )
|
|
READ( SUBSTRS(1:N), * ) LSAF102
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:75' )
|
|
READ( SUBSTRS(1:N), * ) LSAF103
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:76' )
|
|
READ( SUBSTRS(1:N), * ) LMDE111
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:77' )
|
|
READ( SUBSTRS(1:N), * ) LMDE112
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:78' )
|
|
READ( SUBSTRS(1:N), * ) LMDE113
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:79' )
|
|
READ( SUBSTRS(1:N), * ) LMCA121
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:80' )
|
|
READ( SUBSTRS(1:N), * ) LMCA122
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:81' )
|
|
READ( SUBSTRS(1:N), * ) LMCA123
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:82' )
|
|
READ( SUBSTRS(1:N), * ) LMCA124
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:83' )
|
|
READ( SUBSTRS(1:N), * ) LSAM131
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:84' )
|
|
READ( SUBSTRS(1:N), * ) LSAM132
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:85' )
|
|
READ( SUBSTRS(1:N), * ) LSAM133
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:86' )
|
|
READ( SUBSTRS(1:N), * ) LSAM134
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:87' )
|
|
READ( SUBSTRS(1:N), * ) LRBU141
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:88' )
|
|
READ( SUBSTRS(1:N), * ) LRBU142
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:89' )
|
|
READ( SUBSTRS(1:N), * ) LRBU143
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:90' )
|
|
READ( SUBSTRS(1:N), * ) LCAS151
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:91' )
|
|
READ( SUBSTRS(1:N), * ) LNPO150
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:92' )
|
|
READ( SUBSTRS(1:N), * ) LSPO160
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_HTAP_sim_menu:93' )
|
|
READ( SUBSTRS(1:N), * ) LSPO161
|
|
|
|
!=================================================================
|
|
! Print to screen
|
|
!=================================================================
|
|
|
|
WRITE(6,'(/,a)') 'HTAP SIMULATION MENU '
|
|
WRITE(6,'( a)') '-------------------------------------'
|
|
WRITE(6,100 ) ' Use HTAP v2 Emissions :', LHTAP
|
|
WRITE(6, 90 ) 'HTAP Sector Scaling Factors'
|
|
WRITE(6,110 ) ' Scaling factor for AIR :', SC_AIR
|
|
WRITE(6,110 ) ' Scaling factor for SHIPS :', SC_SHIPS
|
|
WRITE(6,110 ) ' Scaling factor for ENERGY :', SC_ENERGY
|
|
WRITE(6,110) ' Scaling factor for INDUSTRY :', SC_INDUSTRY
|
|
WRITE(6,110) ' Scaling factor for TRANSPORT :', SC_TRANSPORT
|
|
WRITE(6,110) ' Scaling factor for RESIDENTIAL :', SC_RESIDENTIAL
|
|
WRITE(6,110) ' Scaling factor for AGRICULTURE :', SC_AGRICULTURE
|
|
WRITE(6, 90 ) 'HTAP Species Scaling Factors'
|
|
WRITE(6,110 ) ' Scaling factor for BC :', SC_BC
|
|
WRITE(6,110 ) ' Scaling factor for CO :', SC_CO
|
|
WRITE(6,110 ) ' Scaling factor for OC :', SC_OC
|
|
WRITE(6,110 ) ' Scaling factor for NH3 :', SC_NH3
|
|
WRITE(6,110 ) ' Scaling factor for NOX :', SC_NOX
|
|
WRITE(6,110 ) ' Scaling factor for SO2 :', SC_SO2
|
|
WRITE(6,110 ) ' Scaling factor for VOCs :', SC_CH2O
|
|
WRITE(6, 90 ) 'HTAP Source Mask Regions '
|
|
WRITE(6,100 ) ' OCEANS :', LOCN
|
|
WRITE(6,100 ) ' US + CANADA (UP TO 66 N) :', LNAM
|
|
WRITE(6,100 ) ' EUROPE + TURKEY (UP TO 66 N) :', LEUR
|
|
WRITE(6,100 ) ' SOUTH ASIA :', LSAS
|
|
WRITE(6,100 ) ' EAST ASIA: CHINA, KOREA, JAPAN :', LEAS
|
|
WRITE(6,100 ) ' SOUTH EAST ASIA :', LSEA
|
|
WRITE(6,100 ) ' PACIFIC, AUSTRALIA, NEW ZELAND :', LPAN
|
|
WRITE(6,100 ) ' NORTH AFRICA, SAHARA, SAHEL :', LNAF
|
|
WRITE(6,100 ) ' SUB SAHARAN/ SUB SAHEL AFRICA :', LSAF
|
|
WRITE(6,100 ) ' MIDDLE EAST :', LMDE
|
|
WRITE(6,100 ) ' MEXICO, CARIBBEAN, CNTL AMERICA:', LMCA
|
|
WRITE(6,100 ) ' SOUTH AMERICA :', LSAM
|
|
WRITE(6,100 ) ' RUSSIA, BELORUSSIA, UKRAINE :', LRBU
|
|
WRITE(6,100 ) ' CENTRAL ASIA :', LCAS
|
|
WRITE(6,100 ) ' ARTIC CIRCLE, GREENLAND + 66 N :', LNPO
|
|
WRITE(6,100 ) ' ANTARCTIC :', LSPO
|
|
WRITE(6, 90 ) 'HTAP Receptor Mask'
|
|
WRITE(6,100 ) ' Use HTAP receptor mask ? :', LRCPTR_MASK
|
|
WRITE(6,100 ) ' BALTIC SEA :', LOCN20
|
|
WRITE(6,100 ) ' NORTH ATLANTIC OCEAN :', LOCN21
|
|
WRITE(6,100 ) ' SOUTH ATLANTIC OCEAN :', LOCN22
|
|
WRITE(6,100 ) ' NORTH PACIFIC OCEAN :', LOCN23
|
|
WRITE(6,100 ) ' SOUTH PACIFIC OCEAN :', LOCN24
|
|
WRITE(6,100 ) ' INDIAN OCEAN :', LOCN25
|
|
WRITE(6,100 ) ' HUDSON BAY :', LOCN26
|
|
WRITE(6,100 ) ' MEDITERRANEAN SEA :', LOCN27
|
|
WRITE(6,100 ) ' BLACK AND CASPIAN SEA :', LOCN28
|
|
WRITE(6,100 ) ' NORTH EAST US :', LNAM31
|
|
WRITE(6,100 ) ' SOUTH EAST US :', LNAM32
|
|
WRITE(6,100 ) ' NORTH WEST US :', LNAM33
|
|
WRITE(6,100 ) ' SOUTH WEST US :', LNAM34
|
|
WRITE(6,100 ) ' EAST CANADA :', LNAM35
|
|
WRITE(6,100 ) ' W CANADA, ALASKA (UP TO 66 N) :', LNAM36
|
|
WRITE(6,100 ) ' NORTH WEST EUROPE :', LEUR41
|
|
WRITE(6,100 ) ' SOUTH WEST EUROPE :', LEUR42
|
|
WRITE(6,100 ) ' EASTERN EUROPE :', LEUR43
|
|
WRITE(6,100 ) ' GREECE, TURKEY, CYPRUS :', LEUR44
|
|
WRITE(6,100 ) ' NORTH INDIA, NEPAL, PAKISTAN + :', LSAS51
|
|
WRITE(6,100 ) ' SOUTH INDIA, SRI LANKA :', LSAS52
|
|
WRITE(6,100 ) ' INDIAN HIMALAYA :', LSAS53
|
|
WRITE(6,100 ) ' NORTH EAST CHINA :', LEAS61
|
|
WRITE(6,100 ) ' SOUTH EAST CHINA :', LEAS62
|
|
WRITE(6,100 ) ' WEST CHINA, MONGOLIA (NO HIMALA:', LEAS63
|
|
WRITE(6,100 ) ' NORTH ANS SOUTH KOREA :', LEAS64
|
|
WRITE(6,100 ) ' JAPAN :', LEAS65
|
|
WRITE(6,100 ) ' CHINA, TIBET HIMALAYA :', LEAS66
|
|
WRITE(6,100 ) ' INDONESIA, MALAYSIA, SINGAPORE :', LSEA71
|
|
WRITE(6,100 ) ' THAILAND, VIETNAM, MYANMAR :', LSEA72
|
|
WRITE(6,100 ) ' PACIFIC :', LPAN81
|
|
WRITE(6,100 ) ' AUSTRALIA :', LPAN82
|
|
WRITE(6,100 ) ' NEW ZELAND :', LPAN83
|
|
WRITE(6,100 ) ' EGYPT :', LNAF91
|
|
WRITE(6,100 ) ' REST OF NORTH AFRICA :', LNAF92
|
|
WRITE(6,100 ) ' SAHEL :', LNAF93
|
|
WRITE(6,100 ) ' CONGO,GHANA, GUINEA, NIGER + :', LSAF101
|
|
WRITE(6,100 ) ' BURUNDI, KENYA, ETHIOPIA + :', LSAF102
|
|
WRITE(6,100 ) ' ANGOLA, MALAWI, SOUTH AFRICA + :', LSAF103
|
|
WRITE(6,100 ) ' LEBANON, ISRAEL, SYRIA, JORDAN :', LMDE111
|
|
WRITE(6,100 ) ' OMAN, QUATAR, YEMEN, EMIRATES +:', LMDE112
|
|
WRITE(6,100 ) ' IRAN, IRAK :', LMDE113
|
|
WRITE(6,100 ) ' MEXICO :', LMCA121
|
|
WRITE(6,100 ) ' CENTRAL AMERICA :', LMCA122
|
|
WRITE(6,100 ) ' CARIBBEAN :', LMCA123
|
|
WRITE(6,100 ) ' COLOMBIA, VENEZUELA, GUYANAS :', LMCA124
|
|
WRITE(6,100 ) ' SOUTH BRAZIL :', LSAM131
|
|
WRITE(6,100 ) ' REST OF BRAZIL :', LSAM132
|
|
WRITE(6,100 ) ' URUGUAY, PARAGUAY, CHILE, ARGEN:', LSAM133
|
|
WRITE(6,100 ) ' PERU, ECUADOR :', LSAM134
|
|
WRITE(6,100 ) ' RUSSIA WEST :', LRBU141
|
|
WRITE(6,100 ) ' RUSSIA EAST :', LRBU142
|
|
WRITE(6,100 ) ' BELORUSSIA + UKRAINE :', LRBU143
|
|
WRITE(6,100 ) ' CENTRAL ASIA :', LCAS151
|
|
WRITE(6,100 ) ' ARTIC CIRCLE, GREENLAND :', LNPO150
|
|
WRITE(6,100 ) ' ANTARCTIC :', LSPO160
|
|
WRITE(6,100 ) ' SOUTHERN OCEAN :', LSPO161
|
|
WRITE(6,'( a)') '-------------------------------------'
|
|
|
|
! FORMAT statements
|
|
90 FORMAT( A )
|
|
100 FORMAT( A, L5 )
|
|
110 FORMAT( A, 3x, F6.2 )
|
|
120 FORMAT (A, A)
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE READ_HTAP_SIM_MENU
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE READ_FUTURE_MENU
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine READ_FUTURE_MENU reads the FUTURE MENU section of the GEOS-Chem
|
|
! input file; this defines IPCC future emissions options. (swu, bmy, 6/1/06)
|
|
!
|
|
! NOTES:
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE FUTURE_EMISSIONS_MOD, ONLY : DO_FUTURE_EMISSIONS
|
|
USE LOGICAL_MOD, ONLY : LFUTURE
|
|
|
|
# include "define.h" ! C-preprocessor switches
|
|
|
|
! Local variables
|
|
INTEGER :: N
|
|
INTEGER :: FUTURE_YEAR
|
|
CHARACTER(LEN=255) :: FUTURE_SCEN
|
|
CHARACTER(LEN=255) :: SUBSTRS(MAXDIM)
|
|
|
|
!=================================================================
|
|
! READ_FUTURE_MENU begins here!
|
|
!=================================================================
|
|
|
|
! Use IPCC future emissions?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_future_menu:1' )
|
|
READ( SUBSTRS(1:N), * ) LFUTURE
|
|
|
|
! Future emission year
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_future_menu:2' )
|
|
READ( SUBSTRS(1:N), * ) FUTURE_YEAR
|
|
|
|
! Future emission scenario
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_future_menu:3' )
|
|
READ( SUBSTRS(1:N), '(a)' ) FUTURE_SCEN
|
|
|
|
! Separator line
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_future_menu:4' )
|
|
|
|
#if !defined( GCAP )
|
|
!### TEMPORARY KLUDGE: right now, future emissions are only defined
|
|
!### for the GCAP met fields. Set LFUTURE=F for other met fields
|
|
!### for the time being. We will implement the future emissions for
|
|
!### other met fields at a later date. (swu, bmy, 6/1/06)
|
|
LFUTURE = .FALSE.
|
|
#endif
|
|
|
|
!=================================================================
|
|
! Print to screen
|
|
!=================================================================
|
|
WRITE( 6, '(/,a)' ) 'FUTURE MENU'
|
|
WRITE( 6, '( a)' ) '-----------'
|
|
WRITE( 6, 100 ) 'Use IPCC future emissions : ', LFUTURE
|
|
WRITE( 6, 110 ) 'Future emissions for year : ', FUTURE_YEAR
|
|
WRITE( 6, 120 ) 'Future emissions scenario : ',
|
|
& TRIM( FUTURE_SCEN )
|
|
|
|
! FORMAT statements
|
|
100 FORMAT( A, L5 )
|
|
110 FORMAT( A, I4 )
|
|
120 FORMAT( A, A )
|
|
|
|
!=================================================================
|
|
! Call setup routines from other F90 modules
|
|
!=================================================================
|
|
|
|
! Initialize
|
|
IF ( LFUTURE ) THEN
|
|
CALL DO_FUTURE_EMISSIONS( FUTURE_YEAR, TRIM( FUTURE_SCEN ) )
|
|
ENDIF
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE READ_FUTURE_MENU
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE READ_CHEMISTRY_MENU
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine READ_CHEMISTRY_MENU reads the CHEMISTRY MENU section of
|
|
! the GEOS-CHEM input file. (bmy, 7/20/04)
|
|
!
|
|
! NOTES:
|
|
! (1 ) Updated for LSCHEM from v9-01-02 (hml, dkh, 02/20/12, adj32_025)
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE ERROR_MOD, ONLY : ERROR_STOP
|
|
USE LOGICAL_MOD, ONLY : LCHEM, LEMBED
|
|
! >> (dkh, 02/12/09)
|
|
USE LOGICAL_MOD, ONLY : LSVCSPEC
|
|
! <<
|
|
USE LOGICAL_MOD, ONLY : LSCHEM, LLINOZ
|
|
USE TIME_MOD, ONLY : SET_CT_CHEM
|
|
|
|
# include "CMN_SIZE" ! Size parameters
|
|
# include "CMN" ! IEBD1 etc
|
|
|
|
! Local variables
|
|
INTEGER :: N
|
|
CHARACTER(LEN=255) :: SUBSTRS(MAXDIM), MSG
|
|
|
|
!=================================================================
|
|
! READ_CHEMISTRY_MENU begins here!
|
|
!=================================================================
|
|
|
|
! Error check
|
|
IF ( CT1 /= 2 ) THEN
|
|
MSG = 'SIMULATION MENU & TRACER MENU must be read in first!'
|
|
CALL ERROR_STOP( MSG, 'READ_CHEMISTRY_MENU ("input_mod.f")' )
|
|
ENDIF
|
|
|
|
! Turn on chemistry?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_chemistry_menu:1' )
|
|
READ( SUBSTRS(1:N), * ) LCHEM
|
|
|
|
! Chemistry timestep
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_chemistry_menu:2' )
|
|
READ( SUBSTRS(1:N), * ) TS_CHEM
|
|
|
|
! Use embedded chemistry?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_chemistry_menu:3' )
|
|
READ( SUBSTRS(1:N), * ) LEMBED
|
|
|
|
! Embedded chemistry limits?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 4, 'read_chemistry_menu:4' )
|
|
READ( SUBSTRS(1:N), * ) IEBD1, JEBD1, IEBD2, JEBD2
|
|
|
|
! >> (dkh, 02/12/09)
|
|
! Read and save CSPEC ?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_chemistry_menu:5' )
|
|
READ( SUBSTRS(1:N), * ) LSVCSPEC
|
|
|
|
! (hml, 06/29/11, adj32_025)
|
|
! Turn on linearized stratospheric chemistry?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_chemistry_menu:6' )
|
|
READ( SUBSTRS(1:N), * ) LSCHEM
|
|
|
|
!! LINOZ chemistry in the stratosphere
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_chemistry_menu:7' )
|
|
READ( SUBSTRS(1:N), * ) LLINOZ
|
|
|
|
! Separator line
|
|
!CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_chemistry_menu:5' )
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_chemistry_menu:8' )
|
|
! <<
|
|
|
|
!=================================================================
|
|
! Print to screen
|
|
!=================================================================
|
|
WRITE( 6, '(/,a)' ) 'CHEMISTRY MENU'
|
|
WRITE( 6, '( a)' ) '--------------'
|
|
WRITE( 6, 100 ) 'Turn on chemistry? : ', LCHEM
|
|
WRITE( 6, 110 ) 'Chemistry timestep [min] : ', TS_CHEM
|
|
WRITE( 6, 100 ) 'Turn on EMBEDDED CHEMISTRY? : ', LEMBED
|
|
WRITE( 6, 120 ) 'EMBEDDED CHEM lower L box: : ', IEBD1, JEBD1
|
|
WRITE( 6, 120 ) 'EMBEDDED CHEM upper R box : ', IEBD2, JEBD2
|
|
! >> (dkh, 02/12/09)
|
|
WRITE( 6, 100 ) 'Use CSPEC restart? : ', LSVCSPEC
|
|
! <<
|
|
! (hml, 06/29/11, adj32_025)
|
|
WRITE( 6, 100 ) 'Turn on linear. strat chem? : ', LSCHEM
|
|
WRITE( 6, 100 ) 'Use Linoz for strat ozone? : ', LLINOZ
|
|
|
|
|
|
! FORMAT statements
|
|
100 FORMAT( A, L5 )
|
|
110 FORMAT( A, I5 )
|
|
120 FORMAT( A, 2I5 )
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE READ_CHEMISTRY_MENU
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE READ_TRANSPORT_MENU
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine READ_TRANSPORT_MENU reads the TRANSPORT MENU section of
|
|
! the GEOS-CHEM input file. (bmy, 7/20/04, 11/6/08)
|
|
!
|
|
! NOTES:
|
|
! (1 ) Now define MAX_DYN for 1 x 1.25 grid (bmy, 12/1/04)
|
|
! (2 ) Update text in error message (bmy, 2/23/05)
|
|
! (3 ) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)
|
|
! (4 ) Don't stop run if TS_DYN > MAX_DYN but transport is turned off
|
|
! (cdh, bmy, 7/7/08)
|
|
! (5 ) Set MAX_DYN for the 0.5 x 0.666 nested grid (yxw, dan, bmy, 11/6/08)
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE ERROR_MOD, ONLY : ERROR_STOP
|
|
USE LOGICAL_MOD, ONLY : LTRAN, LUPBD
|
|
USE LOGICAL_MOD, ONLY : LMFCT, LFILL
|
|
USE TRACER_MOD, ONLY : ITS_A_FULLCHEM_SIM, ITS_A_TAGOX_SIM
|
|
USE TRANSPORT_MOD, ONLY : SET_TRANSPORT
|
|
USE UPBDFLX_MOD, ONLY : INIT_UPBDFLX
|
|
|
|
! Local variables
|
|
INTEGER :: N, IORD, JORD, KORD, J1, KS, MAX_DYN
|
|
CHARACTER(LEN=255) :: SUBSTRS(MAXDIM), MSG, LOCATION
|
|
|
|
!=================================================================
|
|
! READ_TRANSPORT_MENU begins here!
|
|
!=================================================================
|
|
|
|
! Location for err msg
|
|
LOCATION = 'READ_TRANSPORT_MENU ("input_mod.f")'
|
|
|
|
! Error check
|
|
IF ( CT1 /= 2 ) THEN
|
|
MSG = 'SIMULATION MENU & TRACER MENU must be read in first!'
|
|
CALL ERROR_STOP( MSG, LOCATION )
|
|
ENDIF
|
|
|
|
! Turn on transport?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_transport_menu:1' )
|
|
READ( SUBSTRS(1:N), * ) LTRAN
|
|
|
|
! Do flux-corrected transport?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_transport_menu:2' )
|
|
READ( SUBSTRS(1:N), * ) LMFCT
|
|
|
|
! Fill negative values
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_transport_menu:3' )
|
|
READ( SUBSTRS(1:N), * ) LFILL
|
|
|
|
! IORD, JORD, KORD
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 3, 'read_transport_menu:4' )
|
|
READ( SUBSTRS(1:N), * ) IORD, JORD, KORD
|
|
|
|
! Transport timestep
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_transport_menu:5' )
|
|
READ( SUBSTRS(1:N), * ) TS_DYN
|
|
|
|
! Now use strat_chem_mod (hml, adj32_025)
|
|
!! Include strat O3/NOy
|
|
!CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_transport_menu:6' )
|
|
!READ( SUBSTRS(1:N), * ) LUPBD
|
|
|
|
! Separator line
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_transport_menu:7' )
|
|
|
|
!=================================================================
|
|
! Error check settings
|
|
!=================================================================
|
|
|
|
! Now LUPBD is replace by strat_chem_mod (hml, adj32_025)
|
|
!! Turn off LUPBD if for simulations other than fullchem & tagox
|
|
!IF ( .not. ITS_A_FULLCHEM_SIM() .and.
|
|
! .not. ITS_A_TAGOX_SIM() ) LUPBD = .FALSE.
|
|
|
|
! Define maximum timestep for transport
|
|
#if defined( GRID4x5 )
|
|
MAX_DYN = 30
|
|
#elif defined( GRID2x25 )
|
|
MAX_DYN = 15
|
|
#elif defined( GRID1x125 )
|
|
MAX_DYN = 10
|
|
#elif defined( GRID1x1 )
|
|
MAX_DYN = 10
|
|
#elif defined( GRID05x0666 )
|
|
MAX_DYN = 10
|
|
#elif defined( GRID025x03125 )
|
|
MAX_DYN = 5 ! (lzh, 11/15/2014)
|
|
#endif
|
|
|
|
! If TS_DYN is greater than MAX_DYN, then stop w/ error
|
|
IF ( TS_DYN > MAX_DYN .and. LTRAN ) THEN
|
|
MSG = 'Transport timestep is too big!'
|
|
CALL ERROR_STOP( MSG, LOCATION )
|
|
ENDIF
|
|
|
|
!=================================================================
|
|
! Print to screen
|
|
!=================================================================
|
|
WRITE( 6, '(/,a)' ) 'TRANSPORT MENU'
|
|
WRITE( 6, '( a)' ) '--------------'
|
|
WRITE( 6, 100 ) 'Turn on transport? : ', LTRAN
|
|
WRITE( 6, 100 ) 'Use TPCORE flux-correction? : ', LMFCT
|
|
WRITE( 6, 100 ) 'Let TPCORE Fill negatives? : ', LFILL
|
|
WRITE( 6, 110 ) 'IORD, JORD, KORD for TPCORE?: ', IORD,
|
|
& JORD, KORD
|
|
WRITE( 6, 120 ) 'Transport timestep [min] : ', TS_DYN
|
|
!WRITE( 6, 100 ) 'Use strat BC for O3 & NOy? : ', LUPBD
|
|
|
|
! FORMAT statements
|
|
100 FORMAT( A, L5 )
|
|
110 FORMAT( A, 5I5 )
|
|
120 FORMAT( A, I5 )
|
|
|
|
!=================================================================
|
|
! Call setup routines from other F90 modules
|
|
!=================================================================
|
|
|
|
! Pass parameters to "transport_mod.f"
|
|
CALL SET_TRANSPORT( IORD, JORD, KORD )
|
|
|
|
! Pass parameters to "upbdflx_mod.f"
|
|
CALL INIT_UPBDFLX( IORD, JORD, KORD )
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE READ_TRANSPORT_MENU
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE READ_CONVECTION_MENU
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine READ_CONVECTION_MENU reads the CONVECTION MENU section of
|
|
! the GEOS-CHEM input file. (bmy, 7/20/04)
|
|
!
|
|
! NOTES:
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE ERROR_MOD, ONLY : ERROR_STOP
|
|
USE LOGICAL_MOD, ONLY : LCONV, LTURB
|
|
|
|
! Local variables
|
|
INTEGER :: N
|
|
CHARACTER(LEN=255) :: SUBSTRS(MAXDIM), MSG
|
|
|
|
!=================================================================
|
|
! READ_CONVECTION_MENU begins here!
|
|
!=================================================================
|
|
|
|
! Error check
|
|
IF ( CT1 /= 2 ) THEN
|
|
MSG = 'SIMULATION MENU & TRACER MENU must be read in first!'
|
|
CALL ERROR_STOP( MSG, 'READ_TRANSPORT_MENU ("input_mod.f")' )
|
|
ENDIF
|
|
|
|
! Turn on convection?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_convection_menu:1' )
|
|
READ( SUBSTRS(1:N), * ) LCONV
|
|
|
|
! Turn on BL mixing
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_convection_menu:2' )
|
|
READ( SUBSTRS(1:N), * ) LTURB
|
|
|
|
! Convection timestep
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_convection_menu:3' )
|
|
READ( SUBSTRS(1:N), * ) TS_CONV
|
|
|
|
! Separator line
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_convection_menu:4' )
|
|
|
|
!=================================================================
|
|
! Print to screen
|
|
!=================================================================
|
|
WRITE( 6, '(/,a)' ) 'CONVECTION MENU'
|
|
WRITE( 6, '( a)' ) '----------------'
|
|
WRITE( 6, 100 ) 'Turn on cloud convection? : ', LCONV
|
|
WRITE( 6, 100 ) 'Turn on PBL mixing? : ', LTURB
|
|
WRITE( 6, 110 ) 'Convection timestep [min] : ', TS_CONV
|
|
|
|
! FORMAT statements
|
|
100 FORMAT( A, L5 )
|
|
110 FORMAT( A, I5 )
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE READ_CONVECTION_MENU
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE READ_DEPOSITION_MENU
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine READ_DEPOSITION_MENU reads the DEPOSITION MENU section of
|
|
! the GEOS-CHEM input file. (bmy, 7/20/04, 10/3/05)
|
|
!
|
|
! NOTES:
|
|
! (1 ) Now print an informational message for tagged Hg (bmy, 12/15/04)
|
|
! (2 ) We need to call WETDEPID for both wetdep and cloud convection
|
|
! since this sets up the list of soluble tracers (bmy, 3/1/05)
|
|
! (3 ) Remove references to obsolete CO_OH simulation (bmy, 6/24/05)
|
|
! (4 ) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE ERROR_MOD, ONLY : ERROR_STOP
|
|
USE DRYDEP_MOD, ONLY : INIT_DRYDEP
|
|
USE LOGICAL_MOD, ONLY : LCONV, LDRYD
|
|
USE LOGICAL_MOD, ONLY : LWETD, LSPLIT
|
|
USE TRACER_MOD, ONLY : ITS_A_C2H6_SIM, ITS_A_CH3I_SIM
|
|
USE TRACER_MOD, ONLY : ITS_A_CH4_SIM, ITS_A_HCN_SIM
|
|
USE TRACER_MOD, ONLY : ITS_A_MERCURY_SIM, ITS_A_TAGCO_SIM
|
|
USE TRACER_MOD, ONLY : ITS_A_TAGOX_SIM
|
|
USE WETSCAV_MOD, ONLY : WETDEPID
|
|
|
|
! Local variables
|
|
INTEGER :: N
|
|
CHARACTER(LEN=255) :: SUBSTRS(MAXDIM), MSG
|
|
|
|
!=================================================================
|
|
! READ_DEPOSITION_MENU begins here!
|
|
!=================================================================
|
|
|
|
! Error check
|
|
IF ( CT1 /= 2 ) THEN
|
|
MSG = 'SIMULATION MENU & TRACER MENU must be read in first!'
|
|
CALL ERROR_STOP( MSG, 'READ_DEPOSITION_MENU ("input_mod.f")' )
|
|
ENDIF
|
|
|
|
! Turn on drydep?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_deposition_menu:1' )
|
|
READ( SUBSTRS(1:N), * ) LDRYD
|
|
|
|
! Turn on wetdep?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_deposition_menu:2' )
|
|
READ( SUBSTRS(1:N), * ) LWETD
|
|
|
|
! Separator line
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_deposition_menu:3' )
|
|
|
|
!=================================================================
|
|
! Error check settings
|
|
!=================================================================
|
|
|
|
! Turn off drydep for simulations that don't need it
|
|
IF ( ITS_A_CH3I_SIM() ) LDRYD = .FALSE.
|
|
IF ( ITS_A_TAGCO_SIM() ) LDRYD = .FALSE.
|
|
|
|
! Turn off wetdep for simulations that don't need it
|
|
IF ( ITS_A_CH3I_SIM() ) LWETD = .FALSE.
|
|
IF ( ITS_A_HCN_SIM() ) LWETD = .FALSE.
|
|
IF ( ITS_A_TAGOX_SIM() ) LWETD = .FALSE.
|
|
IF ( ITS_A_TAGCO_SIM() ) LWETD = .FALSE.
|
|
IF ( ITS_A_C2H6_SIM() ) LWETD = .FALSE.
|
|
IF ( ITS_A_CH4_SIM() ) LWETD = .FALSE.
|
|
|
|
!=================================================================
|
|
! Print to screen
|
|
!=================================================================
|
|
WRITE( 6, '(/,a)' ) 'DEPOSITION MENU'
|
|
WRITE( 6, '( a)' ) '---------------'
|
|
WRITE( 6, 100 ) 'Turn on dry deposition? : ', LDRYD
|
|
WRITE( 6, 100 ) 'Turn on wet deposition? : ', LWETD
|
|
|
|
! FORMAT statements
|
|
100 FORMAT( A, L5 )
|
|
110 FORMAT( A, I5 )
|
|
|
|
!=================================================================
|
|
! Call setup routines from other F90 modules
|
|
!=================================================================
|
|
|
|
! Initialize dry deposition arrays
|
|
IF ( LDRYD ) THEN
|
|
|
|
! Setup for dry deposition
|
|
CALL INIT_DRYDEP
|
|
|
|
! Print extra info message for Hg simulation
|
|
IF ( ITS_A_MERCURY_SIM() .and. LSPLIT ) THEN
|
|
WRITE ( 6, 120 )
|
|
WRITE ( 6, 121 )
|
|
ENDIF
|
|
ENDIF
|
|
|
|
! Initialize wet deposition tracers
|
|
IF ( LWETD .or. LCONV ) CALL WETDEPID
|
|
|
|
! FORMAT strings
|
|
120 FORMAT( /, 'All tagged Hg2 tracers have the same dep velocity '
|
|
& 'as the total Hg2 tracer.' )
|
|
121 FORMAT( 'All tagged HgP tracers have the same dep velocity '
|
|
& 'as the total HgP tracer.' )
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE READ_DEPOSITION_MENU
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE READ_GAMAP_MENU
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine READ_GAMAP_MENU reads the GAMAP MENU section of the
|
|
! GEOS-CHEM input file. (bmy, 4/25/05)
|
|
!
|
|
! NOTES:
|
|
!******************************************************************************
|
|
!
|
|
! Local variables
|
|
LOGICAL :: EOF
|
|
INTEGER :: N
|
|
CHARACTER(LEN=255) :: SUBSTRS(MAXDIM)
|
|
|
|
!=================================================================
|
|
! READ_GAMAP_MENU begins here!
|
|
!=================================================================
|
|
|
|
! Background
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_gamap_menu:1' )
|
|
READ( SUBSTRS(1:N), '(a)' ) DIAGINFO
|
|
|
|
! Redirect
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_gamap_menu:2' )
|
|
READ( SUBSTRS(1:N), '(a)' ) TRACERINFO
|
|
|
|
! Separator line
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_gamap_menu:3' )
|
|
|
|
!=================================================================
|
|
! Print to screen
|
|
!=================================================================
|
|
WRITE( 6, '(/,a)' ) 'GAMAP MENU'
|
|
WRITE( 6, '( a)' ) '---------------'
|
|
WRITE( 6, '(a,a)' ) 'GAMAP "diaginfo.dat" file : ',
|
|
& TRIM( DIAGINFO )
|
|
WRITE( 6, '(a,a)' ) 'GAMAP "tracerinfo.dat" file : ',
|
|
& TRIM( TRACERINFO )
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE READ_GAMAP_MENU
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE READ_OUTPUT_MENU
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine READ_OUTPUT_MENU reads the OUTPUT MENU section of
|
|
! the GEOS-CHEM input file. (bmy, 7/20/04)
|
|
!
|
|
! NOTES:
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE FILE_MOD, ONLY : IU_GEOS, IOERROR
|
|
|
|
# include "CMN_SIZE" ! Size parameters
|
|
# include "CMN_DIAG" ! NJDAY
|
|
|
|
! Local variables
|
|
INTEGER :: IOS
|
|
|
|
!=================================================================
|
|
! READ_OUTPUT_MENU begins here!
|
|
!=================================================================
|
|
READ( IU_GEOS, 100, IOSTAT=IOS ) NJDAY
|
|
100 FORMAT( 26x, 31i1, / 26x, 29i1, /, 26x, 31i1, /, 26x, 30i1, /,
|
|
& 26x, 31i1, /, 26x, 30i1, /, 26x, 31i1, /, 26x, 31i1, /,
|
|
& 26x, 30i1, / 26x, 31i1, /, 26x, 30i1, /, 26x, 31i1 )
|
|
|
|
! Error check
|
|
IF ( IOS /= 0 ) CALL IOERROR( IOS, IU_GEOS, 'read_output_menu:1' )
|
|
|
|
!=================================================================
|
|
! Print to screen
|
|
!=================================================================
|
|
|
|
WRITE( 6, '(/,a)' ) 'OUTPUT MENU'
|
|
WRITE( 6, '( a)' ) '-----------'
|
|
WRITE( 6, 110 )
|
|
WRITE( 6, 120 )
|
|
WRITE( 6, 130 )
|
|
WRITE( 6, 140 ) NJDAY
|
|
|
|
! FORMAT statements
|
|
110 FORMAT( ' 1111111111222222222233' )
|
|
120 FORMAT( ' 1234567890123456789012345678901' )
|
|
130 FORMAT( ' -------------------------------' )
|
|
140 FORMAT( 'JAN--', 31i1, /, 'FEB--', 29i1, /, 'MAR--', 31i1, /,
|
|
& 'APR--', 30i1, /, 'MAY--', 31i1, /, 'JUN--', 30i1, /,
|
|
& 'JUL--', 31i1, /, 'AUG--', 31i1, /, 'SEP--', 30i1, /,
|
|
& 'OCT--', 31i1, /, 'NOV--', 30i1, /, 'DEC--', 31i1 )
|
|
|
|
! Make sure we have output at end of run
|
|
CALL IS_LAST_DAY_GOOD
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE READ_OUTPUT_MENU
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE READ_DIAGNOSTIC_MENU
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine READ_DIAGNOSTIC_MENU reads the DIAGNOSTIC MENU section of
|
|
! the GEOS-CHEM input file. (bmy, 7/20/04, 2/10/09)
|
|
!
|
|
! NOTES:
|
|
! (1 ) Now reference IU_BPCH from "file_mod.f" and OPEN_BPCH2_FOR_WRITE
|
|
! from "bpch2_mod.f". Now opens the bpch file for output here
|
|
! instead of w/in "main.f" (bmy, 2/3/05)
|
|
! (2 ) Now references "diag03_mod.f" and "diag41_mod.f". Now turn off ND38
|
|
! when both LWETD=F and LCONV=F. Now calls EXPAND_DATE to replace
|
|
! YYYYMMDD and HHMMSS tokens in the bpch file name with the actual
|
|
! starting date & time of the run. (bmy, 3/25/05)
|
|
! (3 ) Now get diag info for ND09 for HCN/CH3CN sim (bmy, 6/27/05)
|
|
! (4 ) Now references "diag04_mod.f" (bmy, 7/26/05)
|
|
! (5 ) Now make sure all USE statements are USE, ONLY. Also remove reference
|
|
! to DIAG_MOD, it's not needed. (bmy, 10/3/05)
|
|
! (6 ) Now remove reference to NBIOTRCE; Replace w/ NBIOMAX. (bmy, 4/5/06)
|
|
! (7 ) Now reference ND56, PD56, INIT_DIAG56 from "diag56_mod.f"
|
|
! (bmy, 5/10/06)
|
|
! (8 ) Now reference ND42, PD42, INIT_DIAG42 from "diag42_mod.f"
|
|
! (dkh, bmy, 5/22/06)
|
|
! (9 ) Now set max dimension for GFED2 or default biomass (bmy, 9/22/06)
|
|
! (10) Bug fix: Should use ND52 in call to SET_TINDEX (cdh, bmy, 2/11/08)
|
|
! (11) Remove call to NDXX_SETUP; this is now called in READ_INPUT_FILE.
|
|
! (phs, 11/18/08)
|
|
! (12) Now set TINDEX with PD45=NNPAR+1 tracers instead of N_TRACERS.
|
|
! (tmf, 2/10/09)
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE BIOMASS_MOD, ONLY : NBIOMAX
|
|
USE BIOFUEL_MOD, ONLY : NBFTRACE
|
|
USE BPCH2_MOD, ONLY : OPEN_BPCH2_FOR_WRITE
|
|
USE DIAG03_MOD, ONLY : ND03, PD03, INIT_DIAG03
|
|
USE DIAG04_MOD, ONLY : ND04, PD04, INIT_DIAG04
|
|
USE DIAG41_MOD, ONLY : ND41, PD41, INIT_DIAG41
|
|
USE DIAG42_MOD, ONLY : ND42, PD42, INIT_DIAG42
|
|
USE DIAG56_MOD, ONLY : ND56, PD56, INIT_DIAG56
|
|
! (diag59 added, lz,10/11/10)
|
|
USE DIAG59_MOD, ONLY : ND59, PD59, INIT_DIAG59
|
|
USE DIAG_OH_MOD, ONLY : INIT_DIAG_OH
|
|
USE DRYDEP_MOD, ONLY : NUMDEP
|
|
USE ERROR_MOD, ONLY : ERROR_STOP
|
|
USE FILE_MOD, ONLY : IU_BPCH
|
|
USE LOGICAL_MOD, ONLY : LBIOMASS, LBIOFUEL, LCARB, LCONV
|
|
USE LOGICAL_MOD, ONLY : LDRYD, LDUST, LPRT, LSULF
|
|
USE LOGICAL_MOD, ONLY : LSSALT, LTURB, LWETD, LGFED2BB
|
|
USE LOGICAL_MOD, ONLY : LGFED3BB
|
|
USE TIME_MOD, ONLY : GET_NYMDb, GET_NHMSb, EXPAND_DATE
|
|
USE TRACER_MOD, ONLY : N_TRACERS
|
|
USE TRACER_MOD, ONLY : ITS_A_CO2_SIM, ITS_A_FULLCHEM_SIM
|
|
USE TRACER_MOD, ONLY : ITS_A_MERCURY_SIM, ITS_A_RnPbBe_SIM
|
|
USE TRACER_MOD, ONLY : ITS_A_TAGOX_SIM, ITS_A_CH3I_SIM
|
|
USE TRACER_MOD, ONLY : SALA_REDGE_um
|
|
USE TRACERID_MOD, ONLY : NEMANTHRO
|
|
USE WETSCAV_MOD, ONLY : GET_WETDEP_NMAX
|
|
|
|
# include "CMN_SIZE" ! Size parameters
|
|
# include "CMN_DIAG" ! NDxx flags
|
|
|
|
! Local variables
|
|
INTEGER :: M, N, N_MAX, N_TMP
|
|
CHARACTER(LEN=255) :: SUBSTRS(MAXDIM), MSG, LOCATION
|
|
|
|
!=================================================================
|
|
! READ_DIAGNOSTIC_MENU begins here!
|
|
!=================================================================
|
|
|
|
! Location for ERROR_STOP
|
|
LOCATION = 'READ_DIAGNOSTIC_MENU ("input_mod.f")'
|
|
|
|
! Error check
|
|
IF ( CT1 /= 2 ) THEN
|
|
MSG = 'SIMULATION MENU & TRACER MENU must be read in first!'
|
|
CALL ERROR_STOP( MSG, LOCATION )
|
|
ENDIF
|
|
|
|
! Get max number of tracers
|
|
N_MAX = MIN( N_TRACERS, NNPAR )
|
|
|
|
! Binary punch file name
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_diagnostic_menu:1' )
|
|
READ( SUBSTRS(1:N), '(a)' ) BPCH_FILE
|
|
|
|
! Separator line
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:2' )
|
|
|
|
!--------------------------
|
|
! ND01: Rn-Pb-Be source
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:3' )
|
|
READ( SUBSTRS(1), * ) ND01
|
|
IF ( .not. ITS_A_RnPbBe_SIM() ) ND01 = 0
|
|
CALL SET_TINDEX( 01, ND01, SUBSTRS(2:N), N-1, N_MAX )
|
|
|
|
!--------------------------
|
|
! ND02: Rn-Pb-Be decay
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:4' )
|
|
READ( SUBSTRS(1), * ) ND02
|
|
IF ( .not. ITS_A_RnPbBe_SIM() ) ND02 = 0
|
|
CALL SET_TINDEX( 02, ND02, SUBSTRS(2:N), N-1, N_MAX )
|
|
|
|
!--------------------------
|
|
! ND03: Hg diagnostics
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:5' )
|
|
READ( SUBSTRS(1), * ) ND03
|
|
IF ( .not. ITS_A_MERCURY_SIM() ) ND03 = 0
|
|
CALL SET_TINDEX( 03, ND03, SUBSTRS(2:N), N-1, PD03 )
|
|
|
|
!--------------------------
|
|
! ND04: CO2 emissions
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:6' )
|
|
READ( SUBSTRS(1), * ) ND04
|
|
IF ( .not. ITS_A_CO2_SIM() ) ND04 = 0
|
|
CALL SET_TINDEX( 04, ND04, SUBSTRS(2:N), N-1, PD04 )
|
|
|
|
!--------------------------
|
|
! ND05: Sulfate prod/loss
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:7' )
|
|
READ( SUBSTRS(1), * ) ND05
|
|
IF ( .not. LSULF ) ND05 = 0
|
|
CALL SET_TINDEX( 05, ND05, SUBSTRS(2:N), N-1, PD05 )
|
|
|
|
!--------------------------
|
|
! ND06: Dust emissions
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:8' )
|
|
READ( SUBSTRS(1), * ) ND06
|
|
IF ( .not. LDUST ) ND06 = 0
|
|
CALL SET_TINDEX( 06, ND06, SUBSTRS(2:N), N-1, NDSTBIN )
|
|
|
|
!--------------------------
|
|
! ND07: Carbon/SOA source
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:9' )
|
|
READ( SUBSTRS(1), * ) ND07
|
|
IF ( .not. LCARB ) ND07 = 0
|
|
CALL SET_TINDEX( 07, ND07, SUBSTRS(2:N), N-1, PD07 )
|
|
|
|
!--------------------------
|
|
! ND08: Sea salt source
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:10' )
|
|
READ( SUBSTRS(1), * ) ND08
|
|
IF ( .not. LSSALT ) ND08 = 0
|
|
CALL SET_TINDEX( 08, ND08, SUBSTRS(2:N), N-1, PD08 )
|
|
|
|
!--------------------------
|
|
! ND09: HCN/CH3CN
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:11' )
|
|
READ( SUBSTRS(1), * ) ND09
|
|
CALL SET_TINDEX( 09, ND09, SUBSTRS(2:N), N-1, N_TRACERS+PD09 )
|
|
|
|
!--------------------------
|
|
! ND10: Free
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:12' )
|
|
READ( SUBSTRS(1), * ) ND10
|
|
CALL SET_TINDEX( 10, ND10, SUBSTRS(2:N), N-1, PD10 )
|
|
|
|
!--------------------------
|
|
! ND11: Acetone source
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:13' )
|
|
READ( SUBSTRS(1), * ) ND11
|
|
CALL SET_TINDEX( 11, ND11, SUBSTRS(2:N), N-1, PD11 )
|
|
|
|
!--------------------------
|
|
! ND12: PBL distribution
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:14' )
|
|
READ( SUBSTRS(1), * ) ND12
|
|
CALL SET_TINDEX( 12, ND12, SUBSTRS(2:N), N-1, PD12 )
|
|
|
|
!--------------------------
|
|
! ND13: Sulfur sources
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:15' )
|
|
READ( SUBSTRS(1), * ) ND13
|
|
IF ( .not. LSULF ) ND13 = 0
|
|
CALL SET_TINDEX( 13, ND13, SUBSTRS(2:N), N-1, PD13 )
|
|
|
|
!--------------------------
|
|
! ND14: Wet conv up flux
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:16' )
|
|
READ( SUBSTRS(1), * ) ND14
|
|
IF ( .not. LCONV ) ND14 = 0
|
|
CALL SET_TINDEX( 14, ND14, SUBSTRS(2:N), N-1, N_MAX )
|
|
|
|
!--------------------------
|
|
! ND15: Mass change in PBL
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:17' )
|
|
READ( SUBSTRS(1), * ) ND15
|
|
IF ( .not. LTURB ) ND15 = 0
|
|
CALL SET_TINDEX( 15, ND15, SUBSTRS(2:N), N-1, N_MAX )
|
|
|
|
!--------------------------
|
|
! ND16: Precip fractions
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:18' )
|
|
READ( SUBSTRS(1), * ) ND16
|
|
CALL SET_TINDEX( 16, ND16, SUBSTRS(2:N), N-1, N_MAX )
|
|
|
|
!--------------------------
|
|
! ND17: Rainout losses
|
|
!--------------------------
|
|
N_TMP = GET_WETDEP_NMAX()
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:19' )
|
|
READ( SUBSTRS(1), * ) ND17
|
|
IF ( .not. LWETD ) ND17 = 0
|
|
CALL SET_TINDEX( 17, ND17, SUBSTRS(2:N), N-1, N_TMP )
|
|
|
|
!--------------------------
|
|
! ND18: Washout losses
|
|
!--------------------------
|
|
N_TMP = GET_WETDEP_NMAX()
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:20' )
|
|
READ( SUBSTRS(1), * ) ND18
|
|
IF ( .not. LWETD ) ND18 = 0
|
|
CALL SET_TINDEX( 18, ND18, SUBSTRS(2:N), N-1, N_TMP )
|
|
|
|
!--------------------------
|
|
! ND19: Free
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:21' )
|
|
READ( SUBSTRS(1), * ) ND19
|
|
CALL SET_TINDEX( 19, ND19, SUBSTRS(2:N), N-1, PD19 )
|
|
|
|
!--------------------------
|
|
! ND21: Opt depths etc.
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:22' )
|
|
READ( SUBSTRS(1), * ) ND21
|
|
CALL SET_TINDEX( 21, ND21, SUBSTRS(2:N), N-1, PD21 )
|
|
|
|
! Error check
|
|
IF ( ND21 > 0 .and. SALA_REDGE_um(2) /= 0.5 ) THEN
|
|
MSG = 'Cannot output seasalt AOD''s when radius bin' //
|
|
& ' is not split at 0.5 um!!'
|
|
CALL ERROR_STOP( MSG, LOCATION )
|
|
ENDIF
|
|
|
|
!--------------------------
|
|
! ND22: J-values
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:23' )
|
|
READ( SUBSTRS(1), * ) ND22
|
|
CALL SET_TINDEX( 22, ND22, SUBSTRS(2:N), N-1, PD22 )
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 2, 'read_diagnostic_menu:24' )
|
|
READ( SUBSTRS(1:N), * ) HR1_JV, HR2_JV
|
|
|
|
!--------------------------
|
|
! ND24: E/W transport flux
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:25' )
|
|
READ( SUBSTRS(1), * ) ND24
|
|
CALL SET_TINDEX( 24, ND24, SUBSTRS(2:N), N-1, N_MAX )
|
|
|
|
!--------------------------
|
|
! ND25: N/S transport flux
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:26' )
|
|
READ( SUBSTRS(1), * ) ND25
|
|
CALL SET_TINDEX( 25, ND25, SUBSTRS(2:N), N-1, N_MAX )
|
|
|
|
!--------------------------
|
|
! ND26: U/D transport flux
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:27' )
|
|
READ( SUBSTRS(1), * ) ND26
|
|
CALL SET_TINDEX( 26, ND26, SUBSTRS(2:N), N-1, N_MAX )
|
|
|
|
!--------------------------
|
|
! ND27: Strat fluxes
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:28' )
|
|
READ( SUBSTRS(1), * ) ND27
|
|
CALL SET_TINDEX( 27, ND27, SUBSTRS(2:N), N-1, PD27 )
|
|
|
|
!--------------------------
|
|
! ND28: Biomass emissions
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:29' )
|
|
READ( SUBSTRS(1), * ) ND28
|
|
IF ( .not. LBIOMASS ) ND28 = 0
|
|
CALL SET_TINDEX( 28, ND28, SUBSTRS(2:N), N-1, NBIOMAX )
|
|
|
|
!--------------------------
|
|
! ND29: CO sources
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:30' )
|
|
READ( SUBSTRS(1), * ) ND29
|
|
CALL SET_TINDEX( 29, ND29, SUBSTRS(2:N), N-1, PD29 )
|
|
|
|
!--------------------------
|
|
! ND30: Land map
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:31' )
|
|
READ( SUBSTRS(1), * ) ND30
|
|
CALL SET_TINDEX( 30, ND30, SUBSTRS(2:N), N-1, PD30 )
|
|
|
|
!--------------------------
|
|
! ND31: Surface pressure
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:32' )
|
|
READ( SUBSTRS(1), * ) ND31
|
|
CALL SET_TINDEX( 31, ND31, SUBSTRS(2:N), N-1, PD31 )
|
|
|
|
!--------------------------
|
|
! ND32: NOx sources
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:33' )
|
|
READ( SUBSTRS(1), * ) ND32
|
|
CALL SET_TINDEX( 32, ND32, SUBSTRS(2:N), N-1, PD32 )
|
|
|
|
!--------------------------
|
|
! ND33: Column tracer
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:34' )
|
|
READ( SUBSTRS(1), * ) ND33
|
|
CALL SET_TINDEX( 33, ND33, SUBSTRS(2:N), N-1, N_MAX )
|
|
|
|
!--------------------------
|
|
! ND34: Biofuel sources
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:35' )
|
|
READ( SUBSTRS(1), * ) ND34
|
|
IF ( .not. LBIOFUEL ) ND34 = 0
|
|
CALL SET_TINDEX( 34, ND34, SUBSTRS(2:N), N-1, NBFTRACE )
|
|
|
|
!--------------------------
|
|
! ND35: 500 hPa tracer
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:36' )
|
|
READ( SUBSTRS(1), * ) ND35
|
|
CALL SET_TINDEX( 35, ND35, SUBSTRS(2:N), N-1, N_MAX )
|
|
|
|
!--------------------------
|
|
! ND36: Anthro emissions
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:37' )
|
|
READ( SUBSTRS(1), * ) ND36
|
|
CALL SET_TINDEX( 36, ND36, SUBSTRS(2:N), N-1, NEMANTHRO )
|
|
|
|
!--------------------------
|
|
! ND37: Updraft scav frac
|
|
!--------------------------
|
|
N_TMP = GET_WETDEP_NMAX()
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:38' )
|
|
READ( SUBSTRS(1), * ) ND37
|
|
CALL SET_TINDEX( 37, ND37, SUBSTRS(2:N), N-1, N_TMP )
|
|
|
|
!--------------------------
|
|
! ND38: Cld conv losses
|
|
!--------------------------
|
|
N_TMP = GET_WETDEP_NMAX()
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:39' )
|
|
READ( SUBSTRS(1), * ) ND38
|
|
IF ( .not. LWETD .and. .not. LCONV ) ND38 = 0
|
|
CALL SET_TINDEX( 38, ND38, SUBSTRS(2:N), N-1, N_TMP )
|
|
|
|
!--------------------------
|
|
! ND39: Wet scav losses
|
|
!--------------------------
|
|
N_TMP = GET_WETDEP_NMAX()
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:40' )
|
|
READ( SUBSTRS(1), * ) ND39
|
|
IF ( .not. LWETD ) ND39 = 0
|
|
CALL SET_TINDEX( 39, ND39, SUBSTRS(2:N), N-1, N_TMP )
|
|
|
|
!--------------------------
|
|
! ND41: Afternoon PBL ht
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:41' )
|
|
READ( SUBSTRS(1), * ) ND41
|
|
CALL SET_TINDEX( 41, ND41, SUBSTRS(2:N), N-1, PD41 )
|
|
|
|
!--------------------------
|
|
! ND42: SOA concentrations
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:42' )
|
|
READ( SUBSTRS(1), * ) ND42
|
|
CALL SET_TINDEX( 42, ND42, SUBSTRS(2:N), N-1, PD42 )
|
|
|
|
!--------------------------
|
|
! ND43: OH, NO, etc.
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:43' )
|
|
READ( SUBSTRS(1), * ) ND43
|
|
IF ( .not. ITS_A_FULLCHEM_SIM() ) ND43 = 0
|
|
CALL SET_TINDEX( 43, ND43, SUBSTRS(2:N), N-1, PD43 )
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 2, 'read_diagnostic_menu:44' )
|
|
READ( SUBSTRS(1:N), * ) HR1_OH, HR2_OH
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 2, 'read_diagnostic_menu:45' )
|
|
READ( SUBSTRS(1:N), * ) HR1_NO, HR2_NO
|
|
|
|
!--------------------------
|
|
! ND44 drydep vel & flux
|
|
!--------------------------
|
|
|
|
! Number of tracers depends on simulation type
|
|
IF ( ITS_A_TAGOX_SIM() ) THEN
|
|
N_TMP = N_TRACERS
|
|
ELSE
|
|
N_TMP = NUMDEP
|
|
ENDIF
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:46' )
|
|
READ( SUBSTRS(1), * ) ND44
|
|
IF ( .not. LDRYD ) ND44 = 0
|
|
CALL SET_TINDEX( 44, ND44, SUBSTRS(2:N), N-1, N_TMP )
|
|
|
|
!--------------------------
|
|
! ND45: Tracer conc.
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:47' )
|
|
READ( SUBSTRS(1), * ) ND45
|
|
!---------------------------------------------------------------------
|
|
! Prior to 2/10/09:
|
|
! Now set TINDEX with PD45=NNPAR+1 tracers instead of N_TRACERS,
|
|
! Minor bug fix discovered by May Fu. (tmf, bmy, 2/10/09)
|
|
!CALL SET_TINDEX( 45, ND45, SUBSTRS(2:N), N-1, N_TRACERS )
|
|
!---------------------------------------------------------------------
|
|
CALL SET_TINDEX( 45, ND45, SUBSTRS(2:N), N-1, PD45 )
|
|
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 2, 'read_diagnostic_menu:48' )
|
|
READ( SUBSTRS(1:N), * ) HR1_OTH, HR2_OTH
|
|
|
|
!--------------------------
|
|
! ND46: Biogenic sources
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:49' )
|
|
READ( SUBSTRS(1), * ) ND46
|
|
CALL SET_TINDEX( 46, ND46, SUBSTRS(2:N), N-1, PD46 )
|
|
|
|
!--------------------------
|
|
! ND47: 24h avg tracer
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:50' )
|
|
READ( SUBSTRS(1), * ) ND47
|
|
CALL SET_TINDEX( 47, ND47, SUBSTRS(2:N), N-1, N_TRACERS )
|
|
|
|
!--------------------------
|
|
! ND52: GAMMA HO2
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:51' )
|
|
READ( SUBSTRS(1), * ) ND52
|
|
CALL SET_TINDEX( 52, ND52, SUBSTRS(2:N), N-1, PD52 )
|
|
|
|
!--------------------------
|
|
! ND53: Free
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:52' )
|
|
READ( SUBSTRS(1), * ) ND53
|
|
CALL SET_TINDEX( 53, ND53, SUBSTRS(2:N), N-1, N_TRACERS )
|
|
|
|
!--------------------------
|
|
! ND54: Time in troposphere
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:53' )
|
|
READ( SUBSTRS(1), * ) ND54
|
|
CALL SET_TINDEX( 54, ND54, SUBSTRS(2:N), N-1, 1 )
|
|
|
|
!--------------------------
|
|
! ND55: Tropopause diags
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:54' )
|
|
READ( SUBSTRS(1), * ) ND55
|
|
CALL SET_TINDEX( 55, ND55, SUBSTRS(2:N), N-1, PD55 )
|
|
|
|
!--------------------------
|
|
! ND56: Lightning flashes
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:55' )
|
|
READ( SUBSTRS(1), * ) ND56
|
|
CALL SET_TINDEX( 56, ND56, SUBSTRS(2:N), N-1, PD56 )
|
|
|
|
!--------------------------
|
|
! ND57: Free
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:56' )
|
|
READ( SUBSTRS(1), * ) ND57
|
|
CALL SET_TINDEX( 57, ND57, SUBSTRS(2:N), N-1, PD57 )
|
|
|
|
!--------------------------
|
|
! ND58: Free
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:57' )
|
|
READ( SUBSTRS(1), * ) ND58
|
|
CALL SET_TINDEX( 58, ND58, SUBSTRS(2:N), N-1, PD58 )
|
|
|
|
! diag59 added, (lz,10/11/10)
|
|
!--------------------------
|
|
! ND59: PM con. kg -> ug/m3
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:58' )
|
|
READ( SUBSTRS(1), * ) ND59
|
|
CALL SET_TINDEX( 59, ND59, SUBSTRS(2:N), N-1, PD59 )
|
|
|
|
!--------------------------
|
|
! ND60: Free
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:59' )
|
|
READ( SUBSTRS(1), * ) ND60
|
|
CALL SET_TINDEX( 60, ND60, SUBSTRS(2:N), N-1, PD60 )
|
|
|
|
!--------------------------
|
|
! ND61: Free
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:60' )
|
|
READ( SUBSTRS(1), * ) ND61
|
|
CALL SET_TINDEX( 61, ND61, SUBSTRS(2:N), N-1, PD61 )
|
|
|
|
!--------------------------
|
|
! ND62: Free
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:61' )
|
|
READ( SUBSTRS(1), * ) ND62
|
|
CALL SET_TINDEX( 62, ND62, SUBSTRS(2:N), N-1, PD62 )
|
|
|
|
!--------------------------
|
|
! ND63: Free
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:62' )
|
|
READ( SUBSTRS(1), * ) ND63
|
|
CALL SET_TINDEX( 63, ND63, SUBSTRS(2:N), N-1, PD63 )
|
|
|
|
!--------------------------
|
|
! ND64: Free
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:63' )
|
|
READ( SUBSTRS(1), * ) ND64
|
|
CALL SET_TINDEX( 64, ND64, SUBSTRS(2:N), N-1, PD64 )
|
|
|
|
!--------------------------
|
|
! ND66: DAO 3-D fields
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:64' )
|
|
READ( SUBSTRS(1), * ) ND66
|
|
CALL SET_TINDEX( 66, ND66, SUBSTRS(2:N), N-1, PD66 )
|
|
|
|
!--------------------------
|
|
! ND67: DAO 2-D fields
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:65' )
|
|
READ( SUBSTRS(1), * ) ND67
|
|
CALL SET_TINDEX( 67, ND67, SUBSTRS(2:N), N-1, PD67 )
|
|
|
|
!--------------------------
|
|
! ND68: Air masses etc
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:66' )
|
|
READ( SUBSTRS(1), * ) ND68
|
|
CALL SET_TINDEX( 68, ND68, SUBSTRS(2:N), N-1, PD68 )
|
|
|
|
!--------------------------
|
|
! ND69: Surface areas
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:67' )
|
|
READ( SUBSTRS(1), * ) ND69
|
|
CALL SET_TINDEX( 69, ND69, SUBSTRS(2:N), N-1, PD69 )
|
|
|
|
!--------------------------
|
|
! ND70: Debug info
|
|
!--------------------------
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_diagnostic_menu:68' )
|
|
READ( SUBSTRS(1), * ) ND70
|
|
LPRT = ( ND70 > 0 )
|
|
CALL SET_TINDEX( 70, ND70, SUBSTRS(2:N), N-1, PD70 )
|
|
|
|
! Separator line
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_diagnostic_menu:69' )
|
|
|
|
!=================================================================
|
|
! Call other setup routines
|
|
!================================================================
|
|
|
|
! Allocate diagnostic arrays
|
|
CALL INIT_DIAG03
|
|
CALL INIT_DIAG04
|
|
CALL INIT_DIAG41
|
|
CALL INIT_DIAG42
|
|
CALL INIT_DIAG56
|
|
! (ND50 diag59 added, lz,10/11/10)
|
|
CALL INIT_DIAG59
|
|
|
|
|
|
! Enable Mean OH (or CH3CCl3) diag for runs which need it
|
|
CALL INIT_DIAG_OH
|
|
|
|
! Expand YYYYMMDD tokens in the bpch file name
|
|
CALL EXPAND_DATE( BPCH_FILE, GET_NYMDb(), GET_NHMSb() )
|
|
|
|
! Open the binary punch file for output
|
|
CALL OPEN_BPCH2_FOR_WRITE( IU_BPCH, BPCH_FILE )
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE READ_DIAGNOSTIC_MENU
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE SET_TINDEX( N_DIAG, L_DIAG, SUBSTRS, N, NMAX )
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine SET_TINDEX sets the TINDEX and TMAX arrays, which determine how
|
|
! many tracers to print to the punch file. (bmy, 7/20/04, 11/15/04)
|
|
!
|
|
! Arguments as Input:
|
|
! ============================================================================
|
|
! (1 ) N_DIAG (INTEGER ) : Number of the GEOS-CHEM diagnostic
|
|
! (2 ) L_DIAG (INTEGER ) : Number of levels that we are saving
|
|
! (3 ) SUBSTRS (CHARACTER) : Substrings passed from READ_DIAGNOSTIC_MENU
|
|
! (4 ) N (INTEGER ) : Number of valid substrings being passed
|
|
! (5 ) NMAX (INTEGER ) : Maximum number of tracers for this diagnostic
|
|
!
|
|
! NOTES:
|
|
! (1 ) Bug fix: now do not drop the last tracer number if "all" is not
|
|
! explicitly specified (tmf, bmy, 11/15/04)
|
|
!******************************************************************************
|
|
!
|
|
! (dkh, 02/16/11)
|
|
USE WETSCAV_MOD, ONLY : GET_WETDEP_IDWETD
|
|
|
|
# include "CMN_SIZE" ! Size parameters
|
|
# include "CMN_DIAG" ! TMAX, TINDEX
|
|
|
|
! Arguments
|
|
INTEGER, INTENT(IN) :: N_DIAG, N, NMAX, L_DIAG
|
|
CHARACTER(LEN=255), INTENT(IN) :: SUBSTRS(N)
|
|
|
|
! Local variables
|
|
LOGICAL, SAVE :: FIRST = .TRUE.
|
|
LOGICAL :: IS_ALL
|
|
INTEGER :: M
|
|
INTEGER :: NN
|
|
|
|
!=================================================================
|
|
! SET_TINDEX begins here!
|
|
!=================================================================
|
|
|
|
! Error check
|
|
IF ( N < 1 ) THEN
|
|
WRITE( 6, '(a)' ) 'ERROR: N must be 1 or greater!'
|
|
WRITE( 6, '(a)' ) 'STOP in SET_TINDEX (input_mod.f)'
|
|
WRITE( 6, '(a)' ) REPEAT( '=', 79 )
|
|
STOP
|
|
ENDIF
|
|
|
|
!=================================================================
|
|
! If the word "all" is present, then set TMAX, TINDEX to all
|
|
! available tracers for the given diagnostic. Otherwise, just
|
|
! use the tracers that were read in from the line
|
|
!=================================================================
|
|
IF ( TRIM( SUBSTRS(1) ) == 'all' .or.
|
|
& TRIM( SUBSTRS(1) ) == 'ALL' ) THEN
|
|
|
|
! TMAX is the max # of tracers to print out
|
|
TMAX(N_DIAG) = NMAX
|
|
|
|
!--------------------------------------------------------------
|
|
! BUG FIX:
|
|
! Old code:
|
|
!! Fill TINDEX with all possible diagnostic tracer numbers
|
|
!DO M = 1, TMAX(N_DIAG)
|
|
! TINDEX(N_DIAG,M) = M
|
|
!ENDDO
|
|
! New code:
|
|
! Now use soluble tracer numbers for these diagnostics (dkh, 02/16/11)
|
|
IF ( N_DIAG == 17 .or. N_DIAG == 18 .or.
|
|
& N_DIAG == 38 .or. N_DIAG == 39 ) THEN
|
|
|
|
! Fill TINDEX with all possible soluble tracer numbers
|
|
DO M = 1, TMAX(N_DIAG)
|
|
NN = GET_WETDEP_IDWETD( M )
|
|
TINDEX(N_DIAG,M) = NN
|
|
ENDDO
|
|
|
|
ELSE
|
|
|
|
! Fill TINDEX with all possible diagnostic tracer numbers
|
|
DO M = 1, TMAX(N_DIAG)
|
|
TINDEX(N_DIAG,M) = M
|
|
ENDDO
|
|
|
|
ENDIF
|
|
!--------------------------------------------------------------
|
|
|
|
! Set flag
|
|
IS_ALL = .TRUE.
|
|
|
|
ELSE
|
|
|
|
! Otherwise, set TMAX, TINDEX to the # of tracers
|
|
! listed in "input.ctm" -- need some error checks too
|
|
TMAX(N_DIAG) = N
|
|
|
|
! Use explicit DO-loop
|
|
DO M = 1, N
|
|
READ( SUBSTRS(M:M), * ) TINDEX(N_DIAG,M)
|
|
ENDDO
|
|
|
|
! Set flag
|
|
IS_ALL = .FALSE.
|
|
|
|
ENDIF
|
|
|
|
!=================================================================
|
|
! Print to screen
|
|
!=================================================================
|
|
|
|
! First-time printing only
|
|
IF ( FIRST ) THEN
|
|
WRITE( 6, '(/,a)' ) 'DIAGNOSTIC MENU'
|
|
WRITE( 6, '( a)' ) '---------------'
|
|
WRITE( 6, '( a)' ) 'Diag L Tracers being saved to disk'
|
|
FIRST = .FALSE.
|
|
ENDIF
|
|
|
|
! Test if all tracers are being printed out
|
|
IF ( IS_ALL ) THEN
|
|
|
|
! Print abbreviated output string
|
|
IF ( L_DIAG > 0 ) THEN
|
|
WRITE( 6, 100 ) N_DIAG, L_DIAG, 1, TMAX(N_DIAG)
|
|
100 FORMAT( 'ND', i2.2, 2x, i3, 1x, i3, ' -', i3 )
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
! Or just list each tracer
|
|
! Print each diagnostic and # of tracers that will print out
|
|
IF ( L_DIAG > 0 ) THEN
|
|
WRITE( 6, 110 ) N_DIAG, L_DIAG,
|
|
& ( TINDEX(N_DIAG,M), M=1,TMAX(N_DIAG) )
|
|
110 FORMAT( 'ND', i2, 2x, i3, 1x, 100i3 )
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE SET_TINDEX
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE READ_PLANEFLIGHT_MENU
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine READ_PLANEFLIGHT_MENU reads the PLANEFLIGHT MENU section of the
|
|
! GEOS-CHEM input file. This turns on the ND40 flight track diagnostic.
|
|
! (bmy, 7/20/04)
|
|
!
|
|
! NOTES:
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE ERROR_MOD, ONLY : ERROR_STOP
|
|
USE PLANEFLIGHT_MOD, ONLY : SET_PLANEFLIGHT
|
|
|
|
# include "CMN_SIZE" ! MAXFAM
|
|
# include "CMN_DIAG" ! ND40
|
|
|
|
! Local variables
|
|
LOGICAL :: DO_PF
|
|
INTEGER :: N
|
|
CHARACTER(LEN=255) :: IFILE
|
|
CHARACTER(LEN=255) :: OFILE
|
|
CHARACTER(LEN=255) :: SUBSTRS(MAXDIM), MSG
|
|
|
|
!=================================================================
|
|
! READ_PLANEFLIGHT_MENU begins here!
|
|
!=================================================================
|
|
|
|
! Error check
|
|
IF ( CT1 /= 2 ) THEN
|
|
MSG = 'SIMULATION MENU & TRACER MENU must be read in first!'
|
|
CALL ERROR_STOP( MSG, 'READ_PLANEFLIGHT_MENU ("input_mod.f")' )
|
|
ENDIF
|
|
|
|
! Initialize
|
|
ND40 = 0
|
|
DO_PF = .FALSE.
|
|
IFILE = ''
|
|
OFILE = ''
|
|
|
|
! Turn on planeflight diagnostic?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_planeflight_menu:1' )
|
|
READ( SUBSTRS(1:N), * ) DO_PF
|
|
|
|
! Set ND40 flag from DO_PF
|
|
IF ( DO_PF ) ND40 = 1
|
|
|
|
! Input file name (w/ flight track data points)
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_planeflight_menu:2' )
|
|
READ( SUBSTRS(1:N), '(a)' ) IFILE
|
|
|
|
! Output file name
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_planeflight_menu:3' )
|
|
READ( SUBSTRS(1:N), '(a)' ) OFILE
|
|
|
|
!=================================================================
|
|
! Print to screen
|
|
!=================================================================
|
|
WRITE( 6, '(/,a)' ) 'PLANEFLIGHT MENU'
|
|
WRITE( 6, '( a)' ) '----------------'
|
|
WRITE( 6, 100 ) 'Turn on planeflight diag? : ', DO_PF
|
|
WRITE( 6, 110 ) 'Flight track input file : ', TRIM(IFILE)
|
|
WRITE( 6, 110 ) 'Output file name : ', TRIM(OFILE)
|
|
|
|
! FORMAT statements
|
|
100 FORMAT( A, L5 )
|
|
110 FORMAT( A, A )
|
|
|
|
!=================================================================
|
|
! Call setup routines from other F90 modules
|
|
!=================================================================
|
|
|
|
! Pass variables to "planeflight_mod.f"
|
|
CALL SET_PLANEFLIGHT( DO_PF, IFILE, OFILE )
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE READ_PLANEFLIGHT_MENU
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE READ_ND48_MENU
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine READ_ND48_MENU reads the ND48 MENU section of the GEOS-CHEM
|
|
! input file. (bmy, 7/20/04, 3/6/06)
|
|
!
|
|
! NOTES:
|
|
! (1 ) Bug fix: ND48 stations should now be read correctly. (bmy, 3/6/06)
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE DIAG48_MOD, ONLY : INIT_DIAG48, ND48_MAX_STATIONS
|
|
USE ERROR_MOD, ONLY : ERROR_STOP
|
|
|
|
! Local variables
|
|
LOGICAL :: DO_ND48
|
|
INTEGER :: N, S
|
|
INTEGER :: FREQ
|
|
INTEGER :: N_STA
|
|
INTEGER :: IARR(ND48_MAX_STATIONS)
|
|
INTEGER :: JARR(ND48_MAX_STATIONS)
|
|
INTEGER :: LARR(ND48_MAX_STATIONS)
|
|
INTEGER :: NARR(ND48_MAX_STATIONS)
|
|
CHARACTER(LEN=255) :: SUBSTRS(MAXDIM), MSG
|
|
CHARACTER(LEN=255) :: FILE
|
|
CHARACTER(LEN=10) :: C
|
|
|
|
!=================================================================
|
|
! READ_ND48_MENU begins here!
|
|
!=================================================================
|
|
|
|
! Error check
|
|
IF ( CT1 /= 2 ) THEN
|
|
MSG = 'SIMULATION MENU & TRACER MENU must be read in first!'
|
|
CALL ERROR_STOP( MSG, 'READ_ND48_MENU ("input_mod.f")' )
|
|
ENDIF
|
|
|
|
! Turn on ND48 diagnostic
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nd48_menu:1' )
|
|
READ( SUBSTRS(1:N), * ) DO_ND48
|
|
|
|
! Timeseries file
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nd48_menu:2' )
|
|
READ( SUBSTRS(1:N), '(a)' ) FILE
|
|
|
|
! Frequency
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nd48_menu:3' )
|
|
READ( SUBSTRS(1:N), * ) FREQ
|
|
|
|
! Number of stations
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nd48_menu:4' )
|
|
READ( SUBSTRS(1:N), * ) N_STA
|
|
|
|
! Initialize
|
|
IARR(:) = 0
|
|
JARR(:) = 0
|
|
LARR(:) = 0
|
|
NARR(:) = 0
|
|
|
|
! Read individual stations
|
|
DO S = 1, N_STA
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 4, 'read_nd48_menu:5' )
|
|
READ( SUBSTRS(1), * ) IARR(S)
|
|
READ( SUBSTRS(2), * ) JARR(S)
|
|
READ( SUBSTRS(3), * ) LARR(S)
|
|
READ( SUBSTRS(4), * ) NARR(S)
|
|
ENDDO
|
|
|
|
!=================================================================
|
|
! Print to screen
|
|
!=================================================================
|
|
WRITE( 6, '(/,a)' ) 'ND48 STATION TIMESERIES MENU'
|
|
WRITE( 6, '( a)' ) '----------------------------'
|
|
WRITE( 6, 100 ) 'Turn on ND48 timeseries? : ', DO_ND48
|
|
WRITE( 6, 110 ) 'ND48 timeseries file name : ', TRIM( FILE )
|
|
WRITE( 6, 120 ) 'ND48 save frequency [min] : ', FREQ
|
|
|
|
DO S = 1, N_STA
|
|
WRITE( 6, 130 ) S, IARR(S), JARR(S), LARR(S), NARR(S)
|
|
ENDDO
|
|
|
|
! FORMAT statements
|
|
100 FORMAT( A, L5 )
|
|
110 FORMAT( A, A )
|
|
120 FORMAT( A, I5 )
|
|
130 FORMAT( 'ND48 timeseries station', i4, ' : ', 4i5 )
|
|
|
|
!=================================================================
|
|
! Call setup routines from other F90 modules
|
|
!=================================================================
|
|
|
|
! Initialize for ND48 timeseries
|
|
CALL INIT_DIAG48( DO_ND48, FREQ, N_STA, IARR,
|
|
& JARR, LARR, NARR, FILE )
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE READ_ND48_MENU
|
|
|
|
!-----------------------------------------------------------------------------
|
|
|
|
SUBROUTINE READ_ND49_MENU
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine READ_ND49_MENU reads the ND49 MENU section of the GEOS-CHEM
|
|
! input file. (bmy, 7/20/04)
|
|
!
|
|
! NOTES:
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE DIAG49_MOD, ONLY : INIT_DIAG49
|
|
USE ERROR_MOD, ONLY : ERROR_STOP
|
|
|
|
# include "CMN_SIZE" ! Size parameters
|
|
|
|
! Local variables
|
|
LOGICAL :: DO_ND49
|
|
INTEGER :: N, I, AS
|
|
INTEGER :: ND49, N_TRACERS, TRACERS(100)
|
|
INTEGER :: IMIN, IMAX, FREQ
|
|
INTEGER :: JMIN, JMAX, N_ND49
|
|
INTEGER :: LMIN, LMAX
|
|
CHARACTER(LEN=255) :: SUBSTRS(MAXDIM), MSG
|
|
CHARACTER(LEN=255) :: FILE
|
|
|
|
!=================================================================
|
|
! READ_ND49_MENU begins here!
|
|
!=================================================================
|
|
|
|
! Error check
|
|
IF ( CT1 /= 2 ) THEN
|
|
MSG = 'SIMULATION MENU & TRACER MENU must be read in first!'
|
|
CALL ERROR_STOP( MSG, 'READ_ND49_MENU ("input_mod.f")' )
|
|
ENDIF
|
|
|
|
! Initialize
|
|
ND49 = 0
|
|
TRACERS(:) = 0
|
|
|
|
! Turn on ND49 diagnostic
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nd49_menu:1' )
|
|
READ( SUBSTRS(1:N), * ) DO_ND49
|
|
|
|
! Instantaneous 3-D timeseries file
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nd49_menu:2' )
|
|
READ( SUBSTRS(1:N), '(a)' ) FILE
|
|
|
|
! Tracers to include
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N_ND49, -1, 'read_nd49_menu:3' )
|
|
DO N = 1, N_ND49
|
|
READ( SUBSTRS(N), * ) TRACERS(N)
|
|
ENDDO
|
|
|
|
! FREQ
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nd49_menu:4' )
|
|
READ( SUBSTRS(1:N), * ) FREQ
|
|
|
|
! IMIN, IMAX
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 2, 'read_nd49_menu:5' )
|
|
READ( SUBSTRS(1:N), * ) IMIN, IMAX
|
|
|
|
! JMIN, JMAX
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 2, 'read_nd49_menu:6' )
|
|
READ( SUBSTRS(1:N), * ) JMIN, JMAX
|
|
|
|
! LMIN, LMAX
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 2, 'read_nd49_menu:7' )
|
|
READ( SUBSTRS(1:N), * ) LMIN, LMAX
|
|
|
|
! Separator line
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nd49_menu:8' )
|
|
|
|
!=================================================================
|
|
! Print to screen
|
|
!=================================================================
|
|
WRITE( 6, '(/,a)' ) 'ND49 3-D INSTANTANEOUS TIMESERIES MENU'
|
|
WRITE( 6, '( a)' ) '--------------------------------------'
|
|
WRITE( 6, 100 ) 'Turn on ND49 timeseries? : ', DO_ND49
|
|
WRITE( 6, 110 ) 'ND49 timeseries file name : ', TRIM( FILE )
|
|
WRITE( 6, 120 ) 'ND49 timeseries tracers : ',
|
|
& ( TRACERS(N), N=1, N_ND49 )
|
|
WRITE( 6, 130 ) 'ND49 save frequency [min] : ', FREQ
|
|
WRITE( 6, 130 ) 'ND49 longitude limits : ', IMIN, IMAX
|
|
WRITE( 6, 130 ) 'ND49 latitude limits : ', JMIN, JMAX
|
|
WRITE( 6, 130 ) 'ND49 level limits : ', LMIN, LMAX
|
|
|
|
! FORMAT statements
|
|
100 FORMAT( A, L5 )
|
|
110 FORMAT( A, A )
|
|
120 FORMAT( A, 100I3 )
|
|
130 FORMAT( A, 2I5 )
|
|
|
|
!=================================================================
|
|
! Call setup routines from other F90 modules
|
|
!=================================================================
|
|
|
|
! Initialize for ND49 timeseries
|
|
CALL INIT_DIAG49( DO_ND49, N_ND49, TRACERS, IMIN,
|
|
& IMAX, JMIN, JMAX, LMIN,
|
|
& LMAX, FREQ, FILE )
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE READ_ND49_MENU
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE READ_ND50_MENU
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine READ_ND50_MENU reads the ND50 MENU section of the GEOS-CHEM
|
|
! input file. (bmy, 7/20/04)
|
|
!
|
|
! NOTES:
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE DIAG50_MOD, ONLY : INIT_DIAG50
|
|
USE ERROR_MOD, ONLY : ERROR_STOP
|
|
|
|
! Local variables
|
|
LOGICAL :: DO_ND50
|
|
INTEGER :: N, I, AS
|
|
INTEGER :: N_ND50, IMIN, IMAX, TRACERS(100)
|
|
INTEGER :: JMIN, JMAX, LMIN, LMAX
|
|
CHARACTER(LEN=255) :: SUBSTRS(MAXDIM), MSG
|
|
CHARACTER(LEN=255) :: FILE
|
|
|
|
!=================================================================
|
|
! READ_ND50_MENU begins here!
|
|
!=================================================================
|
|
|
|
! Error check
|
|
IF ( CT1 /= 2 ) THEN
|
|
MSG = 'SIMULATION MENU & TRACER MENU must be read in first!'
|
|
CALL ERROR_STOP( MSG, 'READ_ND50_MENU ("input_mod.f")' )
|
|
ENDIF
|
|
|
|
! Initialize
|
|
TRACERS(:) = 0
|
|
|
|
! Turn on ND49 diagnostic
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nd50_menu:1' )
|
|
READ( SUBSTRS(1:N), * ) DO_ND50
|
|
|
|
! Instantaneous 3-D timeseries file
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nd50_menu:2' )
|
|
READ( SUBSTRS(1:N), '(a)' ) FILE
|
|
|
|
! Tracers to include
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N_ND50, -1, 'read_nd50_menu:3' )
|
|
DO N = 1, N_ND50
|
|
READ( SUBSTRS(N), * ) TRACERS(N)
|
|
ENDDO
|
|
|
|
! IMIN, IMAX
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 2, 'read_nd50_menu:4' )
|
|
READ( SUBSTRS(1:N), * ) IMIN, IMAX
|
|
|
|
! JMIN, JMAX
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 2, 'read_nd50_menu:5' )
|
|
READ( SUBSTRS(1:N), * ) JMIN, JMAX
|
|
|
|
! LMIN, LMAX
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 2, 'read_nd50_menu:6' )
|
|
READ( SUBSTRS(1:N), * ) LMIN, LMAX
|
|
|
|
! Separator line
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nd50_menu:7' )
|
|
|
|
!=================================================================
|
|
! Print to screen
|
|
!=================================================================
|
|
WRITE( 6, '(/,a)' ) 'ND50 3-D 24hr AVG TIMESERIES MENU'
|
|
WRITE( 6, '( a)' ) '---------------------------------'
|
|
WRITE( 6, 100 ) 'Turn on ND50 timeseries? : ', DO_ND50
|
|
WRITE( 6, 110 ) 'ND50 timeseries file name : ', TRIM( FILE )
|
|
WRITE( 6, 120 ) 'ND50 timeseries tracers : ',
|
|
& ( TRACERS(N), N=1, N_ND50 )
|
|
WRITE( 6, 130 ) 'ND50 longitude limits : ', IMIN, IMAX
|
|
WRITE( 6, 130 ) 'ND50 latitude limits : ', JMIN, JMAX
|
|
WRITE( 6, 130 ) 'ND50 level limits : ', LMIN, LMAX
|
|
|
|
! FORMAT statements
|
|
100 FORMAT( A, L5 )
|
|
110 FORMAT( A, A )
|
|
120 FORMAT( A, 100I3 )
|
|
130 FORMAT( A, 2I5 )
|
|
|
|
!=================================================================
|
|
! Call setup routines from other F90 modules
|
|
!=================================================================
|
|
|
|
! Initialize parameters for ND49 timeseries
|
|
CALL INIT_DIAG50( DO_ND50, N_ND50, TRACERS, IMIN, IMAX,
|
|
& JMIN, JMAX, LMIN, LMAX, FILE )
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE READ_ND50_MENU
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE READ_ND51_MENU
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine READ_ND51_MENU reads the ND51 MENU section of the GEOS-CHEM
|
|
! input file. (bmy, 7/20/04)
|
|
!
|
|
! NOTES:
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE DIAG51_MOD, ONLY : INIT_DIAG51
|
|
USE ERROR_MOD, ONLY : ERROR_STOP
|
|
|
|
# include "CMN_SIZE" ! Size parameters
|
|
# include "CMN_DIAG" ! NDxx flags
|
|
|
|
! Local variables
|
|
LOGICAL :: DO_ND51
|
|
INTEGER :: N, I, AS
|
|
INTEGER :: N_ND51, FREQ, TRACERS(100)
|
|
INTEGER :: IMIN, IMAX, JMIN
|
|
INTEGER :: JMAX, LMIN, LMAX
|
|
REAL*8 :: HR1, HR2, HR_WRITE
|
|
CHARACTER(LEN=255) :: SUBSTRS(MAXDIM), MSG
|
|
CHARACTER(LEN=255) :: FILE
|
|
|
|
!=================================================================
|
|
! READ_ND51_MENU begins here!
|
|
!=================================================================
|
|
|
|
! Error check
|
|
IF ( CT1 /= 2 ) THEN
|
|
MSG = 'SIMULATION MENU & TRACER MENU must be read in first!'
|
|
CALL ERROR_STOP( MSG, 'READ_ND51_MENU ("input_mod.f")' )
|
|
ENDIF
|
|
|
|
! Initialize
|
|
TRACERS(:) = 0
|
|
|
|
! Turn on ND51 diagnostic
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nd51_menu:1' )
|
|
READ( SUBSTRS(1:N), * ) DO_ND51
|
|
|
|
! Instantaneous 3-D timeseries file
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nd51_menu:2' )
|
|
READ( SUBSTRS(1:N), '(a)' ) FILE
|
|
|
|
! Tracers to include
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N_ND51, -1, 'read_nd51_menu:3' )
|
|
DO N = 1, N_ND51
|
|
READ( SUBSTRS(N), * ) TRACERS(N)
|
|
ENDDO
|
|
|
|
! NHMS_WRITE
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nd51_menu:4' )
|
|
READ( SUBSTRS(1:N), * ) HR_WRITE
|
|
|
|
! HR1, HR2
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 2, 'read_nd51_menu:5' )
|
|
READ( SUBSTRS(1:N), * ) HR1, HR2
|
|
|
|
! IMIN, IMAX
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 2, 'read_nd51_menu:6' )
|
|
READ( SUBSTRS(1:N), * ) IMIN, IMAX
|
|
|
|
! JMIN, JMAX
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 2, 'read_nd51_menu:7' )
|
|
READ( SUBSTRS(1:N), * ) JMIN, JMAX
|
|
|
|
! LMIN, LMAX
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 2, 'read_nd51_menu:8' )
|
|
READ( SUBSTRS(1:N), * ) LMIN, LMAX
|
|
|
|
! Separator line
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nd51_menu:9' )
|
|
|
|
!=================================================================
|
|
! Print to screen
|
|
!=================================================================
|
|
WRITE( 6, '(/,a)' ) 'ND51 MORNING OR AFTERNOON TIMESERIES MENU'
|
|
WRITE( 6, '( a)' ) '-----------------------------------------'
|
|
WRITE( 6, 100 ) 'Turn on ND51 timeseries? : ', DO_ND51
|
|
WRITE( 6, 110 ) 'ND51 timeseries file name : ', TRIM( FILE )
|
|
WRITE( 6, 120 ) 'ND41 timeseries tracers : ',
|
|
& ( TRACERS(N), N=1, N_ND51 )
|
|
WRITE( 6, 140 ) 'ND51 hour to write to disk : ', HR_WRITE
|
|
WRITE( 6, 140 ) 'ND51 averaging period [GMT] : ', HR1, HR2
|
|
WRITE( 6, 130 ) 'ND51 longitude limits : ', IMIN, IMAX
|
|
WRITE( 6, 130 ) 'ND51 latitude limits : ', JMIN, JMAX
|
|
WRITE( 6, 130 ) 'ND51 altitude limits : ', LMIN, LMAX
|
|
|
|
! FORMAT statements
|
|
100 FORMAT( A, L5 )
|
|
110 FORMAT( A, A )
|
|
120 FORMAT( A, 100I3 )
|
|
130 FORMAT( A, 2I5 )
|
|
140 FORMAT( A, 2F5.1 )
|
|
|
|
!=================================================================
|
|
! Call setup routine from other F90 modules
|
|
!=================================================================
|
|
|
|
! Initialize parameters for ND51 timeseries
|
|
CALL INIT_DIAG51( DO_ND51, N_ND51, TRACERS, HR_WRITE,
|
|
& HR1, HR2, IMIN, IMAX,
|
|
& JMIN, JMAX, LMIN, LMAX, FILE )
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE READ_ND51_MENU
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE READ_ND51b_MENU
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine READ_ND51_MENU reads the ND51 MENU section of the GEOS-CHEM
|
|
! input file. (bmy, 7/20/04)
|
|
!
|
|
! NOTES:
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE DIAG51b_MOD, ONLY : INIT_DIAG51b
|
|
USE ERROR_MOD, ONLY : ERROR_STOP
|
|
|
|
# include "CMN_SIZE" ! Size parameters
|
|
# include "CMN_DIAG" ! NDxx flags
|
|
|
|
! Local variables
|
|
LOGICAL :: DO_ND51
|
|
INTEGER :: N, I, AS
|
|
INTEGER :: N_ND51, FREQ, TRACERS(100)
|
|
INTEGER :: IMIN, IMAX, JMIN
|
|
INTEGER :: JMAX, LMIN, LMAX
|
|
REAL*8 :: HR1, HR2, HR_WRITE
|
|
CHARACTER(LEN=255) :: SUBSTRS(MAXDIM), MSG
|
|
CHARACTER(LEN=255) :: FILE
|
|
|
|
!=================================================================
|
|
! READ_ND51_MENU begins here!
|
|
!=================================================================
|
|
|
|
! Error check
|
|
IF ( CT1 /= 2 ) THEN
|
|
MSG = 'SIMULATION MENU & TRACER MENU must be read in first!'
|
|
CALL ERROR_STOP( MSG, 'READ_ND51b_MENU ("input_mod.f")' )
|
|
ENDIF
|
|
|
|
! Initialize
|
|
TRACERS(:) = 0
|
|
|
|
! Turn on ND51 diagnostic
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nd51b_menu:1' )
|
|
READ( SUBSTRS(1:N), * ) DO_ND51
|
|
|
|
! Instantaneous 3-D timeseries file
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nd51b_menu:2' )
|
|
READ( SUBSTRS(1:N), '(a)' ) FILE
|
|
|
|
! Tracers to include
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N_ND51, -1, 'read_nd51b_menu:3' )
|
|
DO N = 1, N_ND51
|
|
READ( SUBSTRS(N), * ) TRACERS(N)
|
|
ENDDO
|
|
|
|
! NHMS_WRITE
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nd51b_menu:4' )
|
|
READ( SUBSTRS(1:N), * ) HR_WRITE
|
|
|
|
! HR1, HR2
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 2, 'read_nd51b_menu:5' )
|
|
READ( SUBSTRS(1:N), * ) HR1, HR2
|
|
|
|
! IMIN, IMAX
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 2, 'read_nd51b_menu:6' )
|
|
READ( SUBSTRS(1:N), * ) IMIN, IMAX
|
|
|
|
! JMIN, JMAX
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 2, 'read_nd51b_menu:7' )
|
|
READ( SUBSTRS(1:N), * ) JMIN, JMAX
|
|
|
|
! LMIN, LMAX
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 2, 'read_nd51b_menu:8' )
|
|
READ( SUBSTRS(1:N), * ) LMIN, LMAX
|
|
|
|
! Separator line
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nd51b_menu:9' )
|
|
|
|
!=================================================================
|
|
! Print to screen
|
|
!=================================================================
|
|
WRITE( 6, '(/,a)' ) 'ND51b MORNING OR AFTERNOON TIMESERIES MENU'
|
|
WRITE( 6, '( a)' ) '-----------------------------------------'
|
|
WRITE( 6, 100 ) 'Turn on ND51b timeseries? : ', DO_ND51
|
|
WRITE( 6, 110 ) 'ND51 timeseries file name : ', TRIM( FILE )
|
|
WRITE( 6, 120 ) 'ND41 timeseries tracers : ',
|
|
& ( TRACERS(N), N=1, N_ND51 )
|
|
WRITE( 6, 140 ) 'ND51 hour to write to disk : ', HR_WRITE
|
|
WRITE( 6, 140 ) 'ND51 averaging period [GMT] : ', HR1, HR2
|
|
WRITE( 6, 130 ) 'ND51 longitude limits : ', IMIN, IMAX
|
|
WRITE( 6, 130 ) 'ND51 latitude limits : ', JMIN, JMAX
|
|
WRITE( 6, 130 ) 'ND51 altitude limits : ', LMIN, LMAX
|
|
|
|
! FORMAT statements
|
|
100 FORMAT( A, L5 )
|
|
110 FORMAT( A, A )
|
|
120 FORMAT( A, 100I3 )
|
|
130 FORMAT( A, 2I5 )
|
|
140 FORMAT( A, 2F5.1 )
|
|
|
|
!=================================================================
|
|
! Call setup routine from other F90 modules
|
|
!=================================================================
|
|
|
|
! Initialize parameters for ND51 timeseries
|
|
CALL INIT_DIAG51b( DO_ND51, N_ND51, TRACERS, HR_WRITE,
|
|
& HR1, HR2, IMIN, IMAX,
|
|
& JMIN, JMAX, LMIN, LMAX, FILE )
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE READ_ND51b_MENU
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE READ_ND51c_MENU
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine READ_ND51_MENU reads the ND51 MENU section of the GEOS-CHEM
|
|
! input file. (bmy, 7/20/04)
|
|
!
|
|
! NOTES:
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE DIAG51c_MOD, ONLY : INIT_DIAG51c
|
|
USE ERROR_MOD, ONLY : ERROR_STOP
|
|
|
|
# include "CMN_SIZE" ! Size parameters
|
|
# include "CMN_DIAG" ! NDxx flags
|
|
|
|
! Local variables
|
|
LOGICAL :: DO_ND51
|
|
INTEGER :: N, I, AS
|
|
INTEGER :: N_ND51, FREQ, TRACERS(100)
|
|
INTEGER :: IMIN, IMAX, JMIN
|
|
INTEGER :: JMAX, LMIN, LMAX
|
|
REAL*8 :: HR1, HR2, HR_WRITE
|
|
CHARACTER(LEN=255) :: SUBSTRS(MAXDIM), MSG
|
|
CHARACTER(LEN=255) :: FILE
|
|
|
|
!=================================================================
|
|
! READ_ND51_MENU begins here!
|
|
!=================================================================
|
|
|
|
! Error check
|
|
IF ( CT1 /= 2 ) THEN
|
|
MSG = 'SIMULATION MENU & TRACER MENU must be read in first!'
|
|
CALL ERROR_STOP( MSG, 'READ_ND51c_MENU ("input_mod.f")' )
|
|
ENDIF
|
|
|
|
! Initialize
|
|
TRACERS(:) = 0
|
|
|
|
! Turn on ND51 diagnostic
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nd51c_menu:1' )
|
|
READ( SUBSTRS(1:N), * ) DO_ND51
|
|
|
|
! Instantaneous 3-D timeseries file
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nd51c_menu:2' )
|
|
READ( SUBSTRS(1:N), '(a)' ) FILE
|
|
|
|
! Tracers to include
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N_ND51, -1, 'read_nd51c_menu:3' )
|
|
DO N = 1, N_ND51
|
|
READ( SUBSTRS(N), * ) TRACERS(N)
|
|
ENDDO
|
|
|
|
! NHMS_WRITE
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nd51c_menu:4' )
|
|
READ( SUBSTRS(1:N), * ) HR_WRITE
|
|
|
|
! HR1, HR2
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 2, 'read_nd51c_menu:5' )
|
|
READ( SUBSTRS(1:N), * ) HR1, HR2
|
|
|
|
! IMIN, IMAX
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 2, 'read_nd51c_menu:6' )
|
|
READ( SUBSTRS(1:N), * ) IMIN, IMAX
|
|
|
|
! JMIN, JMAX
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 2, 'read_nd51c_menu:7' )
|
|
READ( SUBSTRS(1:N), * ) JMIN, JMAX
|
|
|
|
! LMIN, LMAX
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 2, 'read_nd51c_menu:8' )
|
|
READ( SUBSTRS(1:N), * ) LMIN, LMAX
|
|
|
|
! Separator line
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nd51c_menu:9' )
|
|
|
|
!=================================================================
|
|
! Print to screen
|
|
!=================================================================
|
|
WRITE( 6, '(/,a)' ) 'ND51c MORNING OR AFTERNOON TIMESERIES MENU'
|
|
WRITE( 6, '( a)' ) '-----------------------------------------'
|
|
WRITE( 6, 100 ) 'Turn on ND51c timeseries? : ', DO_ND51
|
|
WRITE( 6, 110 ) 'ND51 timeseries file name : ', TRIM( FILE )
|
|
WRITE( 6, 120 ) 'ND41 timeseries tracers : ',
|
|
& ( TRACERS(N), N=1, N_ND51 )
|
|
WRITE( 6, 140 ) 'ND51 hour to write to disk : ', HR_WRITE
|
|
WRITE( 6, 140 ) 'ND51 averaging period [GMT] : ', HR1, HR2
|
|
WRITE( 6, 130 ) 'ND51 longitude limits : ', IMIN, IMAX
|
|
WRITE( 6, 130 ) 'ND51 latitude limits : ', JMIN, JMAX
|
|
WRITE( 6, 130 ) 'ND51 altitude limits : ', LMIN, LMAX
|
|
|
|
! FORMAT statements
|
|
100 FORMAT( A, L5 )
|
|
110 FORMAT( A, A )
|
|
120 FORMAT( A, 100I3 )
|
|
130 FORMAT( A, 2I5 )
|
|
140 FORMAT( A, 2F5.1 )
|
|
|
|
!=================================================================
|
|
! Call setup routine from other F90 modules
|
|
!=================================================================
|
|
|
|
! Initialize parameters for ND51 timeseries
|
|
CALL INIT_DIAG51c( DO_ND51, N_ND51, TRACERS, HR_WRITE,
|
|
& HR1, HR2, IMIN, IMAX,
|
|
& JMIN, JMAX, LMIN, LMAX, FILE )
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE READ_ND51c_MENU
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE READ_ND51d_MENU
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine READ_ND51_MENU reads the ND51 MENU section of the GEOS-CHEM
|
|
! input file. (bmy, 7/20/04)
|
|
!
|
|
! NOTES:
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE DIAG51d_MOD, ONLY : INIT_DIAG51d
|
|
USE ERROR_MOD, ONLY : ERROR_STOP
|
|
|
|
# include "CMN_SIZE" ! Size parameters
|
|
# include "CMN_DIAG" ! NDxx flags
|
|
|
|
! Local variables
|
|
LOGICAL :: DO_ND51
|
|
INTEGER :: N, I, AS
|
|
INTEGER :: N_ND51, FREQ, TRACERS(100)
|
|
INTEGER :: IMIN, IMAX, JMIN
|
|
INTEGER :: JMAX, LMIN, LMAX
|
|
REAL*8 :: HR1, HR2, HR_WRITE
|
|
CHARACTER(LEN=255) :: SUBSTRS(MAXDIM), MSG
|
|
CHARACTER(LEN=255) :: FILE
|
|
|
|
!=================================================================
|
|
! READ_ND51_MENU begins here!
|
|
!=================================================================
|
|
|
|
! Error check
|
|
IF ( CT1 /= 2 ) THEN
|
|
MSG = 'SIMULATION MENU & TRACER MENU must be read in first!'
|
|
CALL ERROR_STOP( MSG, 'READ_ND51d_MENU ("input_mod.f")' )
|
|
ENDIF
|
|
|
|
! Initialize
|
|
TRACERS(:) = 0
|
|
|
|
! Turn on ND51 diagnostic
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nd51d_menu:1' )
|
|
READ( SUBSTRS(1:N), * ) DO_ND51
|
|
|
|
! Instantaneous 3-D timeseries file
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nd51d_menu:2' )
|
|
READ( SUBSTRS(1:N), '(a)' ) FILE
|
|
|
|
! Tracers to include
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N_ND51, -1, 'read_nd51d_menu:3' )
|
|
DO N = 1, N_ND51
|
|
READ( SUBSTRS(N), * ) TRACERS(N)
|
|
ENDDO
|
|
|
|
! NHMS_WRITE
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nd51d_menu:4' )
|
|
READ( SUBSTRS(1:N), * ) HR_WRITE
|
|
|
|
! HR1, HR2
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 2, 'read_nd51d_menu:5' )
|
|
READ( SUBSTRS(1:N), * ) HR1, HR2
|
|
|
|
! IMIN, IMAX
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 2, 'read_nd51d_menu:6' )
|
|
READ( SUBSTRS(1:N), * ) IMIN, IMAX
|
|
|
|
! JMIN, JMAX
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 2, 'read_nd51d_menu:7' )
|
|
READ( SUBSTRS(1:N), * ) JMIN, JMAX
|
|
|
|
! LMIN, LMAX
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 2, 'read_nd51d_menu:8' )
|
|
READ( SUBSTRS(1:N), * ) LMIN, LMAX
|
|
|
|
! Separator line
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nd51d_menu:9' )
|
|
|
|
!=================================================================
|
|
! Print to screen
|
|
!=================================================================
|
|
WRITE( 6, '(/,a)' ) 'ND51d MORNING OR AFTERNOON TIMESERIES MENU'
|
|
WRITE( 6, '( a)' ) '-----------------------------------------'
|
|
WRITE( 6, 100 ) 'Turn on ND51d timeseries? : ', DO_ND51
|
|
WRITE( 6, 110 ) 'ND51 timeseries file name : ', TRIM( FILE )
|
|
WRITE( 6, 120 ) 'ND41 timeseries tracers : ',
|
|
& ( TRACERS(N), N=1, N_ND51 )
|
|
WRITE( 6, 140 ) 'ND51 hour to write to disk : ', HR_WRITE
|
|
WRITE( 6, 140 ) 'ND51 averaging period [GMT] : ', HR1, HR2
|
|
WRITE( 6, 130 ) 'ND51 longitude limits : ', IMIN, IMAX
|
|
WRITE( 6, 130 ) 'ND51 latitude limits : ', JMIN, JMAX
|
|
WRITE( 6, 130 ) 'ND51 altitude limits : ', LMIN, LMAX
|
|
|
|
! FORMAT statements
|
|
100 FORMAT( A, L5 )
|
|
110 FORMAT( A, A )
|
|
120 FORMAT( A, 100I3 )
|
|
130 FORMAT( A, 2I5 )
|
|
140 FORMAT( A, 2F5.1 )
|
|
|
|
!=================================================================
|
|
! Call setup routine from other F90 modules
|
|
!=================================================================
|
|
|
|
! Initialize parameters for ND51 timeseries
|
|
CALL INIT_DIAG51d( DO_ND51, N_ND51, TRACERS, HR_WRITE,
|
|
& HR1, HR2, IMIN, IMAX,
|
|
& JMIN, JMAX, LMIN, LMAX, FILE )
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE READ_ND51d_MENU
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE READ_PROD_LOSS_MENU
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine READ_PROD_LOSS_MENU reads the PROD & LOSS MENU section of the
|
|
! GEOS-CHEM input file (bmy, 7/20/04, 10/29/04)
|
|
!
|
|
! NOTES:
|
|
! (1 ) Bug fixes. Only error check # of prod/loss families for TagOx and
|
|
! TagCO runs if DO_SAVE_PL=T. Also turn off this diagnostic for
|
|
! the offline aerosol run. (bmy, 10/29/04)
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE CHARPAK_MOD, ONLY : ISDIGIT, STRSPLIT
|
|
USE DIAG_PL_MOD, ONLY : INIT_DIAG_PL
|
|
USE ERROR_MOD, ONLY : ERROR_STOP
|
|
USE TRACER_MOD, ONLY : N_TRACERS, ITS_A_TAGCO_SIM
|
|
USE TRACER_MOD, ONLY : ITS_A_TAGOX_SIM, ITS_AN_AEROSOL_SIM
|
|
|
|
# include "CMN_SIZE" ! MAXFAM
|
|
# include "CMN_DIAG" ! ND65
|
|
|
|
! Local variables
|
|
LOGICAL :: EOF, DO_SAVE_PL, DO_SAVE_O3
|
|
INTEGER, PARAMETER :: MAXMEM=10
|
|
INTEGER :: F, M, N, NFAM
|
|
INTEGER :: FAM_NMEM(MAXFAM)
|
|
REAL*8 :: FAM_COEF(MAXMEM,MAXFAM)
|
|
CHARACTER(LEN=14 ) :: FAM_NAME(MAXFAM)
|
|
CHARACTER(LEN=14 ) :: FAM_TYPE(MAXFAM)
|
|
CHARACTER(LEN=14 ) :: FAM_MEMB(MAXMEM,MAXFAM)
|
|
CHARACTER(LEN=255) :: LOCATION, NAME
|
|
CHARACTER(LEN=255) :: SUBSTRS(MAXDIM), MSG
|
|
|
|
!=================================================================
|
|
! READ_PROD_LOSS_MENU begins here!
|
|
!=================================================================
|
|
|
|
! Location string
|
|
LOCATION = 'READ_PROD_LOSS_MENU ("input_mod.f")'
|
|
|
|
! Error check
|
|
IF ( CT1 /= 2 ) THEN
|
|
MSG = 'SIMULATION MENU & TRACER MENU must be read in first!'
|
|
CALL ERROR_STOP( MSG, LOCATION )
|
|
ENDIF
|
|
|
|
! Initialize
|
|
FAM_NAME(:) = ''
|
|
FAM_TYPE(:) = ''
|
|
FAM_NMEM(:) = 0
|
|
FAM_MEMB(:,:) = ''
|
|
FAM_COEF(:,:) = 0d0
|
|
|
|
!=================================================================
|
|
! Read info about prod & loss families
|
|
!=================================================================
|
|
|
|
! Turn on production & loss diagnostic (e.g. ND65 diagnostic)
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_prod_loss_menu:1' )
|
|
READ( SUBSTRS(1:N), * ) DO_SAVE_PL
|
|
|
|
! Read number of levels for ND65 diagnostic
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_prod_loss_menu:2' )
|
|
READ( SUBSTRS(1:N), * ) ND65
|
|
|
|
! Save P(O3) & L(O3) for tagged Ox run? (i.e. ND20 diagnostic)
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_prod_loss_menu:3' )
|
|
READ( SUBSTRS(1:N), * ) DO_SAVE_O3
|
|
|
|
! Read number of families
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_prod_loss_menu:4' )
|
|
READ( SUBSTRS(1:N), * ) NFAM
|
|
|
|
! Loop over families
|
|
DO F = 1, NFAM
|
|
|
|
! Get family members
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, -1, 'read_prod_loss_menu:5' )
|
|
|
|
! The first entry is the family name (strip colon at end)
|
|
NAME = SUBSTRS(1)
|
|
FAM_NAME(F) = NAME( 1:LEN_TRIM( NAME )-1 )
|
|
|
|
! Get family type as prod or loss
|
|
IF ( FAM_NAME(F)(1:1) == 'P' .or.
|
|
& FAM_NAME(F)(1:1) == 'p' ) THEN
|
|
FAM_TYPE(F) = 'prod'
|
|
ELSE
|
|
FAM_TYPE(F) = 'loss'
|
|
ENDIF
|
|
|
|
! Number of member species in this prodloss family
|
|
FAM_NMEM(F) = N - 1
|
|
|
|
! Loop over substrings
|
|
DO M = 1, N-1
|
|
|
|
! Family member name
|
|
NAME = TRIM( SUBSTRS(M+1) )
|
|
|
|
! Family member coefficient (set to 1 for now)
|
|
FAM_COEF(M,F) = 1d0
|
|
|
|
! If first char is a digit ...
|
|
IF ( ISDIGIT( NAME(1:1) ) ) THEN
|
|
|
|
! Save new family coefficient
|
|
READ( NAME(1:1), * ) FAM_COEF(M,F)
|
|
|
|
! Get the rest of the member name (skip digit)
|
|
NAME = NAME( 2:LEN_TRIM(NAME) )
|
|
ENDIF
|
|
|
|
! Family member name
|
|
FAM_MEMB(M,F) = NAME
|
|
ENDDO
|
|
ENDDO
|
|
|
|
! Separator line
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_prod_loss_menu:6' )
|
|
|
|
!=================================================================
|
|
! Error check families for certain types of simulations
|
|
!=================================================================
|
|
|
|
! Tagged Ox
|
|
IF ( DO_SAVE_PL .and. ITS_A_TAGOX_SIM() ) THEN
|
|
IF ( NFAM /= 2*N_TRACERS ) THEN
|
|
MSG = 'Wrong number of P/L families for Tagged Ox!'
|
|
CALL ERROR_STOP( MSG, LOCATION )
|
|
ENDIF
|
|
ENDIF
|
|
|
|
! Tagged CO
|
|
IF ( DO_SAVE_PL .and. ITS_A_TAGCO_SIM() ) THEN
|
|
IF ( NFAM /= N_TRACERS+5 ) THEN
|
|
MSG = 'Wrong number of P/L families for Tagged CO!'
|
|
CALL ERROR_STOP( MSG, LOCATION )
|
|
ENDIF
|
|
ENDIF
|
|
|
|
! Offline aerosol -- turn off DO_SAVE_PL, since we use ND05,
|
|
! ND06, ND07, ND08, ND13 etc diagnostics instead of ND65
|
|
IF ( ITS_AN_AEROSOL_SIM() ) THEN
|
|
DO_SAVE_PL = .FALSE.
|
|
DO_SAVE_O3 = .FALSE.
|
|
ND65 = 0
|
|
NFAM = 0
|
|
FAM_NAME(:) = ''
|
|
FAM_TYPE(:) = ''
|
|
FAM_NMEM(:) = 0
|
|
FAM_MEMB(:,:) = ''
|
|
FAM_COEF(:,:) = 0d0
|
|
ENDIF
|
|
|
|
!=================================================================
|
|
! Print to screen
|
|
!=================================================================
|
|
WRITE( 6, '(/,a)' ) 'PROD & LOSS DIAGNOSTIC MENU'
|
|
WRITE( 6, '( a)' ) '---------------------------'
|
|
WRITE( 6, 100 ) 'Turn on prod & loss diag? : ', DO_SAVE_PL
|
|
WRITE( 6, 110 ) '# of levels for P/L diag : ', ND65
|
|
WRITE( 6, 100 ) 'Save P(Ox), L(Ox) for TagOx?: ', DO_SAVE_O3
|
|
|
|
! Loop over families
|
|
DO F = 1, NFAM
|
|
|
|
! Write family name, type and # of members
|
|
WRITE( 6, 120 ) FAM_NAME(F), FAM_TYPE(F)
|
|
|
|
! Write info about each constituent member
|
|
DO M = 1, FAM_NMEM(F)
|
|
WRITE( 6, 130 ) M, FAM_COEF(M,F), FAM_MEMB(M,F)
|
|
ENDDO
|
|
ENDDO
|
|
|
|
! FORMAT statements
|
|
100 FORMAT( A, L5 )
|
|
110 FORMAT( A, I5 )
|
|
120 FORMAT( /, 'Family=', A5, ' Type=', a4 )
|
|
130 FORMAT( I3, 1X, F4.1, 1X, A5 )
|
|
|
|
!=================================================================
|
|
! Call setup routines from other F90 modules
|
|
!=================================================================
|
|
|
|
! Pass variables to "diag_pl_mod.f"
|
|
CALL INIT_DIAG_PL( DO_SAVE_PL, DO_SAVE_O3, NFAM, FAM_NAME,
|
|
& FAM_TYPE, FAM_NMEM, FAM_MEMB, FAM_COEF )
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE READ_PROD_LOSS_MENU
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE READ_UNIX_CMDS_MENU
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine READ_UNIX_CMDS_MENU reads the UNIX CMDS MENU section of the
|
|
! GEOS-CHEM input file. (bmy, 7/20/04, 10/3/05)
|
|
!
|
|
! NOTES:
|
|
! (1 ) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE CHARPAK_MOD, ONLY : STRSQUEEZE
|
|
USE UNIX_CMDS_MOD, ONLY : BACKGROUND, REDIRECT, REMOVE_CMD
|
|
USE UNIX_CMDS_MOD, ONLY : SEPARATOR, SPACE, UNZIP_CMD
|
|
USE UNIX_CMDS_MOD, ONLY : WILD_CARD, ZIP_SUFFIX
|
|
|
|
! Local variables
|
|
LOGICAL :: EOF
|
|
INTEGER :: N
|
|
CHARACTER(LEN=255) :: SUBSTRS(MAXDIM)
|
|
|
|
!=================================================================
|
|
! READ_UNIX_CMDS_MENU begins here!
|
|
!=================================================================
|
|
|
|
! Background
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_unix_cmds_menu:1' )
|
|
READ( SUBSTRS(1:N), '(a)' ) BACKGROUND
|
|
|
|
! Redirect
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_unix_cmds_menu:2' )
|
|
READ( SUBSTRS(1:N), '(a)' ) REDIRECT
|
|
|
|
! Remove command
|
|
REMOVE_CMD = READ_ONE_LINE( EOF, 'read_unix_cmds_menu:3' )
|
|
REMOVE_CMD = REMOVE_CMD(FIRSTCOL:)
|
|
CALL STRSQUEEZE( REMOVE_CMD )
|
|
|
|
! Separator
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_unix_cmds_menu:4' )
|
|
READ( SUBSTRS(1:N), '(a)' ) SEPARATOR
|
|
|
|
! Wild Card
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_unix_cmds_menu:5' )
|
|
READ( SUBSTRS(1:N), '(a)' ) WILD_CARD
|
|
|
|
! Unzip command
|
|
UNZIP_CMD = READ_ONE_LINE( EOF, 'read_unix_cmds_menu:6' )
|
|
UNZIP_CMD = UNZIP_CMD(FIRSTCOL:)
|
|
CALL STRSQUEEZE( UNZIP_CMD )
|
|
|
|
! Zip suffix
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_unix_cmds_menu:7' )
|
|
READ( SUBSTRS(1:N), '(a)' ) ZIP_SUFFIX
|
|
|
|
! Separator line
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_unix_cmds_menu:8' )
|
|
|
|
! Just hardwire the SPACE character
|
|
SPACE = ' '
|
|
|
|
!=================================================================
|
|
! Print to screen
|
|
!=================================================================
|
|
WRITE( 6, '(/,a)' ) 'UNIX CMDS MENU'
|
|
WRITE( 6, '( a)' ) '---------------'
|
|
WRITE( 6, 100 ) 'Unix BACKGROUND command : ',
|
|
& TRIM( BACKGROUND )
|
|
WRITE( 6, 100 ) 'Unix REDIRECT command : ',
|
|
& TRIM( REDIRECT )
|
|
WRITE( 6, 100 ) 'Unix REMOVE command : ',
|
|
& TRIM( REMOVE_CMD )
|
|
WRITE( 6, 100 ) 'Unix SEPARATOR command : ',
|
|
& TRIM( SEPARATOR )
|
|
WRITE( 6, 100 ) 'Unix WHITE SPACE command : ',
|
|
& TRIM( SPACE )
|
|
WRITE( 6, 100 ) 'Unix WILD CARD command : ',
|
|
& TRIM( WILD_CARD )
|
|
WRITE( 6, 100 ) 'Unix UNZIP command : ',
|
|
& TRIM( UNZIP_CMD )
|
|
|
|
! FORMAT statements
|
|
100 FORMAT( A, A )
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE READ_UNIX_CMDS_MENU
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE READ_NESTED_GRID_MENU
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine READ_NESTED_GRID_MENU reads the NESTED GRID MENU section of
|
|
! the GEOS-CHEM input file. (bmy, 7/20/04)
|
|
!
|
|
! NOTES:
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
c$$$ USE DIRECTORY_MOD, ONLY : TPBC_DIR
|
|
c$$$ USE LOGICAL_MOD, ONLY : LWINDO
|
|
USE DIRECTORY_MOD, ONLY : TPBC_DIR
|
|
USE DIRECTORY_MOD, ONLY : TPBC_DIR_NA, TPBC_DIR_EU
|
|
USE DIRECTORY_MOD, ONLY : TPBC_DIR_CH
|
|
USE LOGICAL_MOD, ONLY : LWINDO, LWINDO2x25
|
|
USE LOGICAL_MOD, ONLY : LWINDO_NA, LWINDO_EU, LWINDO_CH
|
|
USE LOGICAL_MOD, ONLY : LWINDO_CU
|
|
USE TPCORE_BC_MOD, ONLY : INIT_TPCORE_BC
|
|
USE TPCORE_BC_MOD, ONLY : INIT_TPCORE_BC_05x0666
|
|
|
|
|
|
! Local variables
|
|
INTEGER :: I0W, J0W, I1, I2, J1, J2, N, TS
|
|
CHARACTER(LEN=255) :: SUBSTRS(MAXDIM)
|
|
|
|
!=================================================================
|
|
! READ_NESTED_GRID_MENU begins here!
|
|
!=================================================================
|
|
|
|
! Save out TPCORE BC's at 4x5
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nested_grid_menu:1' )
|
|
READ( SUBSTRS(1:N), * ) LWINDO
|
|
|
|
c$$$ ! Directory where 4x5 TPCORE BC's are stored
|
|
c$$$ CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nested_grid_menu:2' )
|
|
c$$$ READ( SUBSTRS(1:N), '(a)' ) TPBC_DIR
|
|
c$$$
|
|
c$$$ ! Timestep for 4x5 TPCORE BC's
|
|
c$$$ CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nested_grid_menu:3' )
|
|
c$$$ READ( SUBSTRS(1:N), * ) TS
|
|
c$$$
|
|
c$$$ ! Lower left box
|
|
c$$$ CALL SPLIT_ONE_LINE( SUBSTRS, N, 2, 'read_nested_grid_menu:4' )
|
|
c$$$ READ( SUBSTRS(1:N), * ) I1, J1
|
|
c$$$
|
|
c$$$ ! Timestep for 4x5 TPCORE BC's
|
|
c$$$ CALL SPLIT_ONE_LINE( SUBSTRS, N, 2, 'read_nested_grid_menu:5' )
|
|
c$$$ READ( SUBSTRS(1:N), * ) I2, J2
|
|
c$$$
|
|
c$$$ ! 1x1 transport region offsets
|
|
c$$$ CALL SPLIT_ONE_LINE( SUBSTRS, N, 2, 'read_nested_grid_menu:6' )
|
|
c$$$ READ( SUBSTRS(1:N), * ) I0W, J0W
|
|
c$$$
|
|
c$$$ ! Separator line
|
|
c$$$ CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nested_grid_menu:7' )
|
|
|
|
|
|
! (lzh,02/01/2015) add 2x2.5 BC and nested domains
|
|
! Save out TPCORE BC's at 2x2.5?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nested_grid_menu:2' )
|
|
READ( SUBSTRS(1:N), * ) LWINDO2x25
|
|
|
|
! Save out TPCORE BC's over NA
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nested_grid_menu:3' )
|
|
READ( SUBSTRS(1:N), * ) LWINDO_NA
|
|
|
|
! Directory where NA TPCORE BC's are stored
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nested_grid_menu:4' )
|
|
READ( SUBSTRS(1:N), '(a)' ) TPBC_DIR_NA
|
|
|
|
! Save out TPCORE BC's over EU
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nested_grid_menu:5' )
|
|
READ( SUBSTRS(1:N), * ) LWINDO_EU
|
|
|
|
! Directory where EU TPCORE BC's are stored
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nested_grid_menu:6' )
|
|
READ( SUBSTRS(1:N), '(a)' ) TPBC_DIR_EU
|
|
|
|
! Save out TPCORE BC's over CH
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nested_grid_menu:7' )
|
|
READ( SUBSTRS(1:N), * ) LWINDO_CH
|
|
|
|
! Directory where CH TPCORE BC's are stored
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nested_grid_menu:8' )
|
|
READ( SUBSTRS(1:N), '(a)' ) TPBC_DIR_CH
|
|
|
|
! Save out TPCORE BC's over Custom Region
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nested_grid_menu:9' )
|
|
READ( SUBSTRS(1:N), * ) LWINDO_CU
|
|
|
|
! Directory where TPCORE BC's are stored
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nested_grid_menu:10' )
|
|
READ( SUBSTRS(1:N), '(a)' ) TPBC_DIR
|
|
|
|
! Timestep for 4x5 TPCORE BC's
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nested_grid_menu:11' )
|
|
READ( SUBSTRS(1:N), * ) TS
|
|
|
|
! Lower left box
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 2, 'read_nested_grid_menu:12' )
|
|
READ( SUBSTRS(1:N), * ) I1, J1
|
|
|
|
! Timestep for 4x5 TPCORE BC's
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 2, 'read_nested_grid_menu:13' )
|
|
READ( SUBSTRS(1:N), * ) I2, J2
|
|
|
|
! 1x1 transport region offsets
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 2, 'read_nested_grid_menu:14' )
|
|
READ( SUBSTRS(1:N), * ) I0W, J0W
|
|
|
|
! Separator line
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_nested_grid_menu:15' )
|
|
|
|
!=================================================================
|
|
! Print to screen
|
|
!=================================================================
|
|
WRITE( 6, '(/,a)' ) 'NESTED GRID MENU'
|
|
WRITE( 6, '( a)' ) '----------------'
|
|
WRITE( 6, 100 ) 'Save TPCORE BC''s at 4x5 : ',LWINDO
|
|
WRITE( 6, 110 ) 'Dir w/ archived OH files : ',
|
|
& TRIM( TPBC_DIR_CH )
|
|
WRITE( 6, 120 ) 'Timestep for 4x5 BC''s [min] : ', TS
|
|
WRITE( 6, 120 ) 'Bot left box of 4x5 BC area: ', I1, J1
|
|
WRITE( 6, 120 ) 'Top right box of 4x5 BC area: ', I2, J2
|
|
WRITE( 6, 120 ) '1 x 1 window offsets : ', I0W, J0W
|
|
|
|
! FORMAT statements
|
|
100 FORMAT( A, L5 )
|
|
110 FORMAT( A, A )
|
|
120 FORMAT( A, 2I5 )
|
|
|
|
!=================================================================
|
|
! Call setup routines from other F90 modules
|
|
!=================================================================
|
|
|
|
! Pass values to "tpcore_bc_mod.f"
|
|
CALL INIT_TPCORE_BC( TS, I0W, J0W, I1, J1, I2, J2 )
|
|
|
|
! adj_group: (zhej, dkh, 01/17/12, adj32_015)
|
|
CALL INIT_TPCORE_BC_05x0666
|
|
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE READ_NESTED_GRID_MENU
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE READ_BENCHMARK_MENU
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine READ_BENCHMARK_MENU reads the BENCHMARK MENU section of
|
|
! the GEOS-CHEM input file. (bmy, 7/20/04)
|
|
!
|
|
! NOTES:
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE BENCHMARK_MOD, ONLY : INITIAL_FILE, FINAL_FILE
|
|
USE LOGICAL_MOD, ONLY : LSTDRUN
|
|
|
|
! Local variables
|
|
INTEGER :: N
|
|
CHARACTER(LEN=255) :: SUBSTRS(MAXDIM)
|
|
|
|
!=================================================================
|
|
! READ_NESTED_GRID_MENU begins here!
|
|
!=================================================================
|
|
|
|
! Save benchmark diagnostic output?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_benchmark_menu:1' )
|
|
READ( SUBSTRS(1:N), * ) LSTDRUN
|
|
|
|
! Filename for initial tracer mass
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_benchmark_menu:2' )
|
|
READ( SUBSTRS(1:N), '(a)' ) INITIAL_FILE
|
|
|
|
! Filename for initial tracer mass
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_benchmark_menu:3' )
|
|
READ( SUBSTRS(1:N), '(a)' ) FINAL_FILE
|
|
|
|
! Separator line
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_benchmark_menu:4' )
|
|
|
|
!=================================================================
|
|
! Print to screen
|
|
!=================================================================
|
|
WRITE( 6, '(/,a)' ) 'BENCHMARK MENU'
|
|
WRITE( 6, '( a)' ) '--------------'
|
|
WRITE( 6, 100 ) 'Save benchmark diag output? : ', LSTDRUN
|
|
WRITE( 6, 110 ) 'File for initial tracer mass: ',
|
|
& TRIM( INITIAL_FILE )
|
|
WRITE( 6, 110 ) 'File for final tracer mass : ',
|
|
& TRIM( FINAL_FILE )
|
|
|
|
! FORMAT statements
|
|
100 FORMAT( A, L5 )
|
|
110 FORMAT( A, A )
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE READ_BENCHMARK_MENU
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE READ_ARCHIVED_OH_MENU
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine READ_ARCHIVED_OH_MENU reads the ARCHIVED OH MENU section of the
|
|
! GEOS-CHEM input file. (bmy, 7/20/04)
|
|
!
|
|
! NOTES:
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE DIRECTORY_MOD, ONLY : OH_DIR
|
|
|
|
! Local variables
|
|
INTEGER :: N
|
|
CHARACTER(LEN=255) :: SUBSTRS(MAXDIM)
|
|
|
|
!=================================================================
|
|
! READ_ARCHIVED_OH_MENU begins here!
|
|
!=================================================================
|
|
|
|
! Directory where offline OH files are stored
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_archived_oh_menu:1' )
|
|
READ( SUBSTRS(1:N), '(a)' ) OH_DIR
|
|
|
|
! Separator line
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_archived_oh_menu:1' )
|
|
|
|
!=================================================================
|
|
! Print to screen
|
|
!=================================================================
|
|
WRITE( 6, '(/,a)' ) 'ARCHIVED OH MENU'
|
|
WRITE( 6, '( a)' ) '-----------------'
|
|
WRITE( 6, 100 ) 'Dir w/ archived OH files : ', TRIM(OH_DIR)
|
|
|
|
! FORMAT statements
|
|
100 FORMAT( A, A )
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE READ_ARCHIVED_OH_MENU
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE READ_O3PL_MENU
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine READ_O3PL_MENU reads the O3 P/L MENU section of the
|
|
! GEOS-CHEM input file. (bmy, 7/20/04)
|
|
!
|
|
! NOTES:
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE DIRECTORY_MOD, ONLY : O3PL_DIR
|
|
|
|
! Local variables
|
|
INTEGER :: N
|
|
CHARACTER(LEN=255) :: SUBSTRS(MAXDIM)
|
|
|
|
!=================================================================
|
|
! READ_O3PL_MENU begins here!
|
|
!=================================================================
|
|
|
|
! Directory where archived P(O3) and L(O3) files are stored
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_archived_oh_menu:1' )
|
|
READ( SUBSTRS(1:N), '(a)' ) O3PL_DIR
|
|
|
|
! Separator line
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_archived_oh_menu:2' )
|
|
|
|
!=================================================================
|
|
! Print to screen
|
|
!=================================================================
|
|
WRITE( 6, '(/,a)' ) 'ARCHIVED O3PL MENU'
|
|
WRITE( 6, '( a)' ) '-------------------'
|
|
WRITE( 6, 100 ) 'Dir w/ archived O3 P/L files: ',
|
|
& TRIM( O3PL_DIR )
|
|
|
|
! FORMAT statements
|
|
100 FORMAT( A, A )
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE READ_O3PL_MENU
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE READ_MERCURY_MENU
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine READ_MERCURY_MENU reads the BENCHMARK MENU section of
|
|
! the GEOS-CHEM input file. (bmy, 2/24/06)
|
|
!
|
|
! NOTES:
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE LOGICAL_MOD, ONLY : LDYNOCEAN
|
|
USE MERCURY_MOD, ONLY : INIT_MERCURY
|
|
USE OCEAN_MERCURY_MOD, ONLY : INIT_OCEAN_MERCURY
|
|
USE TRACER_MOD, ONLY : ITS_A_MERCURY_SIM
|
|
|
|
! Local variables
|
|
LOGICAL :: USE_CHECKS
|
|
INTEGER :: ANTHRO_Hg_YEAR, N
|
|
CHARACTER(LEN=255) :: SUBSTRS(MAXDIM), Hg_RST_FILE
|
|
|
|
!=================================================================
|
|
! READ_MERCURY_MENU begins here!
|
|
!=================================================================
|
|
|
|
! Year for anthro Hg emissions
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_mercury_menu:1' )
|
|
READ( SUBSTRS(1:N), * ) ANTHRO_Hg_YEAR
|
|
|
|
! Use dynamic ocean model?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_mercury_menu:2' )
|
|
READ( SUBSTRS(1:N), * ) USE_CHECKS
|
|
|
|
! Use dynamic ocean model?
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_mercury_menu:3' )
|
|
READ( SUBSTRS(1:N), * ) LDYNOCEAN
|
|
|
|
! Name of ocean restart file
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_mercury_menu:4' )
|
|
READ( SUBSTRS(1:N), '(a)' ) Hg_RST_FILE
|
|
|
|
! Separator line
|
|
CALL SPLIT_ONE_LINE( SUBSTRS, N, 1, 'read_mercury_menu:5' )
|
|
|
|
!=================================================================
|
|
! Print to screen
|
|
!=================================================================
|
|
WRITE( 6, '(/,a)' ) 'MERCURY MENU'
|
|
WRITE( 6, '( a)' ) '------------'
|
|
WRITE( 6, 100 ) 'Anthro Hg emissions year : ',
|
|
& ANTHRO_Hg_YEAR
|
|
WRITE( 6, 110 ) 'Error check tag & total Hg? : ', USE_CHECKS
|
|
WRITE( 6, 110 ) 'Use dynamic ocean Hg model? : ', LDYNOCEAN
|
|
WRITE( 6, 120 ) 'Ocean Hg restart file : ',
|
|
& TRIM( Hg_RST_FILE )
|
|
|
|
! FORMAT statements
|
|
100 FORMAT( A, I4 )
|
|
110 FORMAT( A, L5 )
|
|
120 FORMAT( A, A )
|
|
|
|
! If we are performing a Hg simulation ...
|
|
IF ( ITS_A_MERCURY_SIM() ) THEN
|
|
|
|
! Initialize "mercury_mod.f"
|
|
CALL INIT_MERCURY( ANTHRO_Hg_YEAR )
|
|
|
|
! Initialize "ocean_mercury_mod.f"
|
|
IF ( LDYNOCEAN ) THEN
|
|
CALL INIT_OCEAN_MERCURY( Hg_RST_FILE, USE_CHECKS )
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE READ_MERCURY_MENU
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE VALIDATE_DIRECTORIES
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine VALIDATE_DIRECTORIES makes sure that each of the directories
|
|
! that we have read from the GEOS-CHEM input file are valid. Also, trailing
|
|
! separator characters will be added. (bmy, 7/20/04, 8/4/06)
|
|
!
|
|
! NOTES:
|
|
! (1 ) Now make sure all USE statements are USE, ONLY. Now also validate
|
|
! GCAP and GEOS-5 directories. (bmy, 10/3/05)
|
|
! (2 ) Now references DATA_DIR_1x1 from directory_mod.f (bmy, 10/24/05)
|
|
! (3 ) Remove support for GEOS-1 and GEOS-STRAT met fields (bmy, 8/4/06)
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE DIRECTORY_MOD, ONLY : DATA_DIR, DATA_DIR_1x1, GCAP_DIR
|
|
USE DIRECTORY_MOD, ONLY : GEOS_1_DIR, GEOS_S_DIR, GEOS_3_DIR
|
|
USE DIRECTORY_MOD, ONLY : GEOS_4_DIR, GEOS_5_DIR, O3PL_DIR
|
|
USE DIRECTORY_MOD, ONLY : OH_DIR, RUN_DIR, TEMP_DIR
|
|
! USE DIRECTORY_MOD, ONLY : TPBC_DIR
|
|
USE DIRECTORY_MOD, ONLY : TPBC_DIR, TPBC_DIR_NA !(lzh)
|
|
USE DIRECTORY_MOD, ONLY : TPBC_DIR_EU, TPBC_DIR_CH
|
|
USE GRID_MOD, ONLY : ITS_A_NESTED_GRID
|
|
! USE LOGICAL_MOD, ONLY : LWINDO, LUNZIP
|
|
USE LOGICAL_MOD, ONLY : LWINDO_CU, LUNZIP !(lzh)
|
|
USE LOGICAL_MOD, ONLY : LWINDO_NA, LWINDO_EU, LWINDO_CH
|
|
USE TIME_MOD, ONLY : EXPAND_DATE, GET_NYMDb, GET_NYMDe
|
|
|
|
# include "define.h"
|
|
|
|
! Local variables
|
|
INTEGER :: NYMDb, NYMDe
|
|
CHARACTER(LEN=255) :: DIR
|
|
|
|
!=================================================================
|
|
! VALIDATE_DIRECTORIES begins here!
|
|
!=================================================================
|
|
|
|
! Get starting & ending dates
|
|
NYMDb = GET_NYMDb()
|
|
NYMDe = GET_NYMDe()
|
|
|
|
! Check directories
|
|
CALL CHECK_DIRECTORY( DATA_DIR )
|
|
CALL CHECK_DIRECTORY( DATA_DIR_1x1 )
|
|
CALL CHECK_DIRECTORY( RUN_DIR )
|
|
CALL CHECK_DIRECTORY( OH_DIR )
|
|
CALL CHECK_DIRECTORY( O3PL_DIR )
|
|
|
|
! Only validate the TEMP_DIR if we are unzipping met fields
|
|
IF ( LUNZIP ) CALL CHECK_DIRECTORY( TEMP_DIR )
|
|
|
|
! Only validate the TPCORE BC directory if we need it
|
|
c$$$ IF ( LWINDO .or. ITS_A_NESTED_GRID() ) THEN
|
|
c$$$ CALL CHECK_DIRECTORY( TPBC_DIR )
|
|
c$$$ ENDIF
|
|
! (lzh,02/01/2015)
|
|
IF ( ITS_A_NESTED_GRID() ) THEN
|
|
#if defined( NESTED_NA)
|
|
CALL CHECK_DIRECTORY( TPBC_DIR_NA )
|
|
#elif defined( NESTED_EU)
|
|
CALL CHECK_DIRECTORY( TPBC_DIR_EU )
|
|
#elif defined( NESTED_CH)
|
|
CALL CHECK_DIRECTORY( TPBC_DIR_CH )
|
|
#endif
|
|
|
|
ENDIF
|
|
IF ( LWINDO_CU ) THEN
|
|
CALL CHECK_DIRECTORY( TPBC_DIR )
|
|
ENDIF
|
|
IF ( LWINDO_NA ) THEN
|
|
CALL CHECK_DIRECTORY( TPBC_DIR_NA )
|
|
ENDIF
|
|
IF ( LWINDO_EU ) THEN
|
|
CALL CHECK_DIRECTORY( TPBC_DIR_EU )
|
|
ENDIF
|
|
IF ( LWINDO_CH ) THEN
|
|
CALL CHECK_DIRECTORY( TPBC_DIR_CH )
|
|
ENDIF
|
|
|
|
#if defined( GEOS_3 )
|
|
|
|
! Check GEOS-3 met field directory (starting date)
|
|
DIR = GEOS_3_DIR
|
|
CALL EXPAND_DATE( DIR, NYMDb, 000000 )
|
|
DIR = TRIM( DATA_DIR ) // TRIM( DIR )
|
|
CALL CHECK_DIRECTORY( DIR )
|
|
|
|
! Check GEOS-3 met field directory (ending date)
|
|
DIR = GEOS_3_DIR
|
|
CALL EXPAND_DATE( DIR, NYMDe, 000000 )
|
|
DIR = TRIM( DATA_DIR ) // TRIM( DIR )
|
|
CALL CHECK_DIRECTORY( DIR )
|
|
|
|
#elif defined( GEOS_4 )
|
|
|
|
! Check GEOS-4 met field directory (starting date)
|
|
DIR = GEOS_4_DIR
|
|
CALL EXPAND_DATE( DIR, NYMDb, 000000 )
|
|
DIR = TRIM( DATA_DIR ) // TRIM( DIR )
|
|
CALL CHECK_DIRECTORY( DIR )
|
|
|
|
|
|
! Check GEOS-4 met field directory (ending date)
|
|
DIR = GEOS_4_DIR
|
|
CALL EXPAND_DATE( DIR, NYMDe, 000000 )
|
|
DIR = TRIM( DATA_DIR ) // TRIM( DIR )
|
|
CALL CHECK_DIRECTORY( DIR )
|
|
|
|
#elif defined( GEOS_5 )
|
|
|
|
! Check GEOS-5 met field directory (starting date)
|
|
DIR = GEOS_5_DIR
|
|
CALL EXPAND_DATE( DIR, NYMDb, 000000 )
|
|
DIR = TRIM( DATA_DIR ) // TRIM( DIR )
|
|
CALL CHECK_DIRECTORY( DIR )
|
|
|
|
|
|
! Check GEOS-5 met field directory (ending date)
|
|
DIR = GEOS_5_DIR
|
|
CALL EXPAND_DATE( DIR, NYMDe, 000000 )
|
|
DIR = TRIM( DATA_DIR ) // TRIM( DIR )
|
|
CALL CHECK_DIRECTORY( DIR )
|
|
|
|
#elif defined( GCAP )
|
|
|
|
! Check GEOS-5 met field directory (starting date)
|
|
DIR = GCAP_DIR
|
|
CALL EXPAND_DATE( DIR, NYMDb, 000000 )
|
|
DIR = TRIM( DATA_DIR ) // TRIM( DIR )
|
|
CALL CHECK_DIRECTORY( DIR )
|
|
|
|
|
|
! Check GEOS-5 met field directory (ending date)
|
|
DIR = GCAP_DIR
|
|
CALL EXPAND_DATE( DIR, NYMDe, 000000 )
|
|
DIR = TRIM( DATA_DIR ) // TRIM( DIR )
|
|
CALL CHECK_DIRECTORY( DIR )
|
|
|
|
#endif
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE VALIDATE_DIRECTORIES
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE CHECK_DIRECTORY( DIR )
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine CHECK_DIRECTORY makes sure that the given directory
|
|
! is valid. Also a trailing slash character will be added if necessary.
|
|
! (bmy, 3/20/03, 3/23/05)
|
|
!
|
|
! Arguments as Input/Output:
|
|
! ============================================================================
|
|
! (1 ) DIR (CHARACTER) : Directory to be checked
|
|
!
|
|
! NOTES:
|
|
! (1 ) Now references FILE_EXISTS from "file_mod.f" (bmy, 3/23/05)
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE ERROR_MOD, ONLY : ERROR_STOP
|
|
USE FILE_MOD, ONLY : FILE_EXISTS
|
|
USE UNIX_CMDS_MOD, ONLY : SEPARATOR
|
|
|
|
# include "define.h" ! C-preprocessor flags
|
|
|
|
! Arguments
|
|
CHARACTER(LEN=*), INTENT(INOUT) :: DIR
|
|
|
|
! Local variables
|
|
INTEGER :: C
|
|
CHARACTER(LEN=255) :: MSG
|
|
|
|
!=================================================================
|
|
! CHECK_DIRECTORY begins here!
|
|
!=================================================================
|
|
|
|
! Locate the last non-white-space character of NEWDIR
|
|
C = LEN_TRIM( DIR )
|
|
|
|
! Add the trailing directory separator if it is not present
|
|
IF ( DIR(C:C) /= TRIM( SEPARATOR ) ) THEN
|
|
DIR(C+1:C+1) = TRIM( SEPARATOR )
|
|
ENDIF
|
|
|
|
!=================================================================
|
|
! Test if the directory actually exists
|
|
!=================================================================
|
|
|
|
! If the directory does not exist then stop w/ an error message
|
|
IF ( .not. FILE_EXISTS( DIR ) ) THEN
|
|
MSG = 'Invalid directory: ' // TRIM( DIR )
|
|
CALL ERROR_STOP( MSG, 'CHECK_DIRECTORY ("input_mod.f")' )
|
|
ENDIF
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE CHECK_DIRECTORY
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE CHECK_TIME_STEPS
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine CHECK_TIME_STEPS computes the smallest dynamic time step for the
|
|
! model, based on which operation are turned on. This is called from routine
|
|
! READ_INPUT_FILE, after all of the timesteps and logical flags have been
|
|
! read from "input.geos". (bmy, 7/20/04, 10/3/05)
|
|
!
|
|
! NOTES:
|
|
! (1 ) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE LOGICAL_MOD, ONLY : LCONV, LCHEM, LDRYD
|
|
USE LOGICAL_MOD, ONLY : LEMIS, LTRAN, LTURB
|
|
USE TIME_MOD, ONLY : SET_TIMESTEPS
|
|
|
|
! Local variables
|
|
INTEGER :: I, J, K, L, TS_SMALLEST
|
|
|
|
!=================================================================
|
|
! CHECK_TIME_STEPS begins here!
|
|
!=================================================================
|
|
|
|
! NUNIT is time step in minutes for unit conversion
|
|
TS_UNIT = -1
|
|
|
|
! Only do unit conversion if
|
|
IF ( LTRAN .or. LCONV .or. LTURB ) THEN
|
|
TS_UNIT = MAX( TS_DYN, TS_CONV )
|
|
ENDIF
|
|
|
|
! Compute NSMALLEST as the minimum of NDYN, NCONV, NSRCE, NCHEM
|
|
I = TS_DYN
|
|
J = TS_CONV
|
|
K = TS_EMIS
|
|
L = TS_CHEM
|
|
|
|
IF ( .not. LTRAN ) I = 999999
|
|
IF ( .not. LCONV .and..not. LTURB ) J = 999999
|
|
IF ( .not. LDRYD .and..not. LEMIS ) K = 999999
|
|
IF ( .not. LCHEM ) L = 999999
|
|
|
|
! adj_group: hardwire TS_SMALLETS to always be
|
|
! the default TS_DYN. It's too much trouble
|
|
! coordinating adjoint integration otherwise.
|
|
! (dkh, 06/25/09)
|
|
!! Get the smallest of all of the above
|
|
!TS_SMALLEST = MIN( I, J, K, L )
|
|
TS_SMALLEST = TS_DYN
|
|
|
|
! If all of the operators above are turned off,
|
|
! then set NSMALLEST to NDYN.
|
|
IF ( TS_SMALLEST == 999999 ) THEN
|
|
TS_SMALLEST = TS_DYN
|
|
ENDIF
|
|
|
|
! If NDYN is smaller than NSMALLEST, reset NSMALLEST
|
|
! to NDYN. Also reset NTDT and NSTP accordingly.
|
|
! This is useful for runs where transport is turned off,
|
|
! but where chemistry is turned on.
|
|
IF ( TS_DYN < TS_SMALLEST ) THEN
|
|
TS_DYN = TS_SMALLEST
|
|
ENDIF
|
|
|
|
! Initialize timesteps in "time_mod.f"
|
|
CALL SET_TIMESTEPS( CHEMISTRY=TS_CHEM, EMISSION=TS_EMIS,
|
|
& DYNAMICS=TS_DYN, UNIT_CONV=TS_UNIT,
|
|
& CONVECTION=TS_CONV )
|
|
|
|
! Return to MAIN program
|
|
END SUBROUTINE CHECK_TIME_STEPS
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE IS_LAST_DAY_GOOD
|
|
!
|
|
!******************************************************************************
|
|
! Suborutine IS_LAST_DAY_GOOD tests to see if there is output scheduled on
|
|
! the last day of the run. (bmy, 1/11/05, 4/24/06)
|
|
!
|
|
! NOTES:
|
|
! (1 ) Moved to "input_mod.f" from "main.f" (bmy, 1/11/05)
|
|
! (2 ) Now call ITS_A_LEAPYEAR with FORCE=.TRUE. to always return whether
|
|
! the year Y would be a leap year, regardless of met field type.
|
|
! (swu, bmy, 4/24/06)
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE ERROR_MOD, ONLY : ERROR_STOP
|
|
USE JULDAY_MOD, ONLY : JULDAY
|
|
USE TIME_MOD, ONLY : GET_NYMDe, ITS_A_LEAPYEAR, YMD_EXTRACT
|
|
|
|
# include "CMN_SIZE" ! Size parameters
|
|
# include "CMN_DIAG" ! NJDAY
|
|
|
|
! Local variables
|
|
LOGICAL :: IS_LEAPYEAR
|
|
INTEGER :: NYMDe, Y, M, D, LASTDAY
|
|
REAL*8 :: JD, JD0
|
|
|
|
!=================================================================
|
|
! IS_LAST_DAY_GOOD begins here!
|
|
!=================================================================
|
|
|
|
! Astronomical Julian Day corresponding to NYMDe
|
|
NYMDe = GET_NYMDe()
|
|
CALL YMD_EXTRACT( NYMDe, Y, M, D )
|
|
JD = JULDAY( Y, M, DBLE( D ) )
|
|
|
|
! Astronomical Julian Day corresponding to the 1st of the year
|
|
JD0 = JULDAY( Y, 1, 0d0 )
|
|
|
|
! LASTDAY is the day of year corresponding to NYMDe
|
|
LASTDAY = JD - JD0
|
|
|
|
! Skip past the element of NJDAY for Feb 29, if necessary
|
|
IF ( .not. ITS_A_LEAPYEAR( Y, .TRUE. ) .and. LASTDAY > 59 ) THEN
|
|
LASTDAY = LASTDAY + 1
|
|
ENDIF
|
|
|
|
! Stop w/ error if THIS_NJDAY = 0
|
|
IF ( NJDAY(LASTDAY) == 0 ) THEN
|
|
CALL ERROR_STOP( 'No output scheduled on last day of run!',
|
|
& 'IS_LAST_DAY_GOOD ("input_mod.f")' )
|
|
ENDIF
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE IS_LAST_DAY_GOOD
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
SUBROUTINE INIT_INPUT
|
|
!
|
|
!******************************************************************************
|
|
! Subroutine INIT_INPUT initializes all variables from "directory_mod.f" and
|
|
! "logical_mod.f" for safety's sake. (bmy, 7/20/04, 9/24/07)
|
|
!
|
|
! NOTES:
|
|
! (1 ) Now also initialize LNEI99 from "logical_mod.f" (bmy, 11/5/04)
|
|
! (2 ) Now also initialize LAVHRRLAI from "logical_mod.f" (bmy, 12/20/04)
|
|
! (3 ) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)
|
|
! (4 ) Now also initialize LMEGAN switch (tmf, bmy, 10/20/05)
|
|
! (5 ) Now also initialize LEMEP, LGFED2BB switches and DATA_DIR_1x1
|
|
! directory (bmy, 4/5/06)
|
|
! (6 ) Now also intitialize LFUTURE (swu, bmy, 6/1/06)
|
|
! (7 ) Now reference the EDGAR logical switches from "logical_mod.f"
|
|
! (avd, bmy, 7/11/06)
|
|
! (8 ) Now initialize the LVARTROP switch (phs, 9/14/06)
|
|
! (9 ) Now initialize LOTDREG, LOTDLOC, LCTH, LMFLUX, LPRECON (bmy, 1/31/07)
|
|
! (10) Now initialize LOTDSCALE (ltm, bmy, 9/24/07)
|
|
! (11) Add MEGAN Monoterpenes switch (ccc, 2/2/09)
|
|
! 07 Sep 2011 - P. Kasibhatla - Modified for GFED3
|
|
!******************************************************************************
|
|
!
|
|
! References to F90 modules
|
|
USE DIRECTORY_MOD, ONLY : DATA_DIR, GEOS_1_DIR, GEOS_S_DIR
|
|
USE DIRECTORY_MOD, ONLY : GEOS_3_DIR, GEOS_4_DIR, TEMP_DIR
|
|
USE DIRECTORY_MOD, ONLY : RUN_DIR, OH_DIR, O3PL_DIR
|
|
USE DIRECTORY_MOD, ONLY : TPBC_DIR, DATA_DIR_1x1
|
|
USE LOGICAL_MOD, ONLY : LATEQ, LAVHRRLAI, LCARB
|
|
USE LOGICAL_MOD, ONLY : LDEAD, LDUST, LSULF
|
|
USE LOGICAL_MOD, ONLY : LSOA, LSSALT, LCHEM
|
|
USE LOGICAL_MOD, ONLY : LEMBED, LCONV, LDBUG
|
|
USE LOGICAL_MOD, ONLY : LDIAG, LPRT, LSTDRUN
|
|
USE LOGICAL_MOD, ONLY : LDRYD, LAIRNOX, LANTHRO
|
|
USE LOGICAL_MOD, ONLY : LBIONOX, LBIOMASS, LBIOFUEL
|
|
USE LOGICAL_MOD, ONLY : LBIOGENIC, LBBSEA, LEMIS
|
|
USE LOGICAL_MOD, ONLY : LFFNOX, LFOSSIL, LLIGHTNOX
|
|
USE LOGICAL_MOD, ONLY : LMONOT, LNEI99, LSHIPSO2
|
|
USE LOGICAL_MOD, ONLY : LSOILNOX, LTOMSAI, LWOODCO
|
|
USE LOGICAL_MOD, ONLY : LFILL, LMFCT, LTRAN
|
|
USE LOGICAL_MOD, ONLY : LTPFV, LUPBD, LWINDO
|
|
USE LOGICAL_MOD, ONLY : LUNZIP, LWAIT, LTURB
|
|
USE LOGICAL_MOD, ONLY : LSVGLB, LSPLIT, LWETD
|
|
USE LOGICAL_MOD, ONLY : LMEGAN, LMEGANMONO, LDYNOCEAN
|
|
USE LOGICAL_MOD, ONLY : LGFED2BB, LFUTURE, LEDGAR
|
|
USE LOGICAL_MOD, ONLY : LGFED3BB
|
|
USE LOGICAL_MOD, ONLY : LEDGARNOx, LEDGARCO, LEDGARSHIP
|
|
USE LOGICAL_MOD, ONLY : LEDGARSOx, LVARTROP, LOTDREG
|
|
USE LOGICAL_MOD, ONLY : LOTDLOC, LCTH, LMFLUX
|
|
USE LOGICAL_MOD, ONLY : LOTDSCALE, LPRECON, LEMEP
|
|
USE LOGICAL_MOD, ONLY : LNEI05, LNEI08
|
|
USE LOGICAL_MOD, ONLY : LRCP, LRCPSHIP, LRCPAIR
|
|
USE LOGICAL_MOD, ONLY : LSCHEM, LLINOZ, LRETRO
|
|
! >> (dkh, 02/12/09)
|
|
USE LOGICAL_MOD, ONLY : LSVCSPEC
|
|
! <<
|
|
|
|
!Specifically for CO2 simulation (R Nassar, 2009-03-02)
|
|
USE LOGICAL_MOD, ONLY : LGENFF, LANNFF, LMONFF
|
|
USE LOGICAL_MOD, ONLY : LSEASBB, LBIODAILY, LBIODIURNAL
|
|
USE LOGICAL_MOD, ONLY : LBIONETORIG, LBIONETCLIM
|
|
USE LOGICAL_MOD, ONLY : LOCN1997, LOCN2009ANN, LOCN2009MON
|
|
USE LOGICAL_MOD, ONLY : LFFBKGRD
|
|
USE LOGICAL_MOD, ONLY : LBIOSPHTAG, LFOSSILTAG
|
|
USE LOGICAL_MOD, ONLY : LSHIPEDG, LSHIPICO, LPLANE
|
|
USE LOGICAL_MOD, ONLY : LSHIPSCALE, LPLANESCALE
|
|
USE LOGICAL_MOD, ONLY : LSHIPTAG, LPLANETAG
|
|
USE LOGICAL_MOD, ONLY : LCHEMCO2
|
|
|
|
!=================================================================
|
|
! INIT_INPUT begins here!
|
|
!=================================================================
|
|
|
|
! Initialize directories
|
|
DATA_DIR = ''
|
|
DATA_DIR_1x1 = ''
|
|
GEOS_1_DIR = ''
|
|
GEOS_S_DIR = ''
|
|
GEOS_3_DIR = ''
|
|
GEOS_4_DIR = ''
|
|
TEMP_DIR = ''
|
|
RUN_DIR = ''
|
|
OH_DIR = ''
|
|
O3PL_DIR = ''
|
|
TPBC_DIR = ''
|
|
|
|
! Initialize logicals
|
|
LATEQ = .FALSE.
|
|
LAVHRRLAI = .FALSE.
|
|
LCARB = .FALSE.
|
|
LDEAD = .FALSE.
|
|
LDUST = .FALSE.
|
|
LSULF = .FALSE.
|
|
LSOA = .FALSE.
|
|
LSSALT = .FALSE.
|
|
LCHEM = .FALSE.
|
|
LEMBED = .FALSE.
|
|
LCONV = .FALSE.
|
|
LDBUG = .FALSE.
|
|
LDIAG = .FALSE.
|
|
LPRT = .FALSE.
|
|
LSTDRUN = .FALSE.
|
|
LDRYD = .FALSE.
|
|
LAIRNOX = .FALSE.
|
|
LANTHRO = .FALSE.
|
|
LBIONOX = .FALSE.
|
|
LBIOMASS = .FALSE.
|
|
LBIOFUEL = .FALSE.
|
|
LBIOGENIC = .FALSE.
|
|
LBBSEA = .FALSE.
|
|
LCTH = .FALSE.
|
|
LDYNOCEAN = .FALSE.
|
|
LEMEP = .FALSE.
|
|
LEMIS = .FALSE.
|
|
LEDGAR = .FALSE.
|
|
LEDGARNOx = .FALSE.
|
|
LEDGARCO = .FALSE.
|
|
LEDGARSHIP = .FALSE.
|
|
LEDGARSOx = .FALSE.
|
|
LFFNOX = .FALSE.
|
|
LFOSSIL = .FALSE.
|
|
LFUTURE = .FALSE.
|
|
LGFED2BB = .FALSE.
|
|
LGFED3BB = .FALSE.
|
|
LLIGHTNOX = .FALSE.
|
|
LMEGAN = .FALSE.
|
|
LMEGANMONO = .FALSE.
|
|
LMFLUX = .FALSE.
|
|
LMONOT = .FALSE.
|
|
LNEI99 = .FALSE.
|
|
LNEI05 = .FALSE.
|
|
LNEI08 = .FALSE.
|
|
LOTDLOC = .FALSE.
|
|
LOTDREG = .FALSE.
|
|
LOTDSCALE = .FALSE.
|
|
LPRECON = .FALSE.
|
|
LSHIPSO2 = .FALSE.
|
|
LSOILNOX = .FALSE.
|
|
LTOMSAI = .FALSE.
|
|
LWOODCO = .FALSE.
|
|
LFILL = .FALSE.
|
|
LMFCT = .FALSE.
|
|
LTRAN = .FALSE.
|
|
LTPFV = .FALSE.
|
|
LUPBD = .FALSE.
|
|
LWINDO = .FALSE.
|
|
LUNZIP = .FALSE.
|
|
LWAIT = .FALSE.
|
|
LTURB = .FALSE.
|
|
LSCHEM = .FALSE.
|
|
LSVGLB = .FALSE.
|
|
! >> (dkh, 02/12/09)
|
|
LSVCSPEC = .FALSE.
|
|
! <<
|
|
LSPLIT = .FALSE.
|
|
LWETD = .FALSE.
|
|
LVARTROP = .FALSE.
|
|
LLINOZ = .FALSE.
|
|
LRETRO = .FALSE. !(wfr, 3/8/11)
|
|
LRCP = .FALSE. !(cdh, 10/18/11)
|
|
LRCPSHIP = .FALSE. !(cdh, 10/18/11)
|
|
LRCPAIR = .FALSE. !(cdh, 10/18/11)
|
|
|
|
!Specifically for CO2 simulation (R Nassar, 2009-03-02)
|
|
LGENFF = .FALSE.
|
|
LANNFF = .FALSE.
|
|
LMONFF = .FALSE.
|
|
LSEASBB = .FALSE.
|
|
LBIONETORIG = .FALSE.
|
|
LBIONETCLIM = .FALSE.
|
|
LBIODAILY = .FALSE.
|
|
LBIODIURNAL = .FALSE.
|
|
LOCN1997 = .FALSE.
|
|
LOCN2009ANN = .FALSE.
|
|
LOCN2009MON = .FALSE.
|
|
LFFBKGRD = .FALSE.
|
|
LBIOSPHTAG = .FALSE.
|
|
LFOSSILTAG = .FALSE.
|
|
LSHIPEDG = .FALSE.
|
|
LSHIPICO = .FALSE.
|
|
LSHIPSCALE = .FALSE.
|
|
LSHIPTAG = .FALSE.
|
|
LPLANE = .FALSE.
|
|
LPLANESCALE = .FALSE.
|
|
LPLANETAG = .FALSE.
|
|
LCHEMCO2 = .FALSE.
|
|
|
|
! Initialize counters
|
|
CT1 = 0
|
|
CT2 = 0
|
|
CT3 = 0
|
|
|
|
! Return to calling program
|
|
END SUBROUTINE INIT_INPUT
|
|
|
|
!------------------------------------------------------------------------------
|
|
|
|
! End of module
|
|
END MODULE INPUT_MOD
|