在Fortran

时间:2019-03-20 22:07:41

标签: interface fortran

我正在为Fortran中的显式接口苦苦挣扎。

在一个实例中,当我尝试使用假定形状的数组作为函数或子例程(即过程)的伪参数时,编译器请求我编写一个显式接口:Explicit interface required for ... assumed-shape argument。例如,它在子例程中看起来像REAL, INTENT(IN OUT) :: dummy_array(:)。数组声明中的(:)意味着编译器负责将有关数组形状的信息传递给子例程。这很方便,但这也意味着编译器必须知道在编译调用或对该过程的引用时要执行此操作。仅从CALL(或引用)来看,这是不明显的,因此编译器必须具有有关过程的伪参数的信息,因此需要显式接口。

据我了解,有三种方法可以在Fortran中实现显式接口:

  1. 使用MODULE的{​​{1}}程序。这往往是推荐的方法。
  2. 将过程 internal 设置为调用它的对象。这就像在主程序的CONTAINS语句之前放置CONTAINS语句。然后,我的过程的整个代码将放在这两个语句之间。
  3. 为该过程编写一个END。我想大多数人都默认使用此方法,但是它往往是最少推荐的方法,因为这可能会比较费力。

这使我想到了当前的问题:在另一个实例中,编译器给出了INTERFACE。以下是上述方法1的相关部分:

Explicit interface required for ... allocatable argument

问题似乎出在伪数组MODULE My_Module CONTAINS SUBROUTINE Clean(my_array_sizes, my_arrays, my_arrays_clean) USE Shared, ONLY : dp IMPLICIT NONE ... REAL(dp), INTENT(OUT), ALLOCATABLE, ASYNCHRONOUS :: my_arrays_clean(:) ... ALLOCATE(my_arrays_clean(non_zero)) !new array of correct size my_arrays_clean = temp(1:non_zero) !transfer values END SUBROUTINE Clean END MODULE My_Module 上。这是电话:

my_arrays_clean

CALL Clean(my_array_size, probability, probability_clean) !remove empty values from array 的声明:

probability_clean

在我尝试使用 REAL(dp), DIMENSION(:), ALLOCATABLE, ASYNCHRONOUS :: probability, probability_clean !store Photon(E_i, depth) values gfortran -g -std=f2008 -Wall -Wextra -O2 -fall-intrinsics -fopenmp进行编译之前,一切似乎都很好。我不知道怎么了当然,我可以解决这个问题来完成我需要的工作,但是我真的很想了解执行此操作的正确方法。

1 个答案:

答案 0 :(得分:1)

当我们谈论一个显式(或隐式)接口时,我们不是在谈论过程本身的属性。一个过程具有一个接口,但这不是完全相同的概念。如下所示,获取模块和子例程。

module mod
contains
  subroutine sub
  end subroutine
end module

子例程sub有一个接口,包括这样的信息,因为它是一个名为sub的子例程,没有伪参数。问题中感兴趣的子例程具有其自己的对应接口。

“显式接口”代替的是,在引用过程时,已知有关过程接口的哪些信息。看

call sub
end

并与

进行比较
use mod, only : sub
call sub
end

在第一种情况下,在不使用模块mod的情况下,编译器甚至无法将sub视为模块内的子例程。 sub是带有隐式接口(而不是模块中的接口)的外部过程。在第二个中,sub use related

编译器现在不仅可以看到模块子例程,还可以看到接口(现在是 explicit )。

同样,内部过程(使用contains语句的项目2)在其宿主中始终具有显式接口

  call sub
contains
  subroutine sub
  end subroutine
end program

第三,带有接口块:

subroutine sub
end subroutine

  interface
    subroutine sub
    end subroutine
  end interface

  call sub
end program

总结:可访问模块过程始终具有可用的显式接口,但是必须首先使用use语句使它们可访问。内部过程始终可以在主机中访问,始终使用显式接口。接口块提供了一个显式接口,但同样,接口块本身必须位于过程引用所在的位置。