xref: /petsc/src/snes/impls/shell/ftn-custom/zsnesshellf.c (revision bfe80ac4a46d58cb7760074b25f5e81b2f541d8a)
1 #include <petsc/private/ftnimpl.h>
2 #include <petscsnes.h>
3 
4 #if defined(PETSC_HAVE_FORTRAN_CAPS)
5   #define snesshellsetsolve_ SNESSHELLSETSOLVE
6 #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
7   #define snesshellsetsolve_ snesshellsetsolve
8 #endif
9 
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 }
18 
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 }
25