xref: /petsc/src/snes/utils/ftn-custom/zdmlocalsnesf.c (revision ccb4e88a40f0b86eaeca07ff64c64e4de2fae686)
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   PetscErrorCode ierr;
19   void (*func)(DM*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),*ctx;
20   DMSNES sdm;
21 
22   PetscFunctionBegin;
23   ierr = DMGetDMSNES(dm, &sdm);CHKERRQ(ierr);
24   ierr = PetscObjectGetFortranCallback((PetscObject) sdm, PETSC_FORTRAN_CALLBACK_SUBTYPE, _cb.lj, (PetscVoidFunction *) &func, &ctx);CHKERRQ(ierr);
25   (*func)(&dm, &X, &J, &P, ctx, &ierr);CHKERRQ(ierr);
26   PetscFunctionReturn(0);
27 }
28 
29 PETSC_EXTERN void dmsnessetjacobianlocal_(DM *dm, void (*jac)(DM*,Vec*,Mat*,Mat*,void*,PetscErrorCode*), void *ctx, PetscErrorCode *ierr)
30 {
31   DMSNES sdm;
32 
33   *ierr = DMGetDMSNESWrite(*dm, &sdm); if (*ierr) return;
34   *ierr = PetscObjectSetFortranCallback((PetscObject) sdm, PETSC_FORTRAN_CALLBACK_SUBTYPE, &_cb.lj, (PetscVoidFunction) jac, ctx); if (*ierr) return;
35   *ierr = DMSNESSetJacobianLocal(*dm, sourlj, NULL);
36 }
37 
38 static PetscErrorCode sourlf(DM dm, Vec X, Vec F, void *ptr)
39 {
40   PetscErrorCode ierr;
41   void (*func)(DM*,Vec*,Vec*,void*,PetscErrorCode*), *ctx;
42   DMSNES sdm;
43 
44   PetscFunctionBegin;
45   ierr = DMGetDMSNES(dm, &sdm);CHKERRQ(ierr);
46   ierr = PetscObjectGetFortranCallback((PetscObject) sdm, PETSC_FORTRAN_CALLBACK_SUBTYPE, _cb.lf, (PetscVoidFunction *) &func, &ctx);CHKERRQ(ierr);
47   (*func)(&dm, &X, &F, ctx, &ierr);CHKERRQ(ierr);
48   PetscFunctionReturn(0);
49 }
50 
51 PETSC_EXTERN void dmsnessetfunctionlocal_(DM *dm, void (*func)(DM*,Vec*,Vec*,void*,PetscErrorCode*), void *ctx, PetscErrorCode *ierr)
52 {
53   DMSNES sdm;
54 
55   *ierr = DMGetDMSNESWrite(*dm, &sdm); if (*ierr) return;
56   *ierr = PetscObjectSetFortranCallback((PetscObject) sdm, PETSC_FORTRAN_CALLBACK_SUBTYPE, &_cb.lf, (PetscVoidFunction) func, ctx); if (*ierr) return;
57   *ierr = DMSNESSetFunctionLocal(*dm, sourlf, NULL);
58 }
59