Back to home page

MITgcm

 
 

    


File indexing completed on 2026-01-13 06:08:38 UTC

view on githubraw file Latest commit 8e1c4076 on 2026-01-09 17:53:56 UTC
508ee73e24 Mart*0001 #include "GCHEM_OPTIONS.h"
9780f1e2f5 Jean*0002 #undef GCHEM_REPORT_UNUSED_PARAMS
508ee73e24 Mart*0003 
e46e994325 Jean*0004 CBOP
                0005 C     !ROUTINE: GCHEM_CHECK
                0006 C     !INTERFACE:
508ee73e24 Mart*0007       SUBROUTINE GCHEM_CHECK( myThid )
e46e994325 Jean*0008 C     !DESCRIPTION: \bv
5c5997ced8 Jean*0009 C     *==========================================================*
                0010 C     | SUBROUTINE GCHEM_CHECK
                0011 C     | o Validate basic package setup and inter-package
a6c1c05757 Jean*0012 C     |   dependencies.
5c5997ced8 Jean*0013 C     *==========================================================*
e46e994325 Jean*0014 C     \ev
508ee73e24 Mart*0015 
e46e994325 Jean*0016 C     !USES:
                0017       IMPLICIT NONE
508ee73e24 Mart*0018 C     === Global variables ===
                0019 #include "SIZE.h"
                0020 #include "EEPARAMS.h"
                0021 #include "PARAMS.h"
96e2a5a610 Davi*0022 #include "GCHEM.h"
e46e994325 Jean*0023 #ifdef ALLOW_CFC
                0024 # include "CFC_SIZE.h"
                0025 #endif
                0026 #ifdef ALLOW_SPOIL
                0027 # include "SPOIL_SIZE.h"
                0028 #endif
                0029 #include "GCHEM_SIZE.h"
                0030 #ifdef ALLOW_PTRACERS
                0031 # include "PTRACERS_SIZE.h"
                0032 # include "PTRACERS_PARAMS.h"
                0033 #endif
2a2b7d0c36 Mart*0034 #ifdef ALLOW_CAL
                0035 # include "cal.h"
                0036 #endif
508ee73e24 Mart*0037 
e46e994325 Jean*0038 C     !INPUT/OUTPUT PARAMETERS:
                0039 C     myThid   :: My Thread Id number
508ee73e24 Mart*0040       INTEGER myThid
                0041 
                0042 #ifdef ALLOW_GCHEM
2a2b7d0c36 Mart*0043 C     !FUNCTIONS:
8e1c407622 Jean*0044 #ifdef ALLOW_CAL
2a2b7d0c36 Mart*0045       INTEGER  ILNBLNK
                0046       EXTERNAL ILNBLNK
8e1c407622 Jean*0047 #endif
2a2b7d0c36 Mart*0048 
e46e994325 Jean*0049 C     !LOCAL VARIABLES:
5c5997ced8 Jean*0050 C     msgBuf   :: Informational/error message buffer
508ee73e24 Mart*0051       CHARACTER*(MAX_LEN_MBUF) msgBuf
e46e994325 Jean*0052       INTEGER errCount
                0053       INTEGER nb_tendTr
2a2b7d0c36 Mart*0054       INTEGER ioUnit
8e1c407622 Jean*0055 #ifdef ALLOW_CAL
                0056       INTEGER IL
                0057 #endif
9780f1e2f5 Jean*0058 #ifdef GCHEM_REPORT_UNUSED_PARAMS
8e1c407622 Jean*0059       INTEGER k
2a2b7d0c36 Mart*0060       INTEGER gchem_int(5)
                0061       _RL     gchem_rl(5)
                0062       CHARACTER*(MAX_LEN_FNAM) gchem_fileName(5)
                0063       CHARACTER*(10) varName
9780f1e2f5 Jean*0064 #endif
e46e994325 Jean*0065 CEOP
                0066 
                0067 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
508ee73e24 Mart*0068 
6b9e7a8805 Jean*0069       _BEGIN_MASTER(myThid)
e46e994325 Jean*0070       errCount = 0
6b9e7a8805 Jean*0071 
e46e994325 Jean*0072       WRITE(msgBuf,'(2A)') 'GCHEM_CHECK ',
                0073      &                     ' --> Starts to check GCHEM set-up'
508ee73e24 Mart*0074       CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
e46e994325 Jean*0075      &                    SQUEEZE_RIGHT, myThid )
508ee73e24 Mart*0076 
e46e994325 Jean*0077 C--   Check GCHEM Options and Parameters:
                0078 
                0079 #ifndef GCHEM_ADD2TR_TENDENCY
5c5997ced8 Jean*0080       IF ( useCFC ) THEN
e46e994325 Jean*0081         WRITE(msgBuf,'(A)') 'GCHEM_ADD2TR_TENDENCY needed to use CFC'
                0082         CALL PRINT_ERROR( msgBuf, myThid )
                0083         errCount = errCount + 1
5c5997ced8 Jean*0084       ENDIF
e46e994325 Jean*0085 #endif /* ndef GCHEM_ADD2TR_TENDENCY */
                0086 
                0087 #ifndef GCHEM_SEPARATE_FORCING
8d459f0cbe Jean*0088       IF ( useDIC ) THEN
                0089         WRITE(msgBuf,'(A)') 'GCHEM_SEPARATE_FORCING needed to use DIC'
e46e994325 Jean*0090         CALL PRINT_ERROR( msgBuf, myThid )
                0091         errCount = errCount + 1
                0092       ENDIF
                0093       IF ( useBLING ) THEN
                0094         WRITE(msgBuf,'(A)')
                0095      &       'GCHEM_SEPARATE_FORCING needed to use BLING'
                0096         CALL PRINT_ERROR( msgBuf, myThid )
                0097         errCount = errCount + 1
8d459f0cbe Jean*0098       ENDIF
                0099       IF ( useDARWIN ) THEN
e46e994325 Jean*0100         WRITE(msgBuf,'(A)')
                0101      &       'GCHEM_SEPARATE_FORCING needed to use DARWIN'
                0102         CALL PRINT_ERROR( msgBuf, myThid )
                0103         errCount = errCount + 1
8d459f0cbe Jean*0104       ENDIF
e46e994325 Jean*0105 #endif /* ndef GCHEM_SEPARATE_FORCING */
5c5997ced8 Jean*0106 
508ee73e24 Mart*0107 C     GCHEM needs passive tracer package
                0108       IF ( .NOT.usePTRACERS) THEN
8d459f0cbe Jean*0109         WRITE(msgBuf,'(A)') 'usePTRACERS has to be .TRUE. for GCHEM'
e46e994325 Jean*0110         CALL PRINT_ERROR( msgBuf, myThid )
                0111         errCount = errCount + 1
508ee73e24 Mart*0112       ENDIF
                0113 
e46e994325 Jean*0114 C     GCHEM cannot run BLING and DIC together
                0115       IF ( useBLING .AND. useDIC ) THEN
                0116         WRITE(msgBuf,'(A)')
                0117      &       'useBLING and useDIC cannot both be .TRUE.'
                0118         CALL PRINT_ERROR( msgBuf, myThid )
                0119         errCount = errCount + 1
96e2a5a610 Davi*0120       ENDIF
                0121 
e46e994325 Jean*0122 C     GCHEM cannot run BLING and DARWIN together
                0123       IF ( useBLING .AND. useDARWIN ) THEN
                0124         WRITE(msgBuf,'(A)')
                0125      &       'useBLING and useDARWIN cannot both be .TRUE.'
                0126         CALL PRINT_ERROR( msgBuf, myThid )
                0127         errCount = errCount + 1
                0128       ENDIF
                0129 
                0130 C     GCHEM cannot run DARWIN and DIC together
5dae554984 Oliv*0131       IF ( useDARWIN .AND. useDIC ) THEN
e46e994325 Jean*0132         WRITE(msgBuf,'(A)')
                0133      &       'useDARWIN and useDIC cannot both be .TRUE.'
                0134         CALL PRINT_ERROR( msgBuf, myThid )
                0135         errCount = errCount + 1
5dae554984 Oliv*0136       ENDIF
                0137 
e46e994325 Jean*0138       nb_tendTr = gchem_Tracer_num - gchem_sepFTr_num
                0139       IF ( nb_tendTr.GT.GCHEM_tendTr_num ) THEN
                0140         WRITE(msgBuf,'(2A,I5,A)') 'GCHEM_CHECK: ',
                0141      &    'Number of tendency-tracers: nb_tendTr=', nb_tendTr
5dae554984 Oliv*0142         CALL PRINT_ERROR( msgBuf , myThid )
e46e994325 Jean*0143         WRITE(msgBuf,'(2A,I5,A)') 'GCHEM_CHECK: ',
                0144      &    'Exceeds GCHEM_tendTr_num=', GCHEM_tendTr_num,
                0145      &    ' (from GCHEM_SIZE.h)'
                0146         CALL PRINT_ERROR( msgBuf, myThid )
                0147         errCount = errCount + 1
                0148       ENDIF
                0149       IF ( gchem_Tracer_num.GT.PTRACERS_numInUse ) THEN
                0150         WRITE(msgBuf,'(2A,I5,A)') 'GCHEM_CHECK: ',
                0151      &  'Number of GCHEM tracers: gchem_Tracer_num =', gchem_Tracer_num
                0152         CALL PRINT_ERROR( msgBuf, myThid )
                0153         WRITE(msgBuf,'(2A,I5,A)') 'GCHEM_CHECK: ',
                0154      &  ' exceeds number of pTr: PTRACERS_numInUse =',PTRACERS_numInUse
                0155 c    &  ' exceeds number of PTRACERS(_numInUse)=', PTRACERS_numInUse
                0156         CALL PRINT_ERROR( msgBuf, myThid )
                0157         errCount = errCount + 1
5dae554984 Oliv*0158       ENDIF
                0159 
e46e994325 Jean*0160       IF ( errCount.GE.1 ) THEN
                0161         WRITE(msgBuf,'(A,I3,A)')
75c5b64bda Jean*0162      &       'GCHEM_CHECK: detected', errCount,' fatal error(s)'
e46e994325 Jean*0163         CALL PRINT_ERROR( msgBuf, myThid )
                0164         CALL ALL_PROC_DIE( 0 )
                0165         STOP 'ABNORMAL END: S/R GCHEM_CHECK'
                0166       ENDIF
2a2b7d0c36 Mart*0167 
                0168 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
                0169 
                0170 C     some consistency checks with a soft warning
                0171       ioUnit = errorMessageUnit
                0172 #ifdef ALLOW_CAL
                0173       IF ( useCAL ) THEN
                0174        errCount = 0
                0175        IF ( usingGregorianCalendar .AND.
                0176      &      gchem_secondsPeryear .NE. 365.25 _d 0*86400. _d 0 ) THEN
                0177         errCount = errCount + 1
                0178        ELSEIF ( .NOT. usingGregorianCalendar .AND.
                0179      &       gchem_secondsPerYear .NE. nDaysNoLeap*86400. _d 0 ) THEN
                0180         errCount = errCount + 1
                0181        ENDIF
                0182        IF ( errCount .GT. 0 ) THEN
                0183         IL = ILNBLNK(theCalendar)
                0184         WRITE(msgBuf,'(A,F13.1,3A)')
                0185      &       '** warning ** GCHEM_CHECK: gchem_secondsPeryear=',
                0186      &       gchem_secondsPerYear,
                0187      &       ' is not consistent with theCalendar= "',
                0188      &       theCalendar(1:IL),'"'
                0189         CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
                0190         WRITE(msgBuf,'(A)')
                0191      &       '** warning ** GCHEM_CHECK:   Is this intentional ?'
                0192         CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
                0193        ENDIF
                0194       ENDIF
                0195 #endif
                0196       IF ( periodicExternalForcing ) THEN
                0197        errCount = 0
                0198        IF ( gchem_ForcingCycle .EQ. externForcingCycle .AND.
                0199      &      gchem_secondsPeryear .NE. externForcingCycle ) THEN
                0200         WRITE(msgBuf,'(2(A,F13.1))')
                0201      &       '** warning ** GCHEM_CHECK: gchem_secondsPeryear=',
                0202      &       gchem_secondsPerYear,
                0203      &       ' is different from externForcingCycle=',
                0204      &       externForcingCycle
                0205         errCount = errCount + 1
                0206        ELSEIF ( gchem_secondsPeryear .NE. gchem_ForcingCycle ) THEN
                0207         WRITE(msgBuf,'(2(A,F13.1))')
                0208      &       '** warning ** GCHEM_CHECK: gchem_secondsPeryear=',
                0209      &       gchem_secondsPerYear,
                0210      &       ' is different from gchem_ForcingCycle=',
                0211      &       gchem_ForcingCycle
                0212         errCount = errCount + 1
                0213        ENDIF
                0214        IF ( errCount .GT. 0 ) THEN
                0215         CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
                0216         WRITE(msgBuf,'(A)')
                0217      &       '** warning ** GCHEM_CHECK:   Is this intentional ?'
                0218         CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
                0219        ENDIF
                0220       ENDIF
                0221 
8d459f0cbe Jean*0222       _END_MASTER(myThid)
                0223 
e46e994325 Jean*0224 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
                0225 
                0226 C--   Check other GCHEM pkgs:
                0227 
a6c1c05757 Jean*0228 #ifdef ALLOW_CFC
e46e994325 Jean*0229 C-    run checks specific to CFC
a6c1c05757 Jean*0230       IF ( useCFC ) THEN
                0231         CALL CFC_CHECK( myThid )
                0232       ENDIF
                0233 #endif
                0234 
5dae554984 Oliv*0235 #ifdef ALLOW_DARWIN
e46e994325 Jean*0236 C-    run checks specific to darwin
5dae554984 Oliv*0237       IF ( useDARWIN ) THEN
                0238         CALL DARWIN_CHECK( myThid )
                0239       ENDIF
                0240 #endif
                0241 
2a2b7d0c36 Mart*0242 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
                0243 
e46e994325 Jean*0244       _BEGIN_MASTER(myThid)
2a2b7d0c36 Mart*0245       ioUnit = standardMessageUnit
                0246 
                0247       WRITE(msgBuf,'(A)')
                0248      &'// ======================================================='
                0249       CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
                0250       WRITE(msgBuf,'(A)') '// pkg/gchem configuration'
                0251       CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
                0252       WRITE(msgBuf,'(A)')
                0253      &'// ======================================================='
                0254       CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
                0255 
                0256       WRITE(msgBuf,'(A)') '//  '
                0257       CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
                0258 
                0259       CALL WRITE_0D_L( useCFC, INDEX_NONE,
                0260      &     'useCFC =', ' /* use pkg/cfc */')
                0261       CALL WRITE_0D_L( useDIC, INDEX_NONE,
                0262      &     'useDIC =', '  /* use pkg/dic */')
                0263       CALL WRITE_0D_L( useBLING, INDEX_NONE,
                0264      &     'useBLING =', ' /* use pkg/bling */')
                0265       CALL WRITE_0D_L( useSPOIL, INDEX_NONE,
                0266      &     'useSPOIL =', ' /* use pkg/spoil */')
                0267       CALL WRITE_0D_L( useDARWIN, INDEX_NONE,
                0268      &     'useDARWIN =', ' /* use pkg/darwin */')
                0269       CALL WRITE_0D_I( nsubtime, INDEX_NONE, 'nsubtime =',
                0270      &     ' /* number of sub-timesteps withing bgc-module */')
9780f1e2f5 Jean*0271 #ifdef GCHEM_REPORT_UNUSED_PARAMS
2a2b7d0c36 Mart*0272       gchem_int = (/gchem_int1,gchem_int2,
                0273      &     gchem_int3,gchem_int4,gchem_int5/)
                0274       gchem_rl = (/gchem_rl1,gchem_rl2,
                0275      &     gchem_rl3,gchem_rl4,gchem_rl5/)
                0276       gchem_fileName = (/fileName1,fileName2,
                0277      &     fileName3,fileName4,fileName5/)
                0278       DO k = 1, 5
                0279        varName = ' '
                0280        IF ( gchem_fileName(k) .NE. ' ' ) THEN
                0281         WRITE(varName,'(A,I1)') 'fileName',k
                0282         CALL WRITE_0D_C( gchem_fileName(k), -1, INDEX_NONE,
                0283      &      varName(1:9)//' =', ' /* generic file name parameter */')
                0284        ENDIF
                0285        IF ( gchem_int(k) .NE. 0 ) THEN
                0286         WRITE(varName,'(A,I1)') 'gchem_int',k
                0287         CALL WRITE_0D_I( gchem_int(k), INDEX_NONE,
                0288      &      varName(1:10)//' =', ' /* generic INTEGER parameter */')
                0289        ENDIF
                0290        IF ( gchem_rl(k) .NE. 0. _d 0 ) THEN
                0291         WRITE(varName,'(A,I1)') 'gchem_rl',k
                0292         CALL WRITE_0D_RL( gchem_rl(k), INDEX_NONE,
                0293      &      varName(1:9)//' =', ' /* generic REAL*8 parameter */')
                0294        ENDIF
                0295       ENDDO
9780f1e2f5 Jean*0296 #endif
2a2b7d0c36 Mart*0297       CALL WRITE_0D_RL( gchem_ForcingPeriod, INDEX_NONE,
                0298      & 'gchem_ForcingPeriod =', ' /* gchem forcing period (s) */')
                0299       CALL WRITE_0D_RL( gchem_ForcingCycle, INDEX_NONE,
                0300      & 'gchem_ForcingCycle =',
                0301      & ' /* period of gchem forcing cycle (s) */')
                0302       CALL WRITE_0D_RL( gchem_secondsPerYear, INDEX_NONE,
                0303      & 'gchem_secondsPerYear =',
                0304      & ' /* second in a year for light computations */')
                0305 
                0306       WRITE(msgBuf,'(A)')
                0307      &'// ======================================================='
                0308       CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
                0309       WRITE(msgBuf,'(A)') '// End of pkg/gchem config. summary'
                0310       CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
                0311       WRITE(msgBuf,'(A)')
                0312      &'// ======================================================='
                0313       CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
                0314       WRITE(msgBuf,'(A)') ' '
                0315       CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
                0316 
                0317       WRITE(msgBuf,'(2A)') 'GCHEM_CHECK ', ' <-- Ends Normally'
                0318       CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
e46e994325 Jean*0319       WRITE(msgBuf,'(2A)') ' '
2a2b7d0c36 Mart*0320       CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
e46e994325 Jean*0321 
                0322       _END_MASTER(myThid)
2a2b7d0c36 Mart*0323 
e46e994325 Jean*0324 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
                0325 
508ee73e24 Mart*0326 #endif /* ALLOW_GCHEM */
                0327 
6b9e7a8805 Jean*0328       RETURN
                0329       END