Fortran暗示做循环:追加数组

时间:2017-09-15 14:24:39

标签: fortran

我想为周期性边界编写数据,这意味着需要在ij方向的末尾写入第零个索引。此外,还需要编写rho(m+1,n+1)=rho(0,0)。用于写入数据的当前代码是:

do j=0,n
write(2,"(F16.8)")(rho(i,j),i=0,m)
end do

如何以我上面提到的方式编写数据?类似于以下内容

  j ...
i 1 2 3
. 4 5 6
. 7 8 9

  1 2 3 1
  4 5 6 4
  7 8 9 7
  1 2 3 1

3 个答案:

答案 0 :(得分:1)

隐含的do循环必须在数组声明中的括号中:

! These are the same
[  (i, i=1, 3) ]
(/ (i, i=1, 3) /)

如果你有一个多维的,你必须包装它们

[ ( [ (i*j, i=1, 3) ], j = 1, 3 ) ]
!   ^^^^^^^^^^^^^^^^^

对于你的周期,我只需使用mod(idx, len)来回到最后一个0。以下是关于如何使用隐式do循环来实现它的想法。

program periodic_boundary
    implicit none
    integer :: d(0:2, 0:2), i, j

    d = reshape( [(i, i=1, 9)], [3, 3] )

    print '(4I4)',                                 &
        [ (                                        &
            [ (d(mod(i, 3), mod(j, 3)), i=0, 3) ]  &
        , j=0, 3) ]

end program periodic_boundary

为了便于阅读,我使用连续线来分隔内圈和外圈。

答案 1 :(得分:0)

也许是这样的(未经测试的)

integer, dimension(4,4) :: arr1
...
arr1(1:3,1:3) = transpose(reshape([(i,i=1,9)],[3,3]))
arr1(:,4) = arr1(:,1)
arr1(4,:) = arr1(1,:)

但放弃了思考Fortran中第0个指数的疯狂。

答案 2 :(得分:0)

如果计算速度无关紧要,则使用周期性边界条件包装索引可能是另一种选择。 (至于modulo(),请参阅此page,其中[0,P-1]为正面和正面参数。通过将返回值0更改为P,它始终将结果映射到{{ 1}}。)

[1,P]