NetCDF:起始位置+计数超过维度界限

3

我已经用Fortran编写了一段代码,用于读取一个包含4维数据[时间、层次、经度、纬度]的NetCDF文件。然而,我的代码出现了错误。

NetCDF: Start+count exceeds dimension bound

我正在使用的是任意4维NetCDF文件的翻译。例如,位于http://people.sc.fsu.edu/~jburkardt/f_src/netcdf/pres_temp_4D.nc的文件具有压力和温度。我在下面粘贴了我的代码。请建议出现了什么问题。

程序 rw_nc4d_main
使用模块 rw_nc4d,仅限:read_nc4
隐式无单位
字符串(长度=50):: ncfn 字符串(长度=15):: vname ncfn = 'pres_temp_4D.nc' vname = 'pressure'
调用 read_nc4(ncfn, vname)
结束程序 rw_nc4d_main
模块 rw_nc4d
使用 netcdf
隐式无单位
包含
子程 read_nc4(fname,vin_name)
隐式无单位
字符串(长度=*),传入 :: fname 字符串(长度=*),传入 :: vin_name ! 局部变量 整型 :: ncid, var_id, ndim, nvar, nattr, unlim_id 字符串(长度=15):: dname 整型 :: dlength 整型 :: ii, status, lx, ly, lz, lt, lzp1 实型 :: sf, ofs 实型,可调整维度的 :: vin(:,:,:,:)
调用 nc_check(nf90_open(fname, nf90_nowrite, ncid)) 调用 nc_check(nf90_inquire(ncid,ndim,nvar))
DO ii = 1, ndim 调用 nc_check(nf90_inquire_dimension(ncid,ii,dname,len=dlength)) SELECT CASE(TRIM(dname)) CASE('lon', 'LON', 'longitude') lx = dlength CASE('lat', 'LAT', 'latitude' ) ly = dlength CASE('lev', 'LEV', 'level' ) lz = dlength CASE('time', 'TIME' ) lt = dlength CASE('ilev', 'ILEV') lzp1 = dlength CASE DEFAULT 写(*,*)'错误:nc_check for dimensions!'; 停止 END SELECT END DO
分配(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(status,fname)
整型,传入 :: status 字符串(长度=*),可选,传入 :: fname 如果 (status /= nf90_noerr) THEN 如果 (PRESENT(fname)) THEN 写(*,*)'严重错误于',TRIM(fname),' ',TRIM(nf90_strerror(status)) ELSE 写(*,*)'严重错误:',TRIM(nf90_strerror(status)) END IF 停止 END IF
结束子程序 nc_check
结束模块 rw_nc4d

请在所有Fortran相关问题中使用标签“fortran”以获得更多关注。对于特定版本的问题(可能不是这个问题),请使用版本标签(如“fortran90”)。 - Vladimir F Героям слава
1个回答

6

你的尺寸是反过来的。我还怀疑你的变量longitudelatitude与你发布的顺序相反。一个形状为[time, level,latitude,longitude]的变量应该在Fortran中声明为var(longitude, latitude, level, time)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接