From: Tim K. <tim...@ce...> - 2009-08-20 08:16:06
|
Dear all, I'm implementing a Runge-Kutta scheme where inside each time step I have to solve three linear systems with the same matrix but different right hand sides. I'm using the ShellMatrix concept since the matrix is of the type A = B + v*w^T where B is sparse. Also, the matrix seems to be quite ill-conditioned, which is why I use a sparse direct solver (that is, SuperLU_Dist) on B as a preconditioner inside a GMRES scheme for A. Setting up the preconditioner of course takes quite a long time; once this is done, everything else is fast since GMRES converges in less than 10 steps. The only problem is that the preconditioner is set up in each of the three solves which makes everything essentially by a factor of three slower than necessary. I see that there is now a Preconditioner class in libMesh that has not been there in earlier times. Is that in a usable state? Can it reuse a precoditioner between successive solves without setting it up again? Is there any tutorial about how to use it? Best Regards, Tim -- Dr. Tim Kroeger tim...@me... Phone +49-421-218-7710 tim...@ce... Fax +49-421-218-4236 Fraunhofer MEVIS, Institute for Medical Image Computing Universitaetsallee 29, 28359 Bremen, Germany |
From: Derek G. <fri...@gm...> - 2009-08-20 16:16:32
|
On Aug 20, 2009, at 2:15 AM, Tim Kroeger wrote: > I see that there is now a Preconditioner class in libMesh that has not > been there in earlier times. Is that in a usable state? Yes it is... in fact you've probably already been using it! The PetscPreconditioner gets used by default now. > Can it reuse a precoditioner between successive solves without > setting it up > again? It can if you create a Preconditioner that acts that way. It sounds like what you might want to do is create your own Preconditioner class... maybe inheriting from PetscPreconditioner and then override the init() method so that it doesn't clear the preconditioner. Then you might also want to create your own clear() method that does clear the preconditioner... and call this manually whenever you want to reset it. > Is there any tutorial about how to use it? There isn't... but it's fairly straightforward. Just create an instance of a Preconditioner class and then call attach_preconditioner() on the linear/nonlinear solver you are using... ie: system.linear_solver->attach_preconditioner(my_prec); We do this sometime before initing our equation systems object. Hope that helps, Derek |
From: Tim K. <tim...@ce...> - 2009-08-24 13:58:05
|
Dear Derek, On Thu, 20 Aug 2009, Derek Gaston wrote: > On Aug 20, 2009, at 2:15 AM, Tim Kroeger wrote: > >> Can it reuse a precoditioner between successive solves without setting it >> up again? > > It can if you create a Preconditioner that acts that way. It sounds like > what you might want to do is create your own Preconditioner class... maybe > inheriting from PetscPreconditioner and then override the init() method so > that it doesn't clear the preconditioner. Then you might also want to create > your own clear() method that does clear the preconditioner... and call this > manually whenever you want to reset it. Thank you very much; works great! Anyway, just to be curious, I have two more questions about this: 1. Why does PetscPreconditioner::clear() not do anything? I guess, it should at least call PCDestroy(), or is that called elsewhere? 2. I wonder what the suggested way is to cancel the effect of LinearSolver::attach_precondition(), in particular if my Preconditioner object goes out of scope. Currently, I'm just calling LinearSolver::clear(); LinearSolver::attach_preconditioner(NULL); LinearSolver::set_preconditioner_type(ILU_PRECOND); to do that. (That's sort of an academic question because no solves will be performed after that anyway, but it avoids dangling pointers.) Best Regards, Tim -- Dr. Tim Kroeger tim...@me... Phone +49-421-218-7710 tim...@ce... Fax +49-421-218-4236 Fraunhofer MEVIS, Institute for Medical Image Computing Universitaetsallee 29, 28359 Bremen, Germany |