嗨我有一个代码,可以解决非线性耦合PDE问题。但是我需要实现周期性边界条件。周期性的边界条件让我感到困扰,我应该在代码中添加什么来强制执行周期性边界条件?基于下面的模块化算术建议进行了更新。
注意,t> = 0且x在区间[0,1]中。这是耦合方程式,下面是我提供的代码
其中a,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 :(得分:2)
PDE离散化中的边界条件的一个选项是使用重影(晕)单元(网格点)。对于周期性BC,它可能不是最聪明的,但它可以用于所有其他边界条件类型。
所以你将数组声明为
real, dimension(-1:n) :: u,v,w,f,g,d
但是你只能在0..n-1点解决你的PDE(点n与点0相同)。您也可以从1..n开始,并声明数组形式为0..n + 1.
然后你设置
u(-1) = u(n-1)
和
u(n) = u(0)
和所有其他阵列相同。
在每个时间步骤中,您再次为u
和f
或解决方案中修改的所有其他字段设置此内容:
do m=1,A
u(-1) = u(n-1)
u(n) = u(0)
f(-1) = f(n-1)
f(n) = f(0)
do i=0,n-1 !Discretization equation for all times after the 1st step
u(i)=...
f(i)=...
end do
end do
以上都假设显式时间离散化和具有有限差异的空间离散化,并假设x(0) = 0
和x(n) = 1
是您的边界点。