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