[petsc-users] Solve Linear System with Field Split Preconditioner

Jed Brown jed at jedbrown.org
Sun Sep 25 23:16:07 CDT 2022

```The usual issue is that you need a preconditioner for the Schur complement S = A11 - A01 A00^{-1} A10. For incompressible elasticity, this S is spectrally equivalent to a scaled mass matrix.

> Hi all,
>
> I have a linear system formed from structural mechanics, and there exists zero in the diagonal entries:
>
> A = (A00 A01
> 	A10 A11), where A00 has inverse and the diagonal entries in A11 are all zero.
>
> The GMRES method with ILU preconditioner in PETSc was carried out to solve this system, and I got this error:
>
> "PC failed due to FACTOR_NUMERIC_ZEROPIVOT"
>
> I googled and found that Field Split preconditioner should be applied to solve this kind of systems. I passed -pc-type fieldsplit -pc_fieldsplit_detect_saddle_point options to program, and got another error:
>
> “PC failed due to SUBPC_ERROR”
>
> After that, I tried to split the matrix by codes:
>
> IS is;
> ISCreateStride(PETSC_COMM_SELF, row number of A00, 0, 1, &is);
> PCFieldSplitSetIS(pc, “0”, is);
>
> IS is2;
> ISCreateStride(PETSC_COMM_SELF, row number of A11, start row of A11, 1, &is2);
> PCFieldSplitSetIS(pc, “1”, is2);
>
> Recompiled the codes and run it with additional options:
>
>  -fieldsplit_0_ksp_type gmres -fieldsplit_0_pc_type ilu -fieldsplit_1_ksp_type gmres -fieldsplit_1_pc_type none
>
> To my surprise, the Krylov solver executed extremely slow. I googled and found the reason is that if size of A00 is much bigger than A11(e.g. A00 has 10000 rows and A11 has 50 rows), then Schur complement is inefficient.
>
> Could you help me to solve this kind of systems efficiently?
>
> Best regards,
>
> Xiaofeng
```