xref: /petsc/src/snes/utils/ftn-custom/zdmlocalsnesf.c (revision 503c0ea9b45bcfbcebbb1ea5341243bbc69f0bea)
1 #include <petsc/private/fortranimpl.h>
2 #include <petsc/private/snesimpl.h>
3 #if defined(PETSC_HAVE_FORTRAN_CAPS)
4 #define dmsnessetjacobianlocal_      DMSNESSETJACOBIANLOCAL
5 #define dmsnessetfunctionlocal_      DMSNESSETFUNCTIONLOCAL
6 #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
7 #define dmsnessetjacobianlocal_      dmsnessetjacobianlocal
8 #define dmsnessetfunctionlocal_      dmsnessetfunctionlocal
9 #endif
10 
11 static struct {
12   PetscFortranCallbackId lf;
13   PetscFortranCallbackId lj;
14 } _cb;
15 
16 static PetscErrorCode sourlj(DM dm, Vec X, Mat J, Mat P, void *ptr)
17 {
18   void (*func)(DM*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),*ctx;
19   DMSNES sdm;
20 
21   PetscFunctionBegin;
22   PetscCall(DMGetDMSNES(dm, &sdm));
23   PetscCall(PetscObjectGetFortranCallback((PetscObject) sdm, PETSC_FORTRAN_CALLBACK_SUBTYPE, _cb.lj, (PetscVoidFunction *) &func, &ctx));
24   PetscCallFortranVoidFunction((*func)(&dm, &X, &J, &P, ctx, &ierr));
25   PetscFunctionReturn(0);
26 }
27 
28 PETSC_EXTERN void dmsnessetjacobianlocal_(DM *dm, void (*jac)(DM*,Vec*,Mat*,Mat*,void*,PetscErrorCode*), void *ctx, PetscErrorCode *ierr)
29 {
30   DMSNES sdm;
31 
32   *ierr = DMGetDMSNESWrite(*dm, &sdm); if (*ierr) return;
33   *ierr = PetscObjectSetFortranCallback((PetscObject) sdm, PETSC_FORTRAN_CALLBACK_SUBTYPE, &_cb.lj, (PetscVoidFunction) jac, ctx); if (*ierr) return;
34   *ierr = DMSNESSetJacobianLocal(*dm, sourlj, NULL);
35 }
36 
37 static PetscErrorCode sourlf(DM dm, Vec X, Vec F, void *ptr)
38 {
39   void (*func)(DM*,Vec*,Vec*,void*,PetscErrorCode*), *ctx;
40   DMSNES sdm;
41 
42   PetscFunctionBegin;
43   PetscCall(DMGetDMSNES(dm, &sdm));
44   PetscCall(PetscObjectGetFortranCallback((PetscObject) sdm, PETSC_FORTRAN_CALLBACK_SUBTYPE, _cb.lf, (PetscVoidFunction *) &func, &ctx));
45   PetscCallFortranVoidFunction((*func)(&dm, &X, &F, ctx, &ierr));
46   PetscFunctionReturn(0);
47 }
48 
49 PETSC_EXTERN void dmsnessetfunctionlocal_(DM *dm, void (*func)(DM*,Vec*,Vec*,void*,PetscErrorCode*), void *ctx, PetscErrorCode *ierr)
50 {
51   DMSNES sdm;
52 
53   *ierr = DMGetDMSNESWrite(*dm, &sdm); if (*ierr) return;
54   *ierr = PetscObjectSetFortranCallback((PetscObject) sdm, PETSC_FORTRAN_CALLBACK_SUBTYPE, &_cb.lf, (PetscVoidFunction) func, ctx); if (*ierr) return;
55   *ierr = DMSNESSetFunctionLocal(*dm, sourlf, NULL);
56 }
57