1061 lines
39 KiB
Fortran
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
|