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

晓峰 何 tlanyan at hotmail.com
Sun Sep 25 22:02:38 CDT 2022


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


More information about the petsc-users mailing list