C $Header: /u/gcmpack/MITgcm/pkg/atm_compon_interf/cpl_readparms.F,v 1.13 2017/08/09 15:23:39 mlosch Exp $ C $Name: $ #include "ATM_CPL_OPTIONS.h" CBOP C !ROUTINE: CPL_READPARMS C !INTERFACE: SUBROUTINE CPL_READPARMS( myThid ) C !DESCRIPTION: \bv C *==========================================================* C | S/R CPL_READPARMS C | o Read Coupling parameters that control import/export C | from/to the coupler layer C *==========================================================* C | this version is specific to 1 component (atmos) C *==========================================================* C \ev C !USES: IMPLICIT NONE C == Global variables === #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #include "CPL_PARAMS.h" C !INPUT/OUTPUT PARAMETERS: C == Routine Arguments == C myThid :: my Thread Id. number INTEGER myThid CEOP #ifdef COMPONENT_MODULE C !FUNCTIONS: c INTEGER ILNBLNK C !LOCAL VARIABLES: C == Local Variables == C msgBuf :: Informational/error message buffer C iUnit :: Work variable for IO unit number C k :: loop counter C iL :: Work variable for length of file-name C cpl_earlyExpImpCall :: retired; always call coupler early in call sequence CHARACTER*(MAX_LEN_MBUF) msgBuf INTEGER iUnit c INTEGER k, iL _RL cpl_atmSendFrq, tmpLoc LOGICAL cpl_earlyExpImpCall C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| C-- Coupling parameters: C cpl_oldPickup :: restart from an old pickup (= until checkpoint 59h) C useImportMxlD :: True => use Imported Mix.Layer Detph from coupler C useImportSST :: True => use the Imported SST from coupler C useImportSSS :: True => use the Imported SSS from coupler C useImportVsq :: True => use the Imported Surf. velocity^2 C useImportThSIce :: True => use the Imported thSIce state vars from coupler C useImportFlxCO2 :: True => use the Imported air-sea CO2 flux from coupler C cpl_atmSendFrq :: Frequency^-1 for sending data to coupler (s) NAMELIST //CPL_ATM_PARAM & cpl_earlyExpImpCall, & cpl_oldPickup, & useImportMxlD, useImportSST, useImportSSS, & useImportVsq, useImportThSIce, useImportFlxCO2, & cpl_atmSendFrq, & maxNumberPrint C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| _BEGIN_MASTER(myThid) C-- Open the data file WRITE(msgBuf,'(A)') ' CPL_READPARMS: opening data.cpl' CALL PRINT_MESSAGE( msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1 ) CALL OPEN_COPY_DATA_FILE( 'data.cpl', 'CPL_READPARMS', O iUnit, myThid ) C- Set default value: cpl_earlyExpImpCall = .TRUE. cpl_oldPickup = .FALSE. useImportMxlD = .TRUE. useImportSST = .TRUE. useImportSSS = .TRUE. useImportVsq = .TRUE. useImportThSIce = cpl_exchange2W_sIce.EQ.3 useImportFlxCO2 = cpl_exchange_DIC .EQ. 3 cpl_atmSendFrq= deltaTClock maxNumberPrint= 100 countPrtExp = 0 countPrtImp = 0 C-- Read parameters from open data file: C- Parameters for coupling interface: READ(UNIT=iUnit,NML=CPL_ATM_PARAM) WRITE(msgBuf,'(A)') & ' CPL_READPARMS: finished reading data.cpl' CALL PRINT_MESSAGE( msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1 ) C-- Close the open data file #ifdef SINGLE_DISK_IO CLOSE(iUnit) #else CLOSE(iUnit,STATUS='DELETE') #endif /* SINGLE_DISK_IO */ C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| C-- Check for retired parameters: IF ( .NOT.cpl_earlyExpImpCall ) THEN WRITE(msgBuf,'(2A)') 'CPL_READPARMS: ', & 'Parameter "cpl_earlyExpImpCall" has been retired;' CALL PRINT_ERROR( msgBuf, myThid ) WRITE(msgBuf,'(2A)') 'CPL_READPARMS: ', & '=> always call coupler early in sequence of calls' CALL PRINT_ERROR( msgBuf, myThid ) cplErrorCount = cplErrorCount + 1 ENDIF C-- Check parameters and model configuration #ifndef ALLOW_LAND IF ( atm_cplExch_RunOff ) THEN WRITE(msgBuf,'(2A)') 'CPL_READPARMS: needs', & ' to compile pkg/land to use: atm_cplExch_RunOff=T' CALL PRINT_ERROR( msgBuf, myThid ) WRITE(msgBuf,'(2A)') 'CPL_READPARMS: ', & ' (set from Coupler "data.cpl": cpl_exchange_RunOff > 1)' CALL PRINT_ERROR( msgBuf, myThid ) cplErrorCount = cplErrorCount + 1 ENDIF #endif /* ndef ALLOW_LAND */ #ifndef ALLOW_THSICE IF ( atm_cplExch1W_sIce ) THEN WRITE(msgBuf,'(2A)') 'CPL_READPARMS: needs', & ' to compile pkg/thsice to use: atm_cplExch1W_sIce=T' CALL PRINT_ERROR( msgBuf, myThid ) WRITE(msgBuf,'(2A)') 'CPL_READPARMS: ', & ' (set from Coupler "data.cpl": cpl_exchange1W_sIce > 1)' CALL PRINT_ERROR( msgBuf, myThid ) cplErrorCount = cplErrorCount + 1 ENDIF IF ( atm_cplExch2W_sIce ) THEN WRITE(msgBuf,'(2A)') 'CPL_READPARMS: needs', & ' to compile pkg/thsice to use: atm_cplExch2W_sIce=T' CALL PRINT_ERROR( msgBuf, myThid ) WRITE(msgBuf,'(2A)') 'CPL_READPARMS: ', & ' (set from Coupler "data.cpl": cpl_exchange2W_sIce > 1)' CALL PRINT_ERROR( msgBuf, myThid ) cplErrorCount = cplErrorCount + 1 ENDIF IF ( atm_cplExch_SaltPl ) THEN WRITE(msgBuf,'(2A)') 'CPL_READPARMS: needs', & ' to compile pkg/thsice to use: atm_cplExch_SaltPl=T' CALL PRINT_ERROR( msgBuf, myThid ) WRITE(msgBuf,'(2A)') 'CPL_READPARMS: ', & ' (set from Coupler "data.cpl": cpl_exchange_SaltPl > 1)' CALL PRINT_ERROR( msgBuf, myThid ) cplErrorCount = cplErrorCount + 1 ENDIF #endif /* ndef ALLOW_THSICE */ #ifndef ALLOW_AIM IF ( atm_cplExch_DIC ) THEN WRITE(msgBuf,'(2A)') 'CPL_READPARMS: needs', & ' to compile pkg/aim_v23 to use: atm_cplExch_DIC = T' CALL PRINT_ERROR( msgBuf, myThid ) WRITE(msgBuf,'(2A)') 'CPL_READPARMS: ', & ' (set from Coupler "data.cpl": cpl_exchange_DIC > 1)' CALL PRINT_ERROR( msgBuf, myThid ) cplErrorCount = cplErrorCount + 1 ENDIF #endif /* ndef ALLOW_AIM */ IF ( useImportThSIce .AND. .NOT.atm_cplExch2W_sIce ) THEN WRITE(msgBuf,'(2A)') 'CPL_READPARMS: useImportThSIce', & ' requires setting' CALL PRINT_ERROR( msgBuf, myThid ) WRITE(msgBuf,'(2A)') 'CPL_READPARMS: ', & ' cpl_exchange2W_sIce > 1 (in Coupler "data.cpl")' CALL PRINT_ERROR( msgBuf, myThid ) cplErrorCount = cplErrorCount + 1 ELSEIF ( useImportThSIce .AND. cpl_exchange2W_sIce.NE.3 ) THEN WRITE(msgBuf,'(2A)') '** WARNING ** CPL_READPARMS: ', & 'useImportThSIce useless without' CALL PRINT_MESSAGE( msgBuf, errorMessageUnit, & SQUEEZE_RIGHT, myThid ) WRITE(msgBuf,'(2A)') '** WARNING ** CPL_READPARMS: ', & ' cpl_exchange2W_sIce = 3 (in Coupler "data.cpl")' CALL PRINT_MESSAGE( msgBuf, errorMessageUnit, & SQUEEZE_RIGHT, myThid ) ENDIF IF ( useImportFlxCO2 .AND. cpl_exchange_DIC.NE.3 ) THEN WRITE(msgBuf,'(2A)') 'CPL_READPARMS: useImportFlxCO2', & ' requires setting' CALL PRINT_ERROR( msgBuf, myThid ) WRITE(msgBuf,'(2A)') 'CPL_READPARMS: ', & ' cpl_exchange_DIC = 3 (in Coupler "data.cpl")' CALL PRINT_ERROR( msgBuf, myThid ) cplErrorCount = cplErrorCount + 1 ENDIF tmpLoc = NINT( cpl_atmSendFrq / deltaTClock ) tmpLoc = ABS( tmpLoc - ( cpl_atmSendFrq / deltaTClock ) ) IF ( tmpLoc.GT.1. _d -12 .OR. cpl_atmSendFrq.EQ.zeroRL ) THEN WRITE(msgBuf,'(2A)') 'CPL_READPARMS: cpl_atmSendFrq', & ' is not a multiple of deltaT' CALL PRINT_ERROR( msgBuf, myThid ) cplErrorCount = cplErrorCount + 1 ENDIF C- Derive other parameters: cplSendFrq_iter = NINT( cpl_atmSendFrq / deltaTClock ) IF ( cplSendFrq_iter.LT.1 ) cplSendFrq_iter = 1 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| C-- Print out set-up summary iUnit = standardMessageUnit WRITE(msgBuf,'(A)') ' ' CALL PRINT_MESSAGE( msgBuf, iUnit, SQUEEZE_RIGHT, myThid ) WRITE(msgBuf,'(A)') '// ===================================' CALL PRINT_MESSAGE( msgBuf, iUnit, SQUEEZE_RIGHT, myThid ) WRITE(msgBuf,'(A)') '// Coupling set-up summary :' CALL PRINT_MESSAGE( msgBuf, iUnit, SQUEEZE_RIGHT, myThid ) WRITE(msgBuf,'(A)') '// ===================================' CALL PRINT_MESSAGE( msgBuf, iUnit, SQUEEZE_RIGHT, myThid ) C- o Print Coupler-Exchange config (set from params in coupler 'data.cpl') WRITE(msgBuf,'(A)') '// -------' CALL PRINT_MESSAGE( msgBuf, iUnit, SQUEEZE_RIGHT, myThid ) WRITE(msgBuf,'(A)') & '// Coupler-exchange switch (received from coupler):' CALL PRINT_MESSAGE( msgBuf, iUnit, SQUEEZE_RIGHT, myThid ) CALL WRITE_0D_L( atm_cplSequential, INDEX_NONE, & 'atm_cplSequential =', & ' /* use Sequential Coupling Exchange on/off flag */') CALL WRITE_0D_L( atm_cplExch_RunOff, INDEX_NONE, & 'atm_cplExch_RunOff =', & ' /* exchange RunOff fields with coupler on/off */') CALL WRITE_0D_L( atm_cplExch1W_sIce, INDEX_NONE, & 'atm_cplExch1W_sIce =', & ' /* 1-way exchange of seaice vars with coupler */') CALL WRITE_0D_L( atm_cplExch2W_sIce, INDEX_NONE, & 'atm_cplExch2W_sIce =', & ' /* 2-way exchange of ThSIce vars with coupler */') CALL WRITE_0D_L( atm_cplExch_SaltPl, INDEX_NONE, & 'atm_cplExch_SaltPl =', & ' /* exchange Salt-Plume fields with coupler */') CALL WRITE_0D_L( atm_cplExch_DIC, INDEX_NONE, & 'atm_cplExch_DIC =', & ' /* exchange DIC fields with coupler on/off */') C- print namelist parameter value: WRITE(msgBuf,'(A)') '// -------' CALL PRINT_MESSAGE( msgBuf, iUnit, SQUEEZE_RIGHT, myThid ) WRITE(msgBuf,'(A)') & '// Coupler parameters (from local param file):' CALL PRINT_MESSAGE( msgBuf, iUnit, SQUEEZE_RIGHT, myThid ) CALL WRITE_0D_L( cpl_oldPickup , INDEX_NONE, & 'cpl_oldPickup =', & ' /* restart from old pickup on/off flag */') CALL WRITE_0D_L( useImportMxlD , INDEX_NONE, & 'useImportMxlD =', & ' /* use Imported MxL. Depth from Coupler flag */') CALL WRITE_0D_L( useImportSST , INDEX_NONE, & 'useImportSST =', & ' /* use Imported SST from Coupler on/off flag */') CALL WRITE_0D_L( useImportSSS , INDEX_NONE, & 'useImportSSS =', & ' /* use Imported SSS from Coupler on/off flag */') CALL WRITE_0D_L( useImportVsq , INDEX_NONE, & 'useImportVsq =', & ' /* use Imported surf.Vel^2 from Coupler flag */') CALL WRITE_0D_L( useImportThSIce, INDEX_NONE, & 'useImportThSIce=', & ' /* use Imported thSIce state-var fr Cpl. flag */') CALL WRITE_0D_L( useImportFlxCO2, INDEX_NONE, & 'useImportFlxCO2=', & ' /* use Imported air-sea CO2 flux fr Cpl. flag */') CALL WRITE_0D_RL( cpl_atmSendFrq, INDEX_NONE, 'cpl_atmSendFrq =', & ' /* Frequency^o-1 for sending data to Coupler (s) */') C cpl_atmSendFrq :: Frequency^-1 for sending data to coupler (s) CALL WRITE_0D_I( cplSendFrq_iter, INDEX_NONE,'cplSendFrq_iter =', & ' /* send data to coupler every "cplSendFrq" iter */') CALL WRITE_0D_I( maxNumberPrint, INDEX_NONE, 'maxNumberPrint =', & ' /* max number of printed Exp/Imp messages */') WRITE(msgBuf,'(A)') '// ===================================' CALL PRINT_MESSAGE( msgBuf, iUnit, SQUEEZE_RIGHT, myThid ) WRITE(msgBuf,'(A)') '// End of Coupling set-up summary' CALL PRINT_MESSAGE( msgBuf, iUnit, SQUEEZE_RIGHT, myThid ) WRITE(msgBuf,'(A)') '// ===================================' CALL PRINT_MESSAGE( msgBuf, iUnit, SQUEEZE_RIGHT, myThid ) C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| _END_MASTER(myThid) C-- Everyone else must wait for the parameters to be loaded _BARRIER #endif /* COMPONENT_MODULE */ RETURN END