java netcdf精度_NetCDF:开始计数超出维度限制

在尝试使用Fortran读取4维NetCDF文件时遇到错误'NetCDF: Start+count exceeds dimension bound'。代码中定义了变量并尝试分配内存,但在调用nf90_get_var时可能请求的数组大小超过了实际维度的边界。解决方案可能涉及检查数组尺寸和NetCDF文件的维度匹配。
摘要由CSDN通过智能技术生成

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

NetCDF: Start+count exceeds dimension bound

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

PROGRAM rw_nc4d_main

USE rw_nc4d, ONLY: read_nc4

IMPLICIT NONE

CHARACTER(LEN=50) :: ncfn

CHARACTER(LEN=15) :: vname

ncfn = 'pres_temp_4D.nc'

vname = 'pressure'

CALL read_nc4(ncfn, vname)

END PROGRAM rw_nc4d_main

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

MODULE rw_nc4d

USE netcdf

IMPLICIT NONE

CONTAINS

SUBROUTINE read_nc4(fname,vin_name)

IMPLICIT NONE

CHARACTER(LEN=*), INTENT(IN) :: fname

CHARACTER(LEN=*), INTENT(IN) :: vin_name

! Local variables

INTEGER :: ncid, var_id, ndim, nvar, nattr, unlim_id

CHARACTER(LEN=15) :: dname

INTEGER :: dlength

INTEGER :: ii, status, lx, ly, lz, lt, lzp1

REAL :: sf, ofs

REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: vin

CALL nc_check(nf90_open(fname, nf90_nowrite, ncid))

CALL 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 = 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

WRITE(*,*)'ERROR: nc_check for dimensions!'; STOP

END SELECT

END DO

ALLOCATE(vin(lt,lz,ly,lx))

CALL 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))

END SUBROUTINE read_nc4

SUBROUTINE nc_check(status,fname)

INTEGER, INTENT(IN) :: status

CHARACTER(LEN=*), OPTIONAL :: fname

IF (status /= nf90_noerr) THEN

IF (PRESENT(fname)) THEN

WRITE(*,*)'FATAL ERROR in ',TRIM(fname),' ',TRIM(nf90_strerror(status))

ELSE

WRITE(*,*)'FATAL ERROR: ',TRIM(nf90_strerror(status))

END IF

STOP

END IF

END SUBROUTINE nc_check

END MODULE rw_nc4d

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值