! $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