如何在Fortran中定义更改维度对象?

时间:2013-01-01 16:14:44

标签: arrays fortran

我想定义一个块数组,每个块将包含一个不同大小的节点数组。所以我写了一个类似下面的程序,但它不起作用。我想知道我怎么能在FORTRAN做到这一点?还有其他更好的方法吗?基本的困难是使它们可分配!

program Mesh
    implicit none
    integer::i

    type node
      double precision::x,y
    end type node

    type block
        integer::NX,NY
        integer::ENB,WNB,SNB,NNB      
        integer::BlockType            
        type(node),dimension(:,:),allocatable::nodes
    end type block

    type(block),dimension(:),allocatable::blocks !Error:Syntax Error in Data Declaration

    allocate(blocks(1:9)) ! here using 9 just to simplify it,error: allocate-object is not               a nonprocedure pointer or allocatable object

    do i=1,sizeof(blocks)
        blocks(i)%NX=i*2  !Here I want to read in some value, but just use i*2 to simplify
        blocks(i)%NY=i*2  !Here I want to read in some value, but just use i*2 to simplify
        allocate(blocks(i)%nodes(0:NX,0:NY)) !error: not allocatable object either
    end do

end program

1 个答案:

答案 0 :(得分:1)

正如High Performance Mark指出的那样,修复编译器建议的语法将处理大多数其他错误消息。您的编译器可能会禁止的另一个地方就是这一行:

allocate(blocks(i)%nodes(0:NX,0:NY))

其中NXNY在块type之外未知。请将此行更改为:

allocate(blocks(i)%nodes(0:blocks(i)%NX,0:blocks(i)%NY))

另外,我相信您打算使用:

do i=1,size(blocks)

而不是:

do i=1,sizeof(blocks)

sizeof是一个非标准函数,以字节为单位返回对象的大小。 size是一个标准内在函数,它返回数组中元素的数量。在此上下文中使用sizeof可能会导致循环中的分段错误或未定义的行为。