C $Header: /u/gcmpack/MITgcm/pkg/exf/exf_check.F,v 1.35 2017/10/06 00:03:56 jmc Exp $ C $Name: $ #include "EXF_OPTIONS.h" C-- File exf_check.F: Routines to check EXF settings C-- Contents C-- o EXF_CHECK C-- o EXF_CHECK_INTERP C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| CBOP C !ROUTINE: EXF_CHECK C !INTERFACE: SUBROUTINE EXF_CHECK( myThid ) C !DESCRIPTION: \bv C *==========================================================* C | S/R EXF_CHECK C | o Check parameters and other package dependences C *==========================================================* C \ev C !USES: IMPLICIT NONE C == Global variables === #include "EEPARAMS.h" #include "SIZE.h" #include "PARAMS.h" #include "EXF_PARAM.h" #include "EXF_CONSTANTS.h" C !INPUT/OUTPUT PARAMETERS: C myThid :: my Thread Id number INTEGER myThid C !LOCAL VARIABLES: C msgBuf :: Informational/error message buffer CHARACTER*(MAX_LEN_MBUF) msgBuf INTEGER errCount CEOP _BEGIN_MASTER(myThid) errCount = 0 WRITE(msgBuf,'(A)') 'EXF_CHECK: #define ALLOW_EXF' CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, & SQUEEZE_RIGHT, myThid ) C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| C-- Check for consistency, main parameters IF (.NOT. & (exf_iprec.EQ.precFloat32 .OR. exf_iprec.EQ.precFloat64) & ) THEN WRITE(msgBuf,'(A)') & 'S/R EXF_CHECK: value of exf_iprec not allowed' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF IF ( repeatPeriod.LT.0. ) THEN C- Note: should check all {fld}RepCycle (not just common defaut repeatPeriod) WRITE(msgBuf,'(A)') & 'S/R EXF_CHECK: repeatPeriod must be positive' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF IF ( useExfYearlyFields ) THEN IF ( .NOT.useCAL ) THEN WRITE(msgBuf,'(2A)') 'EXF_CHECK: ', & 'useExfYearlyFields requires to use pkg/cal (useCAL=T)' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF IF ( repeatPeriod.NE.0. ) THEN C- Note: should check all obcs{N,S,E,W}repCycle (not just default repeatPeriod) WRITE(msgBuf,'(2A)') 'EXF_CHECK: The use of ', & 'useExfYearlyFields AND repeatPeriod is not implemented' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF ENDIF IF ( useOBCS .AND. useOBCSYearlyFields ) THEN IF ( .NOT.useCAL ) THEN WRITE(msgBuf,'(2A)') 'EXF_CHECK: ', & 'useOBCSYearlyFields requires to use pkg/cal (useCAL=T)' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF IF ( repeatPeriod.NE.0. ) THEN C- Note: should check all siob{N,S,E,W}repCycle (not just default repeatPeriod) WRITE(msgBuf,'(2A)') 'EXF_CHECK: ', & 'useOBCSYearlyFields not implemented for repeatPeriod <> 0' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF ENDIF C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| C-- For each field, check for parameter consistency: C a) stop when file is specified but not read-in; C b) print warning when file is read-in but not used within pkg/exf C- Check wind parameters: IF ( useAtmWind ) THEN IF ( ustressfile .NE. ' ' .OR. vstressfile .NE. ' ' ) THEN WRITE(msgBuf,'(A)') & 'EXF_CHECK: use u,v_wind components but not wind-stress' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF IF ( useRelativeWind .AND. & ( uwindfile .EQ. ' ' .OR. uwindperiod.EQ.0. .OR. & vwindfile .EQ. ' ' .OR. vwindperiod.EQ.0. ) ) THEN WRITE(msgBuf,'(2A)') 'EXF_CHECK: useRelativeWind ', & 'requires to update u/vwind' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF ENDIF IF ( .NOT.useAtmWind ) THEN IF ( uwindfile .NE. ' ' .OR. vwindfile .NE. ' ' ) THEN WRITE(msgBuf,'(A)') & 'EXF_CHECK: read-in wind-stress but not u,v_wind components' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF ENDIF #if !(defined ALLOW_ATM_TEMP) || !(defined ALLOW_BULKFORMULAE) IF ( wspeedfile.NE.' ' .AND. .NOT.useAtmWind ) THEN WRITE(msgBuf,'(3A)') '** WARNING ** EXF_CHECK: "wspeed" ', & 'field is loaded from file but not used within pkg/exf' CALL PRINT_MESSAGE( msgBuf, errorMessageUnit, & SQUEEZE_RIGHT, myThid ) ENDIF #endif C- Check other field parameters: #ifdef ALLOW_ATM_TEMP IF ( hfluxfile.NE.' ' ) THEN WRITE(msgBuf,'(3A)') '** WARNING ** EXF_CHECK: "hflux" ', & 'field is loaded from file but not used within pkg/exf' CALL PRINT_MESSAGE( msgBuf, errorMessageUnit, & SQUEEZE_RIGHT, myThid ) ENDIF IF ( sfluxfile.NE.' ' ) THEN WRITE(msgBuf,'(3A)') '** WARNING ** EXF_CHECK: "sflux" ', & 'field is loaded from file but not used within pkg/exf' CALL PRINT_MESSAGE( msgBuf, errorMessageUnit, & SQUEEZE_RIGHT, myThid ) ENDIF # ifndef ALLOW_BULKFORMULAE C- atemp might be used (outside Bulk-Formulae), e.g. to make snow c IF ( atempfile.NE.' ' ) THEN c WRITE(msgBuf,'(2A)') '** WARNING ** EXF_CHECK: "atemp" ', c & 'field is loaded from file but not used within pkg/exf' c CALL PRINT_MESSAGE( msgBuf, errorMessageUnit, c & SQUEEZE_RIGHT, myThid ) c ENDIF IF ( aqhfile.NE.' ' ) THEN WRITE(msgBuf,'(2A)') '** WARNING ** EXF_CHECK: "aqh" ', & 'field is loaded from file but not used within pkg/exf' CALL PRINT_MESSAGE( msgBuf, errorMessageUnit, & SQUEEZE_RIGHT, myThid ) ENDIF # endif /* ndef ALLOW_BULKFORMULAE */ #else /* ALLOW_ATM_TEMP */ IF ( atempfile.NE.' ' ) THEN WRITE(msgBuf,'(3A)') 'EXF_CHECK: Cannot read-in field ', & '"atemp" with #undef ALLOW_ATM_TEMP' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF IF ( aqhfile.NE.' ' ) THEN WRITE(msgBuf,'(3A)') 'EXF_CHECK: Cannot read-in field ', & '"aqh" with #undef ALLOW_ATM_TEMP' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF #endif /* ALLOW_ATM_TEMP */ #if (defined ALLOW_ATM_TEMP) (defined ALLOW_READ_TURBFLUXES) # ifdef ALLOW_BULKFORMULAE IF ( hs_file.NE.' ' ) THEN WRITE(msgBuf,'(2A)') '** WARNING ** EXF_CHECK: "hs" ', & 'field is loaded from file but not used within pkg/exf' CALL PRINT_MESSAGE( msgBuf, errorMessageUnit, & SQUEEZE_RIGHT, myThid ) ENDIF IF ( hl_file.NE.' ' ) THEN WRITE(msgBuf,'(2A)') '** WARNING ** EXF_CHECK: "hl" ', & 'field is loaded from file but not used within pkg/exf' CALL PRINT_MESSAGE( msgBuf, errorMessageUnit, & SQUEEZE_RIGHT, myThid ) ENDIF # endif /* ALLOW_BULKFORMULAE */ #else /* ALLOW_ATM_TEMP and ALLOW_READ_TURBFLUXES */ IF ( hs_file.NE.' ' ) THEN WRITE(msgBuf,'(3A)') 'EXF_CHECK: Cannot read-in field ', & '"hs" without ALLOW_ATM_TEMP and ALLOW_READ_TURBFLUXES' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF IF ( hl_file.NE.' ' ) THEN WRITE(msgBuf,'(3A)') 'EXF_CHECK: Cannot read-in field ', & '"hl" without ALLOW_ATM_TEMP and ALLOW_READ_TURBFLUXES' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF #endif /* ALLOW_ATM_TEMP and ALLOW_READ_TURBFLUXES */ #if !(defined ALLOW_ATM_TEMP) || !(defined EXF_READ_EVAP) IF ( evapfile.NE.' ' ) THEN WRITE(msgBuf,'(3A)') 'EXF_CHECK: Cannot read-in field ', & '"evap" without ALLOW_ATM_TEMP and EXF_READ_EVAP' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF #endif /* ndef ALLOW_ATM_TEMP or ndef EXF_READ_EVAP */ #ifndef ALLOW_ATM_TEMP IF ( precipfile.NE.' ' ) THEN WRITE(msgBuf,'(3A)') 'EXF_CHECK: Cannot read-in field ', & '"precip" with #undef ALLOW_ATM_TEMP' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF IF ( snowprecipfile.NE.' ' ) THEN WRITE(msgBuf,'(3A)') 'EXF_CHECK: Cannot read-in field ', & '"snowprecip" with #undef ALLOW_ATM_TEMP' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF # ifndef SHORTWAVE_HEATING IF ( swfluxfile.NE.' ' ) THEN WRITE(msgBuf,'(3A)') 'EXF_CHECK: Cannot read-in field ', & '"swflux" without ALLOW_ATM_TEMP or SHORTWAVE_HEATING' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF IF ( swdownfile.NE.' ' ) THEN WRITE(msgBuf,'(3A)') 'EXF_CHECK: Cannot read-in field ', & '"swdown" without ALLOW_ATM_TEMP or SHORTWAVE_HEATING' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF # endif /* ndef SHORTWAVE_HEATING */ IF ( lwfluxfile.NE.' ' ) THEN WRITE(msgBuf,'(3A)') 'EXF_CHECK: Cannot read-in field ', & '"lwflux" with #undef ALLOW_ATM_TEMP' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF IF ( lwdownfile.NE.' ' ) THEN WRITE(msgBuf,'(3A)') 'EXF_CHECK: Cannot read-in field ', & '"lwdown" with #undef ALLOW_ATM_TEMP' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF #endif /* ndef ALLOW_ATM_TEMP */ #ifdef ALLOW_DOWNWARD_RADIATION # if defined(ALLOW_ATM_TEMP) defined(SHORTWAVE_HEATING) IF ( swdownfile.NE.' ' .AND. swfluxfile.NE.' ' ) THEN WRITE(msgBuf,'(2A)') '** WARNING ** EXF_CHECK: "swdown" ', & 'field is loaded from file but not used within pkg/exf' CALL PRINT_MESSAGE( msgBuf, errorMessageUnit, & SQUEEZE_RIGHT, myThid ) ENDIF # endif /* ALLOW_ATM_TEMP or SHORTWAVE_HEATING */ # ifdef ALLOW_ATM_TEMP IF ( lwdownfile.NE.' ' .AND. lwfluxfile.NE.' ' ) THEN WRITE(msgBuf,'(2A)') '** WARNING ** EXF_CHECK: "lwdown" ', & 'field is loaded from file but not used within pkg/exf' CALL PRINT_MESSAGE( msgBuf, errorMessageUnit, & SQUEEZE_RIGHT, myThid ) ENDIF # endif /* ALLOW_ATM_TEMP or SHORTWAVE_HEATING */ #else /* ALLOW_DOWNWARD_RADIATION */ IF ( swdownfile.NE.' ' ) THEN WRITE(msgBuf,'(3A)') 'EXF_CHECK: Cannot read-in field ', & '"swdown" with #undef ALLOW_DOWNWARD_RADIATION' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF IF ( lwdownfile.NE.' ' ) THEN WRITE(msgBuf,'(3A)') 'EXF_CHECK: Cannot read-in field ', & '"lwdown" with #undef ALLOW_DOWNWARD_RADIATION' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF #endif /* ALLOW_DOWNWARD_RADIATION */ #ifndef ATMOSPHERIC_LOADING IF ( apressurefile.NE.' ' ) THEN WRITE(msgBuf,'(3A)') 'EXF_CHECK: Cannot read-in field ', & '"apressure" with #undef ATMOSPHERIC_LOADING' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF #endif /* ndef ATMOSPHERIC_LOADING */ #ifndef EXF_ALLOW_TIDES IF ( tidePotFile.NE.' ' ) THEN WRITE(msgBuf,'(3A)') 'EXF_CHECK: Cannot read-in field ', & '"tidePot" with #undef EXF_ALLOW_TIDES' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF #endif /* ndef EXF_SEAICE_FRACTION */ #ifndef EXF_SEAICE_FRACTION IF ( areamaskfile.NE.' ' ) THEN WRITE(msgBuf,'(3A)') 'EXF_CHECK: Cannot read-in field ', & '"areamask" with #undef EXF_SEAICE_FRACTION' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF #endif /* ndef EXF_SEAICE_FRACTION */ #ifndef ALLOW_RUNOFF IF ( runofffile.NE.' ' ) THEN WRITE(msgBuf,'(3A)') 'EXF_CHECK: Cannot read-in field ', & '"runoff" with #undef ALLOW_RUNOFF' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF #endif /* ndef ALLOW_RUNOFF */ IF ( runoftempfile.NE.' ' ) THEN #ifndef ALLOW_RUNOFTEMP WRITE(msgBuf,'(3A)') 'EXF_CHECK: Cannot read-in field ', & '"runoftemp" with #undef ALLOW_RUNOFTEMP' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 #endif /* ndef ALLOW_RUNOFTEMP */ IF ( runofffile.EQ.' ' ) THEN WRITE(msgBuf,'(2A)') '** WARNING ** EXF_CHECK: "runoftemp" ', & 'field is loaded from file but not used within pkg/exf' CALL PRINT_MESSAGE( msgBuf, errorMessageUnit, & SQUEEZE_RIGHT, myThid ) ENDIF ENDIF IF ( saltflxfile.NE.' ' ) THEN #ifndef ALLOW_SALTFLX WRITE(msgBuf,'(3A)') 'EXF_CHECK: Cannot read-in field ', & '"saltflx" with #undef ALLOW_SALTFLX' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 #endif /* ndef ALLOW_SALTFLX */ IF ( useSEAICE .OR. useThSIce ) THEN WRITE(msgBuf,'(2A)') 'EXF_CHECK: exf salt flux is not', & ' allowed when using either pkg/seaice or pkg/thsice' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF ENDIF C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| #ifdef ALLOW_ZENITHANGLE IF ( ( useExfZenIncoming .OR. select_ZenAlbedo.NE.0 ) .AND. & ( usingCartesianGrid .OR. usingCylindricalGrid ) ) THEN WRITE(msgBuf,'(A,A)') 'EXF_CHECK: ZENITHANGLE code ', & 'does not work for cartesian and cylindrical grids' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF IF ( select_ZenAlbedo.LT.0 .OR. select_ZenAlbedo.GT.3 ) THEN WRITE(msgBuf,'(A,A)') 'EXF_CHECK: unsupported ', & 'select_ZenAlbedo choice' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF IF ( select_ZenAlbedo.EQ.2 ) THEN WRITE(msgBuf,'(A,A)') & '** WARNING ** EXF_CHECK: for daily mean albedo, ', & 'it is advised to use select_ZenAlbedo.EQ.1 instead of 2' CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, & SQUEEZE_RIGHT, myThid ) ENDIF IF ( select_ZenAlbedo.EQ.3 .AND. swdownperiod.GT.21600. ) THEN WRITE(msgBuf,'(A,A)') 'EXF_CHECK: using diurnal albedo ', & 'formula requires diurnal downward shortwave forcing' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF IF ( select_ZenAlbedo.EQ.3 .AND. swdownperiod.GT.3600. ) THEN WRITE(msgBuf,'(3A)') '** WARNING ** EXF_CHECK: ', & 'the diurnal albedo formula is likely not safe for such ', & 'coarse temporal resolution downward shortwave forcing' CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, & SQUEEZE_RIGHT, myThid ) ENDIF #else /* ALLOW_ZENITHANGLE */ IF ( useExfZenIncoming .OR. select_ZenAlbedo.NE.0 ) THEN WRITE(msgBuf,'(A,A)') 'EXF_CHECK: unsupported option', & ' when ALLOW_ZENITHANGLE is not defined' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF #endif /* ALLOW_ZENITHANGLE */ #ifdef USE_EXF_INTERPOLATION IF ( usingCartesianGrid ) THEN WRITE(msgBuf,'(A,A)') 'EXF_CHECK: ', & 'USE_EXF_INTERPOLATION assumes latitude/longitude' CALL PRINT_ERROR( msgBuf, myThid ) WRITE(msgBuf,'(A,A)') 'EXF_CHECK: ', & 'input and output coordinates. Trivial to extend to' CALL PRINT_ERROR( msgBuf, myThid ) WRITE(msgBuf,'(A,A)') 'EXF_CHECK: ', & 'cartesian coordinates, but has not yet been done.' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF CALL EXF_CHECK_INTERP( 'ustress', ustressfile, & ustress_interpMethod, ustress_nlat, & ustress_nlon, ustress_lon_inc, errCount, myThid ) CALL EXF_CHECK_INTERP( 'vstress', vstressfile, & vstress_interpMethod, vstress_nlat, & vstress_nlon, vstress_lon_inc, errCount, myThid ) CALL EXF_CHECK_INTERP( 'hflux', hfluxfile, hflux_interpMethod, & hflux_nlat, hflux_nlon, hflux_lon_inc, errCount, myThid ) CALL EXF_CHECK_INTERP( 'sflux', sfluxfile, sflux_interpMethod, & sflux_nlat, sflux_nlon, sflux_lon_inc, errCount, myThid ) CALL EXF_CHECK_INTERP( 'swflux', swfluxfile, swflux_interpMethod, & swflux_nlat, swflux_nlon, swflux_lon_inc, errCount, myThid ) CALL EXF_CHECK_INTERP( 'runoff', runofffile, runoff_interpMethod, & runoff_nlat, runoff_nlon, runoff_lon_inc, errCount, myThid ) CALL EXF_CHECK_INTERP( 'saltflx', saltflxfile, & saltflx_interpMethod, saltflx_nlat, & saltflx_nlon, saltflx_lon_inc, errCount, myThid ) CALL EXF_CHECK_INTERP( 'atemp', atempfile, atemp_interpMethod, & atemp_nlat, atemp_nlon, atemp_lon_inc, errCount, myThid ) CALL EXF_CHECK_INTERP( 'aqh', aqhfile, aqh_interpMethod, & aqh_nlat, aqh_nlon, aqh_lon_inc, errCount, myThid ) CALL EXF_CHECK_INTERP( 'hs', hs_file, hs_interpMethod, & hs_nlat, hs_nlon, hs_lon_inc, errCount, myThid ) CALL EXF_CHECK_INTERP( 'hl', hl_file, hl_interpMethod, & hl_nlat, hl_nlon, hl_lon_inc, errCount, myThid ) CALL EXF_CHECK_INTERP( 'evap', evapfile, evap_interpMethod, & evap_nlat, evap_nlon, evap_lon_inc, errCount, myThid ) CALL EXF_CHECK_INTERP( 'precip', precipfile, precip_interpMethod, & precip_nlat, precip_nlon, precip_lon_inc, errCount, myThid ) CALL EXF_CHECK_INTERP( 'snowprecip', snowprecipfile, & snowprecip_interpMethod, snowprecip_nlat, & snowprecip_nlon, snowprecip_lon_inc, errCount, myThid ) CALL EXF_CHECK_INTERP( 'uwind', uwindfile, uwind_interpMethod, & uwind_nlat, uwind_nlon, uwind_lon_inc, errCount, myThid ) CALL EXF_CHECK_INTERP( 'vwind', vwindfile, vwind_interpMethod, & vwind_nlat, vwind_nlon, vwind_lon_inc, errCount, myThid ) CALL EXF_CHECK_INTERP( 'wspeed', wspeedfile, wspeed_interpMethod, & wspeed_nlat, wspeed_nlon, wspeed_lon_inc, errCount, myThid ) CALL EXF_CHECK_INTERP( 'lwflux', lwfluxfile, lwflux_interpMethod, & lwflux_nlat, lwflux_nlon, lwflux_lon_inc, errCount, myThid ) CALL EXF_CHECK_INTERP( 'swdown', swdownfile, swdown_interpMethod, & swdown_nlat, swdown_nlon, swdown_lon_inc, errCount, myThid ) CALL EXF_CHECK_INTERP( 'lwdown', lwdownfile, lwdown_interpMethod, & lwdown_nlat, lwdown_nlon, lwdown_lon_inc, errCount, myThid ) CALL EXF_CHECK_INTERP( 'apressure', apressurefile, & apressure_interpMethod, apressure_nlat, & apressure_nlon, apressure_lon_inc, errCount, myThid ) CALL EXF_CHECK_INTERP( 'tidePot', tidePotFile, & tidePot_interpMethod, tidePot_nlat, & tidePot_nlon, tidePot_lon_inc, errCount, myThid ) CALL EXF_CHECK_INTERP( 'areamask', areamaskfile, & areamask_interpMethod, areamask_nlat, & areamask_nlon, areamask_lon_inc, errCount, myThid ) CALL EXF_CHECK_INTERP( 'climsst', climsstfile, & climsst_interpMethod, climsst_nlat, & climsst_nlon, climsst_lon_inc, errCount, myThid ) CALL EXF_CHECK_INTERP( 'climsss', climsssfile, & climsss_interpMethod, climsss_nlat, & climsss_nlon, climsss_lon_inc, errCount, myThid ) CALL EXF_CHECK_INTERP( 'climustr', climustrfile, & climustr_interpMethod, climustr_nlat, & climustr_nlon, climustr_lon_inc, errCount,myThid ) CALL EXF_CHECK_INTERP( 'climvstr', climvstrfile, & climvstr_interpMethod, climvstr_nlat, & climvstr_nlon, climvstr_lon_inc, errCount, myThid ) C- some restrictions on 2-component vector field (might be relaxed later on) IF ( ( uwind_interpMethod.GE.1 .AND. uwindfile.NE.' ' ) .OR. & ( vwind_interpMethod.GE.1 .AND. vwindfile.NE.' ' ) ) THEN IF ( usingCurvilinearGrid .OR. rotateGrid ) THEN IF ( uwind_interpMethod.EQ.0 .OR. uwindfile.EQ.' ' .OR. & vwind_interpMethod.EQ.0 .OR. vwindfile.EQ.' ' ) THEN C- stop if one expects interp+rotation (Curvilin-G) which will not happen WRITE(msgBuf,'(A)') & 'EXF_CHECK: interp. needs 2 components (wind)' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF IF ( uwindStartTime .NE. vwindStartTime .OR. & uwindperiod .NE. vwindperiod .OR. & uwindRepCycle .NE. vwindRepCycle ) THEN WRITE(msgBuf,'(A,A)') 'EXF_CHECK: ', & 'For CurvilinearGrid/RotatedGrid, the u and v wind ' CALL PRINT_ERROR( msgBuf, myThid ) WRITE(msgBuf,'(A,A,A)') 'EXF_CHECK: ', & 'files have to have the same StartTime,period & Cycle ', & 'because S/R EXF_SET_UV assumes that.' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF ENDIF ENDIF IF ( (ustress_interpMethod.GE.1 .AND. ustressfile.NE.' ') .OR. & (vstress_interpMethod.GE.1 .AND. vstressfile.NE.' ') ) THEN IF ( readStressOnCgrid ) THEN WRITE(msgBuf,'(A,A)') & 'EXF_CHECK: readStressOnCgrid=.TRUE. ', & 'and interp wind-stress (=A-grid) are not compatible' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF IF ( usingCurvilinearGrid .OR. rotateGrid ) THEN IF ( ustress_interpMethod.EQ.0 .OR. ustressfile.EQ.' ' .OR. & vstress_interpMethod.EQ.0 .OR. vstressfile.EQ.' ' ) THEN C- stop if one expects interp+rotation (Curvilin-G) which will not happen WRITE(msgBuf,'(A)') & 'EXF_CHECK: interp. needs 2 components (wind-stress)' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF IF ( ustressStartTime .NE. vstressStartTime .OR. & ustressperiod .NE. vstressperiod .OR. & ustressRepCycle .NE. vstressRepCycle ) THEN WRITE(msgBuf,'(A,A)') 'EXF_CHECK: ', & 'For CurvilinearGrid/RotatedGrid, the u and v wind stress ' CALL PRINT_ERROR( msgBuf, myThid ) WRITE(msgBuf,'(A,A,A)') 'EXF_CHECK: ', & 'have to have the same StartTime,period & Cycle ', & 'because S/R EXF_SET_UV assumes that.' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF ENDIF ENDIF IF ( (ustress_interpMethod.EQ.0 .AND. ustressfile.NE.' ') .OR. & (vstress_interpMethod.EQ.0 .AND. vstressfile.NE.' ') ) THEN #else /* ndef USE_EXF_INTERPOLATION */ IF ( ustressfile .NE. ' ' .OR. vstressfile .NE. ' ' ) THEN #endif /* USE_EXF_INTERPOLATION */ IF ( (readStressOnAgrid.AND.readStressOnCgrid) .OR. & .NOT.(readStressOnAgrid.OR.readStressOnCgrid) ) THEN WRITE(msgBuf,'(A)') & 'EXF_CHECK: Select 1 wind-stress position: A or C-grid' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF IF (rotateStressOnAgrid.AND..NOT.readStressOnAgrid) THEN WRITE(msgBuf,'(2A)') 'EXF_CHECK: rotateStressOnAgrid ', & 'only applies to cases readStressOnAgrid is true' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF IF ( rotateStressOnAgrid .AND. & ( ustressfile .EQ. ' ' .OR. ustressperiod .EQ. 0. .OR. & vstressfile .EQ. ' ' .OR. vstressperiod .EQ. 0. ) ) THEN WRITE(msgBuf,'(2A)') 'EXF_CHECK: rotateStressOnAgrid ', & 'requires to update u/vstress' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF ELSE IF ( readStressOnAgrid .OR. readStressOnCgrid .OR. & rotateStressOnAgrid ) THEN WRITE(msgBuf,'(2A)') '** WARNING ** EXF_CHECK: ', & 'wind-stress position irrelevant' CALL PRINT_MESSAGE( msgBuf, errorMessageUnit, & SQUEEZE_RIGHT, myThid ) ENDIF ENDIF #ifdef USE_NO_INTERP_RUNOFF WRITE(msgBuf,'(A)') & 'EXF_CHECK: USE_NO_INTERP_RUNOFF code has been removed;' CALL PRINT_ERROR( msgBuf, myThid ) WRITE(msgBuf,'(A,A)') & 'EXF_CHECK: use instead "runoff_interpMethod=0"', & ' in "data.exf" (EXF_NML_04)' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 #endif /* USE_NO_INTERP_RUNOFF */ #ifdef ALLOW_CLIMTEMP_RELAXATION WRITE(msgBuf,'(A,A)') 'EXF_CHECK: ', & 'ALLOW_CLIMTEMP_RELAXATION no longer supported. Use pkg/rbcs' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 #endif /* ALLOW_CLIMTEMP_RELAXATION */ #ifdef ALLOW_CLIMSALT_RELAXATION WRITE(msgBuf,'(A,A)') 'EXF_CHECK: ', & 'ALLOW_CLIMSALT_RELAXATION no longer supported. Use pkg/rbcs' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 #endif /* ALLOW_CLIMSALT_RELAXATION */ IF ( climsstTauRelax.NE.0. ) THEN #ifndef ALLOW_CLIMSST_RELAXATION WRITE(msgBuf,'(A)') 'EXF_CHECK: climsstTauRelax > 0' CALL PRINT_ERROR( msgBuf, myThid ) WRITE(msgBuf,'(A)') & 'EXF_CHECK: but ALLOW_CLIMSST_RELAXATION is not defined' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 #endif /* ndef ALLOW_CLIMSST_RELAXATION */ IF ( climsstfile.EQ.' ' ) THEN WRITE(msgBuf,'(A)') 'EXF_CHECK: climsstTauRelax > 0 but' CALL PRINT_ERROR( msgBuf, myThid ) WRITE(msgBuf,'(A)') 'EXF_CHECK: climsstfile is not set' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIf ENDIf IF ( climsssTauRelax.NE.0. ) THEN #ifndef ALLOW_CLIMSSS_RELAXATION WRITE(msgBuf,'(A)') 'EXF_CHECK: climsssTauRelax > 0' CALL PRINT_ERROR( msgBuf, myThid ) WRITE(msgBuf,'(A)') & 'EXF_CHECK: but ALLOW_CLIMSSS_RELAXATION is not defined' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 #endif /* ALLOW_CLIMSSS_RELAXATION */ IF ( climsssfile.EQ.' ' ) THEN WRITE(msgBuf,'(A)') 'EXF_CHECK: climsssTauRelax > 0 but' CALL PRINT_ERROR( msgBuf, myThid ) WRITE(msgBuf,'(A)') 'EXF_CHECK: climsssfile is not set' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF ENDIF C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| IF ( errCount.GE.1 ) THEN WRITE(msgBuf,'(A,I3,A)') & 'EXF_CHECK: detected', errCount,' fatal error(s)' CALL PRINT_ERROR( msgBuf, myThid ) CALL ALL_PROC_DIE( 0 ) STOP 'ABNORMAL END: S/R EXF_CHECK' ENDIF _END_MASTER(myThid) RETURN END
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| CBOP C !ROUTINE: EXF_CHECK_INTERP C !INTERFACE: SUBROUTINE EXF_CHECK_INTERP( I loc_name, loc_file, loc_interpMethod, I loc_nlat, loc_nlon, loc_lon_inc, U errCount, I myThid ) C !DESCRIPTION: \bv C *==========================================================* C | S/R EXF_CHECK_INTERP C | o Check parameters for one of the pkg/exf variable C *==========================================================* C \ev C !USES: IMPLICIT NONE C == Global variables === #include "EEPARAMS.h" #include "EXF_INTERP_SIZE.h" #include "EXF_PARAM.h" C !INPUT/OUTPUT PARAMETERS: C fldName :: field short name (to print mesg) C fldFile :: file-name for this field C loc_interpMethod :: select interpolation method C loc_nlat :: size in y direction of original input grid C loc_nlon :: size in x direction of original input grid C fld_lon_inc :: scalar x-grid increment C errCount :: error counter C myThid :: my Thread Id number CHARACTER*(*) loc_name CHARACTER*(*) loc_file INTEGER loc_interpMethod INTEGER loc_nlat INTEGER loc_nlon _RL loc_lon_inc INTEGER errCount INTEGER myThid C !LOCAL VARIABLES: C msgBuf :: Informational/error message buffer CHARACTER*(MAX_LEN_MBUF) msgBuf CEOP IF ( loc_interpMethod.GE.1 .AND. loc_file.NE.' ' ) THEN IF ( loc_nlat .GT. (MAX_LAT_INC+1) ) THEN WRITE(msgBuf,'(3A)') 'EXF_CHECK_INTERP: ',loc_name, & '_nlat > (MAX_LAT_INC+1)' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF #ifndef EXF_INTERP_USE_DYNALLOC C- Check buffer size: IF ( loc_nlon.GT.exf_max_nLon ) THEN WRITE(msgBuf,'(3A)') 'EXF_CHECK_INTERP: ',loc_name, & '_nlon > exf_max_nLon' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF IF ( loc_nlat.GT.exf_max_nLat ) THEN WRITE(msgBuf,'(3A)') 'EXF_CHECK_INTERP: ',loc_name, & '_nlat > exf_max_nLat' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF IF ( (loc_nlon+4)*(loc_nlat+4).GT.exf_interp_bufferSize ) THEN WRITE(msgBuf,'(6A)') 'EXF_CHECK_INTERP: ', & 'exf_interp_bufferSize too small for ', & loc_name, '_nlon & ', loc_name, '_nlat' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF #endif /* ndef EXF_INTERP_USE_DYNALLOC */ IF ( loc_lon_inc.GT.500. ) THEN WRITE(msgBuf,'(4A,1PE16.8)') 'EXF_CHECK_INTERP: ', & 'Invalid value for: ',loc_name,'_lon_inc =', loc_lon_inc CALL PRINT_ERROR( msgBuf, myThid ) WRITE(msgBuf,'(4A)') 'EXF_CHECK_INTERP: Fix it ', & 'or Turn off ',loc_name,'-interp (interpMethod=0)' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF ENDIF RETURN END