16dd63270SBarry Smith #include <petsc/private/ftnimpl.h>
2fcfc5002SJed Brown #include <petscmat.h>
3cdcc8137SSatish Balay
4cdcc8137SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
5cdcc8137SSatish Balay #define matmffdsetfunction_ MATMFFDSETFUNCTION
6c3f9a2e8SBarry Smith #define matmffdsetbase_ MATMFFDSETBASE
7cdcc8137SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
8cdcc8137SSatish Balay #define matmffdsetfunction_ matmffdsetfunction
9c3f9a2e8SBarry Smith #define matmffdsetbase_ matmffdsetbase
10cdcc8137SSatish Balay #endif
11cdcc8137SSatish Balay
ourmatmffdfunction(PetscCtx ctx,Vec x,Vec f)12*2a8381b2SBarry Smith static PetscErrorCode ourmatmffdfunction(PetscCtx ctx, Vec x, Vec f)
13cdcc8137SSatish Balay {
14f5b6597dSBarry Smith Mat mat = (Mat)ctx;
159566063dSJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(void *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[0]))((void *)(PETSC_UINTPTR_T)((PetscObject)mat)->fortran_func_pointers[1], &x, &f, &ierr));
163ba16761SJacob Faibussowitsch return PETSC_SUCCESS;
17cdcc8137SSatish Balay }
18cdcc8137SSatish Balay
matmffdsetfunction_(Mat * mat,void (* func)(void *,Vec *,Vec *,PetscErrorCode *),PetscCtx ctx,PetscErrorCode * ierr)19*2a8381b2SBarry Smith PETSC_EXTERN void matmffdsetfunction_(Mat *mat, void (*func)(void *, Vec *, Vec *, PetscErrorCode *), PetscCtx ctx, PetscErrorCode *ierr)
20cdcc8137SSatish Balay {
21f5b6597dSBarry Smith PetscObjectAllocateFortranPointers(*mat, 2);
225ebfa9e9SBarry Smith ((PetscObject)*mat)->fortran_func_pointers[0] = (PetscFortranCallbackFn *)func;
235ebfa9e9SBarry Smith ((PetscObject)*mat)->fortran_func_pointers[1] = (PetscFortranCallbackFn *)(PETSC_UINTPTR_T)ctx;
242205254eSKarl Rupp
25f5b6597dSBarry Smith *ierr = MatMFFDSetFunction(*mat, ourmatmffdfunction, *mat);
26cdcc8137SSatish Balay }
27