Fortran错误含义

时间:2012-11-13 01:45:57

标签: error-handling fortran scientific-computing

我一直在关注FORTRAN写作的书籍和PDF来编写集成程序。我用gfortran编译代码并得到以下错误的几个副本。

1)Unexpected data declaration statement at (1)
2)Unterminated character constant beginning at (1)
3)Unclassifiable statement at (1)
4)Unexpected STATEMENT FUNCTION statement at (1)
5)Expecting END PROGRAM statement at (1)
6)Syntax error in data declaration at (1)
7)Statement function at (1) is recursive
8)Unexpected IMPLICIT NONE statement at (1)

我不知道帽子他们真正的意思或如何解决它们,谷歌搜索已证明null和本网站上的其他主题我们关于其他错误。对于错误5)我放入程序主程序和结束程序主要像我可能在C ++但仍然得到相同的结果。错误7)没有意义,我正在尝试程序中的递归。错误8)我读隐含的没有是为了防止不必要的减速。

我发布了代码本身,但是我对编译错误更感兴趣,因为我仍然需要微调数组数据处理,但我不能这样做,直到我开始工作。

         Program main
  implicit none      
  real, dimension(:,:), allocatable :: m, oldm
  real a
  integer io, nn
  character(30) :: filename
  real, dimension(:,:), allocatable :: alt, temp, nue, oxy
  integer locationa, locationt, locationn, locationo, i
  integer nend
  real dz, z, integral
  real alti, tempi, nuei, oxyi
  integer y, j

  allocate( m(0, 0) ) ! size zero to start with?

  nn = 0
  j = 0

   write(*,*) 'Enter input file name: '

   read(*,*) filename

   open( 1, file = filename )



  do !reading in data file

   read(1, *, iostat = io) a

   if (io < 0 ) exit

   nn = nn + 1

   allocate( oldm( size(m), size(m) ) )

   oldm = m 

   deallocate( m )

   allocate( m(nn, nn) )

   m = oldm

   m(nn, nn) = a ! The nnth value of m

   deallocate( oldm )

  enddo



  ! Decompose matrix array m into column arrays [1,n]

  write(*,*) 'Enter Column Number for Altitude'
  read(*,*) locationa
  write(*,*) 'Enter Column Number for Temperature'
  read(*,*) locationt
  write(*,*) 'Enter Column Number for Nuetral Density'
  read(*,*) locationn 
  write(*,*) 'Enter Column Number for Oxygen density'
  read(*,*) locationo

  nend = size(m, locationa) !length of column #locationa

  do i = 1, nend

   alt(i, 1) = m(i, locationa)

   temp(i, 1) = log(m(i, locationt))

   nue(i, 1) = log(m(i, locationn))

   oxy(i, 1) = log(m(i, locationo))

  enddo



  ! Interpolate Column arrays, Constant X value will be array ALT with the 3 other arrays

  !real dz = size(alt)/100, z, integral = 0
  !real alti, tempi, nuei, oxyi
  !integer y, j = 0
  dz = size(alt)/100


  do z = 1, 100, dz
  y = z !with chopped rounding alt(y) will always be lowest integer for smooth transition.
  alti = alt(y, 1) + j*dz ! the addition of j*dz's allow for all values not in the array between two points of the array. 

   tempi = exp(linear_interpolation(alt, temp, size(alt), alti))

   nuei = exp(linear_interpolation(alt, nue, size(alt), alti))

   oxyi = exp(linear_interpolation(alt, oxy, size(alt), alti))
   j = j + 1



   !Integration

   integral = integral + tempi*nuei*oxyi*dz 

  enddo


  end program main


  !Functions

  real function linear_interpolation(x, y, n, x0)

   implicit none

   integer :: n, i, k

   real :: x(n), y(n), x0, y0

   k = 0


  do i = 1, n-1

   if ((x0 >= x(i)) .and. (x0 <= x(i+1))) then  

    k = i ! k is the index where: x(k) <= x <= x(k+1)
    exit ! exit loop

   end if

  enddo


  if (k > 0) then  ! compute the interpolated value for a point not in the array

   y0 = y(k) + (y(k+1)-y(k))/(x(k+1)-x(k))*(x0-x(k))

  else

   write(*,*)'Error computing the interpolation !!!'

   write(*,*) 'x0 =',x0, ' is out of range <', x(1),',',x(n),'>'

  end if

  ! return value

     linear_interpolation = y0

  end function linear_interpolation

我可以提供确切错误的更详细描述,我希望错误名称就足够了,因为我有一些类型。

1 个答案:

答案 0 :(得分:0)

我想我可以在您的代码示例中发现一些严重错误。语法错误是您在exp(...语句中有不平衡的括号。它们应该是这样的:

tempi = exp(linear_interpolation(alt, temp, size(alt), alti) ) ! <- extra ")"
nuei = exp(linear_interpolation(alt, nue, size(alt), alti) )
oxyi = exp(linear_interpolation(alt, oxy, size(alt), alti) )

正是这样的事情会产生一连串令人困惑的错误,就像你得到的一样;因此Dave和Jonathan给出的建议不能经常重复。

另一个错误(“unclassifiable statement”)适用于你的循环:

do(i=1, nend)
! ...
do(z=1, 100, dz)
! ...

这些应该没有括号。

“数据声明错误”源于您尝试声明和初始化多个变量,如

real dz = size(alt)/100, z, integral = 0

除了在代码中错误定位(如上所述)之外,这只能通过双冒号分隔符完成:

real :: dz = size(alt)/100, z, integral = 0

我个人建议总是写这样的声明。但必须注意的是,像这样初始化变量具有隐含地赋予它们save属性的副作用。这对主程序没有影响,但重要的是要知道;你可以通过将初始化放在一个单独的行上来避免它。