C $Header: /u/gcmpack/MITgcm/pkg/exf/exf_check_range.F,v 1.33 2017/01/27 17:01:04 jmc Exp $
C $Name: $
#include "EXF_OPTIONS.h"
SUBROUTINE EXF_CHECK_RANGE( myTime, myIter, myThid )
C ==================================================================
C SUBROUTINE EXF_CHECK_RANGE
C ==================================================================
IMPLICIT NONE
C == global variables ==
#include "EEPARAMS.h"
#include "SIZE.h"
#include "GRID.h"
#include "EXF_PARAM.h"
c#include "EXF_CONSTANTS.h"
#include "EXF_FIELDS.h"
C == routine arguments ==
C myThid - thread number for this instance of the routine.
_RL myTime
INTEGER myIter, myThid
C == local variables ==
INTEGER i, j, bi, bj
INTEGER exferr
C == end of interface ==
exferr = 0
C-- Only master thread can safely write directly to standard output:
_BARRIER
_BEGIN_MASTER( myThid )
c DO bj = myByLo(myThid), myByHi(myThid)
c DO bi = myBxLo(myThid), myBxHi(myThid)
DO bj = 1, nSy
DO bi = 1, nSx
C Change checking range because some atmospheric fields will
C not always have valid values in the tile edges.
c DO j = 1-OLy, sNy+OLy
c DO i = 1-OLx, sNx+OLx
DO j = 1, sNy
DO i = 1, sNx
C Heat flux.
IF ( ( hflux(i,j,bi,bj) .GT. 1600. .OR.
& hflux(i,j,bi,bj) .LT. -500. ) .AND.
& maskC(i,j,1,bi,bj) .NE. 0. ) THEN
WRITE(standardMessageUnit,'(A,5(1X,I6),2X,D22.15)')
& 'EXF WARNING: hflux out of range for bi,bj,i,j,it= ',
& bi, bj, i, j, myIter, hflux(i,j,bi,bj)
exferr = 1
ENDIF
C Freshwater flux.
IF ( ABS(sflux(i,j,bi,bj)) .GT. 1.E-6 .AND.
& maskC(i,j,1,bi,bj) .NE. 0. ) THEN
WRITE(standardMessageUnit,'(A,5(1X,I6),2X,D22.15)')
& 'EXF WARNING: sflux out of range for bi,bj,i,j,it= ',
& bi, bj, i, j, myIter, sflux(i,j,bi,bj)
exferr = 1
ENDIF
C Zonal wind stress.
IF ( ABS(ustress(i,j,bi,bj)) .GT. 2.7 .AND.
& maskW(i,j,1,bi,bj) .NE. 0. ) THEN
WRITE(standardMessageUnit,'(A,5(1X,I6),2X,D22.15)')
& 'EXF WARNING: ustress out of range for bi,bj,i,j,it= ',
& bi, bj, i, j, myIter, ustress(i,j,bi,bj)
exferr = 1
ENDIF
C Meridional wind stress.
IF ( ABS(vstress(i,j,bi,bj)) .GT. 2.3 .AND.
& maskS(i,j,1,bi,bj) .NE. 0. ) THEN
WRITE(standardMessageUnit,'(A,5(1X,I6),2X,D22.15)')
& 'EXF WARNING: vstress out of range for bi,bj,i,j,it= ',
& bi, bj, i, j, myIter, vstress(i,j,bi,bj)
exferr = 1
ENDIF
IF ( useAtmWind ) THEN
C zonal wind speed
IF ( ABS(uwind(i,j,bi,bj)) .GT. 100. .AND.
& maskW(i,j,1,bi,bj) .NE. 0. ) THEN
WRITE(standardMessageUnit,'(A,5(1X,I6),2X,D22.15)')
& 'EXF WARNING: uwind out of range for bi,bj,i,j,it= ',
& bi, bj, i, j, myIter, uwind(i,j,bi,bj)
exferr = 1
ENDIF
C zonal wind speed
IF ( ABS(vwind(i,j,bi,bj)) .GT. 100. .AND.
& maskS(i,j,1,bi,bj) .NE. 0. ) THEN
WRITE(standardMessageUnit,'(A,5(1X,I6),2X,D22.15)')
& 'EXF WARNING: vwind out of range for bi,bj,i,j,it= ',
& bi, bj, i, j, myIter, vwind(i,j,bi,bj)
exferr = 1
ENDIF
ENDIF
C wind speed modulus
IF ( ( wspeed(i,j,bi,bj) .LT. 0. .OR.
& wspeed(i,j,bi,bj) .GT. 100. ) .AND.
& maskS(i,j,1,bi,bj) .NE. 0. ) THEN
WRITE(standardMessageUnit,'(A,5(1X,I6),2X,D22.15)')
& 'EXF WARNING: wspeed out of range for bi,bj,i,j,it= ',
& bi, bj, i, j, myIter, wspeed(i,j,bi,bj)
exferr = 1
ENDIF
#ifdef ALLOW_ATM_TEMP
C 2-m air temperature
IF ( (atemp(i,j,bi,bj) .LT. 183 .OR.
& atemp(i,j,bi,bj) .GT. 343 ) .AND.
& maskC(i,j,1,bi,bj) .NE. 0. ) THEN
WRITE(standardMessageUnit,'(2A,5(1X,I6),2X,D22.15)')
& 'EXF WARNING: atemp + exf_offset_atemp ',
& 'out of range for bi,bj,i,j,it= ',
& bi, bj, i, j, myIter, atemp(i,j,bi,bj)
exferr = 1
ENDIF
C 2-m specific humidity
IF ( (aqh(i,j,bi,bj) .LT. 0. .OR.
& aqh(i,j,bi,bj) .GT. 0.1 ) .AND.
& maskC(i,j,1,bi,bj) .NE. 0. ) THEN
WRITE(standardMessageUnit,'(A,5(1X,I6),2X,D22.15)')
& 'EXF WARNING: aqh out of range for bi,bj,i,j,it= ',
& bi, bj, i, j, myIter, aqh(i,j,bi,bj)
exferr = 1
ENDIF
C precipitation rate
IF ( (precip(i,j,bi,bj) .LT. 0. .OR.
& precip(i,j,bi,bj) .GT. 2.E-6 ) .AND.
& maskC(i,j,1,bi,bj) .NE. 0. ) THEN
WRITE(standardMessageUnit,'(A,5(1X,I6),2X,D22.15)')
& 'EXF WARNING: precip out of range for bi,bj,i,j,it= ',
& bi, bj, i, j, myIter, precip(i,j,bi,bj)
exferr = 1
ENDIF
C snow
IF ( (snowprecip(i,j,bi,bj) .LT. 0. .OR.
& snowprecip(i,j,bi,bj) .GT. 2.E-6 ) .AND.
& maskC(i,j,1,bi,bj) .NE. 0. ) THEN
WRITE(standardMessageUnit,'(2A,5(1X,I6),2X,D22.15)')
& 'EXF WARNING: snowprecip out of range ',
& 'for bi,bj,i,j,it= ',
& bi, bj, i, j, myIter, snowprecip(i,j,bi,bj)
exferr = 1
ENDIF
#endif
#ifdef SHORTWAVE_HEATING
C Short wave radiative flux.
IF ( (swflux(i,j,bi,bj) .GT. 1. .OR.
& swflux(i,j,bi,bj) .LT. -1000. ) .AND.
& maskC(i,j,1,bi,bj) .NE. 0. ) THEN
WRITE(standardMessageUnit,'(A,5(1X,I6),2X,D22.15)')
& 'EXF WARNING: swflux out of range for bi,bj,i,j,it= ',
& bi, bj, i, j, myIter, swflux(i,j,bi,bj)
exferr = 1
ENDIF
#endif
#ifdef ALLOW_RUNOFF
C Runoff.
IF ( (runoff(i,j,bi,bj) .LT. 0. .OR.
& runoff(i,j,bi,bj) .GT. 1.E-6 ) .AND.
& maskC(i,j,1,bi,bj) .NE. 0. ) THEN
WRITE(standardMessageUnit,'(A,5(1X,I6),2X,D22.15)')
& 'EXF WARNING: runoff out of range for bi,bj,i,j,it= ',
& bi, bj, i, j, myIter, runoff(i,j,bi,bj)
WRITE(standardMessageUnit,'(A)')
& 'Please note that input units for runoff are'
WRITE(standardMessageUnit,'(A)')
& 'm/s not m/yr. If input file is in m/yr, set'
WRITE(standardMessageUnit,'(A)')
& 'exf_inscal_runoff=3.170979198E-8'
WRITE(standardMessageUnit,'(A)')
& 'in the data.exf input file.'
exferr = 1
ENDIF
# ifdef ALLOW_RUNOFTEMP
C Runoff temperature.
IF ( (runoftemp(i,j,bi,bj) .LT. -2. .OR.
& runoff(i,j,bi,bj) .GT. 36 ) .AND.
& maskC(i,j,1,bi,bj) .NE. 0. ) THEN
WRITE(standardMessageUnit,'(A,5(1X,I6),2X,D22.15)')
& 'EXF WARNING: runoftemp out of range at bi,bj,i,j,it= ',
& bi, bj, i, j, myIter, runoff(i,j,bi,bj)
exferr = 1
ENDIF
# endif /* ALLOW_RUNOFTEMP */
#endif /* ALLOW_RUNOFF */
ENDDO
ENDDO
ENDDO
ENDDO
IF ( exferr .NE. 0 ) THEN
WRITE(standardMessageUnit,'(A)')
& 'EXF WARNING: If you think these values are OK '
WRITE(standardMessageUnit,'(A)')
& 'EXF WARNING: then set useExfCheckRange=.FALSE.'
STOP 'ABNORMAL END: S/R EXF_CHECK_RANGE'
ENDIF
_END_MASTER( myThid )
RETURN
END