xref: /petsc/src/mat/impls/mffd/ftn-custom/zmffdf.c (revision 5b6bfdb9644f185dbf5e5a09b808ec241507e1e7)
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