2401_82508090 2024-12-19 21:30 采纳率: 8%
浏览 60

读取netcdf文件报错

现在运行一个程序的子程序,读取NETCDF生成的nc文件,但是输出为结果报错为ncdiminq: ncid 487635252: NetCDF: Not a valid ID

源程序为

! Open cql3d netcdf file
!

   write(*,*)'before ncopn netcdfnm=',netcdfnm
   ncid = ncopn(TRIM(netcdfnm),NCNOWRIT,istatus)
   write(*,*)'after ncopn ncid=',ncid,'istatus',istatus
   

!c
!c read in dimension IDs and sizes

   write(*,*)'before ncdid xdim'
   xdim = ncdid(ncid,'xdim',istatus)
   write(*,*)'after ncdid xdim=',xdim,'istatus',istatus
   ydim = ncdid(ncid,'ydim',istatus)
   write(*,*)'after ncdid ydim=',ydim,'istatus',istatus
   rdim = ncdid(ncid,'rdim',istatus)
   write(*,*)'after ncdid rdim=',rdim,'istatus',istatus
   kdim=ncdid(ncid,'species_dim',istatus)
   write(*,*)'afterncid kim=',kdim,'istatus',istatus
   
   istatus = nf_inq_dimid(ncid,'tdim',nt_id)
   write(*,*)'proc_cql3d_op: after ncdid nt_id = ',nt_id,'istatus = ',istatus 
   

   istatus = nf_inq_dimlen(ncid, nt_id, nt)
   !call ncdinq(ncid, nt_id,'tdim', nt, istatus)
   write(*,*)'proc_cql3d_op: after ncdinq, # of t steps = ',nt, ' istatus=',istatus      
程序报错为
 after ncopn ncid=   487635252 istatus           2
 before ncdid xdim
 after inq_dimid xdim=           0 istatus         -33
 after inq_dimid ydim=           0 istatus         -33
 after inq_dimid rdim=   490420928 istatus         -33
 after inq_dimid kdim=           0 istatus         -33
 proc_cql3d_op: after nf90_inq_dimid nt_id =            0 istatus =          -33
 proc_cql3d_op: after inquire dimenstion, # of t steps =            0  istatus=
         -33
ncdiminq: ncid 487635252: NetCDF: Not a valid ID
  • 写回答

1条回答 默认 最新

  • 道友老李 JWE233286一种基于机器视觉的水表指针读数识别及修正的方法 专利发明者 2024-12-19 22:00
    关注
    让【道友老李】来帮你解答,本回答参考通义千问大模型编写,并整理提供,如果还有疑问可以点击头像关注私信或评论。
    如果答案让您满意,请采纳、关注,非常感谢!
    ### 问题分析与解决方案

    根据你提供的代码和错误信息,程序在尝试读取 NetCDF 文件时遇到了以下问题:

    1. 无效的 NetCDF ID (ncid)

      • 错误信息 ncdiminq: ncid 487635252: NetCDF: Not a valid ID 表明 ncid 不是有效的 NetCDF 文件标识符。
      • 这可能是由于文件打开失败或文件路径不正确导致的。
    2. 函数调用错误

      • istatus = 2 表示 ncopn 函数调用失败。NetCDF 库中的错误码 2 通常表示文件无法打开或文件不存在。
      • 后续的 ncdidnf_inq_dimid 调用返回 -33,这是 NetCDF 库中常见的无效 ID 错误码。

    解决步骤

    1. 检查文件路径和文件存在性

    确保 netcdfnm 变量指向的文件路径是正确的,并且文件确实存在。可以在代码中添加一个检查:

    inquire(file=TRIM(netcdfnm), exist=file_exists)
    if (.not. file_exists) then
        write(*,*) 'Error: File does not exist:', TRIM(netcdfnm)
        stop
    end if
    

    2. 使用现代 NetCDF 接口

    建议使用更现代的 NetCDF 接口(如 NF90_OPENNF90_INQ_DIMID),这些接口更健壮且更容易调试。以下是修改后的代码示例:

    program read_netcdf
        use netcdf
        implicit none
    
        character(len=*), parameter :: netcdfnm = "your_file.nc"
        integer :: ncid, istatus
        integer :: xdim, ydim, rdim, kdim, nt_id, nt
    
        ! Open NetCDF file
        write(*,*) 'before nf90_open netcdfnm=', TRIM(netcdfnm)
        istatus = nf90_open(TRIM(netcdfnm), NF90_NOWRITE, ncid)
        if (istatus /= NF90_NOERR) then
            write(*,*) 'Error opening file:', TRIM(netcdfnm), ' Status:', istatus
            call handle_err(istatus)
            stop
        end if
        write(*,*) 'after nf90_open ncid=', ncid, ' istatus=', istatus
    
        ! Read dimension IDs and sizes
        write(*,*) 'before nf90_inq_dimid xdim'
        istatus = nf90_inq_dimid(ncid, 'xdim', xdim)
        if (istatus /= NF90_NOERR) then
            write(*,*) 'Error inquiring dimension xdim:', istatus
            call handle_err(istatus)
            stop
        end if
        write(*,*) 'after nf90_inq_dimid xdim=', xdim, ' istatus=', istatus
    
        istatus = nf90_inq_dimid(ncid, 'ydim', ydim)
        if (istatus /= NF90_NOERR) then
            write(*,*) 'Error inquiring dimension ydim:', istatus
            call handle_err(istatus)
            stop
        end if
        write(*,*) 'after nf90_inq_dimid ydim=', ydim, ' istatus=', istatus
    
        istatus = nf90_inq_dimid(ncid, 'rdim', rdim)
        if (istatus /= NF90_NOERR) then
            write(*,*) 'Error inquiring dimension rdim:', istatus
            call handle_err(istatus)
            stop
        end if
        write(*,*) 'after nf90_inq_dimid rdim=', rdim, ' istatus=', istatus
    
        istatus = nf90_inq_dimid(ncid, 'species_dim', kdim)
        if (istatus /= NF90_NOERR) then
            write(*,*) 'Error inquiring dimension species_dim:', istatus
            call handle_err(istatus)
            stop
        end if
        write(*,*) 'after nf90_inq_dimid kdim=', kdim, ' istatus=', istatus
    
        istatus = nf90_inq_dimid(ncid, 'tdim', nt_id)
        if (istatus /= NF90_NOERR) then
            write(*,*) 'Error inquiring dimension tdim:', istatus
            call handle_err(istatus)
            stop
        end if
        write(*,*) 'after nf90_inq_dimid nt_id=', nt_id, ' istatus=', istatus
    
        istatus = nf90_inquire_dimension(ncid, nt_id, len=nt)
        if (istatus /= NF90_NOERR) then
            write(*,*) 'Error inquiring dimension length:', istatus
            call handle_err(istatus)
            stop
        end if
        write(*,*) 'after inquire dimension, # of t steps=', nt, ' istatus=', istatus
    
        ! Close NetCDF file
        istatus = nf90_close(ncid)
        if (istatus /= NF90_NOERR) then
            write(*,*) 'Error closing file:', istatus
            call handle_err(istatus)
        end if
    
    contains
    
        subroutine handle_err(err_code)
            integer, intent(in) :: err_code
            print *, trim(nf90_strerror(err_code))
        end subroutine handle_err
    
    end program read_netcdf
    

    关键点总结

    1. 文件路径检查:确保文件路径正确且文件存在。
    2. 使用现代接口:使用 NF90_OPENNF90_INQ_DIMID 等现代 NetCDF 接口。
    3. 错误处理:添加详细的错误处理逻辑,以便更好地定位问题。

    通过以上步骤,你应该能够解决当前遇到的问题并成功读取 NetCDF 文件。如果问题仍然存在,请检查文件是否损坏或格式是否正确。

    评论

报告相同问题?

问题事件

  • 创建了问题 12月19日