xref: /petsc/src/snes/utils/ftn-custom/zdmsnesf.c (revision 3ba1676111f5c958fe6c2729b46ca4d523958bb3)
1af0996ceSBarry Smith #include <petsc/private/fortranimpl.h>
2af0996ceSBarry Smith #include <petsc/private/snesimpl.h>
3382167b7SJed Brown #if defined(PETSC_HAVE_FORTRAN_CAPS)
4382167b7SJed Brown #define dmsnessetjacobian_      DMSNESSETJACOBIAN
5382167b7SJed Brown #define dmsnessetfunction_      DMSNESSETFUNCTION
6382167b7SJed Brown #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
7382167b7SJed Brown #define dmsnessetjacobian_      dmsnessetjacobian
8382167b7SJed Brown #define dmsnessetfunction_      dmsnessetfunction
9382167b7SJed Brown #endif
10382167b7SJed Brown 
11382167b7SJed Brown static struct {
12382167b7SJed Brown   PetscFortranCallbackId snesfunction;
13382167b7SJed Brown   PetscFortranCallbackId snesjacobian;
14382167b7SJed Brown } _cb;
15382167b7SJed Brown 
16d1e9a80fSBarry Smith static PetscErrorCode ourj(SNES snes, Vec X, Mat J, Mat P, void *ptr)
17382167b7SJed Brown {
1819caf8f3SSatish Balay   void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),*ctx;
19382167b7SJed Brown   DM dm;
20382167b7SJed Brown   DMSNES sdm;
21382167b7SJed Brown 
22382167b7SJed Brown   PetscFunctionBegin;
239566063dSJacob Faibussowitsch   PetscCall(SNESGetDM(snes,&dm));
249566063dSJacob Faibussowitsch   PetscCall(DMGetDMSNES(dm, &sdm));
259566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetFortranCallback((PetscObject) sdm, PETSC_FORTRAN_CALLBACK_SUBTYPE, _cb.snesjacobian, (PetscVoidFunction *) &func, &ctx));
269566063dSJacob Faibussowitsch   PetscCallFortranVoidFunction((*func)(&snes, &X, &J, &P, ctx, &ierr));
27*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
28382167b7SJed Brown }
29382167b7SJed Brown 
3019caf8f3SSatish Balay PETSC_EXTERN void dmsnessetjacobian_(DM *dm, void (*jac)(DM*,Vec*,Mat*,Mat*,void*,PetscErrorCode*), void *ctx, PetscErrorCode *ierr)
31382167b7SJed Brown {
32382167b7SJed Brown   DMSNES sdm;
33382167b7SJed Brown 
34382167b7SJed Brown   *ierr = DMGetDMSNESWrite(*dm, &sdm); if (*ierr) return;
35382167b7SJed Brown   *ierr = PetscObjectSetFortranCallback((PetscObject) sdm, PETSC_FORTRAN_CALLBACK_SUBTYPE, &_cb.snesjacobian, (PetscVoidFunction) jac, ctx); if (*ierr) return;
36382167b7SJed Brown   *ierr = DMSNESSetJacobian(*dm, ourj, NULL);
37382167b7SJed Brown }
38382167b7SJed Brown 
39382167b7SJed Brown static PetscErrorCode ourf(SNES snes, Vec X, Vec F, void *ptr)
40382167b7SJed Brown {
4119caf8f3SSatish Balay   void (*func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*), *ctx;
42382167b7SJed Brown   DM dm;
43382167b7SJed Brown   DMSNES sdm;
44382167b7SJed Brown 
45382167b7SJed Brown   PetscFunctionBegin;
469566063dSJacob Faibussowitsch   PetscCall(SNESGetDM(snes,&dm));
479566063dSJacob Faibussowitsch   PetscCall(DMGetDMSNES(dm, &sdm));
489566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetFortranCallback((PetscObject) sdm, PETSC_FORTRAN_CALLBACK_SUBTYPE, _cb.snesfunction, (PetscVoidFunction *) &func, &ctx));
499566063dSJacob Faibussowitsch   PetscCallFortranVoidFunction((*func)(&snes, &X, &F, ctx, &ierr));
50*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
51382167b7SJed Brown }
52382167b7SJed Brown 
5319caf8f3SSatish Balay PETSC_EXTERN void dmsnessetfunction_(DM *dm, void (*func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*), void *ctx, PetscErrorCode *ierr)
54382167b7SJed Brown {
55382167b7SJed Brown   DMSNES sdm;
56382167b7SJed Brown 
57382167b7SJed Brown   *ierr = DMGetDMSNESWrite(*dm, &sdm); if (*ierr) return;
58382167b7SJed Brown   *ierr = PetscObjectSetFortranCallback((PetscObject) sdm, PETSC_FORTRAN_CALLBACK_SUBTYPE, &_cb.snesfunction, (PetscVoidFunction) func, ctx); if (*ierr) return;
59382167b7SJed Brown   *ierr = DMSNESSetFunction(*dm, ourf, NULL);
60382167b7SJed Brown }
61