No worries. I had a bit of fun this afternoon with this work around for sqrt(NaN).
module safe_sqrt_mod
use, intrinsic :: iso_fortran_env, only: real32, real64
use, intrinsic :: ieee_arithmetic
implicit none
private
public :: safe_sqrt ! Cannot name this SQRT i.e. over ride the INTRINSIC since
interface safe_sqrt ! the functions below end up being called resursively.
module procedure safe_sqrtS, safe_sqrtD
module procedure safe_sqrtC, safe_sqrtZ
end interface safe_sqrt
contains
!---------------- Real, single precision ----------------
elemental pure function safe_sqrtS(x) result(y)
real(real32), intent(in) :: x
real(real32) :: y
if (ieee_is_nan(x)) then
y = x
else
y = sqrt(x)
end if
end function safe_sqrtS
!---------------- Real, double precision ----------------
elemental pure function safe_sqrtD(x) result(y)
real(real64), intent(in) :: x
real(real64) :: y
if (ieee_is_nan(x)) then
y = x
else
y = sqrt(x)
end if
end function safe_sqrtD
!---------------- Complex, single precision ----------------
elemental pure function safe_sqrtC(z) result(w)
complex(real32), intent(in) :: z
complex(real32) :: w
real(real32) :: zr, zi
zr = real(z)
zi = aimag(z)
if (ieee_is_nan(zr) .or. ieee_is_nan(zi)) then
w = z
else
w = sqrt(z)
end if
end function safe_sqrtC
!---------------- Complex, double precision ----------------
elemental pure function safe_sqrtZ(z) result(w)
complex(real64), intent(in) :: z
complex(real64) :: w
real(real64) :: zr, zi
zr = real(z)
zi = aimag(z)
if (ieee_is_nan(zr) .or. ieee_is_nan(zi)) then
w = z
else
w = sqrt(z)
end if
end function safe_sqrtZ
end module safe_sqrt_mod
program p
use, intrinsic :: iso_fortran_env, only : real64, real32
use, intrinsic :: ieee_arithmetic
use safe_sqrt_mod
real(real32) :: r1, r2
real(real64) :: r3, r4
complex(real32) :: z1, z2
complex(real64) :: z3, z4
r1 = 1.0 ; r2 = safe_sqrt(r1) ; print*, r1,r2
r1 = ieee_value(1.0_real32, ieee_quiet_nan) ; r2 = safe_sqrt(r1) ; print*, r1,r2
r3 = 1.0 ; r4 = safe_sqrt(r3) ; print*, r3,r4
r3 = ieee_value(1.0_real64, ieee_quiet_nan) ; r4 = safe_sqrt(r3) ; print*, r3,r4
z1 = ieee_value(1.0_real32, ieee_quiet_nan) ; z2 = safe_sqrt(z1) ; print*, z1,z2
z3 = ieee_value(1.0_real64, ieee_quiet_nan) ; z4 = safe_sqrt(z3) ; print*, z3,z4
z4 = sqrt(z3) ; print*, z3,z4 ! This is the problem we are trying to avoid
end program p