Сейчас я пытаюсь запустить свою климатическую модель с новыми метеорологическими данными (которые предоставляются в формате netcdf вместо старого формата cray). Модель компилируется плавно, однако, когда приходит время для моделирования, модель работает хорошо в первый день, но останавливается на второй день моделирования, всегда на одном и том же временном шаге, независимо от того, какую дату начала я использую. Ошибка:
forrtl: серьезный (408): fort: (2): Нижний индекс № 1 массива TIMEVALS имеет значение 141, что больше верхней границы 140.
Итак, я провел небольшое исследование и просмотрел свой исходный код, чтобы увидеть, к какому типу относится массив timevals, и я обнаружил, что он относится к этим новым метеорологическим данным, которые имеют измерение времени, и такой массив времени состоит из 140 элементов. Каждый элемент представляет собой определенную дату и время метеоданных, которые модель должна использовать для моделирования... поэтому я начал думать, что это проблема моего кода, но мой коллега смог запустить модель без проблемы, что было странно для меня. Он скомпилировал модель с некоторыми другими настройками в Makefile, я не знаю, имеет ли это значение, я все еще не очень хорошо знаком с фортраном и т. д. Однако ниже приведена часть кода, которая использует этот массив 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
и ndg_date
относятся к подталкиванию (метеоданные). У вас есть идеи, что может вызвать эту ошибку?
timevals(141)
, хотяtimevals
содержит только 140 элементов. Это то, что компилятор говорит вам. Однако это не может произойти в предоставленном вами фрагменте кода. Здесь вы получаете доступ только кtimevals(1)
иtimevals(2)
. Пожалуйста, опубликуйте соответствующую (строку) кода, то есть строку, на которую жалуется компилятор! - person Alexander Vogt   schedule 03.06.2015nts
соответствует количеству данных, которыеIO_GET_VAR_DOUBLE
считывает из ваших файлов. - person Vladimir F   schedule 04.06.2015