anyscalar_to_real Function

public pure elemental function anyscalar_to_real(valuein) result(r_out)

NAME

anyscalar_to_real(3f) - [M_anything] convert integer or real parameter of any kind to real
(LICENSE:MIT)

SYNOPSIS

pure elemental function anyscalar_to_real(valuein) result(r_out)

 class(*),intent(in)  :: valuein
 real                 :: r_out

DESCRIPTION

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.

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.

RESULTS

R_OUT    The value of VALUIN converted to real (assuming it is actually
         in the range of type REAL).

EXAMPLE

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

AUTHOR

John S. Urban

LICENSE

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

Arguments

Type IntentOptional Attributes Name
class(*), intent(in) :: valuein

Return Value real


Source Code

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