NetCDF:开始+计数超出维度限制

jkp*_*jkp 3 fortran netcdf

我在 Fortran 中编写了一个代码来读取具有 4 维数据 [时间、水平、经度、纬度] 的 NetCDF 文件。但是,我的代码产生错误

NetCDF: Start+count exceeds dimension bound
Run Code Online (Sandbox Code Playgroud)

在我使用的任何 4-d NetCDF 文件上。例如,http://people.sc.fsu.edu/~jburkardt/f_src/netcdf/pres_temp_4D.nc上的文件有压力和温度。我在下面粘贴我的代码。请建议出了什么问题。

程序 rw_nc4d_main

  仅使用 rw_nc4d:read_nc4

  隐式无

  字符(LEN = 50):: ncfn
  字符(LEN = 15):: vname

  ncfn = 'pres_temp_4D.nc'
  vname = '压力'

  调用 read_nc4(ncfn, vname)    

结束程序 rw_nc4d_main
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!
模块 rw_nc4d

使用 netcdf

隐式无

包含

  子程序 read_nc4(fname,vin_name)   

    隐式无

    字符(LEN = *),意图(输入):: fname
    字符(LEN = *),意图(输入):: vin_name

    !局部变量
    整数 :: ncid、var_id、ndim、nvar、nattr、unlim_id
    字符(LEN=15) :: dname
    整数 :: dlength
    整数 :: ii、状态、lx、ly、lz、lt、lzp1 
    真实的:: SF, ofs
    真实,维度(:,:,:,:),可分配::vin

    调用 nc_check(nf90_open(fname, nf90_nowrite, ncid))
    调用 nc_check(nf90_inquire(ncid,ndim,nvar))

    做 ii = 1, ndim
      调用 nc_check(nf90_inquire_dimension(ncid,ii,dname,len=dlength))
          选择案例(TRIM(dname))
          CASE('lon', 'LON', '经度')
            lx = dlength
          案例('纬度','纬度','纬度')
            ly = dlength
          CASE('lev', 'LEV', 'level')
            lz = dlength
          案例('时间','时间')
            lt = dlength
          CASE('ilev', 'ILEV')
            lzp1 = dlength
          默认情况下
            WRITE(*,*)'错误:nc_check 尺寸!'; 停止
        结束选择
    结束做

    分配(vin(lt,lz,ly,lx))

    调用 nc_check(nf90_inq_varid(ncid,TRIM(vin_name),var_id))
    调用 nc_check(nf90_get_var(ncid,var_id,vin,start=(/1,1,1,1/),count=(/lt,lz,ly,lx/)),fname=TRIM(fname))

 结束子程序 read_nc4

  子程序 nc_check(状态,fname)

    整数,意图(输入):: 状态
    字符(LEN=*),可选的:: fname

    如果(状态/= nf90_noerr)那么
      IF (PRESENT(fname)) THEN
        WRITE(*,*)'FATAL ERROR in ',TRIM(fname),' ',TRIM(nf90_strerror(status))
      别的
        WRITE(*,*)'致命错误:',TRIM(nf90_strerror(status))
      万一
      停止
    万一

  结束子程序 nc_check

结束模块 rw_nc4d

Rus*_*ssF 6

你有前后的尺寸。我还怀疑您的变量的longitude和 与latitude您发布的顺序相反。[time, level,latitude,longitude]应像var(longitude, latitude, level, time)在 Fortran 中一样声明具有形状的变量。