Actual source code: zsnesshellf.c

  1: #include <petsc/private/fortranimpl.h>
  2: #include <petscsnes.h>

  4: #if defined(PETSC_HAVE_FORTRAN_CAPS)
  5:   #define snesshellsetsolve_ SNESSHELLSETSOLVE
  6: #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
  7:   #define snesshellsetsolve_ snesshellsetsolve
  8: #endif

 10: static PetscErrorCode oursnesshellsolve(SNES snes, Vec x)
 11: {
 12:   void (*func)(SNES *, Vec *, PetscErrorCode *);
 13:   PetscCall(PetscObjectQueryFunction((PetscObject)snes, "SNESShellSolve_C", &func));
 14:   PetscCheck(func, PetscObjectComm((PetscObject)snes), PETSC_ERR_USER, "SNESShellSetSolve() must be called before SNESSolve()");
 15:   PetscCallFortranVoidFunction(func(&snes, &x, &ierr));
 16:   return PETSC_SUCCESS;
 17: }

 19: PETSC_EXTERN void snesshellsetsolve_(SNES *snes, void (*func)(SNES *, Vec *, PetscErrorCode *), PetscErrorCode *ierr)
 20: {
 21:   *ierr = PetscObjectComposeFunction((PetscObject)*snes, "SNESShellSolve_C", (PetscVoidFn *)func);
 22:   if (*ierr) return;
 23:   *ierr = SNESShellSetSolve(*snes, oursnesshellsolve);
 24: }