[petsc-dev] Why do we use void* instead of PetscObject in PETSc?

Jed Brown jed at jedbrown.org
Mon Mar 4 15:47:19 CST 2019

Dave May <dave.mayhem23 at gmail.com> writes:

> On Mon, 4 Mar 2019 at 21:30, Jed Brown <jed at jedbrown.org> wrote:
>> If reusing, would the interface require
>> casting the function pointers to void(*)(void) instead of what is
>> currently type-safe for most function pointers?
> No. I don't see that casting a function pointer would be required.
> We would have
> SNESSetJacobian(SNES snes,Mat Amat,Mat Pmat,PetscErrorCode
> (*J)(SNES,Vec,Mat,Mat,PetscObject),PetscObject ctx)

Oh, the PetscObject would only contain the context, not the function
pointer (at least not publicly).  What does user code look like?

  PetscErrorCode f(..., PetscObject ctx) {
    User user;
    ierr = PetscContainerGetPointer((PetscContainer)ctx,&user);CHKERRQ(ierr);

More information about the petsc-dev mailing list