You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 16:05:08