[petsc-users] C++ wrapper for petsc vector

Martin Vymazal martin.vymazal at vki.ac.be
Tue Aug 4 13:07:56 CDT 2015


On Tuesday, August 04, 2015 12:34:01 PM Matthew Knepley wrote:
> On Tue, Aug 4, 2015 at 12:30 PM, Martin Vymazal <martin.vymazal at vki.ac.be>
> 
> wrote:
> > Hello,
> > 
> >  1) thank you for the suggestion.
> >  2) suppose you want to be able to switch between solver implementations
> > 
> > provided by different libraries (e.g. petsc/trilinos). One obvious
> > approach is
> > through inheritance, but in order to keep child interfaces conforming to
> > base
> > class signatures, I need to wrap the solvers. If you can think of a better
> > approach that would keep switching between solvers easy, I'm open to
> > suggestions. I don't really need both trilinos and petsc, this is just a
> > matter of curiosity.
> 
> I think this is a bad way of doing that. You would introduce a whole bunch
> of types
> at the top level which are meaningless (just like Trilinos). If you want
> another solver,
> just wrap it up in the PETSc PCShell object (two calls at most). Its an
> easier to write
> wrapper, which also fits in with all the debugging and profiling. We wrap a
> bunch of
> things this way like Hypre (70+ packages last time I checked).
> 
>    Matt


OK, I was not aware of PCShell (I'm new to PETSc). I don't know Trilinos well 
enough to judge whether it's good from software engineering point of view or 
not, but allow me one last question. What would happen if I wrap all 'other' 
solvers in PCShell and then for some reason, PETSc is not available. None of 
the other solvers would be accessible (unless I modify the source code), so 
wrapping everything using PCShell creates a strong dependency on one 
particular library (PETSc), doesn't it?

Martin


> 
> > Best regards,
> > 
> >  Martin Vymazal
> > 
> > On Tuesday, August 04, 2015 12:24:14 PM Matthew Knepley wrote:
> > > On Tue, Aug 4, 2015 at 12:15 PM, Martin Vymazal <
> > 
> > martin.vymazal at vki.ac.be>
> > 
> > > wrote:
> > > > Hello,
> > > > 
> > > >  I'm trying to create a small C++ class to wrap the 'Vec' object. This
> > > > 
> > > > class
> > > > has an internal pointer to a member variable of type Vec, and in its
> > > > destructor, it calls VecDestroy. Unfortunately, my test program
> > 
> > segfaults
> > 
> > > > and
> > > > this seems to be due to the fact that the destructor of the wrapper
> > 
> > class
> > 
> > > > is
> > > > called after main() calls PetscFinalize(). Apparently VecDestroy
> > 
> > performs
> > 
> > > > some
> > > > collective communication, so calling it after PetscFinalize() is too
> > 
> > late.
> > 
> > > > How
> > > > can I fix this?
> > > 
> > > 1) Declare your C++ in a scope, so that it goes out of scope before
> > > PetscFinalize()
> > > 
> > > 2) Is there any utility to this wrapper since everything can be called
> > > directly from C++?
> > > 
> > >   Thanks,
> > >   
> > >      Matt
> > > > 
> > > > Thank you,
> > > > 
> > > >  Martin Vymazal



More information about the petsc-users mailing list