MatSetNullSpace triggers KSPSetNullSpace when doing KSPSetup. This in turn activates MatNullSpaceRemove after PCApply and destroys the convergence of BDDC, since it changes the preconditioned operator. With BDDC, if you have a linear system with a non-trivial kernel, you need to take care of when projecting the residual vector onto the coarse null space and remove it after expanding the coarse solution onto the partially subassembled space. You don't need to remove the null space from the preconditioned vector; instead, you need to properly calculate the null space of the coarse problem (see function AdaptNullSpace and lines 4164-4220 in bddc.c), and remove it around coarse problem solving (see lines 2014-2022 in bddc.c). <br>
<br><div class="gmail_quote">2012/9/19 Jed Brown <span dir="ltr"><<a href="mailto:jedbrown@mcs.anl.gov" target="_blank">jedbrown@mcs.anl.gov</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Do we really need a new routine for this? Why doesn't MatSetNullSpace() work?
</blockquote></div><br><br clear="all"><br>-- <br>Stefano<br>