这些天我正在尝试使用新的气象数据(以 netcdf 格式而不是旧的 cray 格式给出)运行我的气候模型。模型编译顺利,但是当进行模拟时,模型在第一天运行良好,但在模拟的第二天就停止了,总是在同一时间步长,无论我使用哪个开始日期。错误是:
forrtl: strict (408): fort: (2): 数组 TIMEVALS 的下标 #1 的值为 141,该值大于上限 140。
所以我做了一些研究,浏览了我的源代码,看看 timevals 指的是什么样的数组,我发现它指的是这个具有时间维度的新气象数据,而这样的时间数组由 140 个元素组成。每个元素都是模型应该用于模拟的气象数据的特定日期和时间......所以我开始相信这是我的代码的问题,但我的同事已经能够在没有任何情况下运行模型问题,这对我来说很奇怪。他在 Makefile 中使用一些不同的设置编译了模型,我不知道这是否重要,我对 fortran 等还不是很熟悉。但是下面是使用这个 TIMEVALS 数组的代码部分:
CASE(2) ! nudging data is in netcdf-format
cfile = str_filter(ndg_file_nc,yr,mo,dy,hr,mi,se,ndgblock)
CALL message(' Adjust date using file: ',TRIM(cfile))
IF (p_parallel_io) THEN
INQUIRE(file=cfile,exist=found)
IF (.NOT.found) &
CALL finish('NudgingInit','Nudging data file not found.')
ndgfile%format = NETCDF
CALL IO_open (cfile, ndgfile, IO_READ)
CALL IO_INQ_DIMID(ndgfile%file_id, 'time', ndimid)
CALL IO_INQ_DIMLEN(ndgfile%file_id, ndimid, nts)
CALL IO_INQ_VARID(ndgfile%file_id, 'time', nvarid)
ALLOCATE (timevals(nts))
CALL IO_GET_VAR_DOUBLE (ndgfile%file_id, nvarid, timevals)
ihead_nc(1) = FLOOR(timevals(1)) ! ihead_nc(1) is YYYYMMDD
ihead_nc(2) = INT((timevals(1)-ihead_nc(1))*24._dp) ! ihead_nc(2) is HH
DEALLOCATE (timevals)
ENDIF
IF (p_parallel) CALL p_bcast(ihead_nc, p_io)
CALL inp_convert_date(ihead_nc(1),ihead_nc(2)*10000, ndg_date0)
IF (p_parallel_io) THEN
! skip first record and read second header
ALLOCATE (timevals(nts))
CALL IO_GET_VAR_DOUBLE (ndgfile%file_id, nvarid, timevals)
ihead_nc(1) = FLOOR(timevals(2)) ! ihead_nc(1) is YYYYMMDD
ihead_nc(2) = INT((timevals(2)-ihead_nc(1))*24._dp) ! ihead_nc(2) is HH
DEALLOCATE (timevals)
CALL IO_close(ndgfile)
ENDIF
IF (p_parallel) CALL p_bcast(ihead_nc, p_io)
CALL inp_convert_date(ihead_nc(1),ihead_nc(2)*10000, ndg_date1)
ndg_file
and ndg_date
参考微推(气象数据)
你们知道什么可能会导致这个错误吗?