xref: /petsc/src/mat/impls/mffd/ftn-custom/zmffdf.c (revision c3f9a2e811c4ed6aadf9029001f56003a7a67eb2)
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
8*c3f9a2e8SBarry 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
13*c3f9a2e8SBarry Smith #define matmffdsetbase_                matmffdsetbase
14cdcc8137SSatish Balay #endif
15cdcc8137SSatish Balay 
16cdcc8137SSatish Balay static PetscErrorCode ourmatmffdfunction(void *ctx,Vec x,Vec f)
17cdcc8137SSatish Balay {
18cdcc8137SSatish Balay   PetscErrorCode ierr = 0;
19f5b6597dSBarry Smith   Mat            mat  = (Mat) ctx;
201d14097aSBarry Smith   (*(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);
21cdcc8137SSatish Balay   return 0;
22cdcc8137SSatish Balay }
23cdcc8137SSatish Balay 
248cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matmffdsetfunction_(Mat *mat,void (PETSC_STDCALL *func)(void*,Vec*,Vec*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
25cdcc8137SSatish Balay {
26f5b6597dSBarry Smith   PetscObjectAllocateFortranPointers(*mat,2);
27f5b6597dSBarry Smith   ((PetscObject)*mat)->fortran_func_pointers[0] = (PetscVoidFunction)func;
281d14097aSBarry Smith   ((PetscObject)*mat)->fortran_func_pointers[1] = (PetscVoidFunction)(PETSC_UINTPTR_T)ctx;
292205254eSKarl Rupp 
30f5b6597dSBarry Smith   *ierr = MatMFFDSetFunction(*mat,ourmatmffdfunction,*mat);
31cdcc8137SSatish Balay }
32cdcc8137SSatish Balay 
33390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL matmffdsettype_(Mat *mat,char* ftype PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
34cdcc8137SSatish Balay {
35cdcc8137SSatish Balay   char *t;
36cdcc8137SSatish Balay   FIXCHAR(ftype,len,t);
37cdcc8137SSatish Balay   *ierr = MatMFFDSetType(*mat,t);
38cdcc8137SSatish Balay   FREECHAR(ftype,t);
39cdcc8137SSatish Balay }
40cdcc8137SSatish Balay 
41390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL matmffdsetoptionsprefix_(Mat *mat,char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
426aa9148fSLisandro Dalcin {
436aa9148fSLisandro Dalcin   char *t;
446aa9148fSLisandro Dalcin   FIXCHAR(prefix,len,t);
456aa9148fSLisandro Dalcin   *ierr = MatMFFDSetOptionsPrefix(*mat,t);
466aa9148fSLisandro Dalcin   FREECHAR(prefix,t);
476aa9148fSLisandro Dalcin }
486aa9148fSLisandro Dalcin 
49*c3f9a2e8SBarry Smith PETSC_EXTERN void PETSC_STDCALL matmffdsetbase_(Mat *mat,Vec *u,Vec *f,PetscErrorCode *ierr)
50*c3f9a2e8SBarry Smith {
51*c3f9a2e8SBarry Smith   CHKFORTRANNULLOBJECT(f);
52*c3f9a2e8SBarry Smith  *ierr = MatMFFDSetBase(*mat,*u,*f);
53*c3f9a2e8SBarry Smith }
54*c3f9a2e8SBarry Smith 
55