<div class="gmail_quote">On Tue, Aug 28, 2012 at 8:19 AM, Barry Smith <span dir="ltr"><<a href="mailto:bsmith@mcs.anl.gov" target="_blank">bsmith@mcs.anl.gov</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">> 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.<br>

<br>
<br>
</div>    Are you sure the null space you provide is truly the null space of the matrix? Call MatNullSpaceTest().<br>
<br>
     GMRES uses left preconditioning by default which forces the null space into the Krylov space at each iteration. FGMRES uses right preconditioning and doesn't  do anything to the null space because it is naturally in the Krylov space (since the result with fgmres contains the constants this is why I suspect the matrix actually doesn't have the null space you think it has). You can try running -ksp_type gmres -ksp_pc_side right      my guess is that you will not get near zero for the dot.<br>
</blockquote><div><br></div><div>Barry, it looks like null space removal is not implemented correctly for right preconditioning:<br><br><div><font face="courier new, monospace">diff --git a/src/ksp/ksp/examples/tutorials/ex29.c b/src/ksp/ksp/examples/tutorials/ex29.c</font></div>
<div><font face="courier new, monospace">--- a/src/ksp/ksp/examples/tutorials/ex29.c</font></div><div><font face="courier new, monospace">+++ b/src/ksp/ksp/examples/tutorials/ex29.c</font></div><div><font face="courier new, monospace">@@ -78,6 +78,12 @@</font></div>
<div><font face="courier new, monospace">   ierr = KSPSolve(ksp,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);</font></div><div><font face="courier new, monospace">   ierr = KSPGetSolution(ksp,&x);CHKERRQ(ierr);</font></div><div>
<font face="courier new, monospace">   ierr = KSPGetRhs(ksp,&b);CHKERRQ(ierr);</font></div><div><font face="courier new, monospace">+  {</font></div><div><font face="courier new, monospace">+    PetscScalar dot;</font></div>
<div><font face="courier new, monospace">+    ierr = VecSet(b,1.0);CHKERRQ(ierr);</font></div><div><font face="courier new, monospace">+    ierr = VecDot(b,x,&dot);CHKERRQ(ierr);</font></div><div><font face="courier new, monospace">+    ierr = PetscPrintf(PETSC_COMM_WORLD,"dot %g\n",dot);CHKERRQ(ierr);</font></div>
<div><font face="courier new, monospace">+  }</font></div><div><font face="courier new, monospace"> </font></div><div><font face="courier new, monospace">   ierr = DMDestroy(&da);CHKERRQ(ierr);</font></div><div><font face="courier new, monospace">   ierr = KSPDestroy(&ksp);CHKERRQ(ierr);</font></div>
</div><div><font face="courier new, monospace"><br></font><div><font face="courier new, monospace">$ ./ex29 -bc_type neumann -ksp_monitor_true_residual -ksp_test_null_space -mat_null_space_test_view -pc_type jacobi -ksp_pc_side left</font></div>
<div><font face="courier new, monospace">Constants are likely null vector|| A * 1/N || = 0</font></div><div><font face="courier new, monospace">  0 KSP preconditioned resid norm 1.135199672180e-01 true resid norm 2.319967097991e-01 ||r(i)||/||b|| 1.000000000000e+00</font></div>
<div><font face="courier new, monospace">  1 KSP preconditioned resid norm 4.410876553096e-02 true resid norm 1.254974589275e-01 ||r(i)||/||b|| 5.409449945916e-01</font></div><div><font face="courier new, monospace">  2 KSP preconditioned resid norm 2.255575515098e-02 true resid norm 5.942041105213e-02 ||r(i)||/||b|| 2.561260937863e-01</font></div>
<div><font face="courier new, monospace">  3 KSP preconditioned resid norm 9.933310900089e-03 true resid norm 2.093328265899e-02 ||r(i)||/||b|| 9.023094627987e-02</font></div><div><font face="courier new, monospace">  4 KSP preconditioned resid norm 1.073259860881e-17 true resid norm 1.660357840786e-16 ||r(i)||/||b|| 7.156816328229e-16</font></div>
<div><font face="courier new, monospace">dot 1.73472e-16<br></font><div><font face="courier new, monospace">$ ./ex29 -bc_type neumann -ksp_monitor_true_residual -ksp_test_null_space -mat_null_space_test_view -pc_type jacobi -ksp_pc_side right</font></div>
<div><font face="courier new, monospace">Constants are likely null vector|| A * 1/N || = 0</font></div><div><font face="courier new, monospace">  0 KSP unpreconditioned resid norm 2.319967097991e-01 true resid norm 2.319967097991e-01 ||r(i)||/||b|| 1.000000000000e+00</font></div>
<div><font face="courier new, monospace">  1 KSP unpreconditioned resid norm 1.218421389101e-01 true resid norm 1.218421389101e-01 ||r(i)||/||b|| 5.251890814123e-01</font></div><div><font face="courier new, monospace">  2 KSP unpreconditioned resid norm 5.897341285066e-02 true resid norm 5.897341285066e-02 ||r(i)||/||b|| 2.541993500758e-01</font></div>
<div><font face="courier new, monospace">  3 KSP unpreconditioned resid norm 2.064441965393e-02 true resid norm 2.064441965393e-02 ||r(i)||/||b|| 8.898582946200e-02</font></div><div><font face="courier new, monospace">  4 KSP unpreconditioned resid norm 8.019849301680e-17 true resid norm 5.101974804388e-17 ||r(i)||/||b|| 2.199158259100e-16</font></div>
<div><font face="courier new, monospace">dot 0.0188443</font></div></div></div><div><font face="courier new, monospace"><br></font></div><div><font face="arial, helvetica, sans-serif">It seems to be caused by this:</font></div>
<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">#define KSP_RemoveNullSpace(ksp,y) ((ksp->nullsp && ksp->pc_side == PC_LEFT) ? MatNullSpaceRemove(ksp->nullsp,y,PETSC_NULL) : 0)</font></div>
</div>