非连续数据和临时数组创建

时间:2019-06-08 16:26:06

标签: arrays fortran fortran90 method-call

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开始。 有办法解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

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

关于崩溃-您发现Fortran例程无法自动了解您已仔细设置为1以外的数组的下限(也没有上限)。如果有必要,您必须在参数列表中传递界限(通常只有下界,例程可以自己确定上限)。

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

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

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