xref: /petsc/src/snes/utils/ftn-custom/zdmlocalsnesf.c (revision 3ba1676111f5c958fe6c2729b46ca4d523958bb3)
1af0996ceSBarry Smith #include <petsc/private/fortranimpl.h>
2af0996ceSBarry Smith #include <petsc/private/snesimpl.h>
3a63a1bedSMatthew G. Knepley #if defined(PETSC_HAVE_FORTRAN_CAPS)
4a63a1bedSMatthew G. Knepley #define dmsnessetjacobianlocal_      DMSNESSETJACOBIANLOCAL
5a63a1bedSMatthew G. Knepley #define dmsnessetfunctionlocal_      DMSNESSETFUNCTIONLOCAL
6a63a1bedSMatthew G. Knepley #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
7a63a1bedSMatthew G. Knepley #define dmsnessetjacobianlocal_      dmsnessetjacobianlocal
8a63a1bedSMatthew G. Knepley #define dmsnessetfunctionlocal_      dmsnessetfunctionlocal
9a63a1bedSMatthew G. Knepley #endif
10a63a1bedSMatthew G. Knepley 
11a63a1bedSMatthew G. Knepley static struct {
12a63a1bedSMatthew G. Knepley   PetscFortranCallbackId lf;
13a63a1bedSMatthew G. Knepley   PetscFortranCallbackId lj;
14a63a1bedSMatthew G. Knepley } _cb;
15a63a1bedSMatthew G. Knepley 
16d1e9a80fSBarry Smith static PetscErrorCode sourlj(DM dm, Vec X, Mat J, Mat P, void *ptr)
17a63a1bedSMatthew G. Knepley {
1819caf8f3SSatish Balay   void (*func)(DM*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),*ctx;
19a63a1bedSMatthew G. Knepley   DMSNES sdm;
20a63a1bedSMatthew G. Knepley 
21a63a1bedSMatthew G. Knepley   PetscFunctionBegin;
229566063dSJacob Faibussowitsch   PetscCall(DMGetDMSNES(dm, &sdm));
239566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetFortranCallback((PetscObject) sdm, PETSC_FORTRAN_CALLBACK_SUBTYPE, _cb.lj, (PetscVoidFunction *) &func, &ctx));
249566063dSJacob Faibussowitsch   PetscCallFortranVoidFunction((*func)(&dm, &X, &J, &P, ctx, &ierr));
25*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
26a63a1bedSMatthew G. Knepley }
27a63a1bedSMatthew G. Knepley 
2819caf8f3SSatish Balay PETSC_EXTERN void dmsnessetjacobianlocal_(DM *dm, void (*jac)(DM*,Vec*,Mat*,Mat*,void*,PetscErrorCode*), void *ctx, PetscErrorCode *ierr)
29a63a1bedSMatthew G. Knepley {
30a63a1bedSMatthew G. Knepley   DMSNES sdm;
31a63a1bedSMatthew G. Knepley 
32a63a1bedSMatthew G. Knepley   *ierr = DMGetDMSNESWrite(*dm, &sdm); if (*ierr) return;
33a63a1bedSMatthew G. Knepley   *ierr = PetscObjectSetFortranCallback((PetscObject) sdm, PETSC_FORTRAN_CALLBACK_SUBTYPE, &_cb.lj, (PetscVoidFunction) jac, ctx); if (*ierr) return;
34430b4d03SJed Brown   *ierr = DMSNESSetJacobianLocal(*dm, sourlj, NULL);
35a63a1bedSMatthew G. Knepley }
36a63a1bedSMatthew G. Knepley 
37a63a1bedSMatthew G. Knepley static PetscErrorCode sourlf(DM dm, Vec X, Vec F, void *ptr)
38a63a1bedSMatthew G. Knepley {
3919caf8f3SSatish Balay   void (*func)(DM*,Vec*,Vec*,void*,PetscErrorCode*), *ctx;
40a63a1bedSMatthew G. Knepley   DMSNES sdm;
41a63a1bedSMatthew G. Knepley 
42a63a1bedSMatthew G. Knepley   PetscFunctionBegin;
439566063dSJacob Faibussowitsch   PetscCall(DMGetDMSNES(dm, &sdm));
449566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetFortranCallback((PetscObject) sdm, PETSC_FORTRAN_CALLBACK_SUBTYPE, _cb.lf, (PetscVoidFunction *) &func, &ctx));
459566063dSJacob Faibussowitsch   PetscCallFortranVoidFunction((*func)(&dm, &X, &F, ctx, &ierr));
46*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
47a63a1bedSMatthew G. Knepley }
48a63a1bedSMatthew G. Knepley 
4919caf8f3SSatish Balay PETSC_EXTERN void dmsnessetfunctionlocal_(DM *dm, void (*func)(DM*,Vec*,Vec*,void*,PetscErrorCode*), void *ctx, PetscErrorCode *ierr)
50a63a1bedSMatthew G. Knepley {
51a63a1bedSMatthew G. Knepley   DMSNES sdm;
52a63a1bedSMatthew G. Knepley 
53a63a1bedSMatthew G. Knepley   *ierr = DMGetDMSNESWrite(*dm, &sdm); if (*ierr) return;
54a63a1bedSMatthew G. Knepley   *ierr = PetscObjectSetFortranCallback((PetscObject) sdm, PETSC_FORTRAN_CALLBACK_SUBTYPE, &_cb.lf, (PetscVoidFunction) func, ctx); if (*ierr) return;
55430b4d03SJed Brown   *ierr = DMSNESSetFunctionLocal(*dm, sourlf, NULL);
56a63a1bedSMatthew G. Knepley }
57