主题:[讨论]可以这样直接进行复数的运算吗?
在下面一段程序中,等号右边使用的数组和变量都为己经赋好实际值的双精度型,程序思路是将DD1得到一个复数值,然后将其实部和虚部的值分别赋于D1和D2,除了一开始声明的复数变量,其它变量都为双精度变量。程序编译和运行是没有错误的,但得到的结果与matlab原程序的结果相差较大,(这段程序是主程序中的一段子程序,如果直接将DD1直接赋予一个确定复数的话,跟matlab相应结果比较几乎是没有误差的,所以原因在于DD1没有得到matlab原程序中的复数值),大家帮忙看下这段程序是不是有些地方少声明复数变量还是什么的,我觉得搞不好是因为fortran与matlab在双精度计算方面的差异造成了,因为程序中引用的数组变量都是1e-7这个数量级的。([color=808080][size=4][size=2][color=FFFF00][color=808000]这个格式看着太晕了,下面这段程序附件里也有[/color][/color][/size][/size][/color])
complex(8) meanphase(2),DD1(2)
complex(8) expphases0,curbeam,pi,IA,c,vz0
complex(8) anzsum,meanphasen0,primesum,i1
complex(8) anzsum1(64),meanphasen(10),expphase(10),primesum1(64)
i1=(0,1.0)
nw1=2
do 11,m2=1,nw1
w1(m2)=2*pi*freq0*m2
kzn0(m2)=w1(m2)/bp_in(m2)
11 continue
Npt=64
do 20,m3=1,nw1
if (m3.eq.2) factor1=1.8
expphases0=0
do 30,j2=1,Npt
expphases0=expphases0+(-i1*Y(nw1+Npt+j2+2)+Y(nw1+Npt+Npt+j2+2))**m3
30 continue
meanphase(m3)=expphases0/Npt
kzn(m3)=kzn0(m3)
z_in(m3)=z_in0(m3)
if ((t.GE.0).AND.(t.LT.NumsATT1)) then
alphaATT(m3)=factor*factor1*0.31/8.686
else if ((t.GE.NumsATT1).AND.(t.LT.NumeATT1)) then
alphaATT1add(m3)=(15.8-0.31)/((NumeATT1-NumsATT1)*8.686)*(t-NumsATT1)*m3**(f_scale)
alphaATT(m3)=factor*factor1*(0.31/8.686+alphaATT1add(m3))
else if ((t.GE.Numposition1(1)).AND.(t.LT.Numposition2(1))) then
alphaATTsadd(m3)=78D0/8.686D0*m3**(f_scale)
alphaATT(m3)=factor*factor1*(0.31/8.686+alphaATTsadd(m3))
else if ((t.GE.NumsATT2).AND.(t.LT.NumeATT2)) then
alphaATT2add(m3)=(0.267D0-8.56D0)/((NumeATT2-NumsATT2)*8.686)*(t-NumeATT2)*m3**(f_scale)
alphaATT(m3)=factor*factor1*(0.267/8.686+alphaATT2add(m3))
else if((t.GE.NumeATT2).AND.(t.LE.zint)) then
alphaATT(m3)=factor*factor1*0.267D0/8.686D0
end if
if(m3.eq.1) then
DD1(m3)=-alphaATT(m3)*Y(1)+2*pi*i1*curbeam/IA*conjg(kzn(m3)*sqrt(z_in(m3)/(9*1E011)*c/(4*pi)) *exp(i1*t*(kzn(m3)-w1(m3)/vz0)))*meanphase(m3)
D1(1)=real(DD1(m3))
D1(2)=AIMAG(DD1(m3))
end if
if(m3.eq.2) then
DD1(m3)=-alphaATT(m3)*Y(3)+2*pi*i1*curbeam/IA*conjg(kzn(m3)*sqrt(z_in(m3)/(9*1E011)*c/(4*pi)) *exp(i1*t*(kzn(m3)-w1(m3)/vz0)))*meanphase(m3)
D1(3)=real(DD1(m3))
D1(4)=AIMAG(DD1(m3))
end if[em10][em10][em10]
complex(8) meanphase(2),DD1(2)
complex(8) expphases0,curbeam,pi,IA,c,vz0
complex(8) anzsum,meanphasen0,primesum,i1
complex(8) anzsum1(64),meanphasen(10),expphase(10),primesum1(64)
i1=(0,1.0)
nw1=2
do 11,m2=1,nw1
w1(m2)=2*pi*freq0*m2
kzn0(m2)=w1(m2)/bp_in(m2)
11 continue
Npt=64
do 20,m3=1,nw1
if (m3.eq.2) factor1=1.8
expphases0=0
do 30,j2=1,Npt
expphases0=expphases0+(-i1*Y(nw1+Npt+j2+2)+Y(nw1+Npt+Npt+j2+2))**m3
30 continue
meanphase(m3)=expphases0/Npt
kzn(m3)=kzn0(m3)
z_in(m3)=z_in0(m3)
if ((t.GE.0).AND.(t.LT.NumsATT1)) then
alphaATT(m3)=factor*factor1*0.31/8.686
else if ((t.GE.NumsATT1).AND.(t.LT.NumeATT1)) then
alphaATT1add(m3)=(15.8-0.31)/((NumeATT1-NumsATT1)*8.686)*(t-NumsATT1)*m3**(f_scale)
alphaATT(m3)=factor*factor1*(0.31/8.686+alphaATT1add(m3))
else if ((t.GE.Numposition1(1)).AND.(t.LT.Numposition2(1))) then
alphaATTsadd(m3)=78D0/8.686D0*m3**(f_scale)
alphaATT(m3)=factor*factor1*(0.31/8.686+alphaATTsadd(m3))
else if ((t.GE.NumsATT2).AND.(t.LT.NumeATT2)) then
alphaATT2add(m3)=(0.267D0-8.56D0)/((NumeATT2-NumsATT2)*8.686)*(t-NumeATT2)*m3**(f_scale)
alphaATT(m3)=factor*factor1*(0.267/8.686+alphaATT2add(m3))
else if((t.GE.NumeATT2).AND.(t.LE.zint)) then
alphaATT(m3)=factor*factor1*0.267D0/8.686D0
end if
if(m3.eq.1) then
DD1(m3)=-alphaATT(m3)*Y(1)+2*pi*i1*curbeam/IA*conjg(kzn(m3)*sqrt(z_in(m3)/(9*1E011)*c/(4*pi)) *exp(i1*t*(kzn(m3)-w1(m3)/vz0)))*meanphase(m3)
D1(1)=real(DD1(m3))
D1(2)=AIMAG(DD1(m3))
end if
if(m3.eq.2) then
DD1(m3)=-alphaATT(m3)*Y(3)+2*pi*i1*curbeam/IA*conjg(kzn(m3)*sqrt(z_in(m3)/(9*1E011)*c/(4*pi)) *exp(i1*t*(kzn(m3)-w1(m3)/vz0)))*meanphase(m3)
D1(3)=real(DD1(m3))
D1(4)=AIMAG(DD1(m3))
end if[em10][em10][em10]