[petsc-users] Null space correction depends on solver?

Thomas Witkowski thomas.witkowski at tu-dresden.de
Tue Aug 28 02:17:28 CDT 2012

Part II of my never ending null space story :) Now I solve Poisson 
equation in 3D, discretized with FEM and using free boundaries. In the 
PETSc solver part, I added some test to check whether the solution is 
still orthogonal to the constant nullspace. The result is somehow hard 
to explain. Maybe one of you could spend one minute to give me some 
explanation what's going wrong and how to fix it. First, some code snippet:

Vec rhs;
Mat mat;
Vec nsb;
VecDuplicate(rhs, &nsb);
VecSet(nsb, 1.0);

MatNullSpace matNullspace;
MatNullSpaceRemove(matNullspace, rhs, PETSC_NULL);

PetscScalar dot;
VecDot(nsb, rhs, &dot);
MSG("TEST 1 = %e\n", dot);

KSP ksp;
KSPCreate(MPI::COMM_WORLD, &kspMat11);
KSPSetOperators(ksp, mat, mat, SAME_NONZERO_PATTERN);

MatSetNullSpace(mat, matNullspace);
KSPSetNullSpace(ksp, matNullspace);

KSPSolve(mat, rhs, rhs);

VecDot(nsb, rhs, &dot);
MSG("TEST 2 = %e\n", dot);

So, nothing really special. Now, I run the code with two different solvers:

1) -ksp_type fgmres -pc_type hypre -pc_hypre_type boomeramg 
-pc_hypre_boomeramg_relax_type_coarse Jacobi

                TEST 1 = 5.503931e-14
                TEST 2 = -2.043290e+10

2) -ksp_type gmres -pc_type none
                TEST 1 = 5.503931e-14
                TEST 2 = 3.195510e-09

How to interpret the results? For the first case, is the null space 
information forwarded to the preconditioner? And even for using just 
gmres without any preconditioner, the dot product is much closer to zero 
but still far away.


More information about the petsc-users mailing list