Ошибка времени выполнения Fortran: индекс «645778864» размерности 1 массива «tstar» выше верхней границы 24

Я написал эту программу для тестирования другого кода, она хорошо компилируется, но во время выполнения я получаю такие ошибки:

Fortran runtime error: Index '645778864' of dimension 1 of array 'tstar' above upper bound of 24

мой код принимает в качестве входных данных файл данных (6 столбцов и 24 строки, соответствующие разным временам суток), считывает их и использует в «профиле» подпрограммы для извлечения новых параметров (u и tp). Я назвал количество элементов (24) векторов, соответствующих 6 столбцам, взятым на вход, и не понимаю, почему возникают эти ошибки.

program test
 implicit none

 character(len=12) filein,fileout
 integer :: row,ih,i
 real :: k = 0.4
 real :: z0 = 0.0012
 real, dimension(6) :: z=(/0.5,1.,2.,4.,8.,16./)
 real, dimension(6) :: u
 real, dimension(2) :: teta,tp
 real, dimension(2) :: dt
 real, dimension(24) :: L,tstar,Ho,ustar,tk
 real :: g = 9.81

 write(*,'(2x,''File di input .......''/)')
 read(*,'(a12)') filein
 write(*,'(2x,''File di output........''/)')
 read(*,'(a12)') fileout


 open(unit=60,File=filein)
 open(unit=80,File=fileout)

 write(80,*)

  do row = 1,24    
  read(60,*) ih,ustar,tk,(dt(i),i=1,2),Ho

  teta(1) = dt(1) + tk(row)
  teta(2) = (dt(2)-dt(1)) + teta(1)

  call profile(ustar,Ho,u,teta,tp)
  write(80,*) u,tp

 enddo

close(60)
close(80)


end program test

subroutine profile(ustar,Ho,u,teta,tp)
 implicit none
 integer :: i,j,row
 integer :: N = 6
 real, dimension(24), intent(in) :: ustar,Ho
 real, dimension(24) :: tstar,L,tk
 real, dimension(6),intent(out) :: u
 real, dimension(6) :: z=(/0.5,1.,2.,4.,8.,16./)
 real, dimension(2),intent(out) :: tp
 real, dimension(2) :: teta
 real :: k = 0.4
 real :: z0 = 0.0012
 real :: g = 9.81

 tstar = 0.
 L = 0.

 tstar(row) = -(Ho(row)/(1200.*ustar(row)))
 L(row) = (tk(row)*ustar(row))/(k*g*tstar(row))

 ! convective situation
 do i=1,6
  u(i) = (ustar(row)/k)*(alog(z(i)/z0) +1. - (1. - (16.*(z(i)/L(row))))**0.25)
  if(i.le.2) then
  tp(i) = teta(i) + (tstar(row)/k)*(alog(z(i+2)) - (2.*(alog(0.5 + (0.5*(sqrt(abs(1.-(16.*(z(i+2)/L(row)))))))))))
  endif

 enddo


end 

Входной файл состоит из 6 столбцов, первый из которых состоит из целых чисел (часов дня), а другой соответствует фактическим количествам, которые считываются из строки:

read(60,*) ih,ustar,tk,(dt(i),i=1,2),Ho

Код написан на Fortran90, и я использую gfortran для компиляции. Я не специалист по Фортрану, поэтому прошу не использовать слишком специфичные термины.

хорошо, я назначил «строку» в качестве аргумента подпрограммы, но теперь она выдает ошибку:

At line 29 of file test.f90 (unit = 60, file = 'inputver.dat')
Fortran runtime error: End of file

почему это дает мне эту ошибку?


person Alessio De Luca    schedule 17.11.2014    source источник
comment
Всегда используйте тег fortran и добавляйте версию только при необходимости, чтобы отличить конкретный вопрос. Например, что вы не можете использовать Fortran 2008, а только Fortran 90.   -  person Vladimir F    schedule 17.12.2015


Ответы (1)


Вы никогда не устанавливали row, поэтому оно содержит произвольное значение, в вашем случае 645778864. Из вашего кода я прочитал, что tstar имеет длину 24, отсюда и ошибка.

Вы должны указать row, например. в качестве фиктивного аргумента для вашей подпрограммы.

person Alexander Vogt    schedule 17.11.2014