Fortran错误 - 在需要过程时,尝试将参数编号为3的例程调用为实数(kind = 1)

时间:2014-01-16 02:43:53

标签: fortran

我有一个与各种子程序相关联的fortran项目,这些子程序是从主程序中调用的。使用模块传递变量。我可以编译代码而不会出现任何错误。当我运行代码时,在子程序调用期间我得到一个错误“当需要程序时,尝试调用参数编号为3的例程(kind = 1)。我不知道我哪里出错了。有人指点出错了吗?非常感谢你的帮助。当在循环中调用子程序'ncalc'时出现错误

program partbal

use const
use times
use density
use parameters
use rateconst
use ploss

implicit none

integer :: i
real :: nclp_init, ncl2p_init, ncln_init, ne_init
real :: ncl_init, ncl2_init, Te_init, neTe_init

open (10,file='in.dat')
read (10,*) 
read (10,*) pressure
read (10,*)
read (10,*) P, pfreq, duty
read (10,*)
read (10,*) nclp_init, ncl2p_init, ncln_init, Te_init, Ti

pi   = 3.14159265
R    = 0.043
L    = 0.1778
Al   = 2*pi*R*R
Ar   = 2*pi*R*L
V    = pi*R*R*L
S    = 0.066
e    = 1.6e-19
me   = 9.1e-31
mCl  = 35.5/(6.023e26)
mCl2 = 2*mCl
k    = 1.3806e-23
vi   = (3*Ti*e/(53.25/6.023e26))**0.5

ncl2_init    = pressure*0.1333/(1.3806e-23*298)/2
ncl_init     = ncl2_init
ne_init      = nclp_init + ncl2p_init - ncln_init

tot_time    =    1/(pfreq*1000)
off_time    =    duty*tot_time
npoints     =    10000
dt          =    tot_time/npoints

neTe_init   =    ne_init*Te_init

t_step = 0
call kcalc(Te_init)
call param(nclp_init, ncl2p_init, ncln_init, ne_init, ncl_init,ncl2_init, Te_init, Ti)

do i = 1, npoints, 1

t_step = i*dt + t_step
if (t_step > 0 .and. t_step <= 500) then
  Pabs = 500
else if (t_step > 500) then
  Pabs = 0
end if

if (i <= 1) then
    call ncalc(ne_init, ncl_init, ncl2_init, nclp_init, ncln_init, ncl2p_init)
    call powerloss(ne_init, ncl_init, ncl2_init, Pabs, neTe_init)
    Te = neTe/ne
    call kcalc(Te)
    call param(nclp, ncl2p, ncln, ne, ncl, ncl2, Te, Ti)
else 
    call ncalc(ne, ncl, ncl2, nclp, ncln, ncl2p)
    call powerloss(ne, ncl, ncl2, Pabs, neTe)
    Te = neTe/ne
    call kcalc(Te)
    call param(nclp, ncl2p, ncln, ne, ncl, ncl2, Te, Ti)  
end if


!open( 70, file = 'density.txt' )
!open( 80, file = 'Te.txt')
!do i = 1, 1001, 1
!  np(i) = ncl2p(i) + nclp(i)
!write (70, *) ncl(i), ncl2(i), ncl2p(i), nclp(i), np(i), ncln(i), ne(i)
!close(70)
!write (80, *) Te(i), phi(i)
!close(80)
!end do
end do

end program partbal

subroutine ncalc(n_e, n_cl, n_cl2, n_clp, n_cln, n_cl2p)

use parameters
use const
use density
use rateconst
use times

implicit none

real :: n_e, n_cl, n_cl2, n_clp, n_cln, n_cl2p

 nclp    =  (((kCliz*n_e*n_cl)+((kpair+kdisiz)*n_e*n_cl2)-(5e-14*n_clp*n_cln)-(S*n_clp/V)-((hlclp*Al+hrclp*Ar)*n_clp*ubclp))*dt)+n_clp
 ncl2p   =  (((kCl2iz*n_e*n_cl2)-(5e-14*n_cl2p*n_cln) - (((hlcl2p*Al + hrcl2p*Ar)*n_cl2p*ubcl2p)/V)-(S*n_cl2p/V))*dt)+n_cl2p
 ncln    =  ((((katt+kpair)*n_e*n_cl2)-(5e-14*n_clp*n_cln)-(5e-14*n_cl2p*n_cln)-(kdet*n_e*n_cln)-(S*n_cln/V)-(taun*(Al+Ar)/V))*dt)+n_cln
 ne      =  ncl2p+nclp-ncln
 ncl     =  ((((2*kdis+katt+kdisiz)*n_e*n_cl2)-(kCliz*n_e*n_cl)+(5e-14*n_cl2p *n_cln)+(2*5e-14*n_clp*n_cln)+ (kdet*n_e*n_cln) - (300*n_cl) + ((hlclp*Al + hrclp*Ar)*n_clp*ubclp/V)-(S*n_cl/V))*dt)+n_cl
 ncl2    =  ((n_cl2(1) + (5e-14*n_cl2p*n_cln) - ((kCl2iz+kdis+katt+kpair+kdisiz)*n_e*n_cl2) + (0.5*300*n_cl) + ((hlcl2p*Al + hrcl2p*Ar)*n_cl2p*ubcl2p/V)-(S*n_cl2/V))*dt)+n_cl2

return

end subroutine ncalc

1 个答案:

答案 0 :(得分:2)

在return语句之前的子例程ncalc中的行中,您在赋值语句的右侧很早就引用了n_cl2(1)n_cl2尚未声明为数组,因此编译器假定它必须是对带有单个默认整数参数的函数的引用。因为n_cl2是一个伪参数,所以它要求你在调用例程时为相应的实际参数提供一个函数。

(你的编译器如何设法编译前面对n_cl2的引用有点神秘 - 我怀疑这个错误违反了语法规则,因此你应该看到某种编译时诊断。)

鉴于您正在使用模块,您似乎没有将ncalc例程放在模块中。如果这样做,错误可能会成为编译时错误而不是运行时。