我编写了这个程序来测试另一个代码,它编译得很好但是在运行时我收到了这些错误:
Fortran runtime error: Index '645778864' of dimension 1 of array 'tstar' above upper bound of 24
我的代码将数据文件作为输入(6列和24行对应于当天的不同时间),读取它们并在子程序" profile"中使用它们。提取新参数(u和tp)。我将对应于6列的向量的元素数(24)称为输入,并且不理解为什么存在这些错误。
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编译。我不是专家Fortran所以我请你不要使用过于具体的术语。
好的,我分配了#34; row"作为子程序的参数,但现在它给出了错误:
At line 29 of file test.f90 (unit = 60, file = 'inputver.dat')
Fortran runtime error: End of file
为什么它会给我这个错误?
答案 0 :(得分:4)
您从未设置row
,因此它包含一些任意值,在您的情况下645778864
。从您的代码中我读到tstar
长度为24
,因此出错。
您应指定row
,例如作为子程序的伪参数。