调试 Shell 矩阵

计算科学 线性代数 宠物
2021-12-10 13:25:23

我正在尝试解决复值泊松方程

(C+.D)u=f ;where C, D, u and f are complex numbers.

我将这个 eqn 分解为真正有价值的问题,其形式为

(Cr+.DrCi.DiCi+.DiCr+.Dr)A(urui)=(frfi)

其中“r”和“i”分别表示实部和虚部。A我通过定义 MAT和 Vec编写了一个 Preconditioner (PC),它具有与上述方程相同的形式。我通过求解上述方程作为示例验证了 PC 工作正常。我还定义了一个壳矩阵算子,它计算A算子对向量的作用,并用 ksp 注册壳矩阵和 PC。当我尝试使用壳矩阵和 PC 解决方程时,我得到了错误的解决方案。我正在使用 Dirichlet 边界条件(bcs)urui和齐次 bcs 用于传递给 PC 的残差方程。作为我-ksp_type preonly对 PC 版 Dirichlet bcs 所做的健全性检查,我确实得到了正确的解决方案。PC 和 Shell 矩阵的 ksp 均为gmres.

关于可能出现问题的任何建议?

1个回答

运行-ksp_monitor_true_residual残差会归零吗?如果是这样,那么矩阵的定义是不正确的(或者右手边或者你的“正确”的意思)。如果它不收敛,请尝试一个小的条件良好的情况,-pc_type none以排除预处理器中的错误。如果问题出在预条件子中,请尝试-ksp_type fgmres查看预条件子是否是非线性的(当 GMRES 不收敛时,FGMRES 通常意味着预条件子是非线性的)。

编辑:还有几件事要尝试:

  1. 通过设置“正确的解决方案”来检查矩阵乘法是否正确x, 然后计算bAx,然后求解Ay=b. 如果x=y,矩阵乘法可能是正确的。

  2. 将真实残差与 中的预条件残差进行比较-ksp_monitor_true_residual它们相似吗?尝试相同的-ksp_norm_type unpreconditioned.