Fortran子程序调用CGNS库读取坐标失败问题求助
CGNS坐标读取问题:子程序中调用
cg_coord_read_f返回全0的解决方法 问题描述
尝试从CGNS 2D网格文件提取坐标时,主程序直接调用cg_coord_read_f可正常读取CoordinateX,但将逻辑移至子程序后,读取结果全为0.0000。已知CGNS和HDF5库正常,编译采用8位实型和整型。
可正常运行的主程序代码
program extractor_panel use cgns parameter (izmx=200,iptmx=100000) integer(4) :: index_file, index_zone, index_base, ier dimension x(iptmx,izmx) call cg_open_f('test.cgns',CG_MODE_READ,index_file,ier) index_file = 1 index_zone = 1 index_base = 1 irmin=1 irmax=100 call cg_coord_read_f(index_file, index_zone, index_base, "CoordinateX", RealSingle, irmin, irmax, x, ier) print *, x(1,1), x(2,1), x(3,1), x(4,1), x(5,1) end program
读取异常的子程序版本代码
program extractor_panel ! use cgns parameter (izmx=200,iptmx=100000) character*9 :: filename filename = 'test.cgns' call test(filename) end program subroutine test(filename) parameter (izmx=200,iptmx=100000) character*9 :: filename integer(4) :: index_file, index_zone, index_base, ier, irmin, irmax dimension x(iptmx,izmx) call cg_open_f(filename,CG_MODE_READ,index_file,ier) index_file=1 index_zone=1 index_base=1 irmin=1 irmax=10 call cg_coord_read_f(index_file, index_zone, index_base, "CoordinateX", RealSingle, irmin, irmax, x, ier) print *, x(1,1), x(2,1), x(3,1), x(4,1), x(5,1) end subroutine
问题根源及修复方案
1. 未导入CGNS模块
子程序和主程序都注释了use cgns语句,导致CGNS常量(如CG_MODE_READ、RealSingle)和函数接口未被正确识别,参数传递出现错误,是读取全0的核心原因。
修复:在主程序和子程序中都添加use cgns语句:
program extractor_panel use cgns ! 恢复该行 parameter (izmx=200,iptmx=100000) character*9 :: filename filename = 'test.cgns' call test(filename) end program subroutine test(filename) use cgns ! 添加该行 parameter (izmx=200,iptmx=100000) character*9 :: filename integer(4) :: index_file, index_zone, index_base, ier, irmin, irmax dimension x(iptmx,izmx) call cg_open_f(filename,CG_MODE_READ,index_file,ier) ! ... 剩余代码不变
2. 错误覆盖文件索引值
cg_open_f会返回实际的文件索引到index_file,但子程序中手动将index_file=1,覆盖了CGNS返回的有效句柄,导致后续读取调用指向错误的文件对象。
修复:删除index_file=1这一行,直接使用cg_open_f返回的索引值:
call cg_open_f(filename,CG_MODE_READ,index_file,ier) ! 移除 index_file=1 语句 index_zone=1 index_base=1
3. 增加错误检查逻辑
每次CGNS调用后检查ier值,可快速定位操作失败原因:
call cg_open_f(filename,CG_MODE_READ,index_file,ier) if (ier /= 0) then call cg_error_f(ier) stop 'Failed to open CGNS file' end if call cg_coord_read_f(index_file, index_zone, index_base, "CoordinateX", RealSingle, irmin, irmax, x, ier) if (ier /= 0) then call cg_error_f(ier) stop 'Failed to read CoordinateX' end if
4. 动态匹配网格尺寸(优化建议)
避免硬编码irmax,可先读取网格实际尺寸:
integer(4) :: isize(3) call cg_zone_read_f(index_file, index_base, index_zone, 'ZoneName', isize, ier) irmin = 1 irmax = isize(1) ! 获取实际网格点数
内容的提问来源于stack exchange,提问作者hyunbin-kang
相关产品推荐
相关产品推荐

