【发布时间】:2015-07-13 11:58:56
【问题描述】:
两年多来,我一直在为应用物理问题的数值模拟编写 FORTRAN 代码,并尝试遵循Fortran Best Practices 中描述的约定。
更具体地说,我将参数定义为
integer, parameter:: dp=kind(0.d0)
然后将它用于我的代码中的所有双打。
但是,我发现(在这个论坛上)如果您使用其他编译器编译代码,使用 KIND 参数不一定能提供相同的精度。在this question 中,我读到一个可能的解决方案是使用 SELECTED_REAL_KIND 和 SELECTED_INT_KIND,据我所知,它们遵循一些约定。
不过,后来我发现了 ISO_FORTRAN_ENV 模块,它定义了 REAL32、REAL64 和 REAL128 KIND 参数。
我想这些确实是可移植的,而且由于它们属于 FORTRAN 2008 标准(尽管受到 GNU 支持),我想我应该使用这些吗?
因此,如果有更多知识和经验的人能解决这个困惑,我将不胜感激。
另外,我还有一个关于在 HDF5 中使用这些 KIND 的后续问题。我正在使用 H5T_NATIVE_DOUBLE 并且它确实工作正常(据我所知)但是,in this document 据说这是一个过时的功能,不应使用。相反,它们提供了一个函数
INTEGER(HID_T) FUNCTION h5kind_to_type(kind, flag) RESULT(h5_type) .
当我使用它时,打印出与 REAL64 对应的 HID_T 整数的确切数值给我 50331972,而 H5T_NATIVE_DOUBLE 给我 50331963,这是不同的。
如果我随后尝试使用由 H5kind_to_type 计算的值,HDF5 库也可以正常运行,并且使用 XDMF,我可以在 VisIt 或 Paraview 中绘制输出,而无需修改随附的 .xmf 文件。
所以我的第二个问题是(再次):这是正确的用法吗?
【问题讨论】:
-
我认为在 Fortran 中保证浮点变量有 8 个字节是多么麻烦,这是一个丑闻。我们真的应该在每次声明一个浮点变量时加载一个模块,或者输入一些冗长的命令吗?我陷入了与您类似的陷阱,并认为 real(8) 指定了一个 8 字节的浮点数。现在我使用 real*8,它不像 real(8) 是可移植的。它不是 Fortran 标准的一部分,但实际上每个编译器都能理解。
标签: fortran precision hdf5 double-precision