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.
晓峰 何 <tlan...@hotmail.com> writes: > 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