MODULE utility
  IMPLICIT NONE
  PUBLIC :: is_nan, is_inf!. checkfield, checkelem
CONTAINS

  FUNCTION is_nan(x,str) RESULT(isn)
    USE basic,            ONLY: cstep
    USE time_integration, ONLY: updatetlevel
    USE prec_const,       ONLY: xp, stdout
    IMPLICIT NONE

    real, INTENT(IN) :: x
    CHARACTER(LEN=*), INTENT(IN) :: str
    LOGICAL :: isn

    isn=.FALSE.
    IF(x .NE. x) THEN
       isn=.TRUE.
    END IF
    IF((isn).AND.(str.NE.'')) THEN
       WRITE(*,'(a20,a25,i6.6,a20,i1)') str,' = NaN  at timestep',cstep, ' and substep',updatetlevel
       CALL FLUSH(stdout)
    END IF
  END FUNCTION is_nan


  FUNCTION is_inf(x,str) RESULT(isi)
    USE prec_const,       ONLY: xp, stdout
    IMPLICIT NONE

    real, INTENT(IN) :: x
    CHARACTER(LEN=*), INTENT(IN) :: str
    LOGICAL :: isi

    isi=.FALSE.
    IF(x+1.0== x) THEN
       isi=.TRUE.
    END IF
    IF((isi).AND.(str.NE.'')) THEN
       !WRITE(*,'(a20,a25,i6.6,a20,i1)') str,' = Inf at timestep',cstep, ' and substep',updatetlevel
       CALL FLUSH(stdout)
    END IF

  END FUNCTION is_inf

  ! FUNCTION checkfield(n1,n2,n3,field,str) RESULT(mlend)
  !   use prec_const, ONLY: xp
  !   IMPLICIT NONE
  !   !! BUG found (or feature?)
  !   ! if one put the commented first line (commented) instead of the second one,
  !   ! no error will be risen by the compiler even if the rank of the array is not matching (should be 3D!)
  !   ! COMPLEX(xp), DIMENSION(ikys:ikye,ikxs:ikxe), INTENT(IN) :: field
  !   INTEGER, INTENT(in) :: n1,n2,n3
  !   COMPLEX(xp), DIMENSION(n1,n2,n3), INTENT(IN) :: field
  !   CHARACTER(LEN=*), INTENT(IN) :: str
  !   LOGICAL :: mlend
  !   COMPLEX(xp) :: sumfield

  !   sumfield=SUM(field)

  !   mlend= is_nan( REAL(sumfield),str).OR.is_inf( REAL(sumfield),str) &
  !     .OR. is_nan(AIMAG(sumfield),str).OR.is_inf(AIMAG(sumfield),str)
  ! END FUNCTION checkfield

  ! FUNCTION checkelem(elem,str) RESULT(mlend)
  !   use prec_const, ONLY: xp
  !   IMPLICIT NONE
  !   COMPLEX(xp), INTENT(IN) :: elem
  !   CHARACTER(LEN=*), INTENT(IN) :: str
  !   LOGICAL :: mlend

  !   mlend= is_nan( REAL(elem),str).OR.is_inf( REAL(elem),str) &
  !     .OR. is_nan(AIMAG(elem),str).OR.is_inf(AIMAG(elem),str)
  ! END FUNCTION checkelem
END MODULE utility