xref: /petsc/src/snes/impls/shell/ftn-custom/zsnesshellf.c (revision 5f80ce2ab25dff0f4601e710601cbbcecf323266)
1af0996ceSBarry Smith #include <petsc/private/fortranimpl.h>
290b77ac2SPeter Brune #include <petscsnes.h>
390b77ac2SPeter Brune 
490b77ac2SPeter Brune #if defined(PETSC_HAVE_FORTRAN_CAPS)
590b77ac2SPeter Brune #define snesshellsetsolve_               SNESSHELLSETSOLVE
690b77ac2SPeter Brune #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
790b77ac2SPeter Brune #define snesshellsetsolve_               snesshellsetsolve
890b77ac2SPeter Brune #endif
990b77ac2SPeter Brune 
1090b77ac2SPeter Brune static PetscErrorCode oursnesshellsolve(SNES snes,Vec x)
1190b77ac2SPeter Brune {
1219caf8f3SSatish Balay   void (*func)(SNES*,Vec*,PetscErrorCode*);
13*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectQueryFunction((PetscObject)snes,"SNESShellSolve_C",&func));
14*5f80ce2aSJacob Faibussowitsch   PetscCheck(func,PetscObjectComm((PetscObject)snes),PETSC_ERR_USER,"SNESShellSetSolve() must be called before SNESSolve()");
15*5f80ce2aSJacob Faibussowitsch   CHKERR_FORTRAN_VOID_FUNCTION(func(&snes,&x,&ierr));
1690b77ac2SPeter Brune   return 0;
1790b77ac2SPeter Brune }
18158f039cSPeter Brune 
1919caf8f3SSatish Balay PETSC_EXTERN void snesshellsetsolve_(SNES *snes,void (*func)(SNES*,Vec*,PetscErrorCode*),PetscErrorCode *ierr)
2090b77ac2SPeter Brune {
21bdf89e91SBarry Smith   PetscObjectComposeFunction((PetscObject)*snes,"SNESShellSolve_C",(PetscVoidFunction)func);
2290b77ac2SPeter Brune   *ierr = SNESShellSetSolve(*snes,oursnesshellsolve);
2390b77ac2SPeter Brune }
24