C $Header: /u/gcmpack/MITgcm/pkg/ptracers/ptracers_check.F,v 1.4 2014/08/18 14:34:27 jmc Exp $
C $Name: $
#include "PTRACERS_OPTIONS.h"
c#include "GAD_OPTIONS.h"
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
CBOP
C !ROUTINE: PTRACERS_CHECK
C !INTERFACE:
SUBROUTINE PTRACERS_CHECK( myThid )
C !DESCRIPTION:
C Print summary of PTRACERS setting and Check dependances
C with main model and other packages
C !USES:
IMPLICIT NONE
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "PTRACERS_SIZE.h"
#include "PTRACERS_PARAMS.h"
#include "GAD.h"
C !INPUT PARAMETERS:
INTEGER myThid
CEOP
#ifdef ALLOW_PTRACERS
C !LOCAL VARIABLES:
C iTracer :: tracer index
C iUnit :: unit number for I/O
C msgBuf :: Informational/error message buffer
INTEGER iTracer
INTEGER iUnit
CHARACTER*(MAX_LEN_MBUF) msgBuf
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
_BEGIN_MASTER(myThid)
WRITE(msgBuf,'(A)') 'PTRACERS_CHECK: #define ALLOW_PTRACERS'
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT, myThid )
C-- Print a summary of pTracer parameter values:
iUnit = standardMessageUnit
WRITE(msgBuf,'(A)') '// ==================================='
CALL PRINT_MESSAGE( msgBuf, iUnit, SQUEEZE_RIGHT , myThid )
WRITE(msgBuf,'(A)') '// PTRACERS parameters '
CALL PRINT_MESSAGE( msgBuf, iUnit, SQUEEZE_RIGHT , myThid )
WRITE(msgBuf,'(A)') '// ==================================='
CALL PRINT_MESSAGE( msgBuf, iUnit, SQUEEZE_RIGHT , myThid )
CALL WRITE_0D_I( PTRACERS_numInUse, INDEX_NONE,
& 'PTRACERS_numInUse =',
& ' /* number of tracers */')
CALL WRITE_0D_I( PTRACERS_Iter0, INDEX_NONE,
& 'PTRACERS_Iter0 =',
& ' /* timestep number when tracers are initialized */')
CALL WRITE_0D_L( PTRACERS_startAllTrc, INDEX_NONE,
& 'PTRACERS_startAllTrc =','/* all tracers start @ startTime */')
CALL WRITE_0D_L( PTRACERS_doAB_onGpTr, INDEX_NONE,
& 'PTRACERS_doAB_onGpTr =',
& '/* apply AB on Tendencies (rather than on Tracers) */')
CALL WRITE_0D_L( PTRACERS_addSrelax2EmP, INDEX_NONE,
& 'PTRACERS_addSrelax2EmP =','/* add Salt relaxation to EmP */')
CALL WRITE_1D_RL( PTRACERS_dTLev, Nr, INDEX_K,
& 'PTRACERS_dTLev =',
&' /* Ptracer timestep ( s ) */')
CALL WRITE_0D_RL(PTRACERS_monitorFreq, INDEX_NONE,
& 'PTRACERS_monitorFreq =',
& ' /* Frequency^-1 for monitor output (s) */')
CALL WRITE_0D_RL(PTRACERS_dumpFreq, INDEX_NONE,
& 'PTRACERS_dumpFreq =',
& ' /* Frequency^-1 for snapshot output (s) */')
CALL WRITE_0D_RL(PTRACERS_taveFreq, INDEX_NONE,
& 'PTRACERS_taveFreq =',
& ' /* Frequency^-1 for time-Aver. output (s) */')
CALL WRITE_0D_L( PTRACERS_useRecords, INDEX_NONE,
& 'PTRACERS_useRecords =', ' /* all tracers in 1 file */')
CALL WRITE_0D_L( PTRACERS_timeave_mnc, INDEX_NONE,
& 'PTRACERS_timeave_mnc =',
& ' /* use MNC for Tave output */')
CALL WRITE_0D_L( PTRACERS_snapshot_mnc, INDEX_NONE,
& 'PTRACERS_snapshot_mnc =',
& ' /* use MNC for snapshot output */')
CALL WRITE_0D_L( PTRACERS_pickup_write_mnc, INDEX_NONE,
& 'PTRACERS_pickup_write_mnc =',
& ' /* use MNC for writing pickups */')
CALL WRITE_0D_L( PTRACERS_pickup_read_mnc, INDEX_NONE,
& 'PTRACERS_pickup_read_mnc =',
& ' /* use MNC for reading pickups */')
DO iTracer=1,PTRACERS_numInUse
WRITE(msgBuf,'(A)') ' -----------------------------------'
CALL PRINT_MESSAGE( msgBuf, iUnit, SQUEEZE_RIGHT, myThid )
WRITE(msgBuf,'(A,I4)') ' tracer number : ',iTracer
CALL PRINT_MESSAGE( msgBuf, iUnit, SQUEEZE_RIGHT, myThid )
CALL WRITE_0D_C( PTRACERS_names(iTracer), -1, INDEX_NONE,
& 'PTRACERS_names =', ' /* Tracer short name */')
CALL WRITE_0D_C( PTRACERS_long_names(iTracer), -1, INDEX_NONE,
& 'PTRACERS_long_names =', ' /* Tracer long name */')
CALL WRITE_0D_C( PTRACERS_ioLabel(iTracer), 0, INDEX_NONE,
& 'PTRACERS_ioLabel =', ' /* tracer IO Label */')
IF ( .NOT.PTRACERS_startAllTrc )
& CALL WRITE_0D_RL( PTRACERS_startStepFwd(iTracer), INDEX_NONE,
& 'PTRACERS_startStepFwd =', ' /* tracer starting time */')
CALL WRITE_0D_I( PTRACERS_advScheme(iTracer), INDEX_NONE,
& 'PTRACERS_advScheme =', ' /* Advection Scheme */')
CALL WRITE_0D_L( PTRACERS_SOM_Advection(iTracer), INDEX_NONE,
& 'PTRACERS_SOM_Advection =',
& ' /* tracer uses SOM advection scheme */')
CALL WRITE_0D_L( PTRACERS_ImplVertAdv(iTracer), INDEX_NONE,
& 'PTRACERS_ImplVertAdv =',
& ' /* implicit vert. advection flag */')
CALL WRITE_0D_L( PTRACERS_MultiDimAdv(iTracer), INDEX_NONE,
& 'PTRACERS_MultiDimAdv =',
& ' /* tracer uses Multi-Dim advection */')
CALL WRITE_0D_L( PTRACERS_AdamsBashGtr(iTracer), INDEX_NONE,
& 'PTRACERS_AdamsBashGtr =',
& ' /* apply AB on tracer tendency */')
CALL WRITE_0D_L( PTRACERS_AdamsBash_Tr(iTracer), INDEX_NONE,
& 'PTRACERS_AdamsBash_Tr =',
& ' /* apply AB on passive tracer */')
CALL WRITE_0D_RL( PTRACERS_diffKh(iTracer), INDEX_NONE,
& 'PTRACERS_diffKh =', ' /* Laplacian Diffusivity */')
CALL WRITE_0D_RL( PTRACERS_diffK4(iTracer), INDEX_NONE,
& 'PTRACERS_diffK4 =', ' /* Biharmonic Diffusivity */')
CALL WRITE_1D_RL( PTRACERS_diffKrNr(1,iTracer), Nr, INDEX_K,
& 'PTRACERS_diffKrNr =', ' /* Vertical Diffusivity */')
CALL WRITE_0D_L( PTRACERS_useGMRedi(iTracer), INDEX_NONE,
& 'PTRACERS_useGMRedi =', ' /* apply GM-Redi */')
CALL WRITE_0D_L( PTRACERS_useDWNSLP(iTracer), INDEX_NONE,
& 'PTRACERS_useDWNSLP =', ' /* apply DOWN-SLOPE Flow */')
CALL WRITE_0D_L( PTRACERS_useKPP(iTracer), INDEX_NONE,
& 'PTRACERS_useKPP =', ' /* apply KPP scheme */')
CALL WRITE_1D_RL( PTRACERS_ref(1,iTracer), Nr, INDEX_K,
& 'PTRACERS_ref =', ' /* Reference vertical profile */')
CALL WRITE_0D_RL( PTRACERS_EvPrRn(iTracer), INDEX_NONE,
& 'PTRACERS_EvPrRn =', '/* tracer conc. in Evap. & Rain */')
ENDDO
WRITE(msgBuf,'(A)') ' -----------------------------------'
CALL PRINT_MESSAGE( msgBuf, iUnit, SQUEEZE_RIGHT, myThid )
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
IF ( PTRACERS_Iter0.GE.nEndIter ) THEN
WRITE(msgBuf,'(2A)') '** WARNING ** PTRACERS_CHECK:',
& ' PTRACERS_Iter0 beyond run-end (=nEndIter)'
CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
& SQUEEZE_RIGHT, myThid )
WRITE(msgBuf,'(2A)') '** WARNING ** PTRACERS_CHECK:',
& ' ==> do not load initial conditions nor pickup file'
CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
& SQUEEZE_RIGHT, myThid )
ELSEIF ( PTRACERS_Iter0.GT.nIter0 ) THEN
WRITE(msgBuf,'(2A,I3,A)') 'PTRACERS_CHECK:',
& ' wrong setting of PTRACERS_Iter0 :'
CALL PRINT_ERROR( msgBuf, myThid )
WRITE(msgBuf,'(2A,I3,A)') 'PTRACERS_CHECK:',
& ' nIter0 < PTRACERS_Iter0 < nEndIter not supported'
CALL PRINT_ERROR( msgBuf, myThid )
STOP 'ABNORMAL END: S/R PTRACERS_CHECK'
ENDIF
#ifndef INCLUDE_IMPLVERTADV_CODE
DO iTracer=1,PTRACERS_numInUse
IF ( PTRACERS_ImplVertAdv(iTracer) ) THEN
WRITE(msgBuf,'(A)')
& 'PTRACERS_CHECK: #undef INCLUDE_IMPLVERTADV_CODE'
CALL PRINT_ERROR( msgBuf, myThid )
WRITE(msgBuf,'(2A,I3,A)') 'PTRACERS_CHECK:',
& ' but pTracers_ImplVertAdv(',iTracer,' ) is TRUE'
CALL PRINT_ERROR( msgBuf, myThid )
STOP 'ABNORMAL END: S/R PTRACERS_CHECK'
ENDIF
ENDDO
IF ( PTRACERS_dTLev(1).NE.PTRACERS_dTLev(Nr)
& .AND. implicitDiffusion ) THEN
WRITE(msgBuf,'(A)')
& 'PTRACERS_CHECK: #undef INCLUDE_IMPLVERTADV_CODE'
CALL PRINT_ERROR( msgBuf , myThid)
WRITE(msgBuf,'(2A)') 'PTRACERS_CHECK: ',
& 'but implicitDiffusion=T with non-uniform PTRACERS_dTLev'
CALL PRINT_ERROR( msgBuf , myThid)
STOP 'ABNORMAL END: S/R PTRACERS_CHECK'
ENDIF
#endif
DO iTracer=1,PTRACERS_numInUse
IF ( PTRACERS_useGMRedi(iTracer) .AND. .NOT.useGMRedi ) THEN
WRITE(msgBuf,'(2A,I3,A)') 'PTRACERS_CHECK:',
& ' pTracers_useGMRedi(',iTracer,' ) is TRUE'
CALL PRINT_ERROR( msgBuf, myThid )
WRITE(msgBuf,'(A,L5,A)')
& 'PTRACERS_CHECK: But not useGMRedi (=',useGMRedi,')'
CALL PRINT_ERROR( msgBuf, myThid )
STOP 'ABNORMAL END: S/R PTRACERS_CHECK'
ENDIF
IF ( PTRACERS_useDWNSLP(iTracer) .AND. .NOT.useDOWN_SLOPE ) THEN
WRITE(msgBuf,'(2A,I3,A)') 'PTRACERS_CHECK:',
& ' pTracers_useDWNSLP(',iTracer,' ) is TRUE'
CALL PRINT_ERROR( msgBuf, myThid )
WRITE(msgBuf,'(2A,L5,A)') 'PTRACERS_CHECK:',
& ' But not useDOWN_SLOPE (=', useDOWN_SLOPE, ')'
CALL PRINT_ERROR( msgBuf, myThid )
STOP 'ABNORMAL END: S/R PTRACERS_CHECK'
ENDIF
IF ( PTRACERS_useKPP(iTracer) .AND. .NOT.useKPP ) THEN
WRITE(msgBuf,'(2A,I3,A)') 'PTRACERS_CHECK:',
& ' pTracers_useKPP(',iTracer,' ) is TRUE'
CALL PRINT_ERROR( msgBuf, myThid )
WRITE(msgBuf,'(A,L5,A)')
& 'PTRACERS_CHECK: But not useKPP (=',useKPP,')'
CALL PRINT_ERROR( msgBuf, myThid )
STOP 'ABNORMAL END: S/R PTRACERS_CHECK'
ENDIF
ENDDO
_END_MASTER(myThid)
C Everyone else must wait for the parameters to be loaded
_BARRIER
#endif /* ALLOW_PTRACERS */
RETURN
END