Files
GEOS-Chem-adjoint-v35-note/code/benchmark_mod.f
2018-08-28 00:43:47 -04:00

186 lines
7.4 KiB
Fortran

! $Id: benchmark_mod.f,v 1.1 2009/06/09 21:51:54 daven Exp $
MODULE BENCHMARK_MOD
!
!******************************************************************************
! Module BENCHMARK_MOD contains routines to save out initial and final
! tracer masses which are needed for GEOS-CHEM benchmark diagnostics.
! (bmy, 7/20/04, 10/3/05)
!
! Module Variables:
! ============================================================================
! (1 ) INITIAL_FILE (CHAR*255) : Name of file w/ initial tracer mass
! (2 ) FINAL_FILE (CHAR*255) : Name of file w/ final tracer mass
!
! Module Routines:
! ============================================================================
! (1 ) STDRUN : Saves initial or final tracer mass to bpch file format
!
! GEOS-CHEM modules referenced by biomass_mod.f
! ============================================================================
! (1 ) bpch2_mod.f : Module containing routines for binary punch file I/O
! (2 ) file_mod.f : Contains file unit numbers and error checks
! (3 ) logical_mod.f : Module containing GEOS-CHEM logical switches
! (4 ) time_mod.f : Module containing routines for computing time & date
! (5 ) tracer_mod.f : Module containing GEOS-CHEM tracer array STT etc.
! (6 ) tracerid_mod.f : Module containing pointers to tracers & emissions
!
! NOTES:
! (1 ) Now expand date & time tokens in filenames (bmy, 1/31/05)
! (2 ) Now modified for GCAP grid (swu, bmy, 6/28/05)
! (3 ) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)
!******************************************************************************
!
IMPLICIT NONE
!=================================================================
! MODULE VARIABLES
!=================================================================
CHARACTER(LEN=255) :: INITIAL_FILE
CHARACTER(LEN=255) :: FINAL_FILE
!=================================================================
! MODULE ROUTINES -- Follow below the "CONTAINS" statement
!=================================================================
CONTAINS
!------------------------------------------------------------------------------
SUBROUTINE STDRUN( LBEGIN )
!
!******************************************************************************
! Subroutine STDRUN dumps the mass of either Ox [kg] or 222Rn, 210Pb, and 7Be
! [kg] at the start & end of each run. This is necessary for GEOS-CHEM
! benchmarking. (bmy, 8/12/02, 10/3/05)
!
! Arguments as Input:
! ============================================================================
! (1 ) LBEGIN (LOGICAL) : TRUE denotes beginning of the run;
! FALSE denotes the end of the run
!
! NOTES:
! (1 ) Changed name from STDRUN_Ox to STDRUN, since we now can also save out
! Rn/Pb/Be for NSRCX==1. Also deleted obsolete code from 6/02. Added
! LBEGIN as an argument to determine if this is the start or end of the
! run. (bmy, 8/12/02)
! (2 ) Bundled into "benchmark_mod.f" (bmy, 7/20/04)
! (3 ) Now expand date tokens in the filename (bmy, 1/31/05)
! (4 ) Now call GET_HALFPOLAR from "bpch2_mod.f" to get the HALFPOLAR flag
! value for GEOS or GCAP grids . Also removed references to CMN_DIAG
! and TRCOFFSET. (bmy, 6/28/05)
! (5 ) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)
!******************************************************************************
!
! References to F90 modules
USE BPCH2_MOD, ONLY : OPEN_BPCH2_FOR_WRITE, BPCH2
USE BPCH2_MOD, ONLY : GET_HALFPOLAR, GET_MODELNAME
USE FILE_MOD, ONLY : IU_FILE, IOERROR
USE TIME_MOD, ONLY : EXPAND_DATE, GET_NYMD
USE TIME_MOD, ONLY : GET_NHMS, GET_TAU
USE TRACER_MOD, ONLY : ITS_A_FULLCHEM_SIM, ITS_A_RnPbBe_SIM
USE TRACER_MOD, ONLY : STT, N_TRACERS
USE TRACERID_MOD, ONLY : IDTOX
# include "CMN_SIZE" ! Size parameters
! Arguments
LOGICAL, INTENT(IN) :: LBEGIN
! Local variables
INTEGER :: N, NYMD, NHMS
INTEGER, PARAMETER :: IFIRST=1, JFIRST=1, LFIRST=1
INTEGER, PARAMETER :: CENTER180=1
INTEGER :: HALFPOLAR
REAL*4 :: ARRAY(IIPAR,JJPAR,LLPAR)
REAL*4 :: LONRES, LATRES
REAL*8 :: TAU
CHARACTER(LEN=20) :: MODELNAME
CHARACTER(LEN=40) :: CATEGORY, RESERVED, UNIT
CHARACTER(LEN=80) :: TITLE
CHARACTER(LEN=255) :: FILENAME
!=================================================================
! STDRUN begins here!
!=================================================================
! Return if we are not doing either a radon or fullchem stdrun
IF ( ( .not. ITS_A_FULLCHEM_SIM() ) .and.
& ( .not. ITS_A_RnPbBe_SIM() ) ) RETURN
! Define variables for binary punch file
MODELNAME = GET_MODELNAME()
HALFPOLAR = GET_HALFPOLAR()
CATEGORY = 'TCMASS-$'
UNIT = 'kg'
RESERVED = ''
LONRES = DISIZE
LATRES = DJSIZE
NYMD = GET_NYMD()
NHMS = GET_NHMS()
TAU = GET_TAU()
! Define filename for beginning or end of benchmark run
IF ( LBEGIN ) THEN
TITLE = 'GEOS-CHEM Benchmark: Initial Tracer Mass'
FILENAME = INITIAL_FILE
ELSE
TITLE = 'GEOS-CHEM Benchmark: Final Tracer Mass'
FILENAME = FINAL_FILE
ENDIF
! Expand any date tokens in the filename
CALL EXPAND_DATE( FILENAME, NYMD, NHMS )
!=================================================================
! Save the mass of 222Rn, 210Pb, 7Be to a file
!=================================================================
IF ( ITS_A_RnPbBE_SIM() ) THEN
! Open binary punch file for writing
CALL OPEN_BPCH2_FOR_WRITE( IU_FILE, FILENAME, TITLE )
! Loop over tracers
DO N = 1, N_TRACERS
! Save Rn, Pb, Be as REAL*4
ARRAY(:,:,:) = STT(:,:,:,N)
! Write Rn, Pb, Be to binary punch file
CALL BPCH2( IU_FILE, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, N,
& UNIT, TAU, TAU, RESERVED,
& IIPAR, JJPAR, LLPAR, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,:) )
ENDDO
!=================================================================
! Save the mass of Ox to a file
!=================================================================
ELSE IF ( ITS_A_FULLCHEM_SIM() .and. IDTOX > 0 ) THEN
! Open binary punch file for writing
CALL OPEN_BPCH2_FOR_WRITE( IU_FILE, FILENAME, TITLE )
! Save Ox as REAL*4
ARRAY(:,:,:) = STT(:,:,:,IDTOX)
! Write Ox to binary punch file
CALL BPCH2( IU_FILE, MODELNAME, LONRES, LATRES,
& HALFPOLAR, CENTER180, CATEGORY, IDTOX,
& UNIT, GET_TAU(), GET_TAU(), RESERVED,
& IIPAR, JJPAR, LLPAR, IFIRST,
& JFIRST, LFIRST, ARRAY(:,:,:) )
ENDIF
! Close file
CLOSE( IU_FILE )
! Return to MAIN program
END SUBROUTINE STDRUN
!------------------------------------------------------------------------------
! End of module
END MODULE BENCHMARK_MOD