Ok... so I have a huge email already written that has a big long justification of a Preconditioner Class. But after writing it I realized that it was long winded and no one would really care about the discovery process I went through during the last few days.... so I've decided to just skip to the meat. If you want the justification later let me know....
We need a Preconditioner class. It will allow you to setup a preconditioner and use it multiple times with different RHS vectors.
It should inherit from LinearSolver, using the matrix and rhs vector to produce the preconditioned vector in solution whenever solve() is called.
Concrete implementations of this class would be:
MLPreconditioner (from Trilinos)
I also wouldn't mind a PetscHyprePreconditioner where both MLPreconditioner and it inherit from MultigridPreconditioner. This would allow simple manipulation of common multigrid preconditioner paramters (like smoothing, cycle numbers, etc.). But this can be negotiated.
LinearImplicitSystem should allow for attaching a preconditioner class that would then be used by the solver. LinearImplicitSystem should also allow you to specify a Preconditioner _as_ the solver itself... or maybe there should be a separate PreconditionerSystem... I can't decide.
Just to give an example of a Preconditioner: the PetscPreconditioner would create a PC struct calling PCCreate(), PCSetType() and PCSetOperators() for you. Then when solve is called it would do a PCApply(pc, rhs, solution). Looking over ML (in Trilinos) it would have similar behavior.
To sum up the justification of these classes: I have to do a _lot_ of manual petsc and libmesh manipulation to setup separate preconditioning systems and _efficiently_ solve them.... and a lot of that manipulation is going to have to be duplicated for using ML in Trilinos.
So what do you guys think? If I get the thumbs up I could probably have something in the repository by the end of the day tomorrow...