1ce0a2cd1SBarry Smith #include "private/fortranimpl.h" 2*7850c7c0SBarry Smith #include "private/matimpl.h" 3f4e70085SSatish Balay #include "petscts.h" 4f4e70085SSatish Balay 5f4e70085SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS) 6f4e70085SSatish Balay #define matfdcoloringsetfunctionts_ MATFDCOLORINGSETFUNCTIONTS 7f4e70085SSatish Balay #define matfdcoloringsetfunctionsnes_ MATFDCOLORINGSETFUNCTIONSNES 81d2e4005SSatish Balay #define matfdcoloringview_ MATFDCOLORINGVIEW 9f4e70085SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 10f4e70085SSatish Balay #define matfdcoloringsetfunctionts_ matfdcoloringsetfunctionts 11f4e70085SSatish Balay #define matfdcoloringsetfunctionsnes_ matfdcoloringsetfunctionsnes 121d2e4005SSatish Balay #define matfdcoloringview_ matfdcoloringview 13f4e70085SSatish Balay #endif 14f4e70085SSatish Balay 15f4e70085SSatish Balay 16f4e70085SSatish Balay /* These are not extern C because they are passed into non-extern C user level functions */ 17*7850c7c0SBarry Smith static PetscErrorCode ourmatfdcoloringfunctionts(TS ts,PetscReal t,Vec x,Vec y,MatFDColoring fd) 18f4e70085SSatish Balay { 19f4e70085SSatish Balay PetscErrorCode ierr = 0; 20*7850c7c0SBarry Smith (*(void (PETSC_STDCALL *)(TS*,PetscReal*,Vec*,Vec*,void*,PetscErrorCode*))(fd->ftn_func_pointer)) (&ts,&t,&x,&y,fd->ftn_func_cntx,&ierr); 21f4e70085SSatish Balay return ierr; 22f4e70085SSatish Balay } 23f4e70085SSatish Balay 24*7850c7c0SBarry Smith static PetscErrorCode ourmatfdcoloringfunctionsnes(SNES snes,Vec x,Vec y,MatFDColoring fd) 25f4e70085SSatish Balay { 26f4e70085SSatish Balay PetscErrorCode ierr = 0; 27*7850c7c0SBarry Smith (*(void (PETSC_STDCALL *)(SNES*,Vec*,Vec*,void*,PetscErrorCode*))(fd->ftn_func_pointer)) (&snes,&x,&y,fd->ftn_func_cntx,&ierr); 28f4e70085SSatish Balay return ierr; 29f4e70085SSatish Balay } 30f4e70085SSatish Balay 31f4e70085SSatish Balay EXTERN_C_BEGIN 32f4e70085SSatish Balay 33f4e70085SSatish Balay /* 34*7850c7c0SBarry Smith MatFDColoringSetFunction sticks the Fortran function and its context into the MatFDColoring structure and passes the MatFDColoring object 35*7850c7c0SBarry Smith in as the function context. ourmafdcoloringfunctionsnes() and ourmatfdcoloringfunctionts() then access the function and its context from the 36*7850c7c0SBarry Smith MatFDColoring that is passed in. This is the same way that fortran_func_pointers is used in PETSc objects. 37f4e70085SSatish Balay 38f4e70085SSatish Balay NOTE: FORTRAN USER CANNOT PUT IN A NEW J OR B currently. 39f4e70085SSatish Balay */ 40f4e70085SSatish Balay 41f4e70085SSatish Balay 42*7850c7c0SBarry Smith void PETSC_STDCALL matfdcoloringsetfunctionts_(MatFDColoring *fd,void (PETSC_STDCALL *f)(TS*,double*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 43f4e70085SSatish Balay { 44*7850c7c0SBarry Smith (*fd)->ftn_func_pointer = (void*) f; 45*7850c7c0SBarry Smith (*fd)->ftn_func_cntx = ctx; 46*7850c7c0SBarry Smith *ierr = MatFDColoringSetFunction(*fd,(PetscErrorCodeFunction)ourmatfdcoloringfunctionts,*fd); 47f4e70085SSatish Balay } 48f4e70085SSatish Balay 49*7850c7c0SBarry Smith void PETSC_STDCALL matfdcoloringsetfunction_(MatFDColoring *fd,void (PETSC_STDCALL *f)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 50f4e70085SSatish Balay { 51*7850c7c0SBarry Smith (*fd)->ftn_func_pointer = (void*) f; 52*7850c7c0SBarry Smith (*fd)->ftn_func_cntx = ctx; 53*7850c7c0SBarry Smith *ierr = MatFDColoringSetFunction(*fd,(PetscErrorCodeFunction)ourmatfdcoloringfunctionsnes,*fd); 54f4e70085SSatish Balay } 55f4e70085SSatish Balay 561d2e4005SSatish Balay void PETSC_STDCALL matfdcoloringview_(MatFDColoring *c,PetscViewer *vin,PetscErrorCode *ierr) 571d2e4005SSatish Balay { 581d2e4005SSatish Balay PetscViewer v; 591d2e4005SSatish Balay 601d2e4005SSatish Balay PetscPatchDefaultViewers_Fortran(vin,v); 611d2e4005SSatish Balay *ierr = MatFDColoringView(*c,v); 621d2e4005SSatish Balay } 631d2e4005SSatish Balay 641d2e4005SSatish Balay 65f4e70085SSatish Balay EXTERN_C_END 66