使用ifort 16

时间:2017-11-03 12:49:20

标签: multidimensional-array fortran intel-fortran

我在ifort 16中发生了索引重新映射的问题,但是在ifort 14或gfortran中没有出现(下面列出了确切的版本号)。问题出现在以下测试程序中:

program remap_problem

  implicit none

  type :: tp
    real, dimension(:,:,:), allocatable :: trg_in
  end type tp

  real, dimension(:,:,:), allocatable, target :: trg_out

  type(tp), target :: instance
  real, dimension(:,:), pointer :: ptr

  allocate(instance%trg_in(3,4,5))
  allocate(trg_out(3,4,5))

  ptr(0:2,0:3) => instance%trg_in(:,:,2)
  ptr(0:2,0:3) => trg_out(:,:,2)

end program remap_problem

Fortran中有一条规则,如果目标是连续的或排名第一,您只能重新定义索引(使用0:2,0:3完成)。在此示例中,目标子数组是连续的,因为最后一个索引是Fortran中最慢的。

使用ifort 14或gfortran,它会正常编译。 但ifort 16抱怨派生类型中的目标数组不连续,我得到以下错误:

error #8527: If a bound remapping list is specified, data target must be simply contiguous or of rank one.   [TRG_IN]

但是,trg_out. So不会发生错误,不知何故,ifort 16不会将instance%trg_in(:,:,2)识别为连续的,因为它在派生类型中。我尝试在此处添加关键字contiguous并将allocatable替换为pointer,但似乎没有任何效果。

解决方法是:

  ptr(0:2,-4:3) => instance%trg_in

将所需元素放在正确的索引上,但这很脏。是否有正确的方法来解决此问题,或者我是否必须等待编译器更新。

我的iforts和gfortran的版本是:

ifort(IFORT)14.0.2 20140120
ifort(IFORT)16.0.0 20150815
GNU Fortran(Debian 4.9.2-10)4.9.2

0 个答案:

没有答案