如何在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