问题标签 [allocatable-array]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1127 浏览

python - 如何解决“Fortran 运行时错误:未格式化文件上的 I/O 超过记录结尾”?

现在我有一个 1024 * 1024 * 1024 数组,其 dtype 是float32. 首先,我将此数组以“.bigfile”的格式保存到一个文件中。然后我通过运行如下代码将此大文件转换为 Fortran 无格式文件。

接下来为了测试这个二进制文件,即“filename.dat”,我分别用 Python 和 Fortran95 读取了这个文件。Python 代码运行良好,代码片段如下所示。

但是,Fortran runtime error当我运行 Fortran 阅读代码时发生:

错误信息:

我不明白为什么会出现这些错误。

注意:整体操作在 LINUX 远程服务器中处理。



反复修改read语句后,发现 Fortran 代码运行良好 if ix<=632, iy<=632, iz<=632. 如果它们大于 632,runtime error就会出现。我应该如何纠正这个错误,以便dens可以读取所有 1024^3 元素?



补充

今天我acccess=streamopen语句中添加了一个子句,在,read(10) header之前read(10) dens

修改后Fortran代码readout00.f95读入1024*1024*1024数组,即dens成功。

为什么原始的“readout00.f95”无法读入dens

0 投票
0 回答
97 浏览

fortran - 解除分配导致程序停止而没有错误消息

我正在通过 Brian Hahn为科学家和工程师编写的 Fortran 90一书学习 Fortran。在第 9 章关于数组的第 131/132 页中,他给出了以下代码作为动态数组的示例

我已经使用英特尔 Visual Fortran 编译器在 Visual Studio Community 2019 中实现了这个程序。正如他解释的那样,这个程序的目的是

以下程序摘录展示了如何使用可分配数组(这些野兽被称为)来读取未知数量的数据,不幸的是,由于 READ 的工作方式,必须每行提供一个项目。

我发现了一个有趣的错误。文件 data.txt 包含 100 个随机数,每行 1 个。当我尝试运行它时,它似乎只是停顿了几秒钟,然后控制台简单地打印了

按任意键继续。

提示,没有错误信息。我已经插入了一些调试打印,并确定程序在停止之前运行了 3 到 8 次 do 循环。我无法确定原因。如果我随后将 data.txt 文件更改为只有 3 个数字,程序将按预期运行。通过调试打印,我将错误固定为

Deallocate( X )

线。如果我在 Visual Studio 中调试程序,我只会收到以下消息:

Chap_9_Allocatable_Array.exe 已触发断点。

书中有一些小错误。就在这个例子中,作者似乎忘记声明i,导致编译错误。但是,由于我只是开始了解数组,所以我不知道还能尝试什么。有任何想法吗?

0 投票
1 回答
321 浏览

fortran - 重置(解除分配/无效)已损坏的 Fortran 可分配数组

当出现Incorrect fortran errors: allocatable array is already assigned中描述的情况时;DEALLOCATE 指向一个无法解除分配的数组(损坏的内存留下了一个看起来已分配但没有“指向”有效地址的可分配数组),有什么可以在 Fortran 中完成来解决它,即重置数组作为释放,而不试图释放它指向的内存?

这种情况是一个 Fortran/C 程序,其中一段 C 代码故意破坏(将垃圾写入)分配的内存。这适用于普通类型的数组。但是对于用户定义类型的可分配数组,它本身包括一个可分配组件,写入属于可分配组件的部分的垃圾意味着现在该组件显示为已分配,即使它不是。当我知道我不关心它当前似乎指向的内存时,我宁愿在之后修复它,而是“取消”可分配组件,而不是让 C 代码知道它应该损坏什么。使用指针,这只是一个问题nullify,但是使用可分配数组?

0 投票
0 回答
181 浏览

fortran - Fortran 可分配数组的低性能

我使用 IVF2013 和 IVF2019 的 Intel Visual Fortran。使用可分配数组时,程序比使用静态内存分配的程序慢得多。也就是说,如果我从

方法一:使用固定数组

类似于

方法2:使用可分配数组

代码要慢得多。对于我的代码,静态分配需要 1 分 30 秒,而动态分配需要 2 分 30 秒。然后,我认为可能是因为运行分配操作需要太多时间,因为它在循环中,然后我尝试了以下两种方法:

方法3:使用模块只分配一次数组

方法四:使用自动数组

方法 3 和方法 4 所用的时间几乎与使用动态分配数组方法 2 的时间相同。两者都在 2 分钟 30 秒左右。所有案例都使用相同的优化进行编译。我尝试了 IVF 2013 和 IVF 2019,结果相同。我不知道为什么。尤其是方法 3,虽然 allocate 只运行一次,但仍然需要相同的时间。似乎动态分配的数组存储在比静态分配的数组慢的地方,并且分配不需要额外的时间(因为方法2和3需要相同的时间)。

以更有效的方式分配数组以减少性能损失的任何想法和建议?谢谢。

!=================================================== ========================= 编辑1:

我的程序太长,无法在此处发布。因此,我尝试了一些小代码。结果有点奇怪。我试了三个案例,

方法一:耗时28.98s

方法2:耗时30.56s

方法3:耗时78.72s

现在,对于更小的尺寸问题,方法 1 和方法 2 几乎是同时进行的。但是方法 3 应该比方法 2 更好,因为它只分配 x(1,n) 一次。但它要慢得多。但是在我之前的程序中,方法2给出的时间几乎和方法3一样。很奇怪。

我在 Windows 和 Linux 中都使用了版本设置,-O2 优化,以及不同版本的 IVF。

0 投票
0 回答
120 浏览

fortran - Fortran 中释放可分配数组的问题

我正在转换旧代码并使用可分配数组

现在一个子程序(STIFFR)调用另一个需要工作空间和公差指定数组的子程序(RADaU5)。由于这些取决于问题的维度(传递给 STIFFR),所有数组都在 STIFFR 中声明为可分配的,连同它们的维度一起传递给 RADAU5,然后释放。它是在释放 gfortran 崩溃的最后一个。

…………………………………………………………………………………………………………………………

.............

……

c 下一行是违规行,无论我是否检查是否已分配

接下来,我尝试了 gdb,它在调用 deallocate 时抱怨缺少例程,而 deallocated 之前被多次调用,没有任何明显的问题:

关于可能是什么问题的任何想法?