Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
491 views
in Technique[技术] by (71.8m points)

gcc - Ambiguous reference to variable

So I am doing 2 modules which are linking to the main program. The first one has all the variables defined in it and the second one is with the functions.

Module1:

module zmienne
 implicit none
 integer, parameter :: ngauss = 8
 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
  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) :: r, u, r6, tempred, f, r2, r1, calka,beta
 real(10) :: inte
 real :: start, finish
 integer:: i,j,irange
 real(10),dimension(ngauss)::x,w,integrand         
 end module zmienne

Module2

module in
  implicit none
  contains
     real(10) function inte(y,beta,r2,r1)
     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 function
end module in

And while im calling them like that:

use zmienne; use in

I am getting following error:

Name 'inte' at (1) is an ambiguous reference to 'inte' from module 'zmienne'

I've deleted "inte" in the module1 but now I am getting following error:

irange=inte(intrange/division)
           1
Error: Missing actual argument for argument 'beta' at (1)

The main program code is:

 program wykres
 use zmienne; use in
 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
   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=inte(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
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

The inte is declared in both modules.

Upd. The inte(y,beta,r2,r1) function is defined in the module in, and is used in the main program. This function requires four arguments, but this call

irange=inte(intrange/division)

provides only one argument. I'm not sure if this function should be used in this case. Try to use long meaningful names for variables and functions to avoid similar issues.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...