【发布时间】:2018-03-18 16:50:00
【问题描述】:
我可以像在 python 中那样在 Fortan 90 或 95 中将数组“A”的最后一个元素写为 A(-1) 吗?如果不是,除了使用最后一个索引 A(N) 写入最后一个元素之外,还有什么方法可以写入最后一个元素,其中 N 是最后一个索引值。
【问题讨论】:
-
虽然 A(-1) 不起作用,但我想我们可以使用 modulo 制作(模拟)一个周期性数组。例如,如果
A被声明为A(0:N-1)(即从0 开始),则A(modulo(i, N))对任何i都具有周期性(甚至是负数)。如果B被声明为B(1:N)(即从 1 开始),我们需要将索引移一所以B(modulo(i-1, N) + 1)(希望这是正确的......) -
我认为这行不通,假设我必须找到
real :: u(0:N)do i=0,N∇u = (u(i-1)-2*u(i)+u(i+1))/h**2end do现在在i=0,我需要u(i-1)=u(N)作为周期性边界,它是不可能将u(-1)作为 fortran 中的最后一个元素,即使有些如何使用模数得到 -1。 -
modulo(i,N) 将 i 转换为 [0,N-1] 范围内,所以我上面写的就是对索引使用这样的转换函数(不管它是什么)。但是对于有限差分计算等,我认为更好(更有效)的方法是单独处理边界,以便使用此类索引函数没有开销(并使内存访问更直接)。另一方面,如果周期性数组的访问不是瓶颈(例如,大型对象的容器),我想索引函数可能会有用。
-
来自 OP 对答案的评论:我问这个问题是因为我想将它用于周期性边界条件所以这是一个 XY 问题的示例 (meta.stackexchange.com/questions/66377/what-is-the-xy-problem) .如果 OP 想知道如何在 Fortran 中实现周期性边界条件,这是一个不同的、更有趣的问题。
-
@roygvib,是的,这就是我正在做的分别处理边界并对它们应用周期性边界条件的方法。我正在使用
Nmod(i,N)的 mod 功能。当i达到N它给我零(i 的初始值)。我只需要分别处理 i=0 处的边界。