C $Header: /u/gcmpack/MITgcm/model/src/packages_boot.F,v 1.71 2017/08/09 15:22:56 mlosch Exp $ C $Name: $ #include "PACKAGES_CONFIG.h" #include "CPP_OPTIONS.h" CBOP C !ROUTINE: PACKAGES_BOOT C !INTERFACE: SUBROUTINE PACKAGES_BOOT( myThid ) C !DESCRIPTION: \bv C *==========================================================* C | SUBROUTINE PACKAGES_BOOT C | o Routine to parse runtime package selection file C *==========================================================* C | Routine reads a flat file which contains a single flag C | for each known "package". Flag can enables runtime C | activation or deactivation of a package. The data is read C | from a file called data.pkg. C | Note - If a runtime activation flag is set on but the C | package code was not included in the build then C | the default behavior is to stop with an error. C *==========================================================* C \ev C !USES: IMPLICIT NONE C === Global variables === #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" C !INPUT/OUTPUT PARAMETERS: C === Routine arguments === C myThid :: my Thread Id number INTEGER myThid C !LOCAL VARIABLES: C === Local variables === C msgBuf :: Informational/error message buffer C iUnit :: Work variable for IO unit number CHARACTER*(MAX_LEN_MBUF) msgBuf INTEGER iUnit LOGICAL locFlag CEOP C data.pkg namelists NAMELIST //PACKAGES & useOBCS, & useSHAP_FILT, & useZONAL_FILT, & useOPPS, & usePP81, & useKL10, & useMY82, & useGGL90, & useKPP, & useGMRedi, & useDOWN_SLOPE, & useBBL, & useCAL, & useEXF, & useBulkForce, & useEBM, & useCheapAML, & useAUTODIFF, & useGrdchk, & useSMOOTH, & usePROFILES, & useECCO, & useCTRL, & useSBO, & useFLT, & usePTRACERS, & useGCHEM, & useRBCS, & useOffLine, & useMATRIX, & useFRAZIL, & useSEAICE, & useSALT_PLUME, & useShelfIce, & useStreamIce, & useICEFRONT, & useThSIce, & useLand, & useATM2D, & useAIM, & useAtm_Phys, & useFizhi, & useGridAlt, & useDiagnostics, & useREGRID, & useLayers, & useMNC, & useRunClock, & useEMBED_FILES, & useMYPACKAGE _BEGIN_MASTER(myThid) WRITE(msgBuf,'(A)') ' PACKAGES_BOOT: opening data.pkg' CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, & SQUEEZE_RIGHT , myThid ) CALL OPEN_COPY_DATA_FILE( I 'data.pkg', 'PACKAGES_BOOT', O iUnit, I myThid ) C-- Default package configuration c useGAD =.FALSE. useOBCS =.FALSE. useSHAP_FILT =.FALSE. useZONAL_FILT =.FALSE. useOPPS =.FALSE. usePP81 =.FALSE. useKL10 =.FALSE. useMY82 =.FALSE. useGGL90 =.FALSE. useKPP =.FALSE. useGMRedi =.FALSE. useDOWN_SLOPE =.FALSE. useBBL =.FALSE. useCAL =.FALSE. useEXF =.FALSE. useBulkForce =.FALSE. useEBM =.FALSE. useCheapAML =.FALSE. useAUTODIFF =.FALSE. useGrdchk =.FALSE. useSMOOTH =.FALSE. usePROFILES =.FALSE. useECCO =.FALSE. useCTRL =.FALSE. useSBO =.FALSE. useFLT =.FALSE. usePTRACERS =.FALSE. useGCHEM =.FALSE. useRBCS =.FALSE. useOffLine =.FALSE. useMATRIX =.FALSE. useFRAZIL =.FALSE. useSEAICE =.FALSE. useSALT_PLUME =.FALSE. useShelfIce =.FALSE. useStreamIce =.FALSE. useICEFRONT =.FALSE. useThSIce =.FALSE. useLand =.FALSE. useATM2D =.FALSE. useAIM =.FALSE. useAtm_Phys =.FALSE. useFizhi =.FALSE. useGridAlt =.FALSE. useDiagnostics =.FALSE. useREGRID =.FALSE. useLayers =.FALSE. useMNC =.FALSE. useRunClock =.FALSE. useEMBED_FILES =.FALSE. useMYPACKAGE =.FALSE. C- Adjust default to account for pkgs without run-time On/Off switch #ifdef ALLOW_AUTODIFF useAUTODIFF =.TRUE. # ifdef ALLOW_ECCO useECCO =.TRUE. # endif # ifdef ALLOW_CTRL useCTRL =.TRUE. # endif #endif /* ALLOW_AUTODIFF */ C-- Read parameters from open data file READ(UNIT=iUnit,NML=PACKAGES) WRITE(msgBuf,'(A)') ' PACKAGES_BOOT: finished reading data.pkg' 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-- packages with hard-coded switch #ifndef HAVE_NETCDF IF (usePROFILES) THEN WRITE(msgBuf,'(2A)') '** WARNING ** pkg/profiles uses NetCDF', & ' which is unavailable (genmake2 test failed)' CALL PRINT_MESSAGE( msgBuf, errorMessageUnit, & SQUEEZE_RIGHT, myThid ) WRITE(msgBuf,'(2A)') '** WARNING ** PACKAGES_BOOT:', & ' ==> Reset usePROFILES to FALSE' CALL PRINT_MESSAGE( msgBuf, errorMessageUnit, & SQUEEZE_RIGHT, myThid ) WRITE(msgBuf,'(2A)') ' PACKAGES_BOOT: undef HAVE_NETCDF', & ' ==> Reset usePROFILES to FALSE' CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, & SQUEEZE_RIGHT, myThid ) usePROFILES=.FALSE. ENDIF #endif #ifdef ALLOW_CAL IF (usePROFILES) useCAL = .TRUE. IF (useECCO) useCAL = .TRUE. #endif #ifdef ALLOW_CTRL IF (useGrdchk) useCTRL = .TRUE. #endif C-- packages with an implied switch useGAD = tempStepping .OR. saltStepping .OR. usePTRACERS #ifdef ALLOW_CAL c IF (useEXF) useCAL = .TRUE. C-- Double warning (StdErr & StdOut) after changing useCAL setting IF ( useEXF .AND. .NOT. useCAL ) THEN WRITE(msgBuf,'(2A)') '** WARNING ** PACKAGES_BOOT: ', & 'useCAL no longer set to T when using EXF (useEXF=T)' CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, & SQUEEZE_RIGHT, myThid ) CALL PRINT_MESSAGE( msgBuf, errorMessageUnit, & SQUEEZE_RIGHT, myThid ) WRITE(msgBuf,'(2A)') '** WARNING ** PACKAGES_BOOT: ', & ' as it used to be before checkpoint66d (2017/02/13)' CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, & SQUEEZE_RIGHT, myThid ) CALL PRINT_MESSAGE( msgBuf, errorMessageUnit, & SQUEEZE_RIGHT, myThid ) WRITE(msgBuf,'(2A)') '** WARNING ** PACKAGES_BOOT: ', & 'To continue to use pkg/cal with EXF, need to add:' CALL PRINT_MESSAGE( msgBuf, errorMessageUnit, & SQUEEZE_RIGHT, myThid ) WRITE(msgBuf,'(2A)') '** WARNING ** PACKAGES_BOOT: ', & '> useCAL=.TRUE., < in file "data.pkg"' CALL PRINT_MESSAGE( msgBuf, errorMessageUnit, & SQUEEZE_RIGHT, myThid ) ENDIF #endif /* ALLOW_CAL */ C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| C-- Short summary of which package is compiled and used WRITE(msgBuf,'(2A)') ' PACKAGES_BOOT: On/Off package Summary' CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, & SQUEEZE_RIGHT, myThid ) C----- pkgs with a standard "usePKG" On/Off switch in "data.pkg": WRITE(standardMessageUnit,'(2A)') ' -------- pkgs with a', & ' standard "usePKG" On/Off switch in "data.pkg": --------' #ifdef ALLOW_OBCS CALL PACKAGES_PRINT_MSG( useOBCS, 'OBCS', ' ' ) #endif #ifdef ALLOW_SHAP_FILT CALL PACKAGES_PRINT_MSG( useSHAP_FILT, 'SHAP_FILT', ' ' ) #endif #ifdef ALLOW_ZONAL_FILT CALL PACKAGES_PRINT_MSG( useZONAL_FILT, 'ZONAL_FILT', ' ' ) #endif #ifdef ALLOW_OPPS CALL PACKAGES_PRINT_MSG( useOPPS, 'OPPS', ' ' ) #endif #ifdef ALLOW_PP81 CALL PACKAGES_PRINT_MSG( usePP81, 'PP81', ' ' ) #endif #ifdef ALLOW_KL10 CALL PACKAGES_PRINT_MSG( useKL10, 'KL10', ' ' ) #endif #ifdef ALLOW_MY82 CALL PACKAGES_PRINT_MSG( useMY82, 'MY82', ' ' ) #endif #ifdef ALLOW_GGL90 CALL PACKAGES_PRINT_MSG( useGGL90, 'GGL90', ' ' ) #endif #ifdef ALLOW_KPP CALL PACKAGES_PRINT_MSG( useKPP, 'KPP', ' ' ) #endif #ifdef ALLOW_GMREDI CALL PACKAGES_PRINT_MSG( useGMRedi, 'GMRedi', ' ' ) #endif #ifdef ALLOW_DOWN_SLOPE CALL PACKAGES_PRINT_MSG( useDOWN_SLOPE, 'DOWN_SLOPE', ' ' ) #endif #ifdef ALLOW_BBL CALL PACKAGES_PRINT_MSG( useBBL, 'BBL', ' ' ) #endif #ifdef ALLOW_CAL CALL PACKAGES_PRINT_MSG( useCAL, 'CAL', ' ' ) #endif #ifdef ALLOW_EXF CALL PACKAGES_PRINT_MSG( useEXF, 'EXF', ' ' ) #endif #ifdef ALLOW_BULK_FORCE CALL PACKAGES_PRINT_MSG(useBulkForce,'BULK_FORCE','useBulkForce') #endif #ifdef ALLOW_EBM CALL PACKAGES_PRINT_MSG( useEBM, 'EBM', ' ' ) #endif #ifdef ALLOW_CHEAPAML CALL PACKAGES_PRINT_MSG( useCheapAML, 'CheapAML', ' ' ) #endif #ifdef ALLOW_AUTODIFF CALL PACKAGES_PRINT_MSG( useAUTODIFF, 'AUTODIFF', ' ' ) #endif #ifdef ALLOW_GRDCHK CALL PACKAGES_PRINT_MSG( useGrdchk, 'Grdchk', ' ' ) #endif #ifdef ALLOW_SMOOTH CALL PACKAGES_PRINT_MSG( useSMOOTH, 'SMOOTH', ' ' ) #endif #ifdef ALLOW_PROFILES CALL PACKAGES_PRINT_MSG( usePROFILES, 'PROFILES', ' ' ) #endif #ifdef ALLOW_ECCO CALL PACKAGES_PRINT_MSG( useECCO, 'ECCO', ' ' ) #endif #ifdef ALLOW_CTRL CALL PACKAGES_PRINT_MSG( useCTRL, 'CTRL', ' ' ) #endif #ifdef ALLOW_SBO CALL PACKAGES_PRINT_MSG( useSBO, 'SBO', ' ' ) #endif #ifdef ALLOW_FLT CALL PACKAGES_PRINT_MSG( useFLT, 'FLT', ' ' ) #endif #ifdef ALLOW_PTRACERS CALL PACKAGES_PRINT_MSG( usePTRACERS, 'PTRACERS', ' ' ) #endif #ifdef ALLOW_LONGSTEP CALL PACKAGES_PRINT_MSG( usePTRACERS,'LONGSTEP','usePTRACERS' ) #endif #ifdef ALLOW_GCHEM CALL PACKAGES_PRINT_MSG( useGCHEM, 'GCHEM', ' ' ) #endif #ifdef ALLOW_RBCS CALL PACKAGES_PRINT_MSG( useRBCS, 'RBCS', ' ' ) #endif #ifdef ALLOW_OFFLINE CALL PACKAGES_PRINT_MSG( useOffLine, 'OffLine', ' ' ) #endif #ifdef ALLOW_MATRIX CALL PACKAGES_PRINT_MSG( useMATRIX, 'MATRIX', ' ' ) #endif #ifdef ALLOW_FRAZIL CALL PACKAGES_PRINT_MSG( useFRAZIL, 'FRAZIL', ' ' ) #endif #ifdef ALLOW_SEAICE CALL PACKAGES_PRINT_MSG( useSEAICE, 'SEAICE', ' ' ) #endif #ifdef ALLOW_SALT_PLUME CALL PACKAGES_PRINT_MSG( useSALT_PLUME, 'SALT_PLUME', ' ' ) #endif #ifdef ALLOW_SHELFICE CALL PACKAGES_PRINT_MSG( useShelfIce, 'ShelfIce', ' ' ) #endif #ifdef ALLOW_STREAMICE CALL PACKAGES_PRINT_MSG( useStreamIce, 'StreamIce', ' ' ) #endif #ifdef ALLOW_ICEFRONT CALL PACKAGES_PRINT_MSG( useICEFRONT, 'ICEFRONT', ' ' ) #endif #ifdef ALLOW_THSICE CALL PACKAGES_PRINT_MSG( useThSIce, 'ThSIce', ' ' ) #endif #ifdef ALLOW_LAND CALL PACKAGES_PRINT_MSG( useLand, 'Land', ' ' ) #endif #ifdef ALLOW_ATM2D CALL PACKAGES_PRINT_MSG( useATM2D, 'ATM2D', ' ' ) #endif #ifdef ALLOW_AIM_V23 CALL PACKAGES_PRINT_MSG( useAIM, 'aim_v23', 'useAIM' ) #endif #ifdef ALLOW_ATM_PHYS CALL PACKAGES_PRINT_MSG( useAtm_Phys, 'Atm_Phys', ' ' ) #endif #ifdef ALLOW_FIZHI CALL PACKAGES_PRINT_MSG( useFizhi, 'Fizhi', ' ' ) #endif #ifdef ALLOW_GRIDALT CALL PACKAGES_PRINT_MSG( useGridAlt, 'GridAlt', ' ' ) #endif #ifdef ALLOW_DIAGNOSTICS CALL PACKAGES_PRINT_MSG( useDiagnostics,'Diagnostics', ' ' ) #endif #ifdef ALLOW_REGRID CALL PACKAGES_PRINT_MSG( useREGRID, 'REGRID', ' ' ) #endif #ifdef ALLOW_LAYERS CALL PACKAGES_PRINT_MSG( useLayers, 'Layers', ' ' ) #endif #ifdef ALLOW_MNC CALL PACKAGES_PRINT_MSG( useMNC, 'MNC', ' ' ) #endif #ifdef ALLOW_RUNCLOCK CALL PACKAGES_PRINT_MSG( useRunClock, 'RunClock', ' ' ) #endif #ifdef ALLOW_EMBED_FILES CALL PACKAGES_PRINT_MSG( useEMBED_FILES,'EMBED_FILES', ' ' ) #endif #ifdef ALLOW_MYPACKAGE CALL PACKAGES_PRINT_MSG( useMYPACKAGE, 'MYPACKAGE', ' ' ) #endif C----- pkgs without standard "usePKG" in "data.pkg": WRITE(standardMessageUnit,'(2A)') ' -------- pkgs without', & ' standard "usePKG" On/Off switch in "data.pkg": --------' #ifdef ALLOW_GENERIC_ADVDIFF CALL PACKAGES_PRINT_MSG( useGAD, 'GENERIC_ADVDIFF', 'useGAD' ) #endif #ifdef ALLOW_MOM_COMMON CALL PACKAGES_PRINT_MSG( momStepping,'MOM_COMMON','momStepping' ) #endif #ifdef ALLOW_MOM_VECINV locFlag = momStepping .AND. vectorInvariantMomentum CALL PACKAGES_PRINT_MSG( locFlag, 'MOM_VECINV', & '+vectorInvariantMomentum' ) #endif #ifdef ALLOW_MOM_FLUXFORM locFlag = momStepping .AND. .NOT.vectorInvariantMomentum CALL PACKAGES_PRINT_MSG( locFlag, 'MOM_FLUXFORM', & '& not vectorInvariantMom' ) #endif #ifdef ALLOW_CD_CODE CALL PACKAGES_PRINT_MSG( useCDscheme, 'CD_CODE', 'useCDscheme' ) #endif #ifdef ALLOW_MONITOR locFlag = monitorFreq.GT.0. CALL PACKAGES_PRINT_MSG( locFlag, 'MONITOR', 'monitorFreq > 0.' ) #endif #ifdef ALLOW_TIMEAVE locFlag = taveFreq.GT.0. CALL PACKAGES_PRINT_MSG( locFlag, 'TIMEAVE', 'taveFreq > 0.' ) #endif #ifdef ALLOW_DEBUG CALL PACKAGES_PRINT_MSG( debugMode, 'DEBUG', 'debugMode' ) #endif #ifdef ALLOW_COMPON_COMMUNIC CALL PACKAGES_PRINT_MSG( useCoupler, 'COMPON_COMMUNIC', & 'useCoupler' ) #endif #ifdef ALLOW_ATM_COMPON_INTERF CALL PACKAGES_PRINT_MSG( useCoupler, 'ATM_COMPON_INTERF', & 'useCoupler' ) #endif #ifdef ALLOW_OCN_COMPON_INTERF CALL PACKAGES_PRINT_MSG( useCoupler, 'OCN_COMPON_INTERF', & 'useCoupler' ) #endif C----- pkgs without a run-time switch: locFlag = .TRUE. #ifdef ALLOW_ATM_OCN_COUPLER CALL PACKAGES_PRINT_MSG( locFlag, 'ATM_OCN_COUPLER', 'Used' ) #endif #ifdef ALLOW_EXCH2 CALL PACKAGES_PRINT_MSG( locFlag, 'EXCH2', 'Used' ) #endif #ifdef ALLOW_RW CALL PACKAGES_PRINT_MSG( locFlag, 'RW', 'Used' ) #endif #ifdef ALLOW_MDSIO CALL PACKAGES_PRINT_MSG( locFlag, 'MDSIO', 'Used' ) #endif #ifdef ALLOW_SHOWFLOPS CALL PACKAGES_PRINT_MSG( locFlag, 'SHOWFLOPS', 'Used' ) #endif C----- AD related pkgs: #ifdef ALLOW_ADMTLM CALL PACKAGES_PRINT_MSG( locFlag, 'ADMTLM', 'Used' ) #endif #ifdef ALLOW_AUTODIFF CALL PACKAGES_PRINT_MSG( locFlag, 'AUTODIFF', 'Used' ) #endif #ifdef ALLOW_OPENAD CALL PACKAGES_PRINT_MSG( locFlag, 'OPENAD', 'Used' ) #endif #ifdef ALLOW_COST CALL PACKAGES_PRINT_MSG( locFlag, 'COST', 'Used' ) #endif C----- mysterious pkgs: #ifdef ALLOW_SPHERE CALL PACKAGES_PRINT_MSG( locFlag, 'SPHERE', 'None' ) #endif #ifdef ALLOW_CHRONOS CALL PACKAGES_PRINT_MSG( locFlag, 'CHRONOS', 'None' ) #endif #ifdef ALLOW_ATM_COMMON CALL PACKAGES_PRINT_MSG( locFlag, 'ATM_COMMON', 'None' ) #endif WRITE(msgBuf,'(2A)') ' PACKAGES_BOOT: End of package Summary' CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, & SQUEEZE_RIGHT, myThid ) WRITE(msgBuf,'(A)') ' ' CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, & SQUEEZE_RIGHT, myThid ) _END_MASTER(myThid) C-- Everyone else must wait for the parameters to be loaded _BARRIER RETURN END