使用实数作为数组索引的替代方法

时间:2019-04-24 04:26:45

标签: fortran gfortran

我想求解薛定inger时间相关方程。在我的代码中,我引入了两个数组,分别是yc和yr,用于wavefunction的复数和实数部分。后来我尝试使用yc(x(i),t(j))函数的形式将值以y(x,t)的形式存储在数组中。警告显示我正在使用real作为数组的索引。我知道问题出在哪里,但出路是什么?我可以定义一个可以在程序中谨慎分配其值的函数,以替代该数组吗?

我在Google上搜索此问题,找不到任何解决方案。

function v(x) result(s)
real::s,x
if (x<0) then
s=0
else
s=1
end if
end function v

real::t(10000),x(10000),yc(10000,10000),yr(10000,10000),tf,xi,xf,d
integer::i,j,k,l,m
write(*,*) "tf,xi,xf,step size"
read(*,*) tf,xi,xf,d

x(1)=xi
t(1)=0

i=1
1   if(x(i).lt.xf) then
x(i+1)=x(i)+d
i=i+1
goto 1
end if


do j=1,i
yr(x(j),0)=exp(-x(j)**2)             !initial wavefunction
yc(x(j),0)=0
end do

do l=1,i
k=1
3    if(t(k).lt.tf) then


yr(x(l),t(k+1))=yr(x(l),t(k))-(yc(x(l)+2*d,t(k))-2*yc(x(l)+d,t(k))+yc(x(l),t(k)))/d&
+v(x(l))*yc(x(l),t(k))*d

yc(x(l),t(k+1))=yc(x(l),t(k))+(yr(x(l)+2*d,t(k))-2*yr(x(l)+d,t(k))+yr(x(l),t(k)))/d&
-v(x(l))*yr(x(l),t(k))*d

k=k+1
goto 3

end if
end do



open(1,file="q.dat")
do m=1,i
write(1,*) x(m),yr(x(m),t(1))**2+yc(x(m),t(1))**2
end do
close(1)

end










 expected result :$ yi(x,t)^2+yc(x,t)^2  versus x at different t
obtained error : 
 yr(x(j),0)=exp(-x(j)**2)             !initial wavefunction
   1
Warning: Legacy Extension: REAL array index at (1)
schrodinger.f90:27:8:

 yr(x(j),0)=exp(-x(j)**2)             !initial wavefunction
        1
Warning: Array reference at (1) is out of bounds (0 < 1) in dimension 2
schrodinger.f90:28:3:    and so on`enter code here`

I have googled how to use real as index but no use .

function v(x) result(s)
real::s,x
if (x<0) then
s=0
else
s=1
end if
end function v

real::t(10000),x(10000),yc(10000,10000),yr(10000,10000),tf,xi,xf,d
integer::i,j,k,l,m
write(*,*) "tf,xi,xf,step size"
read(*,*) tf,xi,xf,d

x(1)=xi
t(1)=0

i=1
1   if(x(i).lt.xf) then
x(i+1)=x(i)+d
i=i+1
goto 1
end if


do j=1,i
yr(x(j),0)=exp(-x(j)**2)             !initial wavefunction
yc(x(j),0)=0
end do

do l=1,i
k=1
3    if(t(k).lt.tf) then
yr(x(l),t(k+1))=yr(x(l),t(k))-(yc(x(l)+2*d,t(k))-2*yc(x(l)+d,t(k))+yc(x(l),t(k)))/d&
+v(x(l))*yc(x(l),t(k))*d

yc(x(l),t(k+1))=yc(x(l),t(k))+(yr(x(l)+2*d,t(k))-2*yr(x(l)+d,t(k))+yr(x(l),t(k)))/d&
-v(x(l))*yr(x(l),t(k))*d

k=k+1
goto 3

end if
end do



open(1,file="q.dat")
do m=1,i
write(1,*) x(m),yr(x(m),t(1))**2+yc(x(m),t(1))**2
end do
close(1)

end

预期:在不同时间具有wave函数的数据文件。

获得:警告-使用实数作为索引

1 个答案:

答案 0 :(得分:2)

只需使用整数ij等引用您的数组。如果您有x(i),t(j),则yr(i,j)是相应的值。要获取+2*d等的偏移量,您只需要使用+2即可。例如yr(l+2,k)而不是yr(x(l)+2*d,t(k))

另外,请使用implicit none作为开始,并获取最新的Fortran参考书或类似书籍。所有这些go to的眼睛都有点硬。