如何在fortran中使用这个子程序
How to use this subroutine in fortran
我在 link 上找到了这个子程序:
generate a sequence array in fortran
我想用这个子程序做我的作业。
但是我不能用,不知道为什么没有播放
错误代码如下
Error: Keyword argument requires explicit interface for procedure 'linspace' at (1)
SUBROUTINE linspace(from, to, array)
REAL(8), intent(in) :: from, to
REAL(8), intent(out) :: array(:)
REAL(8) :: range
integer :: n, i
n = size(array)
range = to - from
IF (n == 0) return
IF (n == 1) then
array(1) = from
return
END IF
DO i=2, n
array(i) = from + range * (i - 1) / (n - 1)
END DO
END SUBROUTINE linspace
PROGRAM decay
IMPLICIT NONE
REAL :: k, c0, dt
REAL, DIMENSION(15) :: c_e, c_i
REAL(8) :: t(5)
k = 0.0001
c0 = 100
dt = 60*60
c_e(1) = 100
c_i(1) = 100
call linspace(from=0.0, to=3600.0, array=t)
print *, t
STOP
END PROGRAM decay
错误消息非常准确:您需要一个显式接口,因为虚拟参数array(:)
是一个假定的形状参数。
可以找到关于显式接口的详细答案here。
长话短说:最简单的解决方案是在程序的 conntains 部分包含子例程 linspace。
PROGRAM decay
IMPLICIT NONE
REAL :: k, c0, dt
REAL, DIMENSION(15) :: c_e, c_i
REAL(8) :: t(5)
k = 0.0001
c0 = 100
dt = 60*60
c_e(1) = 100
c_i(1) = 100
call linspace(from=0.0, to=3600.0, array=t)
print *, t
contains
SUBROUTINE linspace(from, to, array)
REAL(8), intent(in) :: from, to
REAL(8), intent(out) :: array(:)
REAL(8) :: range
integer :: n, i
n = size(array)
range = to - from
IF (n == 0) return
IF (n == 1) then
array(1) = from
return
END IF
DO i=2, n
array(i) = from + range * (i - 1) / (n - 1)
END DO
END SUBROUTINE linspace
END PROGRAM decay
我在 link 上找到了这个子程序: generate a sequence array in fortran
我想用这个子程序做我的作业。 但是我不能用,不知道为什么没有播放
错误代码如下
Error: Keyword argument requires explicit interface for procedure 'linspace' at (1)
SUBROUTINE linspace(from, to, array)
REAL(8), intent(in) :: from, to
REAL(8), intent(out) :: array(:)
REAL(8) :: range
integer :: n, i
n = size(array)
range = to - from
IF (n == 0) return
IF (n == 1) then
array(1) = from
return
END IF
DO i=2, n
array(i) = from + range * (i - 1) / (n - 1)
END DO
END SUBROUTINE linspace
PROGRAM decay
IMPLICIT NONE
REAL :: k, c0, dt
REAL, DIMENSION(15) :: c_e, c_i
REAL(8) :: t(5)
k = 0.0001
c0 = 100
dt = 60*60
c_e(1) = 100
c_i(1) = 100
call linspace(from=0.0, to=3600.0, array=t)
print *, t
STOP
END PROGRAM decay
错误消息非常准确:您需要一个显式接口,因为虚拟参数array(:)
是一个假定的形状参数。
可以找到关于显式接口的详细答案here。
长话短说:最简单的解决方案是在程序的 conntains 部分包含子例程 linspace。
PROGRAM decay
IMPLICIT NONE
REAL :: k, c0, dt
REAL, DIMENSION(15) :: c_e, c_i
REAL(8) :: t(5)
k = 0.0001
c0 = 100
dt = 60*60
c_e(1) = 100
c_i(1) = 100
call linspace(from=0.0, to=3600.0, array=t)
print *, t
contains
SUBROUTINE linspace(from, to, array)
REAL(8), intent(in) :: from, to
REAL(8), intent(out) :: array(:)
REAL(8) :: range
integer :: n, i
n = size(array)
range = to - from
IF (n == 0) return
IF (n == 1) then
array(1) = from
return
END IF
DO i=2, n
array(i) = from + range * (i - 1) / (n - 1)
END DO
END SUBROUTINE linspace
END PROGRAM decay