fortran子程序中可以用动态数组吗??

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了fortran子程序中可以用动态数组吗??相关的知识,希望对你有一定的参考价值。

完全可以,需要使用关键字ALLOCATE和ALLOCATABLE,具体使用方法请查阅相应参考书 参考技术A 完全可以 参考技术B 可以

可以将 Fortran 数组保存为 .npy 格式吗?

【中文标题】可以将 Fortran 数组保存为 .npy 格式吗?【英文标题】:Can one save Fortran arrays in .npy format? 【发布时间】:2022-01-08 15:40:14 【问题描述】:

我正在使用 Fortran 进行数值计算。 Fortran 中的通用标准是将数组保存为.dat 文件。我想偶尔将数组传输到 Python 以进行进一步操作。做这件事的方法

用python编写脚本来读取.dat文件并生成一个numpy数组 在保存数组时使用 HDF5、NETCDF 等(可在 Python 中访问)

.dat 文件脚本阅读器需要根据数组的存储方式进行定制。为了便于使用,每个文件可能需要存储一个数组。 我的阵列不是那么大,所以我不喜欢使用 HDF5。但是如果没有其他选择,请告诉我。

这与Reading arrays from .npy files into Fortran 90相反

【问题讨论】:

【参考方案1】:

我的MRedies NPY-for-Fortran 使用得还不够,但它似乎正是您要找的。​​p>

来自自述文件

Fortran 的 NPY

此 Fortran 模块允许将数字 Fortran 数组保存为 Numpy 的 .npy 或 .npz 格式。目前支持的有:

1. integer(1), integer(2), integer(4), integer(8)
2. real(4), real(8)
3. complex(4), complex(8)

*.npy 文件 将数组保存到 .npy 文件中只需调用:

call save_npy("filename.npy", array) 

另外,请留意fortran standard library 上的这个pull request

另一个选项,我没有测试过

不是我的想法先看CAZT'sCAZT's *** answer评论

libnpy 似乎是一个库,它提供了使用 NumPy 的二进制格式将 C 或 Fortran 数组保存到数据文件的简单例程。

以下摘自https://scipy-cookbook.readthedocs.io/items/InputOutput.html

program fex
    use fnpy
    use iso_c_binding
    implicit none

    integer  :: i
    real(C_DOUBLE) :: a(2,4) = reshape([(i, i=1,8)], [2,4])

    call save_double("fa.npy", shape(a), a)
end program fe

程序会创建一个文件fa.npy,您可以按照通常的方式将其加载到python中。

但 NumPy 数组的条目现在遵循 Fortran(列优先)排序。

>>> fa = np.load('fa.npy')
>>> print fa
[[ 1.  3.  5.  7.]
 [ 2.  4.  6.  8.]] 

您可以使用命令在与fex.f95 相同的目录中构建带有npy.modlibnpy.a 的可执行文件。

gfortran -o fex fex.f95 libnpy.a

仅供参考,我在https://github.com/kovalp/libnpy偶然发现了一个更新版本的libnpy

可能的错误

来自Matthias Redies 如果您使用 libnpy 保存一些数组切片 call save_npy(a(:,1,:)),您将不会高兴。

【讨论】:

对不起。我不明白 鉴于问题和答案来自同一个人,在我看来,它就像是一个广告,尤其是它的措辞方式。 @VladimirF 现在好点了吗? 它在第一个站点看起来真的很像。它们在 SO 上很常见。现在的答案肯定更好。鉴于拉取请求在最近几个小时内处于活动状态,等待结果可能更明智,但如果您使用结果更新答案应该没问题。 顺便说一句,即使是图书馆作者也可以这样回答,这是允许的。重点是说“你可以使用这个库以这种方式做到这一点”,而不仅仅是“这里有一个可以做到这一点的库的链接”。

以上是关于fortran子程序中可以用动态数组吗??的主要内容,如果未能解决你的问题,请参考以下文章

c中可以定义变长数组吗

试图将一个连续的动态二维数组从 C 传递到 Fortran

试图将一个连续的动态二维数组从 C 传递到 Fortran

Fortran 子程序中的数组分配

可以将 Fortran 数组保存为 .npy 格式吗?

freemarker里面用assign标签定义数组可以动态赋值吗