【问题标题】:Fortran implied do loop: append arrayFortran 隐含的 do 循环:追加数组
【发布时间】:2017-09-15 14:24:39
【问题描述】:

我想为周期性边界写入数据,这意味着需要在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

【问题讨论】:

  • (n-i,m-j)?我不知道我是否正确理解了你的问题。
  • @VladimirF 添加了一些细节。也许我可能忽略了一些事情。有什么不清楚的可以问我。

标签: fortran


【解决方案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。这是我关于如何使用隐式执行循环的想法。

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

为了可读性,我使用续行将内部循环与外部循环分开。

【讨论】:

    【解决方案2】:

    可能是这样的(未经测试)

    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 个索引的疯狂。

    【讨论】:

      【解决方案3】:

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

      program main
          implicit none
          integer, parameter :: m = 3, n = 3
          integer rho( m, n ), i, j
      
          rho(1,:) = [1,2,3]
          rho(2,:) = [4,5,6]
          rho(3,:) = [7,8,9]
      
          do i = -2,m+3
              print "(*(i2))", ( rho( pbc(i,m), pbc(j,n) ), j = -2,n+3 )
          enddo
      
      contains
          integer function pbc( k, P )
              integer :: k, P
              pbc = modulo( k, P )
              if ( pbc == 0 ) pbc = P
          endfunction
      end
      
      $ gfortran -fcheck=all test.f90
      
       1 2 3 1 2 3 1 2 3
       4 5 6 4 5 6 4 5 6
       7 8 9 7 8 9 7 8 9
       1 2 3 1 2 3 1 2 3
       4 5 6 4 5 6 4 5 6
       7 8 9 7 8 9 7 8 9
       1 2 3 1 2 3 1 2 3
       4 5 6 4 5 6 4 5 6
       7 8 9 7 8 9 7 8 9
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-26
        • 1970-01-01
        • 1970-01-01
        • 2013-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多