C $Header: /u/gcmpack/MITgcm/pkg/ptracers/ptracers_readparms.F,v 1.50 2017/08/09 15:23:36 mlosch Exp $
C $Name: $
#include "PTRACERS_OPTIONS.h"
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
CBOP
C !ROUTINE: PTRACERS_READPARMS
C !INTERFACE:
SUBROUTINE PTRACERS_READPARMS( myThid )
C !DESCRIPTION:
C Initialize PTRACERS parameters, read in data.ptracers
C !USES:
IMPLICIT NONE
#include "SIZE.h"
#include "EEPARAMS.h"
#ifdef ALLOW_LONGSTEP
#include "LONGSTEP_PARAMS.h"
#endif
#include "PTRACERS_SIZE.h"
#include "PTRACERS_PARAMS.h"
#include "PARAMS.h"
#ifdef ALLOW_MNC
#include "MNC_PARAMS.h"
#endif
C !INPUT PARAMETERS:
INTEGER myThid
CEOP
#ifdef ALLOW_PTRACERS
C !LOCAL VARIABLES:
C k,iTracer :: loop indices
C iUnit :: unit number for I/O
C msgBuf :: message buffer
INTEGER k, iTracer
INTEGER iUnit
INTEGER ic
CHARACTER*(MAX_LEN_MBUF) msgBuf
_RL PTRACERS_diffKr(PTRACERS_num)
_RL tauTr1ClimRelax
C PTRACERS_taveFreq :: Frequency with which time-averaged PTRACERS
C are written to post-processing files.
C tauTr1ClimRelax :: old parameter (will be removed 1 day)
NAMELIST //PTRACERS_PARM01
& tauTr1ClimRelax,
& PTRACERS_numInUse,
& PTRACERS_Iter0,
& PTRACERS_doAB_onGpTr,
& PTRACERS_addSrelax2EmP,
& PTRACERS_startStepFwd,
& PTRACERS_resetFreq,
& PTRACERS_resetPhase,
& PTRACERS_advScheme,
& PTRACERS_ImplVertAdv,
& PTRACERS_diffKh,
& PTRACERS_diffK4,
& PTRACERS_diffKr,
& PTRACERS_diffKrNr,
& PTRACERS_ref,
& PTRACERS_EvPrRn,
& PTRACERS_useGMRedi,
& PTRACERS_useDWNSLP,
& PTRACERS_useKPP,
& PTRACERS_initialFile,
& PTRACERS_names,
& PTRACERS_long_names,
& PTRACERS_units,
& PTRACERS_useRecords,
& PTRACERS_dumpFreq,
& PTRACERS_taveFreq,
& PTRACERS_monitorFreq,
& PTRACERS_timeave_mnc,
& PTRACERS_snapshot_mnc,
& PTRACERS_monitor_mnc,
& PTRACERS_pickup_write_mnc,
& PTRACERS_pickup_read_mnc,
& PTRACERS_linFSConserve
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
IF ( .NOT.usePTRACERS ) THEN
C- pkg PTRACERS is not used
_BEGIN_MASTER(myThid)
C- Track pkg activation status:
C print a (weak) warning if data.ptracers is found
CALL PACKAGES_UNUSED_MSG( 'usePTRACERS', ' ', ' ' )
_END_MASTER(myThid)
RETURN
ENDIF
_BEGIN_MASTER(myThid)
C Set ptracer IO & diagnostics labels (2 characters long)
CALL PTRACERS_SET_IOLABEL(
O PTRACERS_ioLabel,
I PTRACERS_num, myThid )
C Set defaults values for parameters in PTRACERS.h
PTRACERS_dumpFreq = dumpFreq
PTRACERS_taveFreq = taveFreq
PTRACERS_monitorFreq = monitorFreq
PTRACERS_Iter0 = 0
PTRACERS_numInUse=-1
DO iTracer=1,PTRACERS_num
PTRACERS_startStepFwd(iTracer) = baseTime
PTRACERS_resetFreq (iTracer) = 0.
PTRACERS_resetPhase(iTracer) = 0.
PTRACERS_advScheme(iTracer)=saltAdvScheme
PTRACERS_ImplVertAdv(iTracer) = .FALSE.
PTRACERS_diffKh(iTracer)=diffKhS
PTRACERS_diffK4(iTracer)=diffK4S
PTRACERS_diffKr(iTracer)=UNSET_RL
DO k=1,Nr
PTRACERS_diffKrNr(k,iTracer)=diffKrNrS(k)
PTRACERS_ref (k,iTracer)=0. _d 0
ENDDO
PTRACERS_EvPrRn(iTracer)=UNSET_RL
PTRACERS_useGMRedi(iTracer)=useGMRedi
PTRACERS_useDWNSLP(iTracer)=useDOWN_SLOPE
PTRACERS_useKPP(iTracer) =useKPP
PTRACERS_initialFile(iTracer)=' '
PTRACERS_linFSConserve(iTracer)=.FALSE.
DO ic = 1,MAX_LEN_FNAM
PTRACERS_names(iTracer)(ic:ic) = ' '
PTRACERS_long_names(iTracer)(ic:ic) = ' '
PTRACERS_units(iTracer)(ic:ic) = ' '
ENDDO
ENDDO
PTRACERS_doAB_onGpTr = doAB_onGtGs
PTRACERS_addSrelax2EmP = .FALSE.
PTRACERS_useRecords = .FALSE.
#ifdef ALLOW_MNC
PTRACERS_timeave_mnc = useMNC .AND. timeave_mnc
PTRACERS_snapshot_mnc = useMNC .AND. snapshot_mnc
PTRACERS_monitor_mnc = useMNC .AND. monitor_mnc
PTRACERS_pickup_write_mnc = useMNC .AND. pickup_write_mnc
PTRACERS_pickup_read_mnc = useMNC .AND. pickup_read_mnc
#else
PTRACERS_timeave_mnc = .FALSE.
PTRACERS_snapshot_mnc = .FALSE.
PTRACERS_monitor_mnc = .FALSE.
PTRACERS_pickup_write_mnc = .FALSE.
PTRACERS_pickup_read_mnc = .FALSE.
#endif
tauTr1ClimRelax = 0.
DO k = 1,Nr
#ifdef ALLOW_LONGSTEP
PTRACERS_dTLev(k) = LS_nIter*dTtracerLev(k)
#else
PTRACERS_dTLev(k) = dTtracerLev(k)
#endif
ENDDO
C Open and read the data.ptracers file
WRITE(msgBuf,'(A)') ' PTRACERS_READPARMS: opening data.ptracers'
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT , myThid )
CALL OPEN_COPY_DATA_FILE(
I 'data.ptracers', 'PTRACERS_READPARMS',
O iUnit,
I myThid )
READ(UNIT=iUnit,NML=PTRACERS_PARM01)
WRITE(msgBuf,'(A)')
& ' PTRACERS_READPARMS: finished reading data.ptracers'
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT , myThid )
C Close the open data file
#ifdef SINGLE_DISK_IO
CLOSE(iUnit)
#else
CLOSE(iUnit,STATUS='DELETE')
#endif /* SINGLE_DISK_IO */
C Check for retired parameters:
C Tracer 1 climatology relaxation time scale (<- but the code is gone !)
IF ( tauTr1ClimRelax .NE. 0. ) THEN
#ifndef ALLOW_COST
WRITE(msgBuf,'(2A)')' PTRACERS_READPARMS: ',
& 'tauTr1ClimRelax has been removed (code is gone)'
CALL PRINT_ERROR( msgBuf, myThid )
STOP 'ABNORMAL END: S/R PTRACERS_READPARMS'
#else
lambdaTr1ClimRelax = 1./tauTr1ClimRelax
ELSE
lambdaTr1ClimRelax = 0.
#endif
ENDIF
C-- Now set-up any remaining parameters that result from other params
C If PTRACERS_numInUse was not set in data.ptracers then we can
C assume that all PTRACERS fields will be in use
IF (PTRACERS_numInUse.LT.0) THEN
PTRACERS_numInUse=PTRACERS_num
ENDIF
C Check we are not trying to use more tracers than allowed
IF (PTRACERS_numInUse.GT.PTRACERS_num) THEN
WRITE(msgBuf,'(A,I4,A,I4,A)')
& ' PTRACERS_READPARMS: You requested',PTRACERS_numInUse,
& ' tracers at run time when only',PTRACERS_num,
& ' were specified at compile time. Naughty! '
CALL PRINT_ERROR( msgBuf, myThid )
STOP 'ABNORMAL END: S/R PTRACERS_READPARMS'
ENDIF
C Set vertical diffusion array
DO iTracer=1,PTRACERS_numInUse
IF ( PTRACERS_diffKr(iTracer).NE.UNSET_RL ) THEN
DO k=1,Nr
PTRACERS_diffKrNr(k,iTracer)=PTRACERS_diffKr(iTracer)
ENDDO
ENDIF
ENDDO
C Set flag to check when each tracer starts
PTRACERS_startAllTrc = .TRUE.
DO iTracer=1,PTRACERS_numInUse
IF ( PTRACERS_startStepFwd(iTracer) .NE. baseTime )
& PTRACERS_startAllTrc = .FALSE.
ENDDO
#ifdef ALLOW_AUTODIFF
IF ( .NOT.PTRACERS_startAllTrc ) THEN
WRITE(msgBuf,'(A)')
& 'PTRACERS_READPARMS: Compiling AD code does not allow'
CALL PRINT_ERROR( msgBuf, myThid )
WRITE(msgBuf,'(A)')
& 'to use different starting time (PTRACERS_startStepFwd)'
CALL PRINT_ERROR( msgBuf, myThid )
STOP 'ABNORMAL END: S/R PTRACERS_READPARMS'
ENDIF
#endif /* ALLOW_AUTODIFF */
C Whether to compute linear surface correction
C (this may also be enabled elsewhere)
PTRACERS_calcSurfCor = .FALSE.
DO iTracer=1,PTRACERS_num
IF (PTRACERS_linFSConserve(iTracer)) PTRACERS_calcSurfCor=.TRUE.
ENDDO
#ifdef ALLOW_MNC
PTRACERS_timeave_mnc = useMNC .AND. PTRACERS_timeave_mnc
PTRACERS_snapshot_mnc = useMNC .AND. PTRACERS_snapshot_mnc
PTRACERS_monitor_mnc = useMNC .AND. PTRACERS_monitor_mnc
PTRACERS_pickup_write_mnc = useMNC .AND. PTRACERS_pickup_write_mnc
PTRACERS_pickup_read_mnc = useMNC .AND. PTRACERS_pickup_read_mnc
PTRACERS_timeave_mdsio = (.NOT. PTRACERS_timeave_mnc)
& .OR. outputTypesInclusive
PTRACERS_snapshot_mdsio = (.NOT. PTRACERS_snapshot_mnc)
& .OR. outputTypesInclusive
PTRACERS_monitor_stdio = (.NOT. PTRACERS_monitor_mnc)
& .OR. outputTypesInclusive
PTRACERS_pickup_write_mdsio = (.NOT. PTRACERS_pickup_write_mnc)
& .OR. outputTypesInclusive
PTRACERS_pickup_read_mdsio = (.NOT. PTRACERS_pickup_read_mnc)
& .OR. outputTypesInclusive
#else
PTRACERS_timeave_mnc = .FALSE.
PTRACERS_snapshot_mnc = .FALSE.
PTRACERS_monitor_mnc = .FALSE.
PTRACERS_pickup_write_mnc = .FALSE.
PTRACERS_pickup_read_mnc = .FALSE.
PTRACERS_timeave_mdsio = .TRUE.
PTRACERS_snapshot_mdsio = .TRUE.
PTRACERS_monitor_stdio = .TRUE.
PTRACERS_pickup_write_mdsio = .TRUE.
PTRACERS_pickup_read_mdsio = .TRUE.
#endif
C-- Print a summary of pTracer parameter values:
_END_MASTER(myThid)
C Everyone else must wait for the parameters to be loaded
_BARRIER
#endif /* ALLOW_PTRACERS */
RETURN
END