2014-01-16 36 views
0

我有一個fortran項目鏈接到各種子例程,這些子例程在主程序中調用。變量使用模塊傳遞。我可以編譯沒有任何錯誤的代碼。當我運行代碼的時候,在子程序調用過程中,我得到一個錯誤「試圖在程序需要時嘗試調用第三個參數的例程作爲真正的(kind = 1),我不確定我要去哪裏錯誤。出了錯誤?你的幫助是非常讚賞。該錯誤出現時子程序「ncalc」被稱爲環Fortran錯誤 - 嘗試在需要過程時嘗試使用參數3調用實例(kind = 1)

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

您有一些長度超過132個字符的行。這違反了標準,可能會導致令人費解的問題。 –

回答

2

內部在子程序線ncalc立即返回語句之前,你必須n_cl2(1)參考n_cl2還沒有被聲明爲一個數組,因此編譯器假定它必須是一個函數的引用,它接受一個默認的整數參數。因爲n_cl2是一個啞元參數,它然後期望您提供一個函數調用例程時相應的實際參數。

(你的編譯器如何設法編譯成n_cl2前面引用是一個有點神祕 - 我懷疑這個錯誤違反了語法規則,因此你應該看到某種編譯時診斷。)

給你正在使用模塊,你還沒有將ncalc例程放在模塊中,這似乎很奇怪。如果你這樣做,錯誤可能會成爲編譯時錯誤,而不是運行時。

相關問題