Привет, у меня есть код ниже, который решает нелинейно связанные PDE. Однако мне нужно реализовать периодические граничные условия. Периодические граничные условия беспокоят меня, что я должен добавить в свой код, чтобы обеспечить соблюдение периодических граничных условий? Обновлено на основе приведенных ниже модульных арифметических предложений.
Обратите внимание, t>=0 и x находится в интервале [0,1]. Вот связанные уравнения, ниже я привожу свой код
где а, b > 0.
Это начальные условия, но теперь мне нужно наложить периодические граничные условия. Математически их можно записать как u(0,t)=u(1,t) и du(0,t)/dx=du(1,t)/dx, то же самое верно для f(x,t). du/dx, которые у меня есть для граничных условий, на самом деле должны быть частными производными.
Мой код ниже
program coupledPDE
integer, parameter :: n = 10, A = 20
real, parameter :: h = 0.1, k = 0.05
real, dimension(0:n-1) :: u,v,w,f,g,d
integer:: i,m
real:: t, R, x,c1,c2,c3,aa,b
R=(k/h)**2.
aa=2.0
b=1.0
c1=(2.+aa*k**2.-2.0*R)/(1+k/2.)
c2=R/(1.+k/2.)
c3=(1.0-k/2.)/(1.0+k/2.)
c4=b*k**2./(1+k/2.)
do i = 0,n-1 !loop over all space points except 0 and n
x = real(i)*h
w(i) = z(x) !u(x,0)
d(i) = z(x) !f(x,0)
end do
do i=0,n-1
ip=mod(i+1,n)
il=modulo(i-1,n)
v(i) = (c1/(1.+c3))*w(i) + (c2/(1.+c3))*(w(ip)+w(il)) -(c4/(1.+c3))*w(i)*((w(i))**2.+(d(i))**2.) !\partial_t u(x,0)=0
g(i) = (c1/(1.+c3))*d(i) + (c2/(1.+c3))*(d(ip)+d(il)) -(c4/(1.+c3))*d(i)*((w(i))**2.+(d(i))**2.) !\partial_t f(x,0)=0
end do
do m=1,A
do i=0,n-1
ip=mod(i+1,n)
il=modulo(i-1,n)
u(i)=c1*v(i)+c2*(v(ip)+v(il))-c3*w(i)-c4*v(i)*((v(i))**2.+(g(i))**2.)
f(i)=c1*g(i)+c2*(g(ip)+g(il))-c3*d(i)-c4*g(i)*((v(i))**2.+(g(i))**2.)
end do
print*, "the values of u(x,t+k) for all m=",m
print "(//3x,i5,//(3(3x,e22.14)))",m,u
do i=0,n-1
w(i)=v(i)
v(i)=u(i)
d(i)=g(i)
t=real(m)*k
x=real(i)*k
end do
end do
end program coupledPDE
function z(x)
real, intent(in) :: x
real :: pi
pi=4.0*atan(1.0)
z = sin(pi*x)
end function z
Спасибо за чтение, если я должен переформатировать свой вопрос более правильным образом, пожалуйста, дайте мне знать.
0,h,2h,...,1-h
, а затем использовать простую арифметику по модулю для сдвига индексов. О периодических границах заботятся автоматически. Еще лучше было бы использовать целые массивы и функциюCSHIFT
. - person RussF   schedule 10.03.2016v[0:n-1]
и т. д. В ваших циклах вычислитеip=mod(i+1,n)
и замените ссылки наi+1
наip
. Аналогично дляi-1
. Если вы определяете свои циклы какdo i = 0,n-1
, все обрабатывается естественным образом. Если вам действительно нужно значение x=1, просто скопируйте значение x=0 после циклаi
. - person RussF   schedule 10.03.2016do i=0,n
, а неdo i=0,n+1
- person RussF   schedule 10.03.2016modulo
дляi-1
, а неmod
. Вы не обновляетеv
,w
,g
илиd
, поэтому ничего не изменится. - person RussF   schedule 10.03.2016