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

alternatives of using real as array index

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

我已经用谷歌搜索了,找不到任何解决方案。

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

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

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

只需使用整数 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 都让眼睛有些难看。