Files
2018-10-30 15:37:33 -04:00

1061 lines
39 KiB
Fortran

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