编译WRF-DA代码遇H5dread_f符号缺失,求适配HDF5版本
首先明确:H5Dread_f确实在HDF5 1.10及以后的版本中被废弃,它属于HDF5旧版的Fortran 90接口,在1.10系列中被替换为更贴合Fortran 2003标准的接口(比如h5dread_ptr),同时只保留了底层的C绑定接口h5dread_f_c。这就是你编译时找不到该符号的核心原因。
下面给你两种可行的解决方案:
方案一:适配新版HDF5修改WRF-DA代码
既然你的系统HDF5库只有h5dread_f_c,可以直接修改da_radiance.f中调用H5Dread_f的代码,替换为调用h5dread_f_c。需要注意两者的参数列表差异——h5dread_f_c的参数更贴近HDF5的C接口,你需要对应调整参数的类型和顺序。
举个简单的参数对应示例(具体以HDF5 1.10的C绑定文档为准):
原调用:
call H5Dread_f(dhnd1, mem_type, buf, hdferr, mem_space, file_space, xfer_prp)
替换为h5dread_f_c的调用(需确认参数匹配):
call h5dread_f_c(dhnd1, mem_type, buf, dims, mem_space, file_space, xfer_prp, hdferr)
如果想彻底适配新版标准,也可以重构代码使用h5dread_ptr接口,它支持Fortran 2003的C指针类型,不过改动会稍大一些。
方案二:使用保留旧接口的HDF5版本
如果你不想修改WRF-DA代码,可以选择HDF5 1.8.x系列版本,这个系列完整保留了H5Dread_f这类旧Fortran接口。推荐使用HDF5 1.8.20(稳定且兼容性好),以下是编译和使用步骤:
1. 编译HDF5 1.8.20
# 下载并解压HDF5 1.8.20源码后,进入源码目录 ./configure --prefix=/your/install/path/hdf5-1.8.20 \ --enable-fortran \ --enable-static \ --enable-shared \ --with-intel # 如果用Intel编译器,加上这个参数 make -j$(nproc) make install
2. 编译WRF-DA时指定旧版HDF5路径
修改你的编译命令,替换HDF5的头文件和库路径为刚才安装的旧版:
ftn -c -ip -O3 -w -ftz -fno-alias -align all -FR -convert big_endian -r8 -real-size `expr 8 \* 8` -i4 \ -I../external/crtm_2.2.3/libsrc \ -I/your/install/path/hdf5-1.8.20/include \ -L/your/install/path/hdf5-1.8.20/lib/ \ -lhdf5hl_fortran -lhdf5_fortran -lhdf5 \ da_radiance.f
补充说明
HDF5 1.10及以后的版本不再提供旧Fortran接口的直接实现,即使编译时开启某些兼容选项也无法恢复,所以要么修改代码适配新版,要么回退到1.8.x版本是最直接的解决方式。
内容的提问来源于stack exchange,提问作者puneet336

