<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Fri, May 11, 2018 at 7:14 AM, Y. Shidi <span dir="ltr"><<a href="mailto:ys453@cam.ac.uk" target="_blank">ys453@cam.ac.uk</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Dear Matt,<br>
<br>
Thank you for your help last time.<br>
I want to get more detail about the Petsc-MUMPS factorisation;<br>
so I go to look the code "/src/mat/impls/aij/mpi/mumps/<wbr>mumps.c".<br>
And I found the following functions are quite important to<br>
the question:<br>
<br>
PetscErrorCode MatCholeskyFactorSymbolic_MUMP<wbr>S(Mat F,Mat A,IS r,const MatFactorInfo *info);<br>
PetscErrorCode MatFactorNumeric_MUMPS(Mat F,Mat A,const MatFactorInfo *info);<br>
PetscErrorCode MatSolve_MUMPS(Mat A,Vec b,Vec x);<br>
<br>
I print some sentence to trace when these functions are called.<br>
Then I test my code; the values in the matrix is changing but the<br>
structure stays the same. Below is the output.<br>
We can see that at 0th step, all the symbolic, numeric and solve<br>
are called; in the subsequent steps only the solve stage is called,<br>
the numeric step is not called.<br></blockquote><div><br></div><div>How are you changing the matrix? Do you remember to assemble?</div><div><br></div><div>  Matt</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Iteration 0 Step 0.0005 Time 0.0005<br>
[INFO]: Direct Solver setup<br>
MatCholeskyFactorSymbolic_MUMP<wbr>S<br>
finish MatCholeskyFactorSymbolic_MUMP<wbr>S<br>
MatFactorNumeric_MUMPS<br>
finish MatFactorNumeric_MUMPS<br>
MatSolve_MUMPS<br>
<br>
Iteration 1 Step 0.0005 Time 0.0005<br>
MatSolve_MUMPS<br>
<br>
Iteration 2 Step 0.0005 Time 0.001<br>
MatSolve_MUMPS<br>
<br>
[INFO]: End of program!!!<br>
<br>
<br>
I am wondering if there is any possibility to split the numeric<br>
and solve stage (as you mentioned using KSPSolve).<br>
<br>
Thank you very much indeed.<br>
<br>
Kind Regards,<br>
Shidi<br>
<br>
On 2018-05-04 21:10, Y. Shidi wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Thank you very much for your reply.<br>
That is really clear.<br>
<br>
Kind Regards,<br>
Shidi<br>
<br>
On 2018-05-04 21:05, Matthew Knepley wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
On Fri, May 4, 2018 at 3:54 PM, Y. Shidi <<a href="mailto:ys453@cam.ac.uk" target="_blank">ys453@cam.ac.uk</a>> wrote:<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Dear Matt,<br>
<br>
Thank you very much for your reply!<br>
So what you mean is that I can just do the KSPSolve() every<br>
iteration<br>
once the MUMPS is set?<br>
</blockquote>
<br>
Yes.<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
That means inside the KSPSolve() the numerical factorization is<br>
performed. If that is the case, it seems that the ksp object is<br>
not changed when the values in the matrix are changed.<br>
</blockquote>
<br>
Yes.<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Or do I need to call both KSPSetOperators() and KSPSolve()?<br>
</blockquote>
<br>
If you do SetOperators, it will redo the factorization. If you do not,<br>
it will look<br>
at the Mat object, determine that the structure has not changed, and<br>
just redo<br>
the numerical factorization.<br>
<br>
  Thanks,<br>
<br>
     Matt<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
On 2018-05-04 14:44, Matthew Knepley wrote:<br>
On Fri, May 4, 2018 at 9:40 AM, Y. Shidi <<a href="mailto:ys453@cam.ac.uk" target="_blank">ys453@cam.ac.uk</a>> wrote:<br>
<br>
Dear PETSc users,<br>
<br>
I am currently using MUMPS to solve linear systems directly.<br>
Generally, we use ICNTL(7) or ICNTL(29) to do the preprocessing<br>
step and then solve the system.<br>
<br>
In my code, the values in the matrix is changed in each iteration,<br>
but the structure of the matrix stays the same, which means the<br>
performance can be improved if symbolic factorisation is only<br>
performed once. Hence, it is necessary to split the symbolic<br>
and numeric factorisation. However, I cannot find a specific step<br>
(control parameter) to perform the numeric factorisation.<br>
I have used ICNTL(3) and ICNTL(4) to print the MUMPS information,<br>
it seems that the symbolic and numeric factorisation always perform<br>
together.<br>
<br>
If you use KSPSolve instead, it will automatically preserve the<br>
symbolic<br>
factorization.<br>
<br>
Thanks,<br>
<br>
Matt<br>
<br>
So I am wondering if anyone has an idea about it.<br>
<br>
Below is how I set up MUMPS solver:<br>
PC pc;<br>
PetscBool flg_mumps, flg_mumps_ch;<br>
flg_mumps = PETSC_FALSE;<br>
flg_mumps_ch = PETSC_FALSE;<br>
PetscOptionsGetBool(NULL, NULL, "-use_mumps_lu", &flg_mumps,<br>
NULL);<br>
PetscOptionsGetBool(NULL, NULL, "-use_mumps_ch", &flg_mumps_ch,<br>
NULL);<br>
if(flg_mumps ||flg_mumps_ch)<br>
{<br>
KSPSetType(_ksp, KSPPREONLY);<br>
PetscInt ival,icntl;<br>
PetscReal val;<br>
KSPGetPC(_ksp, &pc);<br>
/// Set preconditioner type<br>
if(flg_mumps)<br>
{<br>
PCSetType(pc, PCLU);<br>
}<br>
else if(flg_mumps_ch)<br>
{<br>
MatSetOption(A, MAT_SPD, PETSC_TRUE);<br>
PCSetType(pc, PCCHOLESKY);<br>
}<br>
PCFactorSetMatSolverPackage(pc<wbr>, MATSOLVERMUMPS);<br>
PCFactorSetUpMatSolverPackage(<wbr>pc);<br>
PCFactorGetMatrix(pc, &_F);<br>
icntl = 7; ival = 0;<br>
MatMumpsSetIcntl( _F, icntl, ival );<br>
MatMumpsSetIcntl(_F, 3, 6);<br>
MatMumpsSetIcntl(_F, 4, 2);<br>
}<br>
KSPSetUp(_ksp);<br>
<br>
Kind Regards,<br>
Shidi<br>
<br>
--<br>
<br>
What most experimenters take for granted before they begin their<br>
experiments is infinitely more interesting than any results to<br>
which<br>
their experiments lead.<br>
-- Norbert Wiener<br>
<br>
<a href="https://www.cse.buffalo.edu/~knepley/" rel="noreferrer" target="_blank">https://www.cse.buffalo.edu/~k<wbr>nepley/</a> [1] [1]<br>
<br>
Links:<br>
------<br>
[1] <a href="http://www.caam.rice.edu/~mk51/" rel="noreferrer" target="_blank">http://www.caam.rice.edu/~mk51<wbr>/</a> [2]<br>
</blockquote>
<br>
--<br>
<br>
What most experimenters take for granted before they begin their<br>
experiments is infinitely more interesting than any results to which<br>
their experiments lead.<br>
-- Norbert Wiener<br>
<br>
<a href="https://www.cse.buffalo.edu/~knepley/" rel="noreferrer" target="_blank">https://www.cse.buffalo.edu/~k<wbr>nepley/</a> [2]<br>
<br>
<br>
Links:<br>
------<br>
[1] <a href="https://www.cse.buffalo.edu/~knepley/" rel="noreferrer" target="_blank">https://www.cse.buffalo.edu/~k<wbr>nepley/</a><br>
[2] <a href="http://www.caam.rice.edu/~mk51/" rel="noreferrer" target="_blank">http://www.caam.rice.edu/~mk51<wbr>/</a><br>
</blockquote></blockquote>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div>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><br></div><div><a href="http://www.caam.rice.edu/~mk51/" target="_blank">https://www.cse.buffalo.edu/~knepley/</a><br></div></div></div></div></div>
</div></div>