diff --git a/code/modified/restart_mod.f b/code/modified/restart_mod.f index fda9688..7c06120 100644 --- a/code/modified/restart_mod.f +++ b/code/modified/restart_mod.f @@ -135,7 +135,7 @@ USE LOGICAL_MOD, ONLY : LPRT USE TIME_MOD, ONLY : EXPAND_DATE USE TRACER_MOD, ONLY : STT, N_TRACERS, TCVV - USE CHECKPT_MOD, ONLY : CHK_STT + !USE CHECKPT_MOD, ONLY : CHK_STT # include "CMN_SIZE" ! Size parameters @@ -212,7 +212,7 @@ DO L = 1, LLPAR DO J = 1, JJPAR DO I = 1, IIPAR - TRACER(I,J,L) = CHK_STT(I,J,L,N) * TCVV(N) / AD(I,J,L) + TRACER(I,J,L) = STT(I,J,L,N) * TCVV(N) / AD(I,J,L) ENDDO ENDDO ENDDO diff --git a/code/modified/restart_mod.f~ b/code/modified/restart_mod.f~ new file mode 100644 index 0000000..fda9688 --- /dev/null +++ b/code/modified/restart_mod.f~ @@ -0,0 +1,1060 @@ +! $Id: restart_mod.f,v 1.2 2012/03/01 22:00:27 daven Exp $ + MODULE RESTART_MOD +! +!****************************************************************************** +! Module RESTART_MOD contains variables and routines which are used to read +! and write GEOS-CHEM restart files, which contain tracer concentrations +! in [v/v] mixing ratio. (bmy, 6/25/02, 12/16/05) +! +! Module Variables: +! ============================================================================ +! (1 ) INPUT_RESTART_FILE : Full path name of the restart file to be read +! (2 ) OUTPUT_RESTART_FILE : Full path name (w/ tokens!) of output file +! +! Module Routines: +! ============================================================================ +! (1 ) MAKE_RESTART_FILE : Writes restart file to disk +! (2 ) READ_RESTART_FILE : Reads restart file from disk +! (3 ) CONVERT_TRACER_TO_VV : Converts from [ppbv], [ppmv], etc to [v/v] +! (4 ) CHECK_DIMENSIONS : Ensures that restart file contains global data +! (5 ) COPY_STT : Converts [v/v] to [kg] and stores in STT +! (6 ) CHECK_DATA_BLOCKS : Makes sure we have read in data for each tracer +! (7 ) SET_RESTART : Gets restart filenames from "input_mod.f" +! +! GEOS-CHEM modules referenced by restart_mod.f +! ============================================================================ +! (1 ) bpch2_mod.f : Module w/ routines for binary punch file I/O +! (2 ) error_mod.f : Module w/ NaN and other error check routines +! (3 ) file_mod.f : Module w/ file unit numbers and error checks +! (4 ) grid_mod.f : Module w/ horizontal grid information +! (5 ) logical_mod.f : Module w/ GEOS-CHEM logical switches +! (6 ) time_mod.f : Module w/ routines for computing time & date +! (7 ) tracer_mod.f : Module w/ GEOS-CHEM tracer array STT etc. +! +! NOTES: +! (1 ) Moved routines "make_restart_file.f"" and "read_restart_file.f" into +! this module. Also now internal routines to "read_restart_file.f" +! are now a part of this module. Now reference "file_mod.f" to get +! file unit numbers and error checking routines. (bmy, 6/25/02) +! (2 ) Now reference AD from "dao_mod.f". Now reference "error_mod.f". +! Also added minor bug fix for ALPHA platform. (bmy, 10/15/02) +! (3 ) Now references "grid_mod.f" and the new "time_mod.f" (bmy, 2/11/03) +! (4 ) Added error-check and cosmetic changes (bmy, 4/29/03) +! (5 ) Removed call to COPY_STT_FOR_OX, it's obsolete (bmy, 8/18/03) +! (6 ) Add fancy output (bmy, 4/26/04) +! (7 ) Added routine SET_RESTART. Now reference "logical_mod.f" and +! "tracer_mod.f" (bmy, 7/20/04) +! (8 ) Removed obsolete routines TRUE_TRACER_INDEX and COPY_DATA_FOR_CO_OH +! (bmy, 6/28/05) +! (9 ) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05) +! (10) Now pass TAU via the arg list in MAKE_RESTART_FILE (bmy, 12/15/05) +! (11) Add MAKE_CSPEC_FILE and READ_CSPEC_FILE routines to save and read +! CSPEC_FULL restart files (dkh, 02/12/09) +!****************************************************************************** +! + IMPLICIT NONE + + !================================================================= + ! MODULE PRIVATE DECLARATIONS -- keep certain internal variables + ! and routines from being seen outside "restart_mod.f" + !================================================================= + + ! Make everything PRIVATE ... + PRIVATE + + ! ... except these routines + PUBLIC :: MAKE_RESTART_FILE + PUBLIC :: READ_RESTART_FILE + PUBLIC :: SET_RESTART + PUBLIC :: MAKE_CSPEC_FILE + PUBLIC :: READ_CSPEC_FILE + ! adj_group (dkh, ks, mak, cs, 06/08/09) + PUBLIC :: CHECK_DIMENSIONS + + + + !================================================================= + ! MODULE VARIABLES + !================================================================= + CHARACTER(LEN=255) :: INPUT_RESTART_FILE + CHARACTER(LEN=255) :: OUTPUT_RESTART_FILE + + !================================================================= + ! MODULE ROUTINES -- follow below the "CONTAINS" statement + !================================================================= + CONTAINS + +!------------------------------------------------------------------------------ + + SUBROUTINE MAKE_RESTART_FILE( YYYYMMDD, HHMMSS, TAU ) +! +!****************************************************************************** +! Subroutine MAKE_RESTART_FILE creates GEOS-CHEM restart files of tracer +! mixing ratios (v/v), in binary punch file format. (bmy, 5/27/99, 12/16/05) +! +! Arguments as Input: +! ============================================================================ +! (1 ) YYYYMMDD : Year-Month-Date +! (2 ) HHMMSS : and Hour-Min-Sec for which to create a restart file +! (3 ) TAU : GEOS-CHEM TAU value corresponding to YYYYMMDD, HHMMSS +! +! NOTES: +! (1 ) Now use function NYMD_STRING from "time_mod.f" to generate a +! Y2K compliant string for all data sets. (bmy, 6/22/00) +! (2 ) Reference F90 module "bpch2_mod.f" which contains routines BPCH2_HDR, +! BPCH2, and GET_MODELNAME for writing data to binary punch files. +! (bmy, 6/22/00) +! (3 ) Now do not write more than NTRACE data blocks to disk. +! Also updated comments. (bmy, 7/17/00) +! (4 ) Now use IOS /= 0 to trap both I/O errors and EOF. (bmy, 9/13/00) +! (5 ) Added to "restart_mod.f". Also now save the entire grid to the +! restart file. (bmy, 6/24/02) +! (6 ) Bug fix: Remove duplicate definition of MM. This causes compile-time +! problems on the ALPHA platform. (gcc, bmy, 11/6/02) +! (7 ) Now references functions GET_OFFSET, GET_YOFFSET from "grid_mod.f". +! Now references function GET_TAU from "time_mod.f". Now added a call +! to DEBUG_MSG from "error_mod.f" (bmy, 2/11/03) +! (8 ) Cosmetic changes (bmy, 4/29/03) +! (9 ) Now reference STT, N_TRACERS, TCVV from "tracer_mod.f". Also now +! remove hardwired output restart filename. Now references LPRT +! from "logical_mod.f". (bmy, 7/20/04) +! (10) Remove references to CMN_DIAG and TRCOFFSET. Now call GET_HALFPOLAR +! from "bpch2_mod.f" to get the HALFPOLAR flag value for GEOS or GCAP +! grids. (bmy, 6/28/05) +! (11) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05) +! (12) Add TAU to the argument list (bmy, 12/16/05) +!****************************************************************************** +! + ! References to F90 modules + USE BPCH2_MOD, ONLY : BPCH2, GET_MODELNAME + USE BPCH2_MOD, ONLY : GET_HALFPOLAR, OPEN_BPCH2_FOR_WRITE + USE DAO_MOD, ONLY : AD + USE ERROR_MOD, ONLY : DEBUG_MSG + USE FILE_MOD, ONLY : IU_RST, IOERROR + USE GRID_MOD, ONLY : GET_XOFFSET, GET_YOFFSET + USE LOGICAL_MOD, ONLY : LPRT + USE TIME_MOD, ONLY : EXPAND_DATE + USE TRACER_MOD, ONLY : STT, N_TRACERS, TCVV + USE CHECKPT_MOD, ONLY : CHK_STT + +# include "CMN_SIZE" ! Size parameters + + ! Arguments + INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS + REAL*8, INTENT(IN) :: TAU + + ! Local Variables + INTEGER :: I, I0, IOS, J, J0, L, N + INTEGER :: YYYY, MM, DD, HH, SS + REAL*4 :: TRACER(IIPAR,JJPAR,LLPAR) + CHARACTER(LEN=255) :: FILENAME + + ! For binary punch file, version 2.0 + REAL*4 :: LONRES, LATRES + INTEGER :: HALFPOLAR + INTEGER, PARAMETER :: CENTER180 = 1 + + CHARACTER(LEN=20) :: MODELNAME + CHARACTER(LEN=40) :: CATEGORY + CHARACTER(LEN=40) :: UNIT + CHARACTER(LEN=40) :: RESERVED = '' + CHARACTER(LEN=80) :: TITLE + + !================================================================= + ! MAKE_RESTART_FILE begins here! + !================================================================= + + ! Define variables for BINARY PUNCH FILE OUTPUT + TITLE = 'GEOS-CHEM Restart File: ' // + & 'Instantaneous Tracer Concentrations (v/v)' + UNIT = 'v/v' + CATEGORY = 'IJ-AVG-$' + LONRES = DISIZE + LATRES = DJSIZE + + ! Call GET_MODELNAME to return the proper model name for + ! the given met data being used (bmy, 6/22/00) + MODELNAME = GET_MODELNAME() + + ! Call GET_HALFPOLAR to return the proper value + ! for either GCAP or GEOS grids (bmy, 6/28/05) + HALFPOLAR = GET_HALFPOLAR() + + ! Get the nested-grid offsets + I0 = GET_XOFFSET( GLOBAL=.TRUE. ) + J0 = GET_YOFFSET( GLOBAL=.TRUE. ) + + !================================================================= + ! Open the restart file for output -- binary punch format + !================================================================= + + ! Copy the output restart file name into a local variable + FILENAME = TRIM( OUTPUT_RESTART_FILE ) + + ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values + CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS ) + + WRITE( 6, 100 ) TRIM( FILENAME ) + 100 FORMAT( ' - MAKE_RESTART_FILE: Writing ', a ) + + ! Open restart file for output + CALL OPEN_BPCH2_FOR_WRITE( IU_RST, FILENAME, TITLE ) + + !================================================================= + ! Write each tracer to the restart file + !================================================================= + DO N = 1, N_TRACERS + + ! Convert from [kg] to [v/v] and store in the TRACER array +!$OMP PARALLEL DO +!$OMP+DEFAULT( SHARED ) +!$OMP+PRIVATE( I, J, L ) + DO L = 1, LLPAR + DO J = 1, JJPAR + DO I = 1, IIPAR + TRACER(I,J,L) = CHK_STT(I,J,L,N) * TCVV(N) / AD(I,J,L) + ENDDO + ENDDO + ENDDO +!$OMP END PARALLEL DO + + ! Convert STT from [kg] to [v/v] mixing ratio + ! and store in temporary variable TRACER + CALL BPCH2( IU_RST, MODELNAME, LONRES, LATRES, + & HALFPOLAR, CENTER180, CATEGORY, N, + & UNIT, TAU, TAU, RESERVED, + & IIPAR, JJPAR, LLPAR, I0+1, + & J0+1, 1, TRACER ) + ENDDO + + ! Close file + CLOSE( IU_RST ) + + !### Debug + IF ( LPRT ) CALL DEBUG_MSG( '### MAKE_RESTART_FILE: wrote file' ) + + ! Return to calling program + END SUBROUTINE MAKE_RESTART_FILE + +!------------------------------------------------------------------------------ + + SUBROUTINE READ_RESTART_FILE( YYYYMMDD, HHMMSS ) +! +!****************************************************************************** +! Subroutine READ_RESTART_FILE initializes GEOS-CHEM tracer concentrations +! from a restart file (binary punch file format) (bmy, 5/27/99, 12/16/05) +! +! Arguments as input: +! ============================================================================ +! (1 ) YYYYMMDD : Year-Month-Day +! (2 ) HHMMSS : and Hour-Min-Sec for which to read restart file +! +! NOTES: +! (1 ) Now check that N = NTRACER - TRCOFFSET is valid. +! Also reorganize some print statements (bmy, 10/25/99) +! (2 ) Now pass LFORCE, LSPLIT via CMN_SETUP. (bmy, 11/4/99) +! (3 ) Cosmetic changes, added comments (bmy, 3/17/00) +! (4 ) Now use function NYMD_STRING from "time_mod.f" to generate a +! Y2K compliant string for all data sets. (bmy, 6/22/00) +! (5 ) Broke up sections of code into internal subroutines. Also updated +! comments & cleaned up a few things. (bmy, 7/17/00) +! (6 ) Now use IOS /= 0 to trap both I/O errors and EOF. (bmy, 9/13/00) +! (7 ) Print max & min of tracer regardless of the units (bmy, 10/5/00) +! (8 ) Removed obsolete code from 10/00 (bmy, 12/21/00) +! (9 ) Removed obsolete commented out code (bmy, 4/23/01) +! (10) Added updates from amf for tagged Ox run. Also updated comments +! and made some cosmetic changes (bmy, 7/3/01) +! (11) Bug fix: if starting from multiox restart file, then NTRACER +! will be greater than 40 but less than 60. Adjust COPY_STT_FOR_OX +! accordingly. (amf, bmy, 9/6/01) +! (12) Now reference TRANUC from "charpak_mod.f" (bmy, 11/15/01) +! (13) Updated comments (bmy, 1/25/02) +! (14) Now reference AD from "dao_mod.f" (bmy, 9/18/02) +! (15) Now added a call to DEBUG_MSG from "error_mod.f" (bmy, 2/11/03) +! (16) Remove call to COPY_STT_FOR_OX, it's obsolete. (bmy, 8/18/03) +! (17) Add fancy output string (bmy, 4/26/04) +! (18) No longer use hardwired filename. Also now reference "logical_mod.f" +! and "tracer_mod.f" (bmy, 7/20/04) +! (19) Remove code for obsolete CO-OH simulation. Also remove references +! to CMN_DIAG and TRCOFFSET. Change tracer name format string to A10. +! (bmy, 6/24/05) +! (20) Updated comments (bmy, 12/16/05) +!****************************************************************************** +! + ! References to F90 modules + USE BPCH2_MOD, ONLY : OPEN_BPCH2_FOR_READ + USE DAO_MOD, ONLY : AD + USE ERROR_MOD, ONLY : DEBUG_MSG + USE FILE_MOD, ONLY : IU_RST, IOERROR + USE LOGICAL_MOD, ONLY : LSPLIT, LPRT + USE TIME_MOD, ONLY : EXPAND_DATE + USE TRACER_MOD, ONLY : N_TRACERS, STT + USE TRACER_MOD, ONLY : TRACER_NAME, TRACER_MW_G + +# include "CMN_SIZE" ! Size parameters + + ! Arguments + INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS + + ! Local Variables + INTEGER :: I, IOS, J, L, N + INTEGER :: NCOUNT(NNPAR) + REAL*4 :: TRACER(IIPAR,JJPAR,LLPAR) + REAL*8 :: SUMTC + CHARACTER(LEN=255) :: FILENAME + + ! For binary punch file, version 2.0 + INTEGER :: NI, NJ, NL + INTEGER :: IFIRST, JFIRST, LFIRST + INTEGER :: NTRACER, NSKIP + INTEGER :: HALFPOLAR, CENTER180 + REAL*4 :: LONRES, LATRES + REAL*8 :: ZTAU0, ZTAU1 + CHARACTER(LEN=20) :: MODELNAME + CHARACTER(LEN=40) :: CATEGORY + CHARACTER(LEN=40) :: UNIT + CHARACTER(LEN=40) :: RESERVED + + !================================================================= + ! READ_RESTART_FILE begins here! + !================================================================= + + ! Initialize some variables + NCOUNT(:) = 0 + TRACER(:,:,:) = 0e0 + + !================================================================= + ! Open restart file and read top-of-file header + !================================================================= + + ! Copy input file name to a local variable + FILENAME = TRIM( INPUT_RESTART_FILE ) + + ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values + CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS ) + + ! Echo some input to the screen + WRITE( 6, '(a)' ) REPEAT( '=', 79 ) + WRITE( 6, '(a,/)' ) 'R E S T A R T F I L E I N P U T' + WRITE( 6, 100 ) TRIM( FILENAME ) + 100 FORMAT( 'READ_RESTART_FILE: Reading ', a ) + + ! Open the binary punch file for input + CALL OPEN_BPCH2_FOR_READ( IU_RST, FILENAME ) + + ! Echo more output + WRITE( 6, 110 ) + 110 FORMAT( /, 'Min and Max of each tracer, as read from the file:', + & /, '(in volume mixing ratio units: v/v)' ) + + !================================================================= + ! Read concentrations -- store in the TRACER array + !================================================================= + DO + READ( IU_RST, IOSTAT=IOS ) + & MODELNAME, LONRES, LATRES, HALFPOLAR, CENTER180 + + ! IOS < 0 is end-of-file, so exit + IF ( IOS < 0 ) EXIT + + ! IOS > 0 is a real I/O error -- print error message + IF ( IOS > 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:4' ) + + READ( IU_RST, IOSTAT=IOS ) + & CATEGORY, NTRACER, UNIT, ZTAU0, ZTAU1, RESERVED, + & NI, NJ, NL, IFIRST, JFIRST, LFIRST, + & NSKIP + + IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:5') + + READ( IU_RST, IOSTAT=IOS ) + & ( ( ( TRACER(I,J,L), I=1,NI ), J=1,NJ ), L=1,NL ) + + IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:6') + + !============================================================== + ! Assign data from the TRACER array to the STT array. + !============================================================== + + ! Only process concentration data (i.e. mixing ratio) + IF ( CATEGORY(1:8) == 'IJ-AVG-$' ) THEN + + ! Make sure array dimensions are of global size + ! (NI=IIPAR; NJ=JJPAR, NL=LLPAR), or stop the run + CALL CHECK_DIMENSIONS( NI, NJ, NL ) + + ! Convert TRACER from its native units to [v/v] mixing ratio + CALL CONVERT_TRACER_TO_VV( NTRACER, TRACER, UNIT ) + + ! Convert TRACER from [v/v] to [kg] and copy into STT array + CALL COPY_STT( NTRACER, TRACER, NCOUNT ) + + ENDIF + ENDDO + + !================================================================= + ! Examine data blocks, print totals, and return + !================================================================= + + ! Check for missing or duplicate data blocks + CALL CHECK_DATA_BLOCKS( N_TRACERS, NCOUNT ) + + ! Close file + CLOSE( IU_RST ) + + ! Print totals atmospheric mass for each tracer + WRITE( 6, 120 ) + 120 FORMAT( /, 'Total atmospheric masses for each tracer: ' ) + + DO N = 1, N_TRACERS + + ! For tracers in kg C, be sure to use correct unit string + IF ( INT( TRACER_MW_G(N) + 0.5 ) == 12 ) THEN + UNIT = 'kg C' + ELSE + UNIT = 'kg ' + ENDIF + + ! Print totals + WRITE( 6, 130 ) N, TRACER_NAME(N), + & SUM( STT(:,:,:,N) ), ADJUSTL( UNIT ) + 130 FORMAT( 'Tracer ', i3, ' (', a10, ') ', es12.5, 1x, a4) + ENDDO + + ! Fancy output + WRITE( 6, '(a)' ) REPEAT( '=', 79 ) + + !### Debug + IF ( LPRT ) CALL DEBUG_MSG( '### READ_RESTART_FILE: read file' ) + + ! Return to calling program + END SUBROUTINE READ_RESTART_FILE + +!------------------------------------------------------------------------------ + + SUBROUTINE CONVERT_TRACER_TO_VV( NTRACER, TRACER, UNIT ) +! +!****************************************************************************** +! Subroutine CONVERT_TRACER_TO_VV converts the TRACER array from its +! natural units (e.g. ppbv, ppmv) as read from the restart file to v/v +! mixing ratio. (bmy, 6/25/02, 6/24/05) +! +! Arguments as Input: +! ============================================================================ +! (1 ) NTRACER (INTEGER) : Tracer number +! (2 ) TRACER (REAL*4 ) : Array containing tracer concentrations +! (3 ) UNIT (CHARACTER) : Unit of tracer as read in from restart file +! +! NOTES: +! (1 ) Added to "restart_mod.f". Can now also convert from ppm or ppmv +! to v/v mixing ratio. (bmy, 6/25/02) +! (2 ) Now reference GEOS_CHEM_STOP from "error_mod.f", which frees all +! allocated memory before stopping the run. (bmy, 10/15/02) +! (3 ) Remove obsolete reference to CMN (bmy, 6/24/05) +!****************************************************************************** +! + ! References to F90 modules + USE CHARPAK_MOD, ONLY : TRANUC + USE ERROR_MOD, ONLY : GEOS_CHEM_STOP + +# include "CMN_SIZE" ! Size parameters + + ! Arguments + INTEGER, INTENT(IN) :: NTRACER + REAL*4, INTENT(INOUT) :: TRACER(IIPAR,JJPAR,LLPAR) + CHARACTER(LEN=*), INTENT(IN) :: UNIT + + !================================================================= + ! CONVERT_TRACER_TO_VV begins here! + !================================================================= + + ! Convert UNIT to uppercase + CALL TRANUC( UNIT ) + + ! Convert from the current unit to v/v + SELECT CASE ( TRIM( UNIT ) ) + + CASE ( '', 'V/V' ) + ! Do nothing, TRACER is already in v/v + + CASE ( 'PPM', 'PPMV', 'PPMC' ) + TRACER = TRACER * 1d-6 + + CASE ( 'PPB', 'PPBV', 'PPBC' ) + TRACER = TRACER * 1d-9 + + CASE ( 'PPT', 'PPTV', 'PPTC' ) + TRACER = TRACER * 1d-12 + + CASE DEFAULT + WRITE( 6, '(a)' ) 'Incompatible units in punch file!' + WRITE( 6, '(a)' ) 'STOP in CONVERT_TRACER_TO_VV' + WRITE( 6, '(a)' ) REPEAT( '=', 79 ) + CALL GEOS_CHEM_STOP + + END SELECT + + ! Print the min & max of each tracer as it is read from the file + WRITE( 6, 110 ) NTRACER, MINVAL( TRACER ), MAXVAL( TRACER ) + 110 FORMAT( 'Tracer ', i3, ': Min = ', es12.5, ' Max = ', es12.5 ) + + ! Return to READ_RESTART_FILE + END SUBROUTINE CONVERT_TRACER_TO_VV + +!------------------------------------------------------------------------------ + + SUBROUTINE CHECK_DIMENSIONS( NI, NJ, NL ) +! +!****************************************************************************** +! Subroutine CHECK_DIMENSIONS makes sure that the dimensions of the +! restart file extend to cover the entire grid. (bmy, 6/25/02, 10/15/02) +! +! Arguments as Input: +! ============================================================================ +! (1 ) NI (INTEGER) : Number of longitudes read from restart file +! (2 ) NJ (INTEGER) : Number of latitudes read from restart file +! (3 ) NL (INTEGER) : Numbef of levels read from restart file +! +! NOTES: +! (1 ) Added to "restart_mod.f". Now no longer allow initialization with +! less than a globally-sized data block. (bmy, 6/25/02) +! (2 ) Now reference GEOS_CHEM_STOP from "error_mod.f", which frees all +! allocated memory before stopping the run. (bmy, 10/15/02) +!****************************************************************************** +! + ! References to F90 modules + USE ERROR_MOD, ONLY : GEOS_CHEM_STOP + + ! Arguments + INTEGER, INTENT(IN) :: NI, NJ, NL + +# include "CMN_SIZE" + + !================================================================= + ! CHECK_DIMENSIONS begins here! + !================================================================= + + ! Error check longitude dimension: NI must equal IIPAR + IF ( NI /= IIPAR ) THEN + WRITE( 6, '(a)' ) 'ERROR reading in restart file!' + WRITE( 6, '(a)' ) 'Wrong number of longitudes encountered!' + WRITE( 6, '(a)' ) 'STOP in CHECK_DIMENSIONS (restart_mod.f)' + WRITE( 6, '(a)' ) REPEAT( '=', 79 ) + CALL GEOS_CHEM_STOP + ENDIF + + ! Error check latitude dimension: NJ must equal JJPAR + IF ( NJ /= JJPAR ) THEN + WRITE( 6, '(a)' ) 'ERROR reading in restart file!' + WRITE( 6, '(a)' ) 'Wrong number of latitudes encountered!' + WRITE( 6, '(a)' ) 'STOP in CHECK_DIMENSIONS (restart_mod.f)' + WRITE( 6, '(a)' ) REPEAT( '=', 79 ) + CALL GEOS_CHEM_STOP + ENDIF + + ! Error check vertical dimension: NL must equal LLPAR + IF ( NL /= LLPAR ) THEN + WRITE( 6, '(a)' ) 'ERROR reading in restart file!' + WRITE( 6, '(a)' ) 'Wrong number of levels encountered!' + WRITE( 6, '(a)' ) 'STOP in CHECK_DIMENSIONS (restart_mod.f)' + WRITE( 6, '(a)' ) REPEAT( '=', 79 ) + CALL GEOS_CHEM_STOP + ENDIF + + ! Return to calling program + END SUBROUTINE CHECK_DIMENSIONS + +!------------------------------------------------------------------------------ + + SUBROUTINE COPY_STT( NTRACER, TRACER, NCOUNT ) +! +!****************************************************************************** +! Subroutine COPY_STT converts tracer concetrations from [v/v] to [kg] and +! then copies the results into the STT tracer array. (bmy, 6/25/02, 6/24/05) +! +! Arguments as Input: +! ============================================================================ +! (1 ) NTRACER (INTEGER) : Tracer number +! (2 ) NCOUNT (INTEGER) : Ctr array - # of data blocks read for each tracer +! (3 ) TRACER (REAL*4 ) : Tracer concentrations from restart file [v/v] +! +! NOTES: +! (1 ) Added to "restart_mod.f". Also added parallel loops. (bmy, 6/25/02) +! (2 ) Now reference AD from "dao_mod.f" (bmy, 9/18/02) +! (3 ) Now exit if N is out of range (bmy, 4/29/03) +! (4 ) Now references N_TRACERS, STT & TCVV from "tracer_mod.f" (bmy, 7/20/04) +! (5 ) Remove call to TRUE_TRACER_INDEX (bmy, 6/24/05) +!****************************************************************************** +! + ! References to F90 modules + USE DAO_MOD, ONLY : AD + USE TRACER_MOD, ONLY : N_TRACERS, STT, TCVV + +# include "CMN_SIZE" ! Size parameters + + ! Arguments + INTEGER, INTENT(IN) :: NTRACER + REAL*4, INTENT(IN) :: TRACER(IIPAR,JJPAR,LLPAR) + INTEGER, INTENT(INOUT) :: NCOUNT(NNPAR) + + ! Local variables + INTEGER :: I, J, L, N + + !================================================================= + ! COPY_STT begins here! + !================================================================= + + ! Tracer number + N = NTRACER + + ! Exit if N is out of range + IF ( N < 1 .or. N > N_TRACERS ) RETURN + + ! Convert from [v/v] to [kg] and store in STT +!$OMP PARALLEL DO +!$OMP+DEFAULT( SHARED ) +!$OMP+PRIVATE( I, J, L ) + DO L = 1, LLPAR + DO J = 1, JJPAR + DO I = 1, IIPAR + STT(I,J,L,N) = TRACER(I,J,L) * AD(I,J,L) / TCVV(N) + ENDDO + ENDDO + ENDDO +!$OMP END PARALLEL DO + + ! Increment the # of records found for tracer N + NCOUNT(N) = NCOUNT(N) + 1 + + END SUBROUTINE COPY_STT + +!------------------------------------------------------------------------------ + + SUBROUTINE CHECK_DATA_BLOCKS( NTRACE, NCOUNT ) +! +!****************************************************************************** +! Subroutine CHECK_DATA_BLOCKS checks to see if we have multiple or +! missing data blocks for a given tracer. (bmy, 6/25/02, 10/15/02) +! +! Arguments as Input: +! ============================================================================ +! (1 ) NTRACE (INTEGER) : Number of tracers +! (2 ) NCOUNT (INTEGER) : Ctr array - # of data blocks found per tracer +! +! NOTES: +! (1 ) Added to "restart_mod.f". Also now use F90 intrinsic REPEAT to +! write a long line of "="'s to the screen. (bmy, 6/25/02) +! (2 ) Now reference GEOS_CHEM_STOP from "error_mod.f", which frees all +! allocated memory before stopping the run. (bmy, 10/15/02) +!****************************************************************************** +! + ! References to F90 modules + USE ERROR_MOD, ONLY : GEOS_CHEM_STOP + + +# include "CMN_SIZE" ! Size parameters + + ! Arguments + INTEGER, INTENT(IN) :: NTRACE, NCOUNT(NNPAR) + + ! Local variables + INTEGER :: N + + !================================================================= + ! CHECK_DATA_BLOCKS begins here! + !================================================================= + + ! Loop over all tracers + DO N = 1, NTRACE + + ! Stop if a tracer has more than one data block + IF ( NCOUNT(N) > 1 ) THEN + WRITE( 6, 100 ) N + WRITE( 6, 120 ) + WRITE( 6, '(a)' ) REPEAT( '=', 79 ) + CALL GEOS_CHEM_STOP + ENDIF + + ! Stop if a tracer has no data blocks + IF ( NCOUNT(N) == 0 ) THEN + WRITE( 6, 110 ) N + WRITE( 6, 120 ) + WRITE( 6, '(a)' ) REPEAT( '=', 79 ) + CALL GEOS_CHEM_STOP + ENDIF + ENDDO + + ! FORMAT statements + 100 FORMAT( 'More than one record found for tracer : ', i4 ) + 110 FORMAT( 'No records found for tracer : ', i4 ) + 120 FORMAT( 'STOP in CHECK_DATA_BLOCKS (restart_mod.f)' ) + + ! Return to calling program + END SUBROUTINE CHECK_DATA_BLOCKS + +!------------------------------------------------------------------------------ + + SUBROUTINE SET_RESTART( INFILE, OUTFILE ) +! +!****************************************************************************** +! Subroutine SET_RESTART initializes the variables INPUT_RESTART_FILE and +! OUTPUT_RESTART_FILE with the values read from the "input.geos" file. +! (bmy, 7/9/04) +! +! Arguments as Input: +! ============================================================================ +! (1 ) INFILE (CHAR*255) : Input restart file name from "input.geos" +! (2 ) OUTFILE (CHAR*255) : Output restart file name from "input.geos" +! +! NOTES: +!****************************************************************************** +! + ! Arguments + CHARACTER(LEN=255) :: INFILE, OUTFILE + + !================================================================= + ! SET_RESTART begins here + !================================================================= + INPUT_RESTART_FILE = INFILE + OUTPUT_RESTART_FILE = OUTFILE + + ! Return to calling program + END SUBROUTINE SET_RESTART + +!------------------------------------------------------------------------------ + + SUBROUTINE MAKE_CSPEC_FILE( YYYYMMDD, HHMMSS ) +! +!****************************************************************************** +! Subroutine MAKE_CSPEC_FILE creates GEOS-CHEM checkpt files of species +! concentrations. +! (dkh, 8/27/04)! +! Arguments as Input: +! ============================================================================ +! (1 ) YYYYMMDD : Year-Month-Date +! (2 ) HHMMSS : and Hour-Min-Sec for which to create a checkpoint file +! +! Passed via CMN: +! ============================================================================ +! (1 ) TAU : TAU value (elapsed hours) at start of diagnostic interval +! +! Passed via comode_mod +! ============================================================================ +! (1 ) CSPEC : Array of quantities to be checkpointed +! +! +! NOTES: +! (1) Based on MAKE_RESTART_FILE +! +!****************************************************************************** +! + ! References to F90 modules + USE BPCH2_MOD + USE ERROR_MOD, ONLY : DEBUG_MSG, ERROR_STOP + USE FILE_MOD, ONLY : IU_RST, IOERROR + USE GRID_MOD, ONLY : GET_XOFFSET, GET_YOFFSET + USE LOGICAL_MOD, ONLY : LPRT + USE TIME_MOD, ONLY : EXPAND_DATE, GET_TAU + USE COMODE_MOD, ONLY : CSPEC, JLOP + ! write CSPEC_FULL hotp 2/25/09 + USE COMODE_MOD, ONLY : CSPEC_FULL + USE COMODE_MOD, ONLY : IXSAVE, IYSAVE, IZSAVE + +# include "CMN_SIZE" ! Size parameters +# include "CMN" ! TAU , NSRCX, LSOILNOX +# include "comode.h" ! IGAS + + ! Arguments + INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS + + ! Local Variables + INTEGER :: I, I0, IOS, J, J0, L, N, JLOOP + INTEGER :: YYYY, MM, DD, HH, SS, ZIP_HH + CHARACTER(LEN=255) :: FILENAME + CHARACTER(LEN=255) :: OUTPUT_CHECKPT_FILE + + + ! Temporary storage arrays for checkpointed variables + REAL*4 :: TMP(ILONG, ILAT, IPVERT) + + ! For binary punch file, version 2.0 + REAL*4 :: LONRES, LATRES + ! make HALFPOLAR variable (hotp 2/25/09) + !INTEGER, PARAMETER :: HALFPOLAR = 1 + INTEGER :: HALFPOLAR + INTEGER, PARAMETER :: CENTER180 = 1 + + INTEGER :: MAX_nitr_max + INTEGER :: NSOFAR + + CHARACTER(LEN=20) :: MODELNAME + CHARACTER(LEN=40) :: CATEGORY + CHARACTER(LEN=40) :: UNIT + CHARACTER(LEN=40) :: RESERVED = '' + CHARACTER(LEN=80) :: TITLE + + + !================================================================= + ! MAKE_CSPEC_FILE begins here! + !================================================================= + + ! Hardwire output file for now + OUTPUT_CHECKPT_FILE = 'restart.cspec.YYYYMMDDhh' + + ! Clear some arrays + ! use minimum value instead of zero hotp 2/25/09 + !TMP(:,:,:) = 0e0 + TMP(:,:,:) = 1e-30 + + + ! Define variables for BINARY PUNCH FILE OUTPUT + TITLE = 'GEOS-CHEM Checkpoint File: ' // + & 'Instantaneous Species Concentrations (#/cm3)' + CATEGORY = 'IJ-CHK-$' + LONRES = DISIZE + LATRES = DJSIZE + ! get value of HALFPOLAR hotp 2/25/09 + HALFPOLAR = GET_HALFPOLAR() + + ! Call GET_MODELNAME to return the proper model name for + ! the given met data being used (bmy, 6/22/00) + MODELNAME = GET_MODELNAME() + + ! Get the nested-grid offsets + I0 = GET_XOFFSET( GLOBAL=.TRUE. ) + J0 = GET_YOFFSET( GLOBAL=.TRUE. ) + + !================================================================= + ! Open the checkpoint file for output -- binary punch format + !================================================================= + + ! Copy the output checkpoint file name into a local variable + FILENAME = TRIM( OUTPUT_CHECKPT_FILE ) + + ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values + CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS ) + + ! Add ADJ_DIR prefix to filename + !FILENAME = TRIM( ADJ_DIR ) // TRIM( FILENAME ) + + WRITE( 6, 100 ) TRIM( FILENAME ) + 100 FORMAT( ' - MAKE_CSPEC_FILE: Writing ', a ) + + ! Open checkpoint file for output + CALL OPEN_BPCH2_FOR_WRITE( IU_RST, FILENAME, TITLE ) + + !================================================================= + ! Write each checkpointed quantity to the checkpoint file + !================================================================= + + ! Checkpt additional values for full chem simulation + + ! Write the final species concetrations after full chemistry + UNIT = 'molec/cm3/box' + + ! replace NCS with 1 for safety hotp 2/25/09 + !DO N = 1 , NTSPEC(NCS) + DO N = 1 , NTSPEC(1) + +!$OMP PARALLEL DO +!$OMP+DEFAULT( SHARED ) +!$OMP+PRIVATE( I, J, L ) + DO L = 1, IPVERT + DO J = 1, ILAT + DO I = 1, ILONG + + ! fix recommended by pls, save CSPEC_FULL (hotp 2/18/09) + ! now set conc no smalle than 1d-30 + IF ( CSPEC_FULL(I,J,L,N) .LE. 1d-30 ) THEN + TMP(I,J,L) = 1e-30 + ELSE + TMP(I,J,L) = CSPEC_FULL(I,J,L,N) + ENDIF + + ENDDO + ENDDO + ENDDO +!$OMP END PARALLEL DO + + CALL BPCH2( IU_RST, MODELNAME, LONRES, LATRES, + & HALFPOLAR, CENTER180, CATEGORY, N, + & UNIT, GET_TAU(), GET_TAU(), RESERVED, + & ILONG, ILAT, IPVERT, I0+1, + & J0+1, 1, TMP(:,:,:) ) + + ENDDO + + ! Close file + CLOSE( IU_RST ) + + !### Debug + IF ( LPRT ) CALL DEBUG_MSG( '### MAKE_CSPEC_FILE: wrote file' ) + + ! Return to calling program + END SUBROUTINE MAKE_CSPEC_FILE + +!------------------------------------------------------------------------------ + + SUBROUTINE READ_CSPEC_FILE( YYYYMMDD, HHMMSS, IT_EXISTS ) +! +!****************************************************************************** +! Subroutine READ_CSPEC_FILE initializes GEOS-CHEM species concentrations +! from a checkpoint file (binary punch file format) +! (dkh, 8/30/04) +! +! Arguments as input: +! ============================================================================ +! (1 ) YYYYMMDD : Year-Month-Day +! (2 ) HHMMSS : and Hour-Min-Sec for which to read restart file +! +! Passed via CMN: +! ============================================================================ +! (1 ) TAU : TAU value (elapsed hours) at start of diagnostic interval +! +! Notes +! (1 ) Based on READ_RESTART +! +!****************************************************************************** +! + ! References to F90 modules + USE BPCH2_MOD, ONLY : OPEN_BPCH2_FOR_READ + USE ERROR_MOD, ONLY : DEBUG_MSG, ERROR_STOP + USE FILE_MOD, ONLY : IU_RST, IOERROR + USE FILE_MOD, ONLY : FILE_EXISTS + USE LOGICAL_MOD, ONLY : LPRT + USE TIME_MOD, ONLY : EXPAND_DATE + USE COMODE_MOD, ONLY : CSPEC_FULL, JLOP + + +# include "CMN_SIZE" ! Size parameters +# include "CMN" ! LPRT, NSRCX, LSOILNOX +# include "comode.h" ! ITLOOP, IGAS + + ! Arguments + INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS + + ! Local Variables + INTEGER :: I, IOS, J, L, N, JLOOP, NN, NTL + INTEGER :: NCOUNT(NNPAR) + REAL*4 :: TMP(ILONG,ILAT,IPVERT) + LOGICAL :: IT_EXISTS + + REAL*8 :: SUMTC + CHARACTER(LEN=255) :: FILENAME + CHARACTER(LEN=255) :: INPUT_CHECKPT_FILE + + + ! For binary punch file, version 2.0 + INTEGER :: NI, NJ, NL + INTEGER :: IFIRST, JFIRST, LFIRST + INTEGER :: NTRACER, NSKIP + INTEGER :: HALFPOLAR, CENTER180 + REAL*4 :: LONRES, LATRES + REAL*8 :: ZTAU0, ZTAU1 + CHARACTER(LEN=20) :: MODELNAME + CHARACTER(LEN=40) :: CATEGORY + CHARACTER(LEN=40) :: UNIT + CHARACTER(LEN=40) :: RESERVED + + !================================================================= + ! READ_CSPEC_FILE begins here! + !================================================================= + + ! Hardwire output file for now + INPUT_CHECKPT_FILE = 'restart.cspec.YYYYMMDDhh' + + ! Initialize some variables + !TMP(:,:,:) = 0e0 + ! use 1e-30 as min (hotp 2/25/09) + TMP(:,:,:) = 1e-30 + + !================================================================= + ! Open checkpoint file and read top-of-file header + !================================================================= + + ! Copy input file name to a local variable + FILENAME = TRIM( INPUT_CHECKPT_FILE ) + + ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values + CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS ) + + ! Add ADJ_DIR prefix to name + !FILENAME = TRIM( ADJ_DIR ) // TRIM( FILENAME ) + + WRITE( 6, 100 ) TRIM( FILENAME ) + 100 FORMAT( ' - READ_CSPEC_FILE: Reading ', a ) + + ! Check to see if cspec restart file exists + IT_EXISTS = FILE_EXISTS( FILENAME ) + IF ( .not. IT_EXISTS ) THEN + RETURN + ENDIF + + ! Open the binary punch file for input + CALL OPEN_BPCH2_FOR_READ( IU_RST, FILENAME ) + + ! force NCS to one (hotp 2/25/09) + !DO N = 1, NTSPEC(NCS) + DO N = 1, NTSPEC(1) + + ! Read the values of CSPEC + READ( IU_RST, IOSTAT=IOS ) + & MODELNAME, LONRES, LATRES, HALFPOLAR, CENTER180 + + ! IOS < 0 is end-of-file, so exit + IF ( IOS < 0 ) GOTO 555 + + ! IOS > 0 is a real I/O error -- print error message + IF ( IOS > 0 ) + & CALL IOERROR( IOS,IU_RST,'read_cspec_file:13' ) + + READ( IU_RST, IOSTAT=IOS ) + & CATEGORY, NTRACER, UNIT, ZTAU0, ZTAU1, RESERVED, + & NTL, NN, NL, IFIRST, JFIRST, LFIRST, + & NSKIP + + IF ( IOS /= 0 ) + & CALL IOERROR(IOS,IU_RST,'read_cspec_file:14' ) + + READ( IU_RST, IOSTAT=IOS ) + & ( ( ( TMP(I,J,L), I= 1, NTL), J=1,NN ), L = 1, NL) + + IF ( IOS /= 0 ) + & CALL IOERROR( IOS,IU_RST,'read_cspec_file:16' ) + + !============================================================== + ! Assign data from the TMP array to CSPEC + !============================================================== + + ! Only process checkpoint data + IF ( CATEGORY(1:8) == 'IJ-CHK-$' .and. + & NTL == ILONG .and. + & NN == ILAT .and. + & NL == IPVERT ) THEN + + CSPEC_FULL(:,:,:,N) = TMP(:,:,:) + + + ELSE + CALL ERROR_STOP(' Restart data is not correct ', + & ' reading CSPEC, restart_mod') + + ENDIF + + ENDDO ! N + + 555 CONTINUE + + ! Close file + CLOSE( IU_RST ) + + + !### Debug + IF ( LPRT ) CALL DEBUG_MSG( '### READ_CSPEC_FILE: read file' ) + + ! Return to calling program + END SUBROUTINE READ_CSPEC_FILE + +!---------------------------------------------------------------------- + ! End of module + END MODULE RESTART_MOD