Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran FORALL导致堆栈溢出_Fortran - Fatal编程技术网

Fortran FORALL导致堆栈溢出

Fortran FORALL导致堆栈溢出,fortran,Fortran,我正在实施一种遗传算法,根据实验数据对ODE系统中的一些系数进行数值估计。我只是在学习Fortran,同时实现算法。我的配置是一个运行在Windows 7/Visual Studio 2013上的英特尔Fortran 2015,运行在旧的i7处理器上 在众多代码行中,我有以下代码: DO i = 1, N_CROMOSOMES IF (population(9,i) < 0.0_DOUBLE) population(9, i) = square_error(population(1

我正在实施一种遗传算法,根据实验数据对ODE系统中的一些系数进行数值估计。我只是在学习Fortran,同时实现算法。我的配置是一个运行在Windows 7/Visual Studio 2013上的英特尔Fortran 2015,运行在旧的i7处理器上

在众多代码行中,我有以下代码:

DO i = 1, N_CROMOSOMES
    IF (population(9,i) < 0.0_DOUBLE) population(9, i) = square_error(population(1:8, i))
END DO
N_CROMOSOMES是函数的一个整数参数,它定义数组填充的大小,而数组填充的大小又是REALKIND=DOUBLE类型的9 x N_CROMOSOMES数组。对于这个数组中的每一列,它的前8个元素表示我正在估计的8个系数,第9个元素是与系数的特定8次猜测相关联的误差。平方误差是决定它的函数


在程序的这一点上,我将刚刚创建或修改的列标记为错误-1。因此,IF population9,i N_CROMOSOMES的典型值是什么?那里面应该有一个H吗?你可能想显示平方误差的代码。顺便说一句,您可以随意定义double,但如果您还有使用双精度的遗留代码(可能相当于kind=8),则可能会导致混淆。如果forall触发堆栈溢出,我怀疑会创建大型临时数组,尽管我不太明白重写代码会如何将其推到边缘-除非重写还修改了数组大小,甚至将所有64位实数更改为128位。如果编译器已经实现了,我建议您将forall替换为do concurrent。这是Fortran 2008的一个特性,有时被称为“一切都做对了”。我并不是说它会解决问题,它更多的是在你的代码上进行实验。大声地问:你在最近的重写中,为了追求更高的数值精度,是否将double的定义从8改为16?如果您这样做了,您的平台将在软件中实现128位浮点运算,这将大大降低代码的速度,而硬件并没有提供。是吗?阿根特:由于没有更好的名字,我只是临时称它为DOUBLE,当时我不知道它的名字,谢谢你的提示。这个平方误差函数非常复杂。
INTEGER, PARAMETER :: DOUBLE = 16