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