Fortran:任意维度的数组?

时间:2015-08-12 20:29:19

标签: arrays multidimensional-array fortran

如果我想创建一个可分配的多维数组,我可以说:

program test
    real, dimension(:,:), allocatable :: x
    integer :: i,j

    allocate(x(5, 5))

    do i = 1,size(x,1)
        do j = 1,size(x,2)
            x(i,j) = i*j
        end do
    end do

    write(*,*) x

end program test

然而,如果我不知道将会有多少维x,该怎么办?有办法适应吗?

2 个答案:

答案 0 :(得分:3)

较新的编译器允许使用假定等级对象来实现互操作性。 我认为这就是你要找的东西。但这是为了调用函数或子例程。函数或子例程将伪参数声明为假定等级,实际等级在运行时与实际参数一起传递。

来自IBM网站的示例:

REAL :: a0
REAL :: a1(10)
REAL :: a2(10, 20)
REAL, POINTER :: a3(:,:,:)

CALL sub1(a0)
CALL sub1(a1)
CALL sub1(a2)
CALL sub1(a3)

CONTAINS
    SUBROUTINE sub1(a)
        REAL :: a(..)
        PRINT *, RANK(a)
    END

END

关注thisthat了解详情

答案 1 :(得分:1)

在我看来,你试图在排名为-1,-2或-3的数组中进行模板计算 - 这与需要任意排名的数组并不完全相同。并且假定排名数组实际上仅在将数组参数传递给例程时才适用,即使在即将出现的标准中也没有机制来声明数组在运行时确定排名。

如果您不耐烦地继续使用您的代码并且您的编译器尚未实施TS 29113:2012,那么以下方法可能会吸引您。

   real, dimension(:,:,:), allocatable :: voltage_field

   if (nd == 1) allocate(voltage_field(nx,1,1))
   if (nd == 2) allocate(voltage_field(nx,ny,1))       
   if (nd == 3) allocate(voltage_field(nx,ny,nz))

您目前的方法面临的问题是,在了解字段中的维度数量之前,不知道在模板中要考虑的最近邻居数量,因此您可能会发现自己编写了每个模板更新的3个版本。如果您只是滥用大小为nx*1*1的rank-3数组来表示1D问题( mutatis mutandis 2D问题),则在每个模板计算中始终有3组最近邻居。只是在扁平的尺寸中,最近的邻居,或者是包含边界值的鬼影单元,或者如果你的空间包裹圆形,则是单元本身。

编写代码总是在3个维度上工作,但是我认为,对于至少其中两个代码的范围不做任何假设将比编写对秩敏感的代码更容易。但是我没有考虑过这个问题,而且我对它对你的f-d方案的影响并没有太多考虑。