在fortran中具有未知等级(形状)的子程序参数

时间:2013-05-28 08:08:13

标签: fortran rank

我想知道如何在Fortran中最好地处理一个带有未知等级参数的子程序。例如:

Real * 8 :: array1(2,2),array2(2,2,3)

call mysubroutine(array1)
call mysubroutine(array2)

至于现在,我总是需要修改子程序中的形状(等级数)。

例如,内在子程序 random_number array )可以做到。 (但也许它不是用Fortran编写的?)

2 个答案:

答案 0 :(得分:5)

您必须为每个阵列等级编写特定的子例程,但是您创建了一个通用接口,以便您可以对所有等级使用通用调用,而不必确定要调用的特定调用。 how to write wrapper for 'allocate'

有示例代码

答案 1 :(得分:5)

如果您需要按元素填充数组并且这些操作彼此独立,您可以考虑使用suggestion of M. S. B.的替代方法来使用elemental函数。在这种情况下,您为标量(一个元素)编写函数,它将自动应用于数组的所有元素,而不管数组的形状如何。但是,标量函数必须满足elemental例程中的条件,基本上意味着不允许产生任何副作用,这会使结果取决于它应用于各个数组元素的顺序。

在演示之下,它将数组的每个元素乘以2:

module testmod
  implicit none

  integer, parameter :: dp = kind(1.0d0)

contains

  elemental subroutine mul2(scalar)
    real(dp), intent(inout) :: scalar

    scalar = scalar * 2.0_dp

  end subroutine mul2

end module testmod


program test
  use testmod
  implicit none

  real(dp) :: a1(5), a2(3,2)

  a1 = 1.0_dp
  a2 = 2.0_dp
  call mul2(a1)
  call mul2(a2)
  print *, a1
  print *, a2

end program test