<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Oct 12, 2016 at 9:00 PM, Amneet Bhalla <span dir="ltr"><<a href="mailto:mail2amneet@gmail.com" target="_blank">mail2amneet@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span class="gmail-"><br><br>On Monday, October 10, 2016, Barry Smith <<a href="mailto:bsmith@mcs.anl.gov" target="_blank">bsmith@mcs.anl.gov</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><br>
> On Oct 10, 2016, at 4:01 PM, Kong, Fande <<a>fande.kong@inl.gov</a>> wrote:<br>
><br>
> Hi All,<br>
><br>
> I know how to remove the null spaces from a singular system using creating a MatNullSpace and attaching it to Mat.<br>
><br>
> I was really wondering what is the philosophy behind this? The exact algorithms we are using in PETSc right now? Where we are dealing with this, preconditioner, linear solver, or nonlinear solver?<br>
<br>
It is in the Krylov solver.<br>
<br>
The idea is very simple. Say you have a singular A with null space N (that all values Ny are in the null space of A. So N is tall and skinny) and you want to solve A x = b where b is in the range of A. This problem has an infinite number of solutions Ny + x* since A (Ny + x*) = ANy + Ax* = Ax* = b where x* is the "minimum norm solution; that is Ax* = b and x* has the smallest norm of all solutions.<br>
<br>
With left preconditioning B A x = B b GMRES, for example, normally computes the solution in the as alpha_1 Bb + alpha_2 BABb + alpha_3 BABABAb + .... but the B operator will likely introduce some component into the direction of the null space so as GMRES continues the "solution" computed will grow larger and larger with a large component in the null space of A. Hence we simply modify GMRES a tiny bit by building the solution from alpha_1 (I-N)Bb + alpha_2 (I-N)BABb + alpha_3 (I-N)BABABAb + .... that is we remove from each new direction anything in the direction of the null space. Hence the null space doesn't directly appear in the preconditioner, just in the KSP method. If you attach a null space to the matrix, the KSP just automatically uses it to do the removal above.</blockquote><div><br></div></span><div>Barry, if identity matrix I is of size M x M (which is also the size of A) then are you augmenting N (size M x R; R < M) by zero colums to make I - N possible? If so it means that only first R values of vector Bb are used for scaling zero Eigenvectors of A. Does this choice affect iteration count, meaning one can arbitrarily choose any R values of the vector Bb to scale zero eigenvectors of A?</div></blockquote><div><br></div><div>I think it is just a notation. Let us denote Bb as y, that is, y = Bb. N = {x_0, x_1, ..., x_r}, where x_i is a vector. Applying I-N to y means y = y - \sum (y, x_i) x_i. (y, x_i) is the inner product of vectors y and x_i. Look at this code for more details, <a href="http://www.mcs.anl.gov/petsc/petsc-current/src/mat/interface/matnull.c.html#MatNullSpaceRemove">http://www.mcs.anl.gov/petsc/petsc-current/src/mat/interface/matnull.c.html#MatNullSpaceRemove</a></div><div><br></div><div>Fande,</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div><span></span></div><div class="gmail-HOEnZb"><div class="gmail-h5"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
With right preconditioning the solution is built from alpha_1 b + alpha_2 ABb + alpha_3 ABABb + .... and again we apply (I-N) to each term to remove any part that is in the null space of A.<br>
<br>
Now consider the case A y = b where b is NOT in the range of A. So the problem has no "true" solution, but one can find a least squares solution by rewriting b = b_par + b_perp where b_par is in the range of A and b_perp is orthogonal to the range of A and solve instead A x = b_perp. If you provide a MatSetTransposeNullSpace() then KSP automatically uses it to remove b_perp from the right hand side before starting the KSP iterations.<br>
<br>
The manual pages for MatNullSpaceAttach() and MatTranposeNullSpaceAttach() discuss this an explain how it relates to the fundamental theorem of linear algebra.<br>
<br>
Note that for symmetric matrices the two null spaces are the same.<br>
<br>
Barry<br>
<br>
<br>
A different note: This "trick" is not a "cure all" for a totally inappropriate preconditioner. For example if one uses for a preconditioner a direct (sparse or dense) solver or an ILU(k) one can end up with a very bad solver because the direct solver will likely produce a very small pivot at some point thus the triangular solver applied in the precondition can produce HUGE changes in the solution (that are not physical) and so the preconditioner basically produces garbage. On the other hand sometimes it works out ok.<br>
<br>
<br>
><br>
><br>
> Fande Kong,<br>
<br>
</blockquote><br><br></div></div><span class="gmail-HOEnZb"><font color="#888888">-- <br><div dir="ltr"><div>--Amneet <br><br></div><div><br></div><div><br></div></div><br>
</font></span></blockquote></div><br></div></div>