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

NetCDF: Start+count exceeds dimension bound

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

NetCDF: Start+count exceeds dimension bound

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

计划 rw_nc4d_main

  使用 rw_nc4d,仅:read_nc4

  隐式 NONE

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

  ncfn = 'pres_temp_4D.nc'
  vname = 'pressure'

  调用 read_nc4(ncfn, vname)

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

使用 netcdf

隐式 NONE

包含

  子程序 read_nc4(fname,vin_name)

    隐式 NONE

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

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

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

    DO ii = 1, ndim
      CALL nc_check(nf90_inquire_dimension(ncid,ii,dname,len=dlength))
          SELECT CASE(TRIM(dname))
          CASE('lon', 'LON', 'longitude')
            lx = 长度
          CASE('lat', 'LAT', 'latitude' )
            ly = 长度
          CASE('lev', 'LEV', 'level' )
            lz = 长度
          案例('time','TIME')
            lt = 长度
          CASE('ilev', 'ILEV')
            lzp1 = 长度
          大小写默认
            写(*,*)'ERROR: nc_check for dimensions!';停止
        结束 SELECT
    结束做

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

    调用 nc_check(nf90_inq_varid(ncid,TRIM(vin_name),var_id))
    CALL 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(status,fname)

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

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

  结束子程序 nc_check

结束模块 rw_nc4d

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