Fortran 运行时警告:临时数组

Fortran runtime warning: temporary array

我在 运行 我的代码(使用 gfortran 编译)时收到 Fortran 运行时警告 "An array temporary was created",我想知道是否有更好的方法来解决此警告。

我原来的代码是这样的:

allocate(flx_est(lsign,3))
allocate(flx_err(lsign,3))
do i=1,lsign
call combflx_calc(flx_est(i,:),flx_err(i,:))
enddo

在子例程中,我这样定义变量:

subroutine combflx_calc(flx_est,flx_err)
use,intrinsic              :: ISO_Fortran_env, only: real64
implicit none
real(real64),intent(inout) :: flx_est(3),flx_err(3)

flux_estflx_err 向量可能会在子程序内部发生变化,具体取决于几种情况,我需要相应地更新它们的值。

Fortran 似乎不喜欢这种结构。我可以通过定义临时变量来解决它:

tmp_flx_est=flx_est(i,:)
tmp_flx_err=flx_err(i,:)
call combflx_calc(tmp_flx_est,tmp_flx_err)
flx_est(i,:)=tmp_flx_est
flx_err(i,:)=tmp_flx_err

但在我看来,这是一种很愚蠢的修复方法。

如您所见,我不是 Fortran 专家,因此非常欢迎任何帮助。

一种方法是传递一个假定的形状数组

real(real64),intent(inout) :: flx_est(:),flx_err(:)

另一种是交换数组的维度,这样就可以传递二维数组的连续部分。

call combflx_calc(flx_est(:,i),flx_err(:,i))

问题是您的过程 (var(n)) 的显式大小虚拟参数需要连续的数组。假设的形状阵列可以有一些跨度。

正在创建您的临时数组,因为您将跨步数组传递给您的子例程。 Fortran 数组是主要列,因此最左边的索引在数组中变化最快,或者更好地说,最左边的索引在内存中是连续的,右边的每个变量跨过左边的变量。

当你打电话时

call combflx_calc(flx_est(i,:),flx_err(i,:))

这些切片是 3 向量的数组,跨度为 lsign 的长度。该子例程需要内存中连续的单个维度的变量,而您传递给它的变量不是。因此,必须为要操作的子例程创建一个临时文件,然后将其复制回您的数组切片中。

您的 "fix" 不会改变这一点,它只是不再警告临时变量,因为您使用的是显式创建的变量,而不是运行时为您做的。

Vladimir 的回答为您提供了避免临时问题的选项,因此我不会在这里重复它们。