Back to home page

MITgcm

 
 

    


File indexing completed on 2025-11-07 06:08:46 UTC

view on githubraw file Latest commit b7411f1a on 2025-11-06 19:05:26 UTC
785a077159 Alis*0001 #include "PTRACERS_OPTIONS.h"
46918f1b26 Jean*0002 #include "GAD_OPTIONS.h"
785a077159 Alis*0003 
d2825c6d08 Ed H*0004 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
785a077159 Alis*0005 CBOP
d2825c6d08 Ed H*0006 C     !ROUTINE: PTRACERS_READPARMS
e6469f285f Jean*0007 
d2825c6d08 Ed H*0008 C     !INTERFACE:
785a077159 Alis*0009       SUBROUTINE PTRACERS_READPARMS( myThid )
e6469f285f Jean*0010 
d2825c6d08 Ed H*0011 C     !DESCRIPTION:
785a077159 Alis*0012 C     Initialize PTRACERS parameters, read in data.ptracers
                0013 
d2825c6d08 Ed H*0014 C     !USES:
785a077159 Alis*0015       IMPLICIT NONE
                0016 #include "SIZE.h"
                0017 #include "EEPARAMS.h"
4e66ab0b67 Oliv*0018 #ifdef ALLOW_LONGSTEP
                0019 #include "LONGSTEP_PARAMS.h"
                0020 #endif
636477d15b Jean*0021 #include "PTRACERS_SIZE.h"
0a278985fd Jean*0022 #include "PTRACERS_PARAMS.h"
981f32514d Dimi*0023 #include "PARAMS.h"
50653b81f1 Ed H*0024 #ifdef ALLOW_MNC
                0025 #include "MNC_PARAMS.h"
                0026 #endif
a30418b6b9 Ed H*0027 
d2825c6d08 Ed H*0028 C     !INPUT PARAMETERS:
785a077159 Alis*0029       INTEGER myThid
d2825c6d08 Ed H*0030 CEOP
785a077159 Alis*0031 
                0032 #ifdef ALLOW_PTRACERS
d2825c6d08 Ed H*0033 C     !LOCAL VARIABLES:
d75c5feb26 Jean*0034 C     k,iTracer  :: loop indices
d2825c6d08 Ed H*0035 C     iUnit      :: unit number for I/O
b7411f1a84 Jean*0036 C     errCount   :: error counter
d2825c6d08 Ed H*0037 C     msgBuf     :: message buffer
b7411f1a84 Jean*0038 C     tauTr1ClimRelax :: old parameter (will be removed 1 day)
d75c5feb26 Jean*0039       INTEGER k, iTracer
b7411f1a84 Jean*0040       INTEGER iUnit, errCount
d2825c6d08 Ed H*0041       INTEGER ic
785a077159 Alis*0042       CHARACTER*(MAX_LEN_MBUF) msgBuf
d75c5feb26 Jean*0043       _RL PTRACERS_diffKr(PTRACERS_num)
282caa8385 Jean*0044       _RL tauTr1ClimRelax
b7411f1a84 Jean*0045 C--   retired parameters:
636477d15b Jean*0046 C     PTRACERS_taveFreq :: Frequency with which time-averaged PTRACERS
                0047 C                          are written to post-processing files.
b7411f1a84 Jean*0048       _RL PTRACERS_taveFreq
                0049       LOGICAL PTRACERS_timeave_mnc
                0050 
636477d15b Jean*0051       NAMELIST /PTRACERS_PARM01/
282caa8385 Jean*0052      &     tauTr1ClimRelax,
dc3a357327 Jean*0053      &     PTRACERS_numInUse,
                0054      &     PTRACERS_Iter0,
fc10d43a89 Jean*0055      &     PTRACERS_doAB_onGpTr,
dc3a357327 Jean*0056      &     PTRACERS_addSrelax2EmP,
                0057      &     PTRACERS_startStepFwd,
5d1aafd341 Jean*0058      &     PTRACERS_resetFreq,
                0059      &     PTRACERS_resetPhase,
d2825c6d08 Ed H*0060      &     PTRACERS_advScheme,
1883875e84 Jean*0061      &     PTRACERS_ImplVertAdv,
d2825c6d08 Ed H*0062      &     PTRACERS_diffKh,
                0063      &     PTRACERS_diffK4,
                0064      &     PTRACERS_diffKr,
d75c5feb26 Jean*0065      &     PTRACERS_diffKrNr,
dd33ff71a5 Mart*0066      &     PTRACERS_ref,
e6469f285f Jean*0067      &     PTRACERS_EvPrRn,
d2825c6d08 Ed H*0068      &     PTRACERS_useGMRedi,
82f84e4873 Jean*0069      &     PTRACERS_useDWNSLP,
d2825c6d08 Ed H*0070      &     PTRACERS_useKPP,
46918f1b26 Jean*0071      &     PTRACERS_linFSConserve,
                0072      &     PTRACERS_stayPositive,
d2825c6d08 Ed H*0073      &     PTRACERS_initialFile,
                0074      &     PTRACERS_names,
                0075      &     PTRACERS_long_names,
                0076      &     PTRACERS_units,
dc3a357327 Jean*0077      &     PTRACERS_useRecords,
                0078      &     PTRACERS_dumpFreq,
                0079      &     PTRACERS_taveFreq,
                0080      &     PTRACERS_monitorFreq,
e6469f285f Jean*0081      &     PTRACERS_timeave_mnc,
de55280acd Mart*0082      &     PTRACERS_snapshot_mnc,
                0083      &     PTRACERS_monitor_mnc,
e6469f285f Jean*0084      &     PTRACERS_pickup_write_mnc,
46918f1b26 Jean*0085      &     PTRACERS_pickup_read_mnc
d2825c6d08 Ed H*0086 
ae4c29e0db Jean*0087 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
                0088 
                0089       IF ( .NOT.usePTRACERS ) THEN
                0090 C-    pkg PTRACERS is not used
                0091         _BEGIN_MASTER(myThid)
                0092 C-    Track pkg activation status:
                0093 C     print a (weak) warning if data.ptracers is found
                0094          CALL PACKAGES_UNUSED_MSG( 'usePTRACERS', ' ', ' ' )
                0095         _END_MASTER(myThid)
                0096         RETURN
                0097       ENDIF
                0098 
6bc4100fab Jean*0099       _BEGIN_MASTER(myThid)
                0100 
b7411f1a84 Jean*0101       errCount = 0
01111eb599 Jean*0102 C     Set ptracer IO & diagnostics labels (2 characters long)
                0103       CALL PTRACERS_SET_IOLABEL(
                0104      O                           PTRACERS_ioLabel,
                0105      I                           PTRACERS_num, myThid )
                0106 
d2825c6d08 Ed H*0107 C     Set defaults values for parameters in PTRACERS.h
f932d407eb Mart*0108       PTRACERS_dumpFreq    = dumpFreq
0badf4857e Mart*0109       PTRACERS_monitorFreq = monitorFreq
727f3ba9e2 Jean*0110       PTRACERS_Iter0   = 0
785a077159 Alis*0111       PTRACERS_numInUse=-1
                0112       DO iTracer=1,PTRACERS_num
dc3a357327 Jean*0113         PTRACERS_startStepFwd(iTracer) = baseTime
5d1aafd341 Jean*0114         PTRACERS_resetFreq (iTracer) = 0.
                0115         PTRACERS_resetPhase(iTracer) = 0.
d2825c6d08 Ed H*0116         PTRACERS_advScheme(iTracer)=saltAdvScheme
1883875e84 Jean*0117         PTRACERS_ImplVertAdv(iTracer) = .FALSE.
d2825c6d08 Ed H*0118         PTRACERS_diffKh(iTracer)=diffKhS
                0119         PTRACERS_diffK4(iTracer)=diffK4S
d75c5feb26 Jean*0120         PTRACERS_diffKr(iTracer)=UNSET_RL
                0121         DO k=1,Nr
                0122           PTRACERS_diffKrNr(k,iTracer)=diffKrNrS(k)
dd33ff71a5 Mart*0123           PTRACERS_ref     (k,iTracer)=0. _d 0
d75c5feb26 Jean*0124         ENDDO
e6469f285f Jean*0125         PTRACERS_EvPrRn(iTracer)=UNSET_RL
d2825c6d08 Ed H*0126         PTRACERS_useGMRedi(iTracer)=useGMRedi
1db41719d4 Jean*0127         PTRACERS_useDWNSLP(iTracer)=useDOWN_SLOPE
a2b9d94edc Jean*0128         PTRACERS_useKPP(iTracer)   =useKPP
46918f1b26 Jean*0129         PTRACERS_linFSConserve(iTracer)= .FALSE.
                0130 #ifdef GAD_SMOLARKIEWICZ_HACK
                0131         PTRACERS_stayPositive(iTracer) = .TRUE.
                0132 #else
                0133         PTRACERS_stayPositive(iTracer) = .FALSE.
                0134 #endif
d2825c6d08 Ed H*0135         PTRACERS_initialFile(iTracer)=' '
                0136         DO ic = 1,MAX_LEN_FNAM
                0137           PTRACERS_names(iTracer)(ic:ic) = ' '
                0138           PTRACERS_long_names(iTracer)(ic:ic) = ' '
                0139           PTRACERS_units(iTracer)(ic:ic) = ' '
                0140         ENDDO
785a077159 Alis*0141       ENDDO
fc10d43a89 Jean*0142       PTRACERS_doAB_onGpTr      = doAB_onGtGs
c2ced55abd Jean*0143       PTRACERS_addSrelax2EmP    = .FALSE.
50653b81f1 Ed H*0144       PTRACERS_useRecords       = .FALSE.
                0145 #ifdef ALLOW_MNC
6bc4100fab Jean*0146       PTRACERS_snapshot_mnc     = useMNC .AND. snapshot_mnc
                0147       PTRACERS_monitor_mnc      = useMNC .AND. monitor_mnc
                0148       PTRACERS_pickup_write_mnc = useMNC .AND. pickup_write_mnc
                0149       PTRACERS_pickup_read_mnc  = useMNC .AND. pickup_read_mnc
50653b81f1 Ed H*0150 #else
                0151       PTRACERS_snapshot_mnc     = .FALSE.
de55280acd Mart*0152       PTRACERS_monitor_mnc      = .FALSE.
50653b81f1 Ed H*0153       PTRACERS_pickup_write_mnc = .FALSE.
                0154       PTRACERS_pickup_read_mnc  = .FALSE.
                0155 #endif
282caa8385 Jean*0156       tauTr1ClimRelax = 0.
4e66ab0b67 Oliv*0157       DO k = 1,Nr
                0158 #ifdef ALLOW_LONGSTEP
                0159         PTRACERS_dTLev(k) = LS_nIter*dTtracerLev(k)
                0160 #else
                0161         PTRACERS_dTLev(k) = dTtracerLev(k)
                0162 #endif
                0163       ENDDO
b7411f1a84 Jean*0164 C-    retired params default:
                0165       PTRACERS_taveFreq    = UNSET_RL
                0166       PTRACERS_timeave_mnc = .FALSE.
785a077159 Alis*0167 
d2825c6d08 Ed H*0168 C     Open and read the data.ptracers file
785a077159 Alis*0169       WRITE(msgBuf,'(A)') ' PTRACERS_READPARMS: opening data.ptracers'
6bc4100fab Jean*0170       CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
                0171      &                    SQUEEZE_RIGHT , myThid )
785a077159 Alis*0172       CALL OPEN_COPY_DATA_FILE(
                0173      I                   'data.ptracers', 'PTRACERS_READPARMS',
                0174      O                   iUnit,
                0175      I                   myThid )
                0176       READ(UNIT=iUnit,NML=PTRACERS_PARM01)
                0177       WRITE(msgBuf,'(A)')
                0178      &  ' PTRACERS_READPARMS: finished reading data.ptracers'
6bc4100fab Jean*0179       CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
                0180      &                    SQUEEZE_RIGHT , myThid )
785a077159 Alis*0181 
d2825c6d08 Ed H*0182 C     Close the open data file
7a77863887 Mart*0183 #ifdef SINGLE_DISK_IO
785a077159 Alis*0184       CLOSE(iUnit)
7a77863887 Mart*0185 #else
                0186       CLOSE(iUnit,STATUS='DELETE')
                0187 #endif /* SINGLE_DISK_IO */
785a077159 Alis*0188 
b7411f1a84 Jean*0189 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
                0190 C--   Check for retired parameters:
                0191       IF ( PTRACERS_taveFreq .NE. UNSET_RL ) THEN
                0192         WRITE(msgBuf,'(2A)') 'PTRACERS_READPARMS: "PTRACERS_taveFreq"',
                0193      &    ' is no longer allowed in file "data.ptracers"'
                0194         CALL PRINT_ERROR( msgBuf, myThid )
                0195         WRITE(msgBuf,'(2A)') 'PTRACERS_READPARMS: ',
                0196      &    ' since "pkg/timeave" has been removed.'
                0197         CALL PRINT_ERROR( msgBuf, myThid )
                0198         errCount = errCount + 1
                0199       ENDIF
                0200       IF ( PTRACERS_timeave_mnc ) THEN
                0201         WRITE(msgBuf,'(3A)') 'PTRACERS_READPARMS: ',
                0202      &    '"PTRACERS_timeave_mnc" is no longer allowed ',
                0203      &    'in file "data.ptracers"'
                0204         CALL PRINT_ERROR( msgBuf, myThid )
                0205         WRITE(msgBuf,'(2A)') 'PTRACERS_READPARMS: ',
                0206      &    ' since "pkg/timeave" has been removed.'
                0207         CALL PRINT_ERROR( msgBuf, myThid )
                0208         errCount = errCount + 1
                0209       ENDIF
                0210 
282caa8385 Jean*0211 C     Tracer 1 climatology relaxation time scale (<- but the code is gone !)
dc3a357327 Jean*0212       IF ( tauTr1ClimRelax .NE. 0. ) THEN
                0213 #ifndef ALLOW_COST
                0214         WRITE(msgBuf,'(2A)')' PTRACERS_READPARMS: ',
                0215      &       'tauTr1ClimRelax has been removed (code is gone)'
                0216         CALL PRINT_ERROR( msgBuf, myThid )
b7411f1a84 Jean*0217         errCount = errCount + 1
dc3a357327 Jean*0218 #else
282caa8385 Jean*0219        lambdaTr1ClimRelax = 1./tauTr1ClimRelax
dc3a357327 Jean*0220       ELSE
                0221        lambdaTr1ClimRelax = 0.
                0222 #endif
282caa8385 Jean*0223       ENDIF
                0224 
dc3a357327 Jean*0225 C--   Now set-up any remaining parameters that result from other params
                0226 
d2825c6d08 Ed H*0227 C     If PTRACERS_numInUse was not set in data.ptracers then we can
                0228 C     assume that all PTRACERS fields will be in use
785a077159 Alis*0229       IF (PTRACERS_numInUse.LT.0) THEN
d2825c6d08 Ed H*0230         PTRACERS_numInUse=PTRACERS_num
785a077159 Alis*0231       ENDIF
dc3a357327 Jean*0232 
d2825c6d08 Ed H*0233 C     Check we are not trying to use more tracers than allowed
785a077159 Alis*0234       IF (PTRACERS_numInUse.GT.PTRACERS_num) THEN
078adc59f0 Jean*0235         WRITE(msgBuf,'(A,I4,A,I4,A)')
                0236      &       ' PTRACERS_READPARMS: You requested',PTRACERS_numInUse,
                0237      &       ' tracers at run time when only',PTRACERS_num,
d2825c6d08 Ed H*0238      &       ' were specified at compile time. Naughty! '
6bc4100fab Jean*0239         CALL PRINT_ERROR( msgBuf, myThid )
b7411f1a84 Jean*0240         errCount = errCount + 1
d2825c6d08 Ed H*0241       ENDIF
2ac3d7bd33 Jean*0242 
                0243 C     Set vertical diffusion array
                0244       DO iTracer=1,PTRACERS_numInUse
                0245         IF ( PTRACERS_diffKr(iTracer).NE.UNSET_RL ) THEN
                0246          DO k=1,Nr
                0247           PTRACERS_diffKrNr(k,iTracer)=PTRACERS_diffKr(iTracer)
                0248          ENDDO
                0249         ENDIF
                0250       ENDDO
                0251 
dc3a357327 Jean*0252 C     Set flag to check when each tracer starts
                0253       PTRACERS_startAllTrc = .TRUE.
                0254       DO iTracer=1,PTRACERS_numInUse
                0255         IF ( PTRACERS_startStepFwd(iTracer) .NE. baseTime )
                0256      &    PTRACERS_startAllTrc = .FALSE.
                0257       ENDDO
c6839165c8 Jean*0258 #ifdef ALLOW_AUTODIFF
dc3a357327 Jean*0259       IF ( .NOT.PTRACERS_startAllTrc ) THEN
                0260         WRITE(msgBuf,'(A)')
                0261      &   'PTRACERS_READPARMS: Compiling AD code does not allow'
                0262         CALL PRINT_ERROR( msgBuf, myThid )
                0263         WRITE(msgBuf,'(A)')
                0264      &   'to use different starting time (PTRACERS_startStepFwd)'
                0265         CALL PRINT_ERROR( msgBuf, myThid )
b7411f1a84 Jean*0266         errCount = errCount + 1
dc3a357327 Jean*0267       ENDIF
c6839165c8 Jean*0268 #endif /* ALLOW_AUTODIFF */
2ac3d7bd33 Jean*0269 
0aacb0e819 Oliv*0270 C     Whether to compute linear surface correction
                0271 C     (this may also be enabled elsewhere)
                0272       PTRACERS_calcSurfCor = .FALSE.
                0273       DO iTracer=1,PTRACERS_num
                0274         IF (PTRACERS_linFSConserve(iTracer)) PTRACERS_calcSurfCor=.TRUE.
                0275       ENDDO
                0276 
d2825c6d08 Ed H*0277 #ifdef ALLOW_MNC
6bc4100fab Jean*0278       PTRACERS_snapshot_mnc     = useMNC .AND. PTRACERS_snapshot_mnc
                0279       PTRACERS_monitor_mnc      = useMNC .AND. PTRACERS_monitor_mnc
                0280       PTRACERS_pickup_write_mnc = useMNC .AND. PTRACERS_pickup_write_mnc
                0281       PTRACERS_pickup_read_mnc  = useMNC .AND. PTRACERS_pickup_read_mnc
50653b81f1 Ed H*0282 
                0283       PTRACERS_snapshot_mdsio     = (.NOT. PTRACERS_snapshot_mnc)
                0284      &     .OR. outputTypesInclusive
de55280acd Mart*0285       PTRACERS_monitor_stdio      = (.NOT. PTRACERS_monitor_mnc)
                0286      &     .OR. outputTypesInclusive
50653b81f1 Ed H*0287       PTRACERS_pickup_write_mdsio = (.NOT. PTRACERS_pickup_write_mnc)
                0288      &     .OR. outputTypesInclusive
                0289       PTRACERS_pickup_read_mdsio  = (.NOT. PTRACERS_pickup_read_mnc)
                0290      &     .OR. outputTypesInclusive
                0291 #else
                0292       PTRACERS_snapshot_mnc       = .FALSE.
de55280acd Mart*0293       PTRACERS_monitor_mnc        = .FALSE.
50653b81f1 Ed H*0294       PTRACERS_pickup_write_mnc   = .FALSE.
                0295       PTRACERS_pickup_read_mnc    = .FALSE.
                0296       PTRACERS_snapshot_mdsio     = .TRUE.
de55280acd Mart*0297       PTRACERS_monitor_stdio      = .TRUE.
50653b81f1 Ed H*0298       PTRACERS_pickup_write_mdsio = .TRUE.
                0299       PTRACERS_pickup_read_mdsio  = .TRUE.
                0300 #endif
e6469f285f Jean*0301 
b7411f1a84 Jean*0302 C--   Print a summary of pTracer parameter values: <- done in PTRACERS_CHECK
                0303 
                0304       IF ( errCount.GE.1 ) THEN
                0305         WRITE(msgBuf,'(A,I3,A)')
                0306      &       'PTRACERS_READPARMS: detected', errCount,' fatal error(s)'
                0307         CALL PRINT_ERROR( msgBuf, myThid )
                0308         CALL ALL_PROC_DIE( 0 )
                0309         STOP 'ABNORMAL END: S/R PTRACERS_READPARMS'
                0310       ENDIF
6bc4100fab Jean*0311 
                0312       _END_MASTER(myThid)
                0313 C     Everyone else must wait for the parameters to be loaded
                0314       _BARRIER
                0315 
785a077159 Alis*0316 #endif /* ALLOW_PTRACERS */
                0317 
                0318       RETURN
                0319       END