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