我在Fortran中编写了2个程序,每个程序用于对某些参数进行一些计算。 在我加入他们之后,我遇到了一些错误。由于我缺乏Fortran的经验,我无法理解这些错误的原因。
以下是错误;
CC2=CUBEROOT(NN,wq)
1
Warning: Extension: REAL array index at (1)
growthrate_vs_Il2.f90:46.20:
CC2=CUBEROOT(NN,wq)
1
Warning: Extension: REAL array index at (1)
growthrate_vs_Il2.f90:46.16:
CC2=CUBEROOT(NN,wq)
1
Error: Rank mismatch in array reference at (1) (2/1)
growthrate_vs_Il2.f90:48.27:
call fsub(CC2,Delta0,b,z1,z2,z3)
1
Warning: Type mismatch in argument 'f1' at (1); passed COMPLEX(4) to COMPLEX(8)
代码:
program main
implicit none
integer::i,j
real*8,dimension(1000)::Il2,Il3,a0,omega,nominator,dominator,ff,lamda,kk,b,c,d
real*8,dimension(1000)::growth_rate,cb1,cb2
real*8,dimension(1000)::Il,Delta0, Delta1,m,CC,CC2,BB,mm,NN,wq
real*8::sumo,sumo2,a
real*8,parameter::mass_ratio=0.00870
complex*8,dimension(1000)::z1,z2,z3,f1,f2,f3
real*8,dimension(1000)::cuberoot
Il=0.0
Il2=0.0
sumo=0.0
a=1.0
do i=1,1000
Il(i)=sumo+0.1
omega(i) = 2.359*Il(i)
nominator=2-omega(i)
dominator=1-omega(i)
ff(i)=nominator(i)/dominator(i)
lamda(i)=sqrt(ff(i))
kk(i)=1/lamda(i)
Il2(i)=sumo2+0.001
a0(i) = 0.68*Il2(i)
b(i)=-(2.0+omega(i))
cb1(i)=2.0*omega(i)
cb2(i)=2.0*kk(i)*a0(i)*mass_ratio
c(i)=(1.0d0+cb1(i)-cb2(i))
d(i)=-(omega(i)+cc2(i))
sumo=Il(i)
sumo2=Il2(i)
end do
Delta0= (b**2)-(3*a*c)
Delta1= (2*(b**3))-(9*a*b*c)+(27*(a**2)*d)
m=(Delta0)**3
BB=(Delta1)**2
mm= BB-(4*m)
CC=sqrt(mm)
NN=(Delta1+CC)/2
CC2=CUBEROOT(NN,wq)
call fsub(CC2,Delta0,b,z1,z2,z3)
print*,'Delta0',Delta0,'Delta1',Delta1,'mm',mm,'CC2',CC2
print *, "Omega1_square= ",z1
print *, "Omega2_square= ",z2
print *, "Omega3_square= ",z3
end program
子程序和功能如下:
subroutine fsub(x,t,s,f1,f2,f3)
implicit none
integer::k
real(kind=8), intent(in),dimension(1000) :: x,t,s
complex(kind=8), intent(out),dimension(1000) :: f1,f2,f3
complex(kind=8),dimension(1000)::z1,z2,z3
z1=(1,0)
f1=(-1/3)*(s+(z1*x)+(t/(z1*x)))
z2=(-0.5,0.866)
f2=(-1/3)*(s+(z2*x)+(t/(z2*x)))
z3=(-0.5,-0.866)
f3=(-1/3)*(s+(z3*x)+(t/(z3*x)))
end subroutine fsub
real (kind=8) FUNCTION CUBEROOT (XX,cube_root)
IMPLICIT NONE
real(kind=8), INTENT(IN),dimension(1000) :: XX
Real*8,dimension(1000):: log_x
real(kind=8),Intent(out),dimension(1000) :: cube_root
log_x=LOG(XX)
cube_root=EXP(log_x/3.0)
RETURN
END FUNCTION CUBEROOT
答案 0 :(得分:1)
只是立即导致编译器报告错误的点的集合。我并不是说在修复这些程序后,程序将编译或运行正确。
kind=8
和*8
不一样。你很幸运他们为这个编译器的real
类型提供相同的东西,但它们不适用于复杂类型。请注意,complex*8
是单精度,complex(kind=8)
是编译器的双精度。但请注意,除*8
之外的其他类型的character
符号不是Fortran。它不是也从未成为任何Fortran标准的一部分。
在主代码中,您将函数cuberoot
定义为
real*8,dimension(1000)::cuberoot
首先,你的函数不返回一个数组(但也许它应该),所以它是错误的。其次,无论如何都不能以这种方式声明数组返回函数。将您的程序放入模块中,而不是如上所述声明类型。
您的函数CUBEROOT
错误。它没有返回任何东西。也许你想要像
FUNCTION CUBEROOT (XX)
real(kind=something_better_than_8),dimension(1000) :: CUBEROOT
real(kind=something_better_than_8), INTENT(IN),dimension(1000) :: XX
cuberoot = EXP(LOG(XX)/3) !or just XX**(-1._something_better_than_8/3) if that is what you wanted
END FUNCTION CUBEROOT
必须放在包含implicit none
的模块中。