【问题标题】:Fortran last element of the array [duplicate]Fortran数组的最后一个元素[重复]
【发布时间】: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**2 end 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,是的,这就是我正在做的分别处理边界并对它们应用周期性边界条件的方法。我正在使用 N mod(i,N) 的 mod 功能。当i 达到N 它给我零(i 的初始值)。我只需要分别处理 i=0 处的边界。

标签: arrays fortran


【解决方案1】:

不,你可能不会。您将写入一个可能是另一个变量或其他重要信息的内存位置,而您无法知道结果。

如果没有N,可以使用size()函数。

A(size(A)) = ......

编辑:当声明了自定义数组边界时,Fortran 还具有 Lbound() 和 Ubound() 函数。使用 Ubound() 始终返回数组的上限,而 size() 将适用于以索引 1 开头的 Fortran 标准数组。但是,Lbound() 和 Ubound 会返回数组,除非添加了维度参数。对于一维数组,只有第 1 维,因此它始终可以访问一维数组中的最后一个元素。

A(Ubound(A,1)) = ......

【讨论】:

  • 可能比这复杂一点。考虑一个数组声明,例如 integer :: a(-5,5),其中 (i) a(-1) 指的是第 5 个元素,并且 (ii) size(a)-1 返回 10。值得了解uboundlbound
  • 对我投反对票。这不仅不考虑具有自定义边界的声明,而且它基于 0 索引数组,这不是 fortran 的默认值。
  • 感谢 cmets。已编辑了更完整的答案。请注意,问题标记为 Fortran90,这些功能适用于 95 及更高版本。
  • 谢谢,我之所以问这个问题是因为我想像在 python 中那样将它用于周期性边界条件:- [i][(i-1)%I], [i][(i+1)%I]
  • 这里,(i-1)%I 给我 -1 表示 i=0 并且 A(-1) 是 python 中的最后一个元素,但现在我很清楚我不能在 fortran 中这样做.
猜你喜欢
  • 2021-03-14
  • 1970-01-01
  • 2012-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-27
  • 2017-04-08
相关资源
最近更新 更多