xref: /petsc/src/snes/impls/shell/ftn-custom/zsnesshellf.c (revision 8cc058d9cd56c1ccb3be12a47760ddfc446aaffc)
190b77ac2SPeter Brune #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 {
1290b77ac2SPeter Brune   PetscErrorCode ierr = 0;
13158f039cSPeter Brune   void (PETSC_STDCALL *func)(SNES*,Vec*,PetscErrorCode*);
14158f039cSPeter Brune   ierr = PetscObjectQueryFunction((PetscObject)snes,"SNESShellSolve_C",(PetscVoidFunction*)&func);CHKERRQ(ierr);
15ce94432eSBarry Smith   if (!func) SETERRQ(PetscObjectComm((PetscObject)snes),PETSC_ERR_USER,"SNESShellSetSolve() must be called before SNESSolve()");
16158f039cSPeter Brune   func(&snes,&x,&ierr);CHKERRQ(ierr);
1790b77ac2SPeter Brune   return 0;
1890b77ac2SPeter Brune }
19158f039cSPeter Brune 
20*8cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesshellsetsolve_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,Vec*,PetscErrorCode*),PetscErrorCode *ierr)
2190b77ac2SPeter Brune {
2200de8ff0SBarry Smith   PetscObjectComposeFunction((PetscObject)*snes,"SNESShellSolve_C",NULL,(PetscVoidFunction)func);
2390b77ac2SPeter Brune   *ierr = SNESShellSetSolve(*snes,oursnesshellsolve);
2490b77ac2SPeter Brune }
25