альтернативы использования реального в качестве индекса массива - PullRequest
0 голосов
/ 24 апреля 2019

Я хочу решить уравнение Шредингера, зависящее от времени.В своем коде я ввел два массива, а именно yc и yr, для сложной и реальной части волновой функции.Позже я попытался сохранить значения в массиве в формате yc(x(i),t(j)) как функцию 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

ожидаемое: данныефайлы с волновой функцией в разное время.

получено: предупреждение - использование вещественных индексов

1 Ответ

2 голосов
/ 24 апреля 2019

Просто укажите ваши массивы, используя целые числа i, j и т. Д. Если у вас есть x(i),t(j), тогда yr(i,j) соответствует соответствующему значению. Чтобы получить смещения +2*d и т. Д., Вам нужно всего лишь использовать +2. например yr(l+2,k) вместо yr(x(l)+2*d,t(k)).

Также, пожалуйста, используйте implicit none для начала и получите современный справочник Фортрана или аналогичный. Все эти go to немного неприятны для глаз.

...