范围和处理具有许多输入的子程序

时间:2018-06-04 18:26:41

标签: fortran subroutine

我的一些fortran子程序传递了大量的输入,有时甚至是30或40.其原因有两个,首先,这些子程序有许多明确直接相关的子程序,需要将这些变量作为输入,第二,避免定义全局变量,并且解决方案似乎是每次都明确地将每个变量传递给子例程。

这对我来说似乎是不可接受的,但我真的没有解决方案,我不是百分之百确定这是一个问题,也许这是用这种语言做事的正确方法

我的问题是:这是一个问题吗?如果是,是否有更好的方法来管理这种语言的范围,而不必引入对象?

1 个答案:

答案 0 :(得分:4)

我可以看到设计师为什么要避免全局变量。我必须处理采用相反方法的代码,几乎没有参数,并且在各种模块中一切都处于全局状态,并且它很糟糕,无论它们在only中使用use子句多少}陈述。

我们可以有把握地说,这一论点(比如30)太大了。所有代码风格指南都可能与此一致。使用LAPACK所需的许多参数库通常有点不愉快,而且这一点远远不及30。

Fortran 90和更新版本有几种方法可以减少参数的数量。

首先,您可以将逻辑相关的变量耦合到派生类型

type particle
  integer :: species
  real    :: mass
  real    :: x, y, z
  real    :: vx, vy, vz
  ...
end type

其次,通过使用假定的形状数组,您可以避免传递数组维度。这允许现代LAPACK接口具有明显更少的参数,例如(Netlib和MKL接口)。

subroutine sub(A, NX, NY, NZ)
  integer :: NZ, NY, NZ
  real :: A(NX, NY, NZ)

VS

subroutine sub(A)
  real :: A(:,:,:)

此更改需要显式的过程接口,因此在实践中必须将过程移动到模块中。

这些变化都是相当重大的变化,需要对大型遗留代码进行大量重构。