Fortran阵列拼接初始化

时间:2017-01-31 20:30:50

标签: arrays fortran

我试图在fortran中初始化一个0到1之间等间距的数组。 我的代码是:

program test
  double precision :: h
  double precision, dimension(:), allocatable :: x

  h = 1./11
  if(.not. allocated(x)) allocate(x(10))

  x(1:10) = [h:(1-h):h] (*)
end program

我给出的错误是"允许的最高数据类型等级是INTEGER(KIND = 8)"在盯着看。 我试图用

改变它
x(1:10) = h:(1-h):h
x = h:(1-h):h
x(1:10) = (/(h:(1-h):h)/)

以及各种其他形式没有运气。

2 个答案:

答案 0 :(得分:2)

您使用的语法无效Fortran,隐含的DO循环不具有非整数边界。你想要这样的东西:

x = h * real([(i,i=1,size(x))],kind(h))

有关更多信息,请查看"数组构造函数"在标准或教科书中。

不要在左侧使用(1:10) - 请参阅https://software.intel.com/en-us/blogs/2008/03/31/doctor-it-hurts-when-i-do-this

答案 1 :(得分:0)

此表达式

[h:(1-h):h]
从Fortran的角度来看,

是破碎的。它看起来有点像数组切片,但这需要整数,而不是实数,而()而不是[]。它看起来有点像数组构造函数,[]是正确的,但h:(1-h):h不是。

试试这个

x = REAL([(ix,ix=1,10)],real64)/11

(已将ix声明为整数)。表达式(ix,ix=1,10)隐含的do-loop ,并且在[]内部生成一个数组,其中包含从1到{{1}的整数}}。我相信其余的是显而易见的。

顺便说一下,由于我建议的替换的lhs是整个10,你实际上并不需要明确地分配它,Fortran会自动为你做这件事。这是整个数组部分之间的差异之一,例如x和整个数组x(1:10)

如果这不能产生你想要的结果,请告诉我们。