【问题标题】:How to use this subroutine in fortran [duplicate]如何在fortran中使用此子例程[重复]
【发布时间】:2021-04-23 12:25:09
【问题描述】:

我在这个链接上找到了这个子程序: 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

【问题讨论】:

    标签: fortran fortran90


    【解决方案1】:

    错误信息非常准确:您需要一个显式接口,因为虚拟参数array(:) 是一个假定的形状参数。

    关于显式接口的详细解答可以在here找到。


    长话短说:最简单的解决方案是在程序的包含部分中包含子例程 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
    

    【讨论】:

    • 在回答有关显式接口的问题时请小心。我们得到很多这样的问题,通常使用重复系统比重复和分割知识库更有用。
    • 错误信息非常准确,但它并没有抱怨假定的形状(注意该参数不是延迟形状)参数。这是一个问题,没错,但消息指的是关键字的使用。
    • 我从您的 cmets 中找到了解决方案。你评论我这个anwser,所以我可以解决它。但我想拆分这段代码。因此,我搜索解决方案并最终找到。解决方案是“使用模块” 非常感谢!
    • @francescalus 我会在下一个问题中记住这一点。 (我还编辑了延迟形状 -> 假定形状)
    • @francescalus 如果我删除我的答案真的有帮助吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多