anyscalar_to_real(3f) - [M_anything] convert integer or real parameter of any kind to real
(LICENSE:MIT)
pure elemental function anyscalar_to_real(valuein) result(r_out)
class(*),intent(in) :: valuein
real :: r_out
This function uses polymorphism to allow input arguments of different types.
It is used to create other procedures that can take
many scalar arguments as input options.
VALUEIN input argument of a procedure to convert to type REAL.
May be of KIND kind=int8, kind=int16, kind=int32, kind=int64,
kind=real32, kind=real64, or kind=real128.
R_OUT The value of VALUIN converted to real (assuming it is actually
in the range of type REAL).
Sample program
program demo_anyscalar_to_real
use, intrinsic :: iso_fortran_env, only : int8, int16, int32, int64
use, intrinsic :: iso_fortran_env, only : real32, real64, real128
implicit none
! call same function with many scalar input types
write(*,*)squarei(2_int8)
write(*,*)squarei(2_int16)
write(*,*)squarei(2_int32)
write(*,*)squarei(2_int64)
write(*,*)squarei(2.0_real32)
write(*,*)squarei(2.0_real64)
write(*,*)squarei(2.0_real128)
contains
function squarei(invalue) result (dvalue)
use M_anything, only : anyscalar_to_real
class(*),intent(in) :: invalue
real :: invalue_local
real :: dvalue
invalue_local=anyscalar_to_real(invalue)
dvalue=invalue_local*invalue_local
end function squarei
end program demo_anyscalar_to_real
John S. Urban
MIT
if(valuein > big)then write(stderr,)’anyscalar_to_real value too large ‘,valuein endif if(valuein > big)then write(stderr,)’anyscalar_to_real value too large ‘,valuein endif
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(*), | intent(in) | :: | valuein |
pure elemental function anyscalar_to_real(valuein) result(r_out) ! ident_5="@(#) M_anything anyscalar_to_real(3f) convert integer or real parameter of any kind to real" class(*),intent(in) :: valuein real :: r_out real,parameter :: big=huge(0.0) select type(valuein) type is (integer(kind=int8)); r_out=real(valuein) type is (integer(kind=int16)); r_out=real(valuein) type is (integer(kind=int32)); r_out=real(valuein) type is (integer(kind=int64)); r_out=real(valuein) type is (real(kind=real32)); r_out=real(valuein) type is (real(kind=real64)) !!if(valuein > big)then !! write(stderr,*)'*anyscalar_to_real* value too large ',valuein !!endif r_out=real(valuein) #ifdef HAS_REAL128 type is (real(kind=real128)) !!if(valuein > big)then !! write(stderr,*)'*anyscalar_to_real* value too large ',valuein !!endif r_out=real(valuein) #endif type is (logical); r_out=merge(0.0d0,1.0d0,valuein) type is (character(len=*)); read(valuein,*) r_out end select end function anyscalar_to_real