xref: /petsc/src/snes/utils/ftn-custom/zdmsnesf.c (revision 6a98f8dc3f2c9149905a87dc2e9d0fedaf64e09a)
1 #include <petsc/private/fortranimpl.h>
2 #include <petsc/private/snesimpl.h>
3 #if defined(PETSC_HAVE_FORTRAN_CAPS)
4 #define dmsnessetjacobian_      DMSNESSETJACOBIAN
5 #define dmsnessetfunction_      DMSNESSETFUNCTION
6 #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
7 #define dmsnessetjacobian_      dmsnessetjacobian
8 #define dmsnessetfunction_      dmsnessetfunction
9 #endif
10 
11 static struct {
12   PetscFortranCallbackId snesfunction;
13   PetscFortranCallbackId snesjacobian;
14 } _cb;
15 
16 static PetscErrorCode ourj(SNES snes, Vec X, Mat J, Mat P, void *ptr)
17 {
18   PetscErrorCode ierr;
19   void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),*ctx;
20   DM dm;
21   DMSNES sdm;
22 
23   PetscFunctionBegin;
24   ierr = SNESGetDM(snes,&dm);CHKERRQ(ierr);
25   ierr = DMGetDMSNES(dm, &sdm);CHKERRQ(ierr);
26   ierr = PetscObjectGetFortranCallback((PetscObject) sdm, PETSC_FORTRAN_CALLBACK_SUBTYPE, _cb.snesjacobian, (PetscVoidFunction *) &func, &ctx);CHKERRQ(ierr);
27   (*func)(&snes, &X, &J, &P, ctx, &ierr);CHKERRQ(ierr);
28   PetscFunctionReturn(0);
29 }
30 
31 PETSC_EXTERN void dmsnessetjacobian_(DM *dm, void (*jac)(DM*,Vec*,Mat*,Mat*,void*,PetscErrorCode*), void *ctx, PetscErrorCode *ierr)
32 {
33   DMSNES sdm;
34 
35   *ierr = DMGetDMSNESWrite(*dm, &sdm); if (*ierr) return;
36   *ierr = PetscObjectSetFortranCallback((PetscObject) sdm, PETSC_FORTRAN_CALLBACK_SUBTYPE, &_cb.snesjacobian, (PetscVoidFunction) jac, ctx); if (*ierr) return;
37   *ierr = DMSNESSetJacobian(*dm, ourj, NULL);
38 }
39 
40 static PetscErrorCode ourf(SNES snes, Vec X, Vec F, void *ptr)
41 {
42   PetscErrorCode ierr;
43   void (*func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*), *ctx;
44   DM dm;
45   DMSNES sdm;
46 
47   PetscFunctionBegin;
48   ierr = SNESGetDM(snes,&dm);CHKERRQ(ierr);
49   ierr = DMGetDMSNES(dm, &sdm);CHKERRQ(ierr);
50   ierr = PetscObjectGetFortranCallback((PetscObject) sdm, PETSC_FORTRAN_CALLBACK_SUBTYPE, _cb.snesfunction, (PetscVoidFunction *) &func, &ctx);CHKERRQ(ierr);
51   (*func)(&snes, &X, &F, ctx, &ierr);CHKERRQ(ierr);
52   PetscFunctionReturn(0);
53 }
54 
55 PETSC_EXTERN void dmsnessetfunction_(DM *dm, void (*func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*), void *ctx, PetscErrorCode *ierr)
56 {
57   DMSNES sdm;
58 
59   *ierr = DMGetDMSNESWrite(*dm, &sdm); if (*ierr) return;
60   *ierr = PetscObjectSetFortranCallback((PetscObject) sdm, PETSC_FORTRAN_CALLBACK_SUBTYPE, &_cb.snesfunction, (PetscVoidFunction) func, ctx); if (*ierr) return;
61   *ierr = DMSNESSetFunction(*dm, ourf, NULL);
62 }
63