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