C $Header: /u/gcmpack/MITgcm/pkg/exf/exf_check.F,v 1.22 2014/01/06 14:52:38 mlosch Exp $
C $Name:  $

#include "EXF_OPTIONS.h"

      SUBROUTINE EXF_CHECK( myThid )

c     ==================================================================
c     SUBROUTINE EXF_CHECK
c     ==================================================================
c
      IMPLICIT NONE

c     == global variables ==

#include "EEPARAMS.h"
#include "SIZE.h"
#include "PARAMS.h"

#include "EXF_PARAM.h"
#include "EXF_CONSTANTS.h"
c     == routine arguments ==

c     myThid - thread number for this instance of the routine.

      INTEGER myThid

c     == local variables ==

C     msgBuf   :: Informational/error message buffer
      CHARACTER*(MAX_LEN_MBUF) msgBuf

c     == end of interface ==

c     check for consistency
      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 )
       STOP 'ABNORMAL END: S/R EXF_CHECK'
      ENDIF

      IF (repeatPeriod.lt.0.) THEN
       WRITE(msgBuf,'(A)') 
     &      'S/R EXF_CHECK: repeatPeriod must be positive'
       CALL PRINT_ERROR( msgBuf, myThid )
       STOP 'ABNORMAL END: S/R EXF_CHECK'
      ENDIF

      IF (useExfYearlyFields.and.repeatPeriod.ne.0.) THEN
       WRITE(msgBuf,'(A,A)') 'S/R EXF_CHECK: The use of ',
     $      'useExfYearlyFields AND repeatPeriod is not implemented'
       CALL PRINT_ERROR( msgBuf, myThid )
       STOP 'ABNORMAL END: S/R EXF_CHECK'
      ENDIF

#ifdef ALLOW_BULKFORMULAE
      IF ( useAtmWind ) THEN
      IF ( ustressfile .NE. ' ' .OR. vstressfile .NE. ' ' ) THEN
        WRITE(msgBuf,'(A)')
     &   'S/R EXF_CHECK: use u,v_wind components but not wind-stress'
        CALL PRINT_ERROR( msgBuf, myThid )
        STOP 'ABNORMAL END: S/R EXF_CHECK'
      ENDIF
      ENDIF
#endif

      IF ( .NOT.useAtmWind ) THEN
       IF ( uwindfile .NE. ' ' .OR. vwindfile .NE. ' ' ) THEN
        WRITE(msgBuf,'(A)')
     & 'S/R EXF_CHECK: read-in wind-stress but not u,v_wind components'
        CALL PRINT_ERROR( msgBuf, myThid )
        STOP 'ABNORMAL END: S/R EXF_CHECK'
       ENDIF
      ENDIF

#ifndef ALLOW_ZENITHANGLE
      IF ( useExfZenAlbedo .OR. useExfZenIncoming .OR.
     &     select_ZenAlbedo .NE. 0 ) THEN
        WRITE(msgBuf,'(A,A)') 'S/R EXF_CHECK: unsupported option',
     &        ' when ALLOW_ZENITHANGLE is not defined'
        CALL PRINT_ERROR( msgBuf, myThid )
        STOP 'ABNORMAL END: S/R EXF_CHECK'
      ENDIF
#endif

#ifdef ALLOW_ZENITHANGLE
      IF ( usingCartesianGrid .OR. usingCylindricalGrid ) THEN
       WRITE(msgBuf,'(A,A)') 'S/R EXF_CHECK: ALLOW_ZENITHANGLE does ',
     &      'not work for carthesian and cylindrical grids'
       CALL PRINT_ERROR( msgBuf, myThid )
       STOP 'ABNORMAL END: S/R EXF_CHECK'
      ENDIF
      IF ( select_ZenAlbedo.LT.0 .OR. select_ZenAlbedo.GT.3 ) THEN
       WRITE(msgBuf,'(A,A)') 'S/R EXF_CHECK: unsupported ',
     &      'select_ZenAlbedo choice'
       CALL PRINT_ERROR( msgBuf, myThid )
       STOP 'ABNORMAL END: S/R EXF_CHECK'
      ENDIF
      IF ( select_ZenAlbedo.EQ.2 .) THEN
       WRITE(msgBuf,'(A,A)') 
     &      'S/R EXF_CHECK: *** WARNING *** 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.GT.2 .AND. swdownperiod.GT. 21600 ) THEN
       WRITE(msgBuf,'(A,A)') 'S/R EXF_CHECK: using diurnal albedo ',
     &        'formula requires diurnal downward shortwave forcing'
       CALL PRINT_ERROR( msgBuf, myThid )
       STOP 'ABNORMAL END: S/R EXF_CHECK'
      ENDIF
      IF ( select_ZenAlbedo.GT.2 .AND. swdownperiod.GT. 3600 ) then
       WRITE(msgBuf,'(A,A,A)')
     &      'S/R EXF_CHECK: *** WARNING *** ',
     &      '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
#endif

#ifdef USE_EXF_INTERPOLATION
      IF ( climsstfile .NE. ' ' ) THEN
       IF ( climsst_nlat .GT. MAX_LAT_INC ) THEN
        WRITE(msgBuf,'(A)') 'S/R EXF_CHECK: climsst_nlat > MAX_LAT_INC'
        CALL PRINT_ERROR( msgBuf, myThid )
        STOP 'ABNORMAL END: S/R EXF_CHECK'
       ENDIF
      ENDIF
      IF ( climsssfile .NE. ' ' ) THEN
       IF ( climsss_nlat .GT. MAX_LAT_INC ) THEN
        WRITE(msgBuf,'(A)') 'S/R EXF_CHECK: climsss_nlat > MAX_LAT_INC'
        CALL PRINT_ERROR( msgBuf, myThid )
        STOP 'ABNORMAL END: S/R EXF_CHECK'
       ENDIF
      ENDIF
      IF ( usingCartesianGrid ) THEN
       WRITE(msgBuf,'(A,A)') 'S/R EXF_CHECK: ',
     &      'USE_EXF_INTERPOLATION assumes latitude/longitude'
       CALL PRINT_ERROR( msgBuf, myThid )
       WRITE(msgBuf,'(A,A)') 'S/R EXF_CHECK: ',
     &      'input and output coordinates. Trivial to extend to'
       CALL PRINT_ERROR( msgBuf, myThid )
       WRITE(msgBuf,'(A,A)') 'S/R EXF_CHECK: ',
     &      'cartesian coordinates, but has not yet been done.'
       CALL PRINT_ERROR( msgBuf, myThid )
       STOP 'ABNORMAL END: S/R EXF_CHECK'
      ENDIF
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)') 
     &        'S/R EXF_CHECK: interp. needs 2 components (wind)'
         CALL PRINT_ERROR( msgBuf, myThid )
         STOP 'ABNORMAL END: S/R EXF_CHECK'
        ENDIF
        IF ( uwindstartdate .NE. vwindstartdate .OR.
     &       uwindperiod    .NE. vwindperiod   ) THEN
         WRITE(msgBuf,'(A,A)') 'S/R EXF_CHECK: ',
     &        'For CurvilinearGrid/RotatedGrid, the u and v wind '
         CALL PRINT_ERROR( msgBuf, myThid )
         WRITE(msgBuf,'(A,A,A)') 'S/R EXF_CHECK: ',
     &        'files have to have the same startdate and period, ',
     &        'because S/R EXF_SET_UV assumes that.'
         CALL PRINT_ERROR( msgBuf, myThid )
         STOP 'ABNORMAL END: S/R EXF_CHECK'
        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)') 
     &       'S/R EXF_CHECK: readStressOnCgrid=.TRUE. ',
     &       'and interp wind-stress (=A-grid) are not compatible'
        CALL PRINT_ERROR( msgBuf, myThid )
        STOP 'ABNORMAL END: S/R EXF_CHECK'
       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)') 
     &        'S/R EXF_CHECK: interp. needs 2 components (wind-stress)'
         CALL PRINT_ERROR( msgBuf, myThid )
         STOP 'ABNORMAL END: S/R EXF_CHECK'
        ENDIF
        IF ( ustressstartdate .NE. vstressstartdate .OR.
     &       ustressperiod    .NE. vstressperiod   ) THEN
         WRITE(msgBuf,'(A,A)') 'S/R EXF_CHECK: ',
     &    'For CurvilinearGrid/RotatedGrid, the u and v wind stress '
         CALL PRINT_ERROR( msgBuf, myThid )
         WRITE(msgBuf,'(A,A,A)') 'S/R EXF_CHECK: ',
     &        'files have to have the same startdate and period, ',
     &        'because S/R EXF_SET_UV assumes that.'
         CALL PRINT_ERROR( msgBuf, myThid )
         STOP 'ABNORMAL END: S/R EXF_CHECK'
        ENDIF
       ENDIF
      ENDIF

      IF ( (ustress_interpMethod.EQ.0 .AND. ustressfile.NE.' ') .OR.
     &     (vstress_interpMethod.EQ.0 .AND. vstressfile.NE.' ') ) THEN
#else /* ifndef 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)')
     & 'S/R EXF_CHECK: Select 1 wind-stress position: A or C-grid'
        CALL PRINT_ERROR( msgBuf, myThid )
        STOP 'ABNORMAL END: S/R EXF_CHECK'
       ENDIF
      ELSE
       IF ( readStressOnAgrid .OR. readStressOnCgrid ) THEN
        WRITE(msgBuf,'(A)')
     &       'S/R EXF_CHECK: wind-stress position irrelevant'
        CALL PRINT_ERROR( msgBuf, myThid )
        STOP 'ABNORMAL END: S/R EXF_CHECK'
       ENDIF
      ENDIF

#ifdef USE_NO_INTERP_RUNOFF
      WRITE(msgBuf,'(A)') 
     &     'S/R EXF_CHECK: USE_NO_INTERP_RUNOFF code has been removed;'
      CALL PRINT_ERROR( msgBuf, myThid )
      WRITE(msgBuf,'(A,A)') 
     &     'S/R EXF_CHECK: use instead "runoff_interpMethod=0"',
     &      ' in "data.exf" (EXF_NML_04)'
      CALL PRINT_ERROR( msgBuf, myThid )
      STOP 'ABNORMAL END: S/R EXF_CHECK'
#endif /* USE_NO_INTERP_RUNOFF */

#ifdef ALLOW_CLIMTEMP_RELAXATION
      WRITE(msgBuf,'(A,A)') 'S/R EXF_CHECK: ',
     &     'ALLOW_CLIMTEMP_RELAXATION no longer supported. Use pkg/rbcs'
      CALL PRINT_ERROR( msgBuf, myThid )
      STOP 'ABNORMAL END: S/R EXF_CHECK'
#endif

#ifdef ALLOW_CLIMSALT_RELAXATION
      WRITE(msgBuf,'(A,A)') 'S/R EXF_CHECK: ',
     &     'ALLOW_CLIMSALT_RELAXATION no longer supported. Use pkg/rbcs'
      CALL PRINT_ERROR( msgBuf, myThid )
      STOP 'ABNORMAL END: S/R EXF_CHECK'
#endif

      IF ( climsstTauRelax.NE.0. ) THEN
#ifndef ALLOW_CLIMSST_RELAXATION
       WRITE(msgBuf,'(A)') 'S/R EXF_CHECK: climsstTauRelax > 0'
       CALL PRINT_ERROR( msgBuf, myThid )
       WRITE(msgBuf,'(A)') 
     &      'S/R EXF_CHECK: but ALLOW_CLIMSST_RELAXATION is not defined'
       CALL PRINT_ERROR( msgBuf, myThid )
       STOP 'ABNORMAL END: S/R EXF_CHECK'
#endif
       IF ( climsstfile.EQ.' ' ) THEN
        WRITE(msgBuf,'(A)') 'S/R EXF_CHECK: climsstTauRelax > 0 but'
        CALL PRINT_ERROR( msgBuf, myThid )
        WRITE(msgBuf,'(A)') 'S/R EXF_CHECK: climsstfile is not set'
        CALL PRINT_ERROR( msgBuf, myThid )
        STOP 'ABNORMAL END: S/R EXF_CHECK'
       ENDIf
      ENDIf
      
      IF ( climsssTauRelax.NE.0. ) THEN
#ifndef ALLOW_CLIMSSS_RELAXATION
       WRITE(msgBuf,'(A)') 'S/R EXF_CHECK: climsssTauRelax > 0'
       CALL PRINT_ERROR( msgBuf, myThid )
       WRITE(msgBuf,'(A)') 
     &      'S/R EXF_CHECK: but ALLOW_CLIMSSS_RELAXATION is not defined'
       CALL PRINT_ERROR( msgBuf, myThid )
       STOP 'ABNORMAL END: S/R EXF_CHECK'
#endif
       IF ( climsssfile.EQ.' ' ) THEN
        WRITE(msgBuf,'(A)') 'S/R EXF_CHECK: climsssTauRelax > 0 but'
        CALL PRINT_ERROR( msgBuf, myThid )
        WRITE(msgBuf,'(A)') 'S/R EXF_CHECK: climsssfile is not set'
        CALL PRINT_ERROR( msgBuf, myThid )
        STOP 'ABNORMAL END: S/R EXF_CHECK'
       ENDIF
      ENDIF

      RETURN
      END