I think I'm going to go ahead and start on a Preconditioner base  
class... that doesn't inherit from LinearSolver for now.  I'll get it  
up and running with a PetscPreconditioner class.

This will pretty much meet my requirements for now.

Derek


On Jan 23, 2009, at 2:19 PM, Derek Gaston wrote:

> Ok - all good arguments... and I'm seeing some of your reasoning  
> now.... but let me show you the use case I'm thinking of which might  
> better explain why I think the LinearSolver link is useful...
>
> I'm needing to solve individual systems _just_ for preconditioning  
> purposes... and they use a preconditioner _as a solver_.  If a  
> Preconditioner was _not_ a LinearSolver this would be what I would  
> have to do (and is close to what I'm doing now... although there is  
> even more manual manipulation).
>
> ApplyPreconditioner(Vector x, Vector & y)
> {
> LinearImplicitSystem sys;
> sys.add_variable("u");
>
> AssemblePrecMatrix(sys.matrix);
>
> copyCorrectPiecesOfX(x, sys.rhs);
>
> Preconditioner pre(sys.matrix);
> pre.apply(sys.rhs, sys.solution);
>
> copyCorrectPiecesOfSolution(sys.solution, y);
> }
>
> This really doesn't look too bad... the problem is that there's  
> datastructures that aren't used... or are redundant.  For instance  
> there's a KSP object inside of that LinearImplicitSystem that never  
> gets used... and it has it's own PC object... again that never gets  
> used.  Then there's the fact that you have to call apply() and pass  
> in two things that are both held within the system.
>
> If you could just create the LinearSystem, passing in the  
> Preconditioner then just call sys.solve().... it would simplify  
> things.  I suppose that there's nothing stopping us from adding a  
> precondition() method to LinearSystem.... that just calls the  
> Preconditioner object (that you can pass in at construction time or  
> attach).
>
> What do you guys think?
>
> Derek
>
> On Jan 23, 2009, at 12:18 PM, John Peterson wrote:
>
>> On Fri, Jan 23, 2009 at 12:01 PM, Derek Gaston <[email protected]>  
>> wrote:
>>> Alright!  Now we have a debate!  Let me see if I can persuade  
>>> you... and if
>>> I can't... I'm probably going to code it up anyway to give you a  
>>> chance to
>>> see what I mean.
>>>
>>> First, let's look at the two different forms of preconditioning  
>>> (I'll be
>>> using GMRES the whole time because it's easy to think about)...
>>>
>>> Solving: Ax=b
>>>
>>> Left Preconditioning: Find P^-1 Ax = P^-1b
>>> Right Preconditioning: Find A P^-1 P x = b
>>
>> You're right, I wasn't taking right-preconditioning into account in  
>> my
>> previous email.
>>
>>
>>> Further, from Axelsson: Iterative Solution Methods (2000) pg. 472  
>>> when
>>> talking about left preconditioning GMRES:
>>>
>>> "The statement h:=C^-1 r is to be interpreted as solving the  
>>> system Ch = r."
>>>
>>> Where h = y and C = P.
>>
>> What you've perfectly described is a Preconditioner object that  
>> *uses*
>> a LinearSolver during its application, not something which "is a"
>> LinearSolver.  Of course, this doesn't preclude you from also  
>> having a
>> Preconditioner::solve() member, which just applies the  
>> preconditioner.
>> It doesn't, in my opinion, make it a LinearSolver, in the sense in
>> which we use that name in Libmesh.
>>
>>
>>> You say that a Preconditioner doesn't satisfy the "is a"  
>>> relationship for
>>> inheritance... but I hope I've shown you that in fact it does.  A
>>> Preconditioner "is a" LinearSolver that solves a specific Py=q  
>>> system... the
>>> solution of which is used internally by another LinearSolver.
>>
>> Perhaps, but in LibMesh a LinearSolver isn't a just thing that  
>> "solves
>> a specific Py=q system," although it does do that.  It's an abstract
>> interface to 3rd-party concrete linear algebra libraries as I
>> mentioned before.  So, it's a little unfortunate that we have already
>> taken the name that you would like to use but I still argue strongly
>> against adding your proposed Preconditioner to this hierarchy.  We
>> might need to have a discussion about expanding the meaning of
>> LinearSolver in libmesh, but I think the current system is elegant  
>> and
>> relatively simple to understand for new users.
>>
>> -- 
>> John
>


------------------------------------------------------------------------------
This SF.net email is sponsored by:
SourcForge Community
SourceForge wants to tell your story.
http://p.sf.net/sfu/sf-spreadtheword
_______________________________________________
Libmesh-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/libmesh-devel

Reply via email to