我写了一个代码来求解二维泊松方程,其中到处都是齐次的狄利克雷 BC,源项为 -1。我正在使用经典的 Jacobi 迭代方法。网格是, 并且所有的数组都是从 0 开始的。
该代码使用 5 点模板(2阶有限差分法)。使用这个模板,代码循环所有内部点(即从到在里面方向),而边界点永远不会被触及。
但是,当使用 9 点模板时,代码会出现差异,4阶中心差分法。同样,仅迭代内部点。由于离散化在每侧使用两个点,因此我使用一阶近似值推断边界点(鬼点),即.
我必须在边界附近使用特殊的离散化方法吗?我可以使用非对称有限差分方案,但我希望我的方法(带有鬼点)能够工作。下面是我的代码示例。对于这种情况,网格是等距的(,或者在代码中)。
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
! Jacobi scheme
if(method_order == second_order) then
! 2nd order method: 5 points stencil
do jj=min_y,max_y
do ii=min_x,max_x
Ujacob(ii,jj) = 0.25_dp &
& * (Uold(ii-1,jj) + Uold(ii+1,jj) + Uold(ii,jj-1) + Uold(ii,jj+1) &
& - h(1)**2 * Urhs(ii,jj))
end do
end do
else if(method_order == fourth_order) then
! Fill buffer points
Ujacob( -1, 0:grid_ny-1) = -Ujacob( 1, 0:grid_ny-1)
Ujacob(grid_nx, 0:grid_ny-1) = -Ujacob(grid_nx-2, 0:grid_ny-1)
Ujacob(0:grid_nx-1, -1) = -Ujacob(0:grid_nx-1, 1)
Ujacob(0:grid_nx-1, grid_ny) = -Ujacob(0:grid_nx-1, grid_ny-2)
! 4th order method: 9 points stencil
do jj=min_y,max_y
do ii=min_x,max_x
Ujacob(ii,jj) = 1./60._dp &
& *(-1._dp * (Uold(ii-2,jj) + Uold(ii+2,jj) + Uold(ii,jj-2) + Uold(ii,jj+2)) &
& + 16._dp * (Uold(ii-1,jj) + Uold(ii+1,jj) + Uold(ii,jj-1) + Uold(ii,jj+1)) &
& - 12._dp * h(1)**2 * Urhs(ii,jj))
end do
end do
end if
编辑:
按照 Wolfgang 的建议,我通过镜像边界旁边发生的事情来填充我的幽灵点。但是,这无济于事,代码仍然存在分歧。