繁体   English   中英

Fortran:任意维度的数组?

[英]Fortran: Array of arbitrary dimension?

如果要创建可分配的多维数组,可以说:

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会是多少,该怎么办。 有办法解决吗?

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

来自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

跟随这个那个更多细节

在我看来,您正在尝试对等级为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的等级3数组来表示一维问题( 比照就是2D问题),则每个模版计算中总会有3组最近的邻居。 只是,在展平的尺寸中,最接近的邻居是包含边界值的重影单元,或者是空间环绕的单元本身。

我认为,编写代码始终可以在3个维度上工作,但我不对其中至少两个维度的范围做任何假设,这比编写对等级敏感的代码要容易得多。 但是我对此事未作过多考虑,也没有对它对您的fd计划的影响考虑太多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM