1af0996ceSBarry Smith #include <petsc/private/fortranimpl.h> 2fcfc5002SJed Brown #include <petscmat.h> 3cdcc8137SSatish Balay 4cdcc8137SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS) 5cdcc8137SSatish Balay #define matmffdsetfunction_ MATMFFDSETFUNCTION 6cdcc8137SSatish Balay #define matmffdsettype_ MATMFFDSETTYPE 76aa9148fSLisandro Dalcin #define matmffdsetoptionsprefix_ MATMFFDSETOPTIONSPREFIX 8c3f9a2e8SBarry Smith #define matmffdsetbase_ MATMFFDSETBASE 9cdcc8137SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 10cdcc8137SSatish Balay #define matmffdsetfunction_ matmffdsetfunction 11cdcc8137SSatish Balay #define matmffdsettype_ matmffdsettype 126aa9148fSLisandro Dalcin #define matmffdsetoptionsprefix_ matmffdsetoptionsprefix 13c3f9a2e8SBarry Smith #define matmffdsetbase_ matmffdsetbase 14cdcc8137SSatish Balay #endif 15cdcc8137SSatish Balay 16cdcc8137SSatish Balay static PetscErrorCode ourmatmffdfunction(void *ctx, Vec x, Vec f) 17cdcc8137SSatish Balay { 18f5b6597dSBarry Smith Mat mat = (Mat)ctx; 199566063dSJacob 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)); 203ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 21cdcc8137SSatish Balay } 22cdcc8137SSatish Balay 2319caf8f3SSatish Balay PETSC_EXTERN void matmffdsetfunction_(Mat *mat, void (*func)(void *, Vec *, Vec *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 24cdcc8137SSatish Balay { 25f5b6597dSBarry Smith PetscObjectAllocateFortranPointers(*mat, 2); 26*8434afd1SBarry Smith ((PetscObject)*mat)->fortran_func_pointers[0] = (PetscVoidFn *)func; 27*8434afd1SBarry Smith ((PetscObject)*mat)->fortran_func_pointers[1] = (PetscVoidFn *)(PETSC_UINTPTR_T)ctx; 282205254eSKarl Rupp 29f5b6597dSBarry Smith *ierr = MatMFFDSetFunction(*mat, ourmatmffdfunction, *mat); 30cdcc8137SSatish Balay } 31cdcc8137SSatish Balay 3219caf8f3SSatish Balay PETSC_EXTERN void matmffdsettype_(Mat *mat, char *ftype, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len) 33cdcc8137SSatish Balay { 34cdcc8137SSatish Balay char *t; 35cdcc8137SSatish Balay FIXCHAR(ftype, len, t); 365975b3b6SBarry Smith *ierr = MatMFFDSetType(*mat, t); 375975b3b6SBarry Smith if (*ierr) return; 38cdcc8137SSatish Balay FREECHAR(ftype, t); 39cdcc8137SSatish Balay } 40cdcc8137SSatish Balay 4119caf8f3SSatish Balay PETSC_EXTERN void matmffdsetoptionsprefix_(Mat *mat, char *prefix, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len) 426aa9148fSLisandro Dalcin { 436aa9148fSLisandro Dalcin char *t; 446aa9148fSLisandro Dalcin FIXCHAR(prefix, len, t); 455975b3b6SBarry Smith *ierr = MatMFFDSetOptionsPrefix(*mat, t); 465975b3b6SBarry Smith if (*ierr) return; 476aa9148fSLisandro Dalcin FREECHAR(prefix, t); 486aa9148fSLisandro Dalcin } 49