1b45d2f2cSJed Brown #include <petsc-private/fortranimpl.h> 2b45d2f2cSJed Brown #include <petsc-private/matimpl.h> 3fcfc5002SJed Brown 4fcfc5002SJed Brown /* Declare these pointer types instead of void* for clarity, but do not include petscts.h so that this code does have an actual reverse dependency. */ 5fcfc5002SJed Brown typedef struct _p_TS *TS; 6fcfc5002SJed Brown typedef struct _p_SNES *SNES; 7f4e70085SSatish Balay 8f4e70085SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS) 9f4e70085SSatish Balay #define matfdcoloringsetfunctionts_ MATFDCOLORINGSETFUNCTIONTS 1089d42083SSatish Balay #define matfdcoloringsetfunction_ MATFDCOLORINGSETFUNCTION 111d2e4005SSatish Balay #define matfdcoloringview_ MATFDCOLORINGVIEW 12f4e70085SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 13f4e70085SSatish Balay #define matfdcoloringsetfunctionts_ matfdcoloringsetfunctionts 14372a5eeaSSatish Balay #define matfdcoloringsetfunction_ matfdcoloringsetfunction 151d2e4005SSatish Balay #define matfdcoloringview_ matfdcoloringview 16f4e70085SSatish Balay #endif 17f4e70085SSatish Balay 18f4e70085SSatish Balay 19f4e70085SSatish Balay /* These are not extern C because they are passed into non-extern C user level functions */ 207850c7c0SBarry Smith static PetscErrorCode ourmatfdcoloringfunctionts(TS ts,PetscReal t,Vec x,Vec y,MatFDColoring fd) 21f4e70085SSatish Balay { 22f4e70085SSatish Balay PetscErrorCode ierr = 0; 237850c7c0SBarry Smith (*(void (PETSC_STDCALL *)(TS*,PetscReal*,Vec*,Vec*,void*,PetscErrorCode*))(fd->ftn_func_pointer)) (&ts,&t,&x,&y,fd->ftn_func_cntx,&ierr); 24f4e70085SSatish Balay return ierr; 25f4e70085SSatish Balay } 26f4e70085SSatish Balay 277850c7c0SBarry Smith static PetscErrorCode ourmatfdcoloringfunctionsnes(SNES snes,Vec x,Vec y,MatFDColoring fd) 28f4e70085SSatish Balay { 29f4e70085SSatish Balay PetscErrorCode ierr = 0; 307850c7c0SBarry Smith (*(void (PETSC_STDCALL *)(SNES*,Vec*,Vec*,void*,PetscErrorCode*))(fd->ftn_func_pointer)) (&snes,&x,&y,fd->ftn_func_cntx,&ierr); 31f4e70085SSatish Balay return ierr; 32f4e70085SSatish Balay } 33f4e70085SSatish Balay 34f4e70085SSatish Balay /* 357850c7c0SBarry Smith MatFDColoringSetFunction sticks the Fortran function and its context into the MatFDColoring structure and passes the MatFDColoring object 367850c7c0SBarry Smith in as the function context. ourmafdcoloringfunctionsnes() and ourmatfdcoloringfunctionts() then access the function and its context from the 377850c7c0SBarry Smith MatFDColoring that is passed in. This is the same way that fortran_func_pointers is used in PETSc objects. 38f4e70085SSatish Balay 39f4e70085SSatish Balay NOTE: FORTRAN USER CANNOT PUT IN A NEW J OR B currently. 40f4e70085SSatish Balay */ 41f4e70085SSatish Balay 42f4e70085SSatish Balay 43*8cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matfdcoloringsetfunctionts_(MatFDColoring *fd,void (PETSC_STDCALL *f)(TS*,double*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 44f4e70085SSatish Balay { 457850c7c0SBarry Smith (*fd)->ftn_func_pointer = (void*) f; 467850c7c0SBarry Smith (*fd)->ftn_func_cntx = ctx; 478865f1eaSKarl Rupp 487850c7c0SBarry Smith *ierr = MatFDColoringSetFunction(*fd,(PetscErrorCodeFunction)ourmatfdcoloringfunctionts,*fd); 49f4e70085SSatish Balay } 50f4e70085SSatish Balay 51*8cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matfdcoloringsetfunction_(MatFDColoring *fd,void (PETSC_STDCALL *f)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 52f4e70085SSatish Balay { 537850c7c0SBarry Smith (*fd)->ftn_func_pointer = (void*) f; 547850c7c0SBarry Smith (*fd)->ftn_func_cntx = ctx; 558865f1eaSKarl Rupp 567850c7c0SBarry Smith *ierr = MatFDColoringSetFunction(*fd,(PetscErrorCodeFunction)ourmatfdcoloringfunctionsnes,*fd); 57f4e70085SSatish Balay } 58f4e70085SSatish Balay 59*8cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matfdcoloringview_(MatFDColoring *c,PetscViewer *vin,PetscErrorCode *ierr) 601d2e4005SSatish Balay { 611d2e4005SSatish Balay PetscViewer v; 621d2e4005SSatish Balay 631d2e4005SSatish Balay PetscPatchDefaultViewers_Fortran(vin,v); 641d2e4005SSatish Balay *ierr = MatFDColoringView(*c,v); 651d2e4005SSatish Balay } 661d2e4005SSatish Balay 67