1ce0a2cd1SBarry Smith #include "private/fortranimpl.h" 27850c7c0SBarry 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 7*372a5eeaSSatish Balay #define matfdcoloringsetfunction_ MATFDCOLORINGSETFUNCTIONS 81d2e4005SSatish Balay #define matfdcoloringview_ MATFDCOLORINGVIEW 9f4e70085SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 10f4e70085SSatish Balay #define matfdcoloringsetfunctionts_ matfdcoloringsetfunctionts 11*372a5eeaSSatish Balay #define matfdcoloringsetfunction_ matfdcoloringsetfunction 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 */ 177850c7c0SBarry Smith static PetscErrorCode ourmatfdcoloringfunctionts(TS ts,PetscReal t,Vec x,Vec y,MatFDColoring fd) 18f4e70085SSatish Balay { 19f4e70085SSatish Balay PetscErrorCode ierr = 0; 207850c7c0SBarry 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 247850c7c0SBarry Smith static PetscErrorCode ourmatfdcoloringfunctionsnes(SNES snes,Vec x,Vec y,MatFDColoring fd) 25f4e70085SSatish Balay { 26f4e70085SSatish Balay PetscErrorCode ierr = 0; 277850c7c0SBarry 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 /* 347850c7c0SBarry Smith MatFDColoringSetFunction sticks the Fortran function and its context into the MatFDColoring structure and passes the MatFDColoring object 357850c7c0SBarry Smith in as the function context. ourmafdcoloringfunctionsnes() and ourmatfdcoloringfunctionts() then access the function and its context from the 367850c7c0SBarry 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 427850c7c0SBarry Smith void PETSC_STDCALL matfdcoloringsetfunctionts_(MatFDColoring *fd,void (PETSC_STDCALL *f)(TS*,double*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 43f4e70085SSatish Balay { 447850c7c0SBarry Smith (*fd)->ftn_func_pointer = (void*) f; 457850c7c0SBarry Smith (*fd)->ftn_func_cntx = ctx; 467850c7c0SBarry Smith *ierr = MatFDColoringSetFunction(*fd,(PetscErrorCodeFunction)ourmatfdcoloringfunctionts,*fd); 47f4e70085SSatish Balay } 48f4e70085SSatish Balay 497850c7c0SBarry Smith void PETSC_STDCALL matfdcoloringsetfunction_(MatFDColoring *fd,void (PETSC_STDCALL *f)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 50f4e70085SSatish Balay { 517850c7c0SBarry Smith (*fd)->ftn_func_pointer = (void*) f; 527850c7c0SBarry Smith (*fd)->ftn_func_cntx = ctx; 537850c7c0SBarry 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