Apologies. Click below for a full example of the workaround I had in mind:
Click here
module eye_mod
implicit none
integer, parameter :: sp = kind(1.0e0)
integer, parameter :: dp = kind(1.0d0)
interface eye
module procedure eye_default
module procedure eye_sp
module procedure eye_dp
end interface
contains
function eye_default(n) result(res)
integer, intent(in) :: n
real(sp) :: res(n,n)
integer :: k
res = 0
do k = 1, n
res(k,k) = 1
end do
end function
function eye_sp(n,i) result(res)
integer, intent(in) :: n
real(sp), intent(in) :: i
real(kind(i)) :: res(n,n)
integer :: k
res = 0
do k = 1, n
res(k,k) = 1
end do
end function
function eye_dp(n,i) result(res)
integer, intent(in) :: n
real(dp), intent(in) :: i
real(kind(i)) :: res(n,n)
integer :: k
res = 0
do k = 1, n
res(k,k) = 1
end do
end function
end module
The main program would look something like:
program test_eye
use eye_mod, only: eye, wp => dp
implicit none
! Dummy variable used to select precision
real(wp), parameter :: dum_wp = 1.0_wp
integer, parameter :: n = 3
real(wp) :: I(n,n)
integer :: k
I = eye(n,dum_wp)
do k = 1, n
print *, I(k,:)
end do
end program