<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Mar 11, 2014 at 11:05 AM, Luc <span dir="ltr"><<a href="mailto:luc.berger.vergiat@gmail.com" target="_blank">luc.berger.vergiat@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">
<div bgcolor="#FFFFFF" text="#000000">
<div>Hum,<br>
would a <b>-pc_fieldsplit_schur_precondition self </b>use the
full Schur as preconditioner for itself?<br>
I made some special choices in order to keep A diagonal which
makes it cheap to inverse.<br>
Actually I am assuming that Schur will be blazing fast with my
type of discretization... </div></div></blockquote><div><br></div><div>We reorganized, so that now what you want is "selfp":</div><div><br></div><div> <a href="http://www.mcs.anl.gov/petsc/petsc-dev/docs/manualpages/PC/PCFieldSplitSchurPrecondition.html">http://www.mcs.anl.gov/petsc/petsc-dev/docs/manualpages/PC/PCFieldSplitSchurPrecondition.html</a></div>
<div><br></div><div> Thanks,</div><div><br></div><div> Matt</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 bgcolor="#FFFFFF" text="#000000"><div>Best,<pre cols="72">Luc</pre>
On 03/11/2014 11:36 AM, Matthew Knepley wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">
<div class="gmail_extra">
<div class="gmail_quote">On Tue, Mar 11, 2014 at 9:56 AM, Luc
Berger-Vergiat <span dir="ltr"><<a href="mailto:luc.berger.vergiat@gmail.com" target="_blank">luc.berger.vergiat@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">
<div style="word-wrap:break-word">Hi all,
<div>I am testing some preconditioners for a FEM problem
involving different types of fields (displacements,
temperature, stresses and plastic strain).</div>
<div>To make sure that things are working correctly I am
first solving this problem with: </div>
<blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">
<div><font face="'Lucida Console'">-ksp_type preonly
-pc_type lu,</font> which works fine obviously.</div>
</blockquote>
<br>
<div>Then I move on to do:</div>
<blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">
<div><font face="'Lucida Console'">-ksp_type gmres
-pc_type lu,</font> and I get very good
convergence (one gmres linear iteration per time
step) which I expected.</div>
</blockquote>
<br>
<div>So solving the problem exactly in a preconditioner
to gmres leads to optimal results.</div>
<div>This can be done using a Schur complement, but when
I pass the following options:</div>
<blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">
<div><font face="'Lucida Console'">-ksp_type gmres
-pc_type fieldsplit -pc_fieldsplit_type schur
-pc_fieldsplit_schur_factorization_type full
-pc_fieldsplit_0_fields 2,3
-pc_fieldsplit_1_fields 0,1 -fieldsplit_0_ksp_type
preonly -fieldsplit_0_pc_type
lu -fieldsplit_1_ksp_type
preonly -fieldsplit_1_pc_type lu</font></div>
</blockquote>
<div>My results are terrible, gmres does not converge
and my FEM code reduces the size of the time step in
order to converge.</div>
<div>This does not make much sense to me...</div>
</div>
</blockquote>
<div><br>
</div>
<div>The problem is the Schur complement block. We have</div>
<div><br>
</div>
<div> S = C A^{-1} B</div>
<div><br>
</div>
<div>PETSc does not form S explicitly, since it would
require forming the dense</div>
<div>inverse of A explicitly. Thus we only calculate the
action of A. If you look in</div>
<div>-ksp_view, you will see that the preconditioner for S
is formed from A_11,</div>
<div>which it sounds like is 0 in your case, so the LU of
that is a crud preconditioner.</div>
<div>Once you wrap the solve in GMRES, it will eventually
converge.</div>
<div><br>
</div>
<div>You can try using the LSC stuff if you do not have a
preconditioner matrix</div>
<div>for the Schur complement.</div>
<div><br>
</div>
<div> Thanks,</div>
<div><br>
</div>
<div> Matt</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 style="word-wrap:break-word">
<div>Curiously if I use the following options:</div>
<blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">
<div><font face="'Lucida Console'">-ksp_type gmres
-pc_type fieldsplit -pc_fieldsplit_type schur
-pc_fieldsplit_schur_factorization_type full
-pc_fieldsplit_0_fields 2,3
-pc_fieldsplit_1_fields 0,1 -fieldsplit_0_ksp_type
gmres -fieldsplit_0_pc_type
lu -fieldsplit_1_ksp_type gmres
-fieldsplit_1_pc_type lu</font></div>
</blockquote>
then the global gmres converges in two iterations.
<div><br>
</div>
<div>So using a pair of ksp gmres/pc lu on the A00 block
and the Schur complements works, but using lu directly
doesn't.</div>
<div><br>
</div>
<div>Because I think that all this is quite strange, I
decided to dump some matrices out. Namely, I dumped
the complete FEM jacobian, I also do a MatView on
jac->B, jac->C and the result of KSPGetOperators
on kspA. These returns three out of the four blocks
needed to do the Schur complement. They are correct
and I assume that the last block is also correct.</div>
<div>When I import jac->B, jac->C and the matrix
corresponding to kspA in MATLAB to compute the inverse
of the Schur complement and pass it to gmres as
preconditioner the problem is solved in 1 iteration.</div>
<div>
<br>
</div>
<div>So MATLAB says:</div>
<blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">
<div><span style="font-family:'Lucida Console'">-ksp_type
gmres -pc_type fieldsplit -pc_fieldsplit_type
schur -pc_fieldsplit_schur_factorization_type full
-pc_fieldsplit_0_fields 2,3
-pc_fieldsplit_1_fields 0,1 -fieldsplit_0_ksp_type
preonly -fieldsplit_0_pc_type
lu -fieldsplit_1_ksp_type
preonly -fieldsplit_1_pc_type lu</span></div>
</blockquote>
<div>
<div>should yield only one iteration (maybe two
depending on implementation).</div>
<div><br>
</div>
<div>Any ideas why the Petsc doesn't solve this
correctly?</div>
<div><br>
<div>
<span style="text-indent:0px;letter-spacing:normal;font-variant:normal;text-align:-webkit-auto;font-style:normal;font-weight:normal;line-height:normal;border-collapse:separate;text-transform:none;font-size:medium;white-space:normal;font-family:Helvetica;word-spacing:0px">
<div>
Best,</div>
<div>Luc</div>
</span>
</div>
<br>
</div>
</div>
</div>
</blockquote>
</div>
<br>
<br clear="all"><span class=""><font color="#888888">
<div><br>
</div>
-- <br>
What most experimenters take for granted before they begin
their experiments is infinitely more interesting than any
results to which their experiments lead.<br>
-- Norbert Wiener
</font></span></div>
</div>
</blockquote>
<br>
</div>
</blockquote></div><br><br clear="all"><div><br></div>-- <br>What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead.<br>
-- Norbert Wiener
</div></div>