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_est
和 flx_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 的回答为您提供了避免临时问题的选项,因此我不会在这里重复它们。
我在 运行 我的代码(使用 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_est
和 flx_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 的回答为您提供了避免临时问题的选项,因此我不会在这里重复它们。