C $Header: /u/gcmpack/MITgcm/pkg/ocn_compon_interf/cpl_readparms.F,v 1.16 2017/08/09 15:23:37 mlosch Exp $ C $Name: $ #include "OCN_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 (ocean) C *==========================================================* C \ev C !USES: IMPLICIT NONE C == Global variables === #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #include "CPL_PARAMS.h" #ifdef ALLOW_MNC #include "MNC_PARAMS.h" #endif 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 LOGICAL cpl_earlyExpImpCall C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| C-- Coupling parameters: C useImportHFlx :: True => use the Imported HeatFlux from couler C useImportFW :: True => use the Imported Fresh Water flux fr cpl C useImportTau :: True => use the Imported Wind-Stress from couler C useImportSLP :: True => use the Imported Sea-level Atmos. Pressure C useImportRunOff :: True => use the Imported RunOff flux from coupler C useImportSIce :: True => use the Imported Sea-Ice loading from coupler C useImportThSIce :: True => use the Imported thSIce state vars from coupler C useImportSltPlm :: True => use the Imported Salt-Plume flux from coupler C useImportFice :: True => use the Imported Seaice fraction (DIC-only) C useImportCO2 :: True => use the Imported atmos. CO2 from coupler C useImportWSpd :: True => use the Imported surf. Wind speed from coupler C cpl_taveFreq :: Frequency^-1 for time-Aver. output (s) NAMELIST //CPL_OCN_PARAM & cpl_earlyExpImpCall, & useImportHFlx, useImportFW, useImportTau, & useImportSLP, useImportRunOff, & useImportSIce, useImportThSIce, useImportSltPlm, & useImportFice, useImportCO2, useImportWSpd, & cpl_taveFreq, cpl_snapshot_mnc, cpl_timeave_mnc 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. useImportHFlx = .TRUE. useImportFW = .TRUE. useImportTau = .TRUE. useImportSLP = .TRUE. useImportRunOff = cpl_exchange_RunOff.EQ.3 useImportSIce = cpl_exchange1W_sIce.EQ.3 useImportThSIce = cpl_exchange2W_sIce.EQ.3 useImportSltPlm = cpl_exchange_SaltPl.EQ.3 useImportFice =( cpl_exchange_DIC .EQ. 3 .AND. & cpl_exchange1W_sIce.EQ.3 ) c & .OR. cpl_exchange2W_sIce.EQ.3 useImportCO2 = cpl_exchange_DIC .EQ. 3 useImportWSpd = cpl_exchange_DIC .EQ. 3 cpl_taveFreq = taveFreq #ifdef ALLOW_MNC cpl_snapshot_mnc = snapshot_mnc cpl_timeave_mnc = timeave_mnc #else cpl_snapshot_mnc = .FALSE. cpl_timeave_mnc = .FALSE. #endif C-- Read parameters from open data file: C- Parameters for coupling interface: READ(UNIT=iUnit,NML=CPL_OCN_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_DIC IF ( ocn_cplExch_RunOff ) THEN WRITE(msgBuf,'(2A)') 'CPL_READPARMS: needs', & ' to compile pkg/dic to use: ocn_cplExch_RunOff=T' CALL PRINT_ERROR( msgBuf, myThid ) WRITE(msgBuf,'(2A)') 'CPL_READPARMS: ', & ' (set from Coupler "data.cpl": cpl_exchange_RunOff=1,3)' CALL PRINT_ERROR( msgBuf, myThid ) cplErrorCount = cplErrorCount + 1 ENDIF #endif /* ndef ALLOW_DIC */ #ifndef ALLOW_THSICE IF ( ocn_cplExch2W_sIce ) THEN WRITE(msgBuf,'(2A)') 'CPL_READPARMS: needs', & ' to compile pkg/thsice to use: ocn_cplExch2W_sIce=T' CALL PRINT_ERROR( msgBuf, myThid ) WRITE(msgBuf,'(2A)') 'CPL_READPARMS: ', & ' (set from Coupler "data.cpl": cpl_exchange2W_sIce=1,3)' CALL PRINT_ERROR( msgBuf, myThid ) cplErrorCount = cplErrorCount + 1 ENDIF #endif /* ndef ALLOW_THSICE */ #ifndef ALLOW_SALT_PLUME IF ( ocn_cplExch_SaltPl ) THEN WRITE(msgBuf,'(2A)') 'CPL_READPARMS: needs', & ' compiled pkg/salt_plume to use: ocn_cplExch_SaltPl=T' CALL PRINT_ERROR( msgBuf, myThid ) WRITE(msgBuf,'(2A)') 'CPL_READPARMS: ', & ' (set from Coupler "data.cpl": cpl_exchange_SaltPl=1,3)' CALL PRINT_ERROR( msgBuf, myThid ) cplErrorCount = cplErrorCount + 1 ENDIF #endif /* ndef ALLOW_SALT_PLUME */ #ifndef ALLOW_DIC IF ( ocn_cplExch_DIC ) THEN WRITE(msgBuf,'(2A)') 'CPL_READPARMS: needs', & ' to compile pkg/dic to use: ocn_cplExch_DIC = T' CALL PRINT_ERROR( msgBuf, myThid ) WRITE(msgBuf,'(2A)') 'CPL_READPARMS: ', & ' (set from Coupler "data.cpl": cpl_exchange_DIC = 1,3)' CALL PRINT_ERROR( msgBuf, myThid ) cplErrorCount = cplErrorCount + 1 ENDIF #endif /* ndef ALLOW_DIC */ C- If cpl_taveFreq is positive, then must compile the timeave pkg code #ifndef ALLOW_TIMEAVE IF (cpl_taveFreq.GT.0.) THEN WRITE(msgBuf,'(A)') & 'CPL_READPARMS: cpl_taveFreq > 0 but not compiled pkg/timeave' CALL PRINT_ERROR( msgBuf, myThid) WRITE(msgBuf,'(A)') & 'Re-compile with pkg "timeave" in packages.conf' CALL PRINT_ERROR( msgBuf, myThid) cplErrorCount = cplErrorCount + 1 ENDIF #endif /* ndef ALLOW_TIMEAVE */ #ifndef ATMOSPHERIC_LOADING iUnit = errorMessageUnit IF ( useImportSLP ) THEN WRITE(msgBuf,'(2A)') '** WARNING ** CPL_READPARMS:', & ' useImportSLP is set but' CALL PRINT_MESSAGE( msgBuf, iUnit, SQUEEZE_RIGHT, myThid ) ELSEIF ( useImportSIce ) THEN WRITE(msgBuf,'(2A)') '** WARNING ** CPL_READPARMS:', & ' useImportSIce is set but' CALL PRINT_MESSAGE( msgBuf, iUnit, SQUEEZE_RIGHT, myThid ) ENDIF IF ( useImportSLP .OR. useImportSIce ) THEN WRITE(msgBuf,'(2A)') '** WARNING ** CPL_READPARMS:', & ' pressure loading code is not active.' CALL PRINT_MESSAGE( msgBuf, iUnit, SQUEEZE_RIGHT, myThid ) C WRITE(msgBuf,'(2A)') '** WARNING **', C & ' Re-compile with: #define ATMOSPHERIC_LOADING' C CALL PRINT_MESSAGE(msgBuf,iUnit,SQUEEZE_RIGHT,myThid) ENDIF #endif /* ATMOSPHERIC_LOADING */ IF ( useImportRunOff .AND. cpl_exchange_RunOff.NE.3 ) THEN WRITE(msgBuf,'(2A)') 'CPL_READPARMS: useImportRunOff', & ' requires setting' CALL PRINT_ERROR( msgBuf, myThid) WRITE(msgBuf,'(2A)') 'CPL_READPARMS: ', & ' cpl_exchange_RunOff = 3 (in Coupler "data.cpl")' CALL PRINT_ERROR( msgBuf, myThid) cplErrorCount = cplErrorCount + 1 ENDIF IF ( ( useImportSIce .OR. & useImportFice.AND.cpl_exchange2W_sIce.NE.3 ) & .AND. cpl_exchange1W_sIce.NE.3 ) THEN WRITE(msgBuf,'(2A)') 'CPL_READPARMS: useImport', & ' SIce-Mass/Frac requires setting' CALL PRINT_ERROR( msgBuf, myThid) WRITE(msgBuf,'(2A)') 'CPL_READPARMS: ', & ' cpl_exchange1W_sIce = 3 (in Coupler "data.cpl")' CALL PRINT_ERROR( msgBuf, myThid) cplErrorCount = cplErrorCount + 1 ENDIF IF ( useImportThSIce .AND. .NOT.ocn_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,3 (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 ( useImportSltPlm .AND. cpl_exchange_SaltPl.NE.3 ) THEN WRITE(msgBuf,'(2A)') 'CPL_READPARMS: useImportSltPlm', & ' requires setting' CALL PRINT_ERROR( msgBuf, myThid) WRITE(msgBuf,'(2A)') 'CPL_READPARMS: ', & ' cpl_exchange_SaltPl = 3 (in Coupler "data.cpl")' CALL PRINT_ERROR( msgBuf, myThid) cplErrorCount = cplErrorCount + 1 ENDIF IF ( ( useImportFice.AND.cpl_exchange2W_sIce.NE.3 & .OR. useImportCO2 .OR. useImportWSpd ) & .AND. cpl_exchange_DIC.NE.3 ) THEN WRITE(msgBuf,'(2A)') 'CPL_READPARMS: useImport', & ' with DIC variables 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 C Set IO flags cpl_snapshot_mdsio = .TRUE. cpl_timeave_mdsio = .TRUE. #ifdef ALLOW_MNC IF (useMNC) THEN IF ( .NOT.outputTypesInclusive & .AND. cpl_snapshot_mnc ) cpl_snapshot_mdsio = .FALSE. IF ( .NOT.outputTypesInclusive & .AND. cpl_timeave_mnc ) cpl_timeave_mdsio = .FALSE. ENDIF #endif C- derive other parameters: 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( ocn_cplSequential, INDEX_NONE, & 'ocn_cplSequential =', & ' /* use Sequential Coupling Exchange on/off flag */') CALL WRITE_0D_L( ocn_cplExch_RunOff, INDEX_NONE, & 'ocn_cplExch_RunOff =', & ' /* exchange RunOff fields with coupler on/off */') CALL WRITE_0D_L( ocn_cplExch1W_sIce, INDEX_NONE, & 'ocn_cplExch1W_sIce =', & ' /* 1-way exchange of seaice vars with coupler */') CALL WRITE_0D_L( ocn_cplExch2W_sIce, INDEX_NONE, & 'ocn_cplExch2W_sIce =', & ' /* 2-way exchange of ThSIce vars with coupler */') CALL WRITE_0D_L( ocn_cplExch_SaltPl, INDEX_NONE, & 'ocn_cplExch_SaltPl =', & ' /* exchange Salt-Plume fields with coupler */') CALL WRITE_0D_L( ocn_cplExch_DIC, INDEX_NONE, & 'ocn_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( useImportHFlx, INDEX_NONE, & 'useImportHFlx =', & ' /* use Imported Heat-Flx fr Coupler on/off flag */') CALL WRITE_0D_L( useImportFW , INDEX_NONE, & 'useImportFW =', & ' /* use Imported Fresh-Water fr Cpl. on/off flag */') CALL WRITE_0D_L( useImportTau , INDEX_NONE, & 'useImportTau =', & ' /* use Imported Wind-Stress fr Cpl. on/off flag */') CALL WRITE_0D_L( useImportSLP , INDEX_NONE, & 'useImportSLP =', & ' /* use Imported Sea-level Atm Press on/off flag */') CALL WRITE_0D_L( useImportRunOff , INDEX_NONE, & 'useImportRunOff=', & ' /* use Imported Run-Off fr Cpl. on/off flag */') CALL WRITE_0D_L( useImportSIce , INDEX_NONE, & 'useImportSIce =', & ' /* use Imported Sea-Ice loading on/off flag */') CALL WRITE_0D_L( useImportThSIce , INDEX_NONE, & 'useImportThSIce=', & ' /* use Imported thSIce state-var on/off flag */') CALL WRITE_0D_L( useImportSltPlm , INDEX_NONE, & 'useImportSltPlm=', & ' /* use Imported Salt-Plume flux on/off flag */') CALL WRITE_0D_L( useImportFice , INDEX_NONE, & 'useImportFice =', & ' /* use Imported Seaice Frac (DIC-only) flag */') CALL WRITE_0D_L( useImportCO2 , INDEX_NONE, & 'useImportCO2 =', & ' /* use Imported Atmos. CO2 fr Cpl. on/off flag */') CALL WRITE_0D_L( useImportWSpd , INDEX_NONE, & 'useImportWSpd =', & ' /* use Imported Windspeed fr Cpl. on/off flag */') CALL WRITE_0D_RL( cpl_taveFreq, INDEX_NONE, 'cpl_taveFreq =', & ' /* Frequency^-1 for time-Aver. output (s) */') CALL WRITE_0D_L( cpl_timeave_mnc , INDEX_NONE, & 'cpl_timeave_mnc =', & ' /* write TimeAv to MNC file on/off flag */') CALL WRITE_0D_L( cpl_timeave_mdsio , INDEX_NONE, & 'cpl_timeave_mdsio =', & ' /* write TimeAv to MDSIO file on/off flag */') 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