我想为周期性边界编写数据,这意味着需要在i
和j
方向的末尾写入第零个索引。此外,还需要编写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
答案 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]