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 12cdcc8137SSatish Balay static PetscErrorCode ourmatmffdfunction(void *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 1919caf8f3SSatish Balay PETSC_EXTERN void matmffdsetfunction_(Mat *mat, void (*func)(void *, Vec *, Vec *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 20cdcc8137SSatish Balay { 21f5b6597dSBarry Smith PetscObjectAllocateFortranPointers(*mat, 2); 22*5ebfa9e9SBarry Smith ((PetscObject)*mat)->fortran_func_pointers[0] = (PetscFortranCallbackFn *)func; 23*5ebfa9e9SBarry Smith ((PetscObject)*mat)->fortran_func_pointers[1] = (PetscFortranCallbackFn *)(PETSC_UINTPTR_T)ctx; 242205254eSKarl Rupp 25f5b6597dSBarry Smith *ierr = MatMFFDSetFunction(*mat, ourmatmffdfunction, *mat); 26cdcc8137SSatish Balay } 27