【问题标题】:Fortran HDF5: Compile time switching between H5T_NATIVE_DOUBLE and H5T_NATIVE_FLOATFortran HDF5:H5T_NATIVE_DOUBLE 和 H5T_NATIVE_FLOAT 之间的编译时切换
【发布时间】:2023-02-03 02:10:59
【问题描述】:

我尝试寻找我遇到的这个问题的答案,但我找不到答案(或者如果可能的话,就此而言)。

我在两个计算流体动力学求解器上工作,它们都是用 Fortran 编写的。 这两个求解器共享处理数据 I/O 的源文件。 主要区别在于,一个求解器使用双精度实数 (real8),而另一个求解器使用单精度 (real4)。

对于最初的 HDF5 开发,我在双精度求解器中实现了 HDF5 I/O。一切都按预期工作,没有问题。存储库中提供的 HDF5 示例足以指导我。

现在我还想在单精度求解器中利用这些 HDF5 I/O 例程。 但是,写入实数会带来问题,因为我需要在 HDF5 API 调用中定义 H5T_NATIVE_DOUBLE 或 H5T_NATIVE_FLOAT。

我想要的是能够在编译时根据编译的求解器在 H5T_NATIVE_DOUBLE 或 H5T_NATIVE_FLOAT 之间切换。

由于对 HDF5 API 的调用超过 60 次,因此使用 Makefile 指令并不是一个优雅的解决方案。

我将如何着手完成这个?

由于 H5T_NATIVE_DOUBLE 和 H5T_NATIVE_FLOAT 都是 HDF5 类型,因此我无法找到其他可用的类型。也许我可以定义一个从 HDF5 类型继承 double 或 float 类型的符号类型?

我还没有遇到过像这个问题这样的事情,我不知道什么是好的方法。

【问题讨论】:

  • 显示代码示例可能会有所帮助。 use hd5f, my_data_type=>h5t_native_float 之类的东西在某些情况下可能有效,但在其他情况下则无效。
  • 当然,必须有某种机制可以直接在单个数据文件中使用多种数据类型(例如 IEEE fpe 类型),而无需使用某些系统特定的 native_float。但我不使用 HDF。
  • 自从我使用 HDF5 以来已经有一段时间了,所以我不确定这些建议可能需要付出多少努力,而且他们并没有回答这个问题,而是完全绕过它。 (1) 以双精度存储所有 f-p 数字,单精度版本的代码必须根据需要向上和向下转换数字 (2) 设计文件以存储单精度和双精度浮点数;求解器使用他们想要的精度。我轻率地挥舞着存在的一些过程会注意,如果一个文件包含两个版本,它们讲述的是同一个故事。

标签: floating-point fortran hdf5


【解决方案1】:

我建议定义一个在H5T_NATIVE_DOUBLEH5T_NATIVE_FLOAT 之间切换的中间值。所有 (60+) 对 hdf5 api 的调用都将使用此变量,并且其值将根据预处理器标志进行切换。

例如,如果您正在 include-ing 一个 hdf5 头文件(未测试):

#ifdef solver_is_single_precision
#   define MY_HDF5_REAL_TYPE H5T_NATIVE_FLOAT
#else
#   defile MY_HDF5_REAL_TYPE H5T_NATIVE_DOUBLE
#endif

或者,如果您使用的是 hdf5 模块(同样,未经测试,而且我不知道模块内部类型的名称):

   use hdf5, only : &
#ifdef solver_is_single_precision
      my_hdf5_real_type => native_float
#else
      my_hdf5_real_type => native_double
#endif

理想情况下,这将进入一些特定于代码的 hdf5 头文件或模块文件,但它也可以进入每个相关例程或模块的顶部。

另请注意,存在 hdf5 例程来转换类型,例如 h5kind_to_type (https://docs.hdfgroup.org/archive/support/HDF5/doc/fortran/NewFeatures_F2003.pdf),尽管我从未使用过它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 2012-02-24
    相关资源
    最近更新 更多