首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Fortran错误-当需要过程时,尝试将参数编号为3的例程作为实数(kind =1)调用

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

Stack Overflow用户
提问于 2014-01-16 10:43:53
回答 1查看 966关注 0票数 0

我有一个链接到各个子例程的fortran项目,这些子例程是从主程序中调用的。使用模块传递变量。我可以编译代码,没有任何错误。当我运行代码的时候,在子例程调用的过程中,我得到了一个错误“当需要过程时,试图调用一个带参数3的例程作为实数(kind =1)。我不确定我在哪里出错了。有人能指出错误吗?非常感谢你的帮助。当在循环内调用子例程'ncalc‘时,就会出现错误

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2014-01-16 14:14:14

在紧接返回语句之前的子例程ncalc中的行中,在赋值语句的右侧非常早的地方引用了n_cl2(1)n_cl2没有声明为数组,因此编译器假定它必须是对接受单个默认整数参数的函数的引用。因为n_cl2是一个伪参数,所以当调用例程时,它希望您为相应的实际参数提供一个函数。

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

考虑到您正在使用模块,您没有将ncalc例程放在模块中似乎很奇怪。如果这样做,错误可能会变成编译时错误,而不是运行时错误。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21152445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档