Unclassifiable statement at (1) in Fortran

1.4k views Asked by At

I am pretty new to to fortran and I don't really know why am I getting this error.

integrand(i)=inte(x(i),beta,r2,r1)
      1 Error: Unclassifiable statement at (1) calka11.f95:97.6:

I have made all the variables into a module file and then call them using

use 

and when I am getting those variables into the code file again It works fluently again.

    module zmienne
     real(10) :: r, u, r6, tempred, f, r2, r1, calka,beta
     real(10) :: inte
     real :: start, finish
     integer:: i
     integer, parameter :: Ngauss = 8
     real(10),dimension(ngauss),parameter::xx=(/-0.9602898565d0,&
     -0.7966664774d0,-0.5255324099d0,-0.1834346425d0,&
     0.1834346425d0,0.5255324099d0,0.7966664774d0,0.9602898565d0/)
     real(10),Dimension(ngauss),parameter::ww=(/0.1012285363d0,&
     0.2223810345d0,0.3137066459d0,0.3626837834d0,&
     0.3626837834d0,0.3137066459d0,0.2223810345d0,0.1012285363d0/)
     real(10),dimension(ngauss)::x,w,integrand
     integer, parameter :: out_unit=1000
     integer, parameter :: out_unit1=1001
     integer, parameter :: out_unit2=1002, out_unit3=1003
     real(10), parameter :: error=0.000001
     real(10):: total_calka, division,tot_old,blad
     real(10),parameter:: intrange=7.0
     integer::j,irange
   end module zmienne

The main program that uses the module:

program wykres
 use zmienne
 implicit none
 open(unit=out_unit, file='wykresik.dat', action='write', status='replace')
 open(unit=out_unit1, file='wykresik1.dat', action='write')
 open(unit=out_unit2, file='wykresik2.dat', action='write')
 open(out_unit3, file='wykresik3.dat', action='write')

! the gaussian points (xx) and weights (ww) are for the [-1,1] interval
! for [0,1] interval we have (vector instr.)
     x=0.5d0*(xx+1.0d0)
     w=0.5d0*ww
! plots 
   tempred = 1.0
   beta=4.d0/tempred
   call cpu_time(start)
 do i=1,1000
    r=float(i)*0.01
    r6=(1.0/r)**6
    u=beta*r6*(r6-1.0)
    f=exp(-u/tempred)-1.0
    write(out_unit,*) r, u
    write(out_unit1,*)r, f
    write(out_unit2,*)r, r*r*f
end do
   call cpu_time(finish)
 print '("Time = ",f6.3," seconds.")',finish-start
! end of plots
! integration  1
 calka=0.0
 r1=0.0
 r2=0.5
    do i=1,ngauss
    r=(r2-r1)*x(i)+r1
    r6=(1.0/r)**6
    u=beta*r6*(r6-1.0d0)
! check for underflows
    if (u>100.d0) then 
    f=-1.0d0 
    else
    f=exp(-u)-1.d0 
    endif
! the array integrand is introduced in order to perform vector calculations below
    integrand(i)=r*r*f
    calka=calka+integrand(i)*w(i)
    enddo
    calka=calka*(r2-r1)

    write(*,*)calka
! end of integration    

! integration 2
  calka=0.0    
     do i=1,ngauss
     integrand(i)=inte(x(i),beta,r2,r1)
     calka=calka+integrand(i)*w(i)
     enddo
     calka=calka*(r2-r1)
! end of integration 2    
    write(*,*)calka

! vector integration  and analytical result  
    write(*,*)sum(integrand*w*(r2-r1)),-(0.5**3)/3.0

!**************************************************************



! tot_calka - the sum of integrals all integration ranges    
! dividion the initial length of the integration intervals    
!  tot_old - we will compare the results fro two consecutive divisions.
! at the beginning we assume any big number
!  blad - the difference between two consecutive integrations,
! at the beginning we assume any big number
! error - assumed precission, parameter, it is necassary for
! performing do-while loop 
    total_calka=0.0
    division=0.5
    tot_old=10000.0
    blad=10000.0
    do while (blad>error)
! intrange - the upper integration limit, it should be estimated
!  analysing the plot of the Mayer function. Here - 7.
! irange = the number of subintegrals we have to calculate
    irange=int(intrange/division)
    total_calka=-(0.5**3)/3.0
!   the analytical result for the integration range [0,0.5]

! the loop over all the intervals, for each of them we calculate 
! lower and upper limits, r1 and r2
    do j=1,irange
    r1=0.5+(j-1)*division
    r2=r1+division
    calka=0.0
! the integral for a given interval   
    do i=1,ngauss
      integrand(i)=inte(x(i),beta,r2,r1)
     calka=calka+integrand(i)*w(i) 
    enddo
    total_calka=total_calka+calka*(r2-r1)
    enddo
! aux. output: number of subintervals, old and new integrals
        write(*,*) irange,division,tot_old,total_calka
    division=division/2.0
    blad=abs(tot_old-total_calka)
    tot_old=total_calka
! and the final error
       write(*,*) blad
    enddo

   open(1,file='calka.dat', access='append')
! the secod viarial coefficient=CONSTANT*total_calka, 
! CONSTANT is omitted here
   write(1,*)tempred,total_calka
   close(1)
end program wykres

I also made the external to this real function and it gives me an error for every variable in the module. It looks like that for example

undefined reference to `__zmienne_MOD_total_calka'

Inte is a real defined variable, which is necessary for me to calculate this integral.

integrand(i)=inte(x(i),beta,r2,r1)

Why it doesn't work when it's in another file, while it was working while its been inside it. That's weird

This is the original code:

program wykres
 implicit none

 real(10) :: r, u, r6, tempred, f, r2, r1, calka,beta
! beta - an auxiliary variable
 real(10) :: inte
! inte - the function defined below
 real :: start, finish
 integer:: i
 integer, parameter :: Ngauss = 8
 real(10),dimension(ngauss),parameter::xx=(/-0.9602898565d0,&
 -0.7966664774d0,-0.5255324099d0,-0.1834346425d0,&
 0.1834346425d0,0.5255324099d0,0.7966664774d0,0.9602898565d0/)
 real(10),Dimension(ngauss),parameter::ww=(/0.1012285363d0,&
 0.2223810345d0,0.3137066459d0,0.3626837834d0,&
 0.3626837834d0,0.3137066459d0,0.2223810345d0,0.1012285363d0/)
 real(10),dimension(ngauss)::x,w,integrand
 integer, parameter :: out_unit=1000
 integer, parameter :: out_unit1=1001
 integer, parameter :: out_unit2=1002, out_unit3=1003
 real(10), parameter :: error=0.000001
 real(10):: total_calka, division,tot_old,blad
 real(10),parameter:: intrange=7.0
 integer::j,irange

 open(unit=out_unit, file='wykresik.dat', action='write', status='replace')
 open(unit=out_unit1, file='wykresik1.dat', action='write')
 open(unit=out_unit2, file='wykresik2.dat', action='write')
 open(out_unit3, file='wykresik3.dat', action='write')

! the gaussian points (xx) and weights (ww) are for the [-1,1] interval
! for [0,1] interval we have (vector instr.)
     x=0.5d0*(xx+1.0d0)
     w=0.5d0*ww

! plots 
   tempred = 1.0
   call cpu_time(start)
 do i=1,1000
    r=float(i)*0.01
    r6=(1.0/r)**6
    u=4.0d0*r6*(r6-1.0)
    f=exp(-u/tempred)-1.0
    write(out_unit,*) r, u
    write(out_unit1,*)r, f
    write(out_unit2,*)r, r*r*f
end do
   call cpu_time(finish)
 print '("Time = ",f6.3," seconds.")',finish-start
! end of plots

! integration  1
 calka=0.0
 r1=0.0
 r2=0.5
! auxiliary variable
 beta=4.d0/tempred
    do i=1,ngauss
    r=(r2-r1)*x(i)+r1
    r6=(1.0/r)**6
    u=beta*r6*(r6-1.0d0)
! check for underflows
    if (u>100.d0) then 
    f=-1.0d0 
    else
    f=exp(-u)-1.d0 
    endif
! the array integrand is introduced in order to perform vector calculations below
    integrand(i)=r*r*f
    calka=calka+integrand(i)*w(i)
    enddo
    calka=calka*(r2-r1)
    write(*,*)calka
! end of integration    

! integration 2
  calka=0.0    
     do i=1,ngauss
     integrand(i)=inte(x(i),beta,r2,r1)
     calka=calka+integrand(i)*w(i)
     enddo
     calka=calka*(r2-r1)
! end of integration 2    
    write(*,*)calka

! vector integration  and analytical result  
    write(*,*)sum(integrand*w*(r2-r1)),-(0.5**3)/3.0

!**************************************************************



! tot_calka - the sum of integrals all integration ranges    
! dividion the initial length of the integration intervals    
!  tot_old - we will compare the results fro two consecutive divisions.
! at the beginning we assume any big number
!  blad - the difference between two consecutive integrations,
! at the beginning we assume any big number
! error - assumed precission, parameter, it is necassary for
! performing do-while loop 
    total_calka=0.0
    division=0.5
    tot_old=10000.0
    blad=10000.0
    do while (blad>error)
! intrange - the upper integration limit, it should be estimated
!  analysing the plot of the Mayer function. Here - 7.
! irange = the number of subintegrals we have to calculate
    irange=int(intrange/division)
    total_calka=-(0.5**3)/3.0
!   the analytical result for the integration range [0,0.5]

! the loop over all the intervals, for each of them we calculate 
! lower and upper limits, r1 and r2
    do j=1,irange
    r1=0.5+(j-1)*division
    r2=r1+division
    calka=0.0
! the integral for a given interval   
    do i=1,ngauss
      integrand(i)=inte(x(i),beta,r2,r1)
     calka=calka+integrand(i)*w(i) 
    enddo
    total_calka=total_calka+calka*(r2-r1)
    enddo
! aux. output: number of subintervals, old and new integrals
        write(*,*) irange,division,tot_old,total_calka
    division=division/2.0
    blad=abs(tot_old-total_calka)
    tot_old=total_calka
! and the final error
       write(*,*) blad
    enddo

   open(1,file='calka.dat', access='append')
! the secod viarial coefficient=CONSTANT*total_calka, 
! CONSTANT is omitted here
   write(1,*)tempred,total_calka
   close(1)
end program wykres

Jesus christ, there were a code below the end program... Thread may be closed now. Thank you to everyone.

real(kind=10) function inte(y,beta,r2,r1)
     implicit none

     real(kind=10)::r,beta,r6,r2,r1,u,y

     r=(r2-r1)*y+r1
     r6=(1.0/r)**6
     u=beta*r6*(r6-1.0d0)
         if (u>100.d0) then 
    inte=-1.0d0 
    else
    inte=exp(-u)-1.d0 
    endif
    inte=r*r*inte
    end
1

There are 1 answers

2
Vladimir F Героям слава On BEST ANSWER
real(10) :: inte

is not just a real scalar variable of kind 10, whatever that kind means for your compiler. (For gfortran kind 10 is the x87 extended precision, for many other compilers it is invalid.)

When you then do

integrand(i)=inte(x(i),beta,r2,r1)

it makes no sense to index a scalar.

If inte was meant to be an external function returning a real of kind 10, you should declare it as

real(10), external :: inte

or much better write a complete interface block for it.