On Fri, Nov 7, 2014 at 11:04 AM, Lawrence Mitchell < [email protected]> wrote:
> Hi petsc-dev, > > I'm solving a pure Neumann mixed Poisson-like problem, preconditioning > with a schur complement. The pressure space has a nullspace of the > constant functions and so I attach the appropriate nullspace to the krylov > solver, and compose the constant nullspace with the IS defining the > pressure space. My RHS is consistent. > That is supposed to work, and I think it does in my tests. The code is here https://bitbucket.org/petsc/petsc/src/1f0d623c8336219eb98f7ded6f95c151ca603fe7/src/ksp/pc/impls/fieldsplit/fieldsplit.c?at=master#cl-562 so maybe we can track this down in the debugger. Thanks, Matt > When I precondition with: > > -pc_type fieldsplit -pc_fieldsplit_type schur > -pc_fieldsplit_schur_fact_type full \ > -pc_fieldsplit_schur_precondition selfp > > I notice that the nullspace is not transferred over to the preconditioning > matrix for S. Is this a deliberate choice? > > ksp_view output below, note that the schurcomplement mat has an attached > nullspace, but the generated pmat does not. > > Cheers, > > Lawrence > > KSP Object: 1 MPI processes > type: gmres > GMRES: restart=30, using Classical (unmodified) Gram-Schmidt > Orthogonalization with no iterative refinement > GMRES: happy breakdown tolerance 1e-30 > maximum iterations=30, initial guess is zero > tolerances: relative=1e-07, absolute=1e-50, divergence=10000 > left preconditioning > has attached null space > using PRECONDITIONED norm type for convergence test > PC Object: 1 MPI processes > type: fieldsplit > FieldSplit with Schur preconditioner, factorization FULL > Preconditioner for the Schur complement formed from Sp, an assembled > approximation to S, which uses (the lumped) A00's diagonal's inverse > Split info: > Split number 0 Defined by IS > Split number 1 Defined by IS > KSP solver for A00 block > KSP Object: (fieldsplit_0_) 1 MPI processes > type: gmres > GMRES: restart=30, using Classical (unmodified) Gram-Schmidt > Orthogonalization with no iterative refinement > GMRES: happy breakdown tolerance 1e-30 > maximum iterations=10000, initial guess is zero > tolerances: relative=1e-05, absolute=1e-50, divergence=10000 > left preconditioning > using PRECONDITIONED norm type for convergence test > PC Object: (fieldsplit_0_) 1 MPI processes > type: ilu > ILU: out-of-place factorization > 0 levels of fill > tolerance for zero pivot 2.22045e-14 > matrix ordering: natural > factor fill ratio given 1, needed 1 > Factored matrix follows: > Mat Object: 1 MPI processes > type: seqaij > rows=72, cols=72 > package used to perform factorization: petsc > total: nonzeros=1080, allocated nonzeros=1080 > total number of mallocs used during MatSetValues calls =0 > using I-node routines: found 23 nodes, limit used is 5 > linear system matrix = precond matrix: > Mat Object: (fieldsplit_0_) 1 MPI processes > type: seqaij > rows=72, cols=72 > total: nonzeros=1080, allocated nonzeros=0 > total number of mallocs used during MatSetValues calls =0 > using I-node routines: found 23 nodes, limit used is 5 > KSP solver for S = A11 - A10 inv(A00) A01 > KSP Object: (fieldsplit_1_) 1 MPI processes > type: gmres > GMRES: restart=30, using Classical (unmodified) Gram-Schmidt > Orthogonalization with no iterative refinement > GMRES: happy breakdown tolerance 1e-30 > maximum iterations=10000, initial guess is zero > tolerances: relative=1e-05, absolute=1e-50, divergence=10000 > left preconditioning > using PRECONDITIONED norm type for convergence test > PC Object: (fieldsplit_1_) 1 MPI processes > type: ilu > ILU: out-of-place factorization > 0 levels of fill > tolerance for zero pivot 2.22045e-14 > matrix ordering: natural > factor fill ratio given 1, needed 1 > Factored matrix follows: > Mat Object: 1 MPI processes > type: seqaij > rows=24, cols=24 > package used to perform factorization: petsc > total: nonzeros=216, allocated nonzeros=216 > total number of mallocs used during MatSetValues calls =0 > using I-node routines: found 8 nodes, limit used is 5 > linear system matrix followed by preconditioner matrix: > Mat Object: (fieldsplit_1_) 1 MPI processes > type: schurcomplement > rows=24, cols=24 > has attached null space > Schur complement A11 - A10 inv(A00) A01 > A11 > Mat Object: (fieldsplit_1_) 1 MPI > processes > type: seqaij > rows=24, cols=24 > total: nonzeros=72, allocated nonzeros=0 > total number of mallocs used during MatSetValues calls =0 > has attached null space > using I-node routines: found 8 nodes, limit used is 5 > A10 > Mat Object: 1 MPI processes > type: seqaij > rows=24, cols=72 > total: nonzeros=288, allocated nonzeros=0 > total number of mallocs used during MatSetValues calls =0 > using I-node routines: found 8 nodes, limit used is 5 > KSP of A00 > KSP Object: (fieldsplit_0_) 1 MPI > processes > type: gmres > GMRES: restart=30, using Classical (unmodified) > Gram-Schmidt Orthogonalization with no iterative refinement > GMRES: happy breakdown tolerance 1e-30 > maximum iterations=10000, initial guess is zero > tolerances: relative=1e-05, absolute=1e-50, > divergence=10000 > left preconditioning > using PRECONDITIONED norm type for convergence test > PC Object: (fieldsplit_0_) 1 MPI > processes > type: ilu > ILU: out-of-place factorization > 0 levels of fill > tolerance for zero pivot 2.22045e-14 > matrix ordering: natural > factor fill ratio given 1, needed 1 > Factored matrix follows: > Mat Object: 1 MPI processes > type: seqaij > rows=72, cols=72 > package used to perform factorization: petsc > total: nonzeros=1080, allocated nonzeros=1080 > total number of mallocs used during MatSetValues > calls =0 > using I-node routines: found 23 nodes, limit > used is 5 > linear system matrix = precond matrix: > Mat Object: (fieldsplit_0_) > 1 MPI processes > type: seqaij > rows=72, cols=72 > total: nonzeros=1080, allocated nonzeros=0 > total number of mallocs used during MatSetValues calls =0 > using I-node routines: found 23 nodes, limit used is 5 > A01 > Mat Object: 1 MPI processes > type: seqaij > rows=72, cols=24 > total: nonzeros=288, allocated nonzeros=0 > total number of mallocs used during MatSetValues calls =0 > using I-node routines: found 23 nodes, limit used is 5 > Mat Object: 1 MPI processes > type: seqaij > rows=24, cols=24 > total: nonzeros=216, allocated nonzeros=216 > total number of mallocs used during MatSetValues calls =0 > using I-node routines: found 8 nodes, limit used is 5 > linear system matrix = precond matrix: > Mat Object: 1 MPI processes > type: nest > rows=96, cols=96 > has attached null space > Matrix object: > type=nest, rows=2, cols=2 > MatNest structure: > (0,0) : prefix="fieldsplit_0_", type=seqaij, rows=72, cols=72 > (0,1) : type=seqaij, rows=72, cols=24 > (1,0) : type=seqaij, rows=24, cols=72 > (1,1) : prefix="fieldsplit_1_", type=seqaij, rows=24, cols=24 > > -- What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead. -- Norbert Wiener
