1 #include "private/fortranimpl.h" 2 #include "petscsnes.h" 3 4 #if defined(PETSC_HAVE_FORTRAN_CAPS) 5 #define matmffdsetfunction_ MATMFFDSETFUNCTION 6 #define matmffdsettype_ MATMFFDSETTYPE 7 #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 8 #define matmffdsetfunction_ matmffdsetfunction 9 #define matmffdsettype_ matmffdsettype 10 #endif 11 12 static PetscErrorCode ourmatmffdfunction(void *ctx,Vec x,Vec f) 13 { 14 PetscErrorCode ierr = 0; 15 Mat mat = (Mat) ctx; 16 (*(void (PETSC_STDCALL *)(void*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)mat)->fortran_func_pointers[0]))((void*)((PetscObject)mat)->fortran_func_pointers[1],&x,&f,&ierr);CHKERRQ(ierr); 17 return 0; 18 } 19 20 EXTERN_C_BEGIN 21 void PETSC_STDCALL matmffdsetfunction_(Mat *mat,void (PETSC_STDCALL *func)(void*,Vec*,Vec*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 22 { 23 CHKFORTRANNULLOBJECT(ctx); 24 PetscObjectAllocateFortranPointers(*mat,2); 25 ((PetscObject)*mat)->fortran_func_pointers[0] = (PetscVoidFunction)func; 26 ((PetscObject)*mat)->fortran_func_pointers[1] = (PetscVoidFunction)ctx; 27 *ierr = MatMFFDSetFunction(*mat,ourmatmffdfunction,*mat); 28 } 29 30 void PETSC_STDCALL matmffdsettype_(Mat *mat,CHAR ftype PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 31 { 32 char *t; 33 FIXCHAR(ftype,len,t); 34 *ierr = MatMFFDSetType(*mat,t); 35 FREECHAR(ftype,t); 36 } 37 38 EXTERN_C_END 39