在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开始。 有办法解决这个问题吗?
答案 0 :(得分:1)
我认为您可能将编译器警告误解为错误。通常,编译器在创建临时数组时会发出警告-这对高性能编程非常有用。但是我不确定编译器是否会将其视为错误。是的,我知道为什么您可能不想为了避免这种情况而重新排列数组
关于崩溃-您发现Fortran例程无法自动了解您已仔细设置为1
以外的数组的下限(也没有上限)。如果有必要,您必须在参数列表中传递界限(通常只有下界,例程可以自己确定上限)。
但是,它几乎没有必要,并且似乎不在您的代码中-设置y
数组的每个值的循环(如果我理解正确的话)可以替换为
y = 0.5 * (exp(-((r - r0))**2) + exp(-((r + r0)/std_dev)**2))
PS,我认为您的问题的这一部分是关于例程不遵守非1数组下限的例程,几乎可以肯定是其他几个询问行踪的重复,但是我无法立即找到。