1 #include <petsc/private/ftnimpl.h> 2 #include <petscmat.h> 3 4 #if defined(PETSC_HAVE_FORTRAN_CAPS) 5 #define matmffdsetfunction_ MATMFFDSETFUNCTION 6 #define matmffdsetbase_ MATMFFDSETBASE 7 #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 8 #define matmffdsetfunction_ matmffdsetfunction 9 #define matmffdsetbase_ matmffdsetbase 10 #endif 11 12 static PetscErrorCode ourmatmffdfunction(void *ctx, Vec x, Vec f) 13 { 14 Mat mat = (Mat)ctx; 15 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)); 16 return PETSC_SUCCESS; 17 } 18 19 PETSC_EXTERN void matmffdsetfunction_(Mat *mat, void (*func)(void *, Vec *, Vec *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 20 { 21 PetscObjectAllocateFortranPointers(*mat, 2); 22 ((PetscObject)*mat)->fortran_func_pointers[0] = (PetscVoidFn *)func; 23 ((PetscObject)*mat)->fortran_func_pointers[1] = (PetscVoidFn *)(PETSC_UINTPTR_T)ctx; 24 25 *ierr = MatMFFDSetFunction(*mat, ourmatmffdfunction, *mat); 26 } 27