【问题标题】:non-contiguous data and temporary array creation非连续数据和临时数组创建
【发布时间】:2019-10-23 18:41:00
【问题描述】:

Fortran runtime warning: temporary array 回答了类似的问题。但是,就我而言,这些解决方案对我的帮助并不大。 在子例程中,我有一个子例程调用:

subroutine initialize_prim(prim)

 real(kind=wp), dimension(2, -4:204), intent(out) :: prim

call double_gaussian(prim(1, :))

end subroutine initialize_prim
subroutine double_gaussian(y)

    real(kind=wp), dimension(-4:204), intent(out) :: y

    integer :: i

    do i = -4, 204
      y(i) = 0.5 * ( &
         exp(-((r(i) - r0))**2) + exp(-((r(i) + r0)/std_dev)**2))
    end do

  end subroutine double_gaussian

这给出了一条错误消息,指出 fortran 为“double_gaussian”中的“y”创建了一个临时数组。阅读了一些关于连续数组的内容后,我明白为什么会出现这个错误。 现在,看看我的整个程序,将数组的顺序反转为“prim”是非常乏味的,因此这种解决方案实际上是不可能的。 为了在“double_gaussian”中创建假定形状,我尝试过这样做,


    real(kind=wp), dimension(:), intent(out) :: y

    integer :: i

    do i = -4, 204
      y(i) = 0.5 * ( &
         exp(-((r(i) - r0))**2) + exp(-((r(i) + r0)/std_dev)**2))
    end do

  end subroutine double_gaussian

但是,这会导致 fortran 崩溃并显示错误消息 “数组 'y' 的维度 1 的索引 '-4' 低于 1 的下限”。 似乎对于假定的形状格式,索引仍然假定从 1 开始,而在我的情况下它从 -4 开始。 有没有办法解决这个问题?

【问题讨论】:

  • 可以显示关于非连续数组的实际“错误消息”吗?能否提供一个自包含的可编译代码?
  • 假定的形状从您声明的任何地方开始。 y(-4:) 将从 -4 开始。

标签: arrays fortran fortran90 method-call


【解决方案1】:

我认为您可能将编译器警告误解为错误。通常编译器在创建临时数组时会发出警告——这对高性能编程很有帮助。但我不确定编译器是否会将其视为错误。是的,我理解为什么你可能不想为了避免这种情况而重新排序你的数组

至于崩溃 - 您发现 Fortran 例程不会自动知道您仔细设置为 1 以外的数组的下限(也不知道它们的上限)。如果有必要,您必须传递参数列表中的界限(通常只有下限,例程可以自己计算出上限)。

但是,它很少是必要的,而且它似乎不在您的代码中 - 设置 y 数组的每个值的循环可以(如果我理解正确的话)替换为

y = 0.5 * (exp(-((r - r0))**2) + exp(-((r + r0)/std_dev)**2))

PS 我认为你的这部分问题,关于不尊重非 1 数组下限的例程,几乎可以肯定是其他几个问题的重复,但我无法立即找到。

【讨论】:

    猜你喜欢
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多