11module assert
2+ ! Gfortran >= 6 needed for ieee_arithmetic: ieee_is_nan
23
34 use , intrinsic :: iso_c_binding, only: sp= >c_float, dp= >c_double
45 use , intrinsic :: iso_fortran_env, only: stderr= >error_unit
5- use , intrinsic :: ieee_arithmetic
6+ use , intrinsic :: ieee_arithmetic, only: ieee_is_finite, ieee_is_nan
7+ use error, only: errorstop
68 implicit none
79 private
8-
10+
911 integer ,parameter :: wp = sp
1012
11- public :: wp,isclose, assert_isclose, err
12-
13+ public :: wp,isclose, assert_isclose, errorstop
14+
1315contains
1416
1517elemental logical function isclose(actual, desired, rtol, atol, equal_nan)
@@ -29,7 +31,7 @@ elemental logical function isclose(actual, desired, rtol, atol, equal_nan)
2931 real (wp), intent (in ) :: actual, desired
3032 real (wp), intent (in ), optional :: rtol, atol
3133 logical , intent (in ), optional :: equal_nan
32-
34+
3335 real (wp) :: r,a
3436 logical :: n
3537 ! this is appropriate INSTEAD OF merge(), since non present values aren't defined.
@@ -41,12 +43,12 @@ elemental logical function isclose(actual, desired, rtol, atol, equal_nan)
4143 if (present (equal_nan)) n = equal_nan
4244
4345 ! print*,r,a,n,actual,desired
44-
46+
4547!- -- sanity check
46- if ((r < 0._wp ).or. (a < 0._wp )) error stop ' tolerances must be non-negative '
47- !- -- simplest case
48- isclose = (actual == desired)
49- if (isclose) return
48+ if ((r < 0._wp ).or. (a < 0._wp )) call errorstop
49+ !- -- simplest case -- too unlikely, especially for arrays?
50+ ! isclose = (actual == desired)
51+ ! if (isclose) return
5052!- -- equal nan
5153 isclose = n.and. (ieee_is_nan(actual).and. ieee_is_nan(desired))
5254 if (isclose) return
@@ -59,6 +61,8 @@ end function isclose
5961
6062
6163impure elemental subroutine assert_isclose(actual, desired, rtol, atol, equal_nan, err_msg)
64+ ! NOTE: with Fortran 2018 this can be Pure
65+ !
6266! inputs
6367! ------
6468! actual: value "measured"
@@ -77,15 +81,10 @@ impure elemental subroutine assert_isclose(actual, desired, rtol, atol, equal_na
7781
7882 if (.not. isclose(actual,desired,rtol,atol,equal_nan)) then
7983 write (stderr,* ) merge (err_msg,' ' ,present (err_msg)),' : actual' ,actual,' desired' ,desired
80- error stop
84+ call errorstop
8185 endif
8286
8387end subroutine assert_isclose
8488
85-
86- pure subroutine err (msg )
87- character , intent (in ) :: msg
88- error stop msg
89- end subroutine err
90-
9189end module assert
90+
0 commit comments