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