xref: /petsc/src/mat/matfd/ftn-custom/zfdmatrixf.c (revision fcfc5002621824adfa812777a2540cbf267814f2)
1c6db04a5SJed Brown #include <private/fortranimpl.h>
2c6db04a5SJed Brown #include <private/matimpl.h>
3*fcfc5002SJed Brown 
4*fcfc5002SJed 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. */
5*fcfc5002SJed Brown typedef struct _p_TS *TS;
6*fcfc5002SJed 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 EXTERN_C_BEGIN
35f4e70085SSatish Balay 
36f4e70085SSatish Balay /*
377850c7c0SBarry Smith         MatFDColoringSetFunction sticks the Fortran function and its context into the MatFDColoring structure and passes the MatFDColoring object
387850c7c0SBarry Smith     in as the function context. ourmafdcoloringfunctionsnes() and ourmatfdcoloringfunctionts()  then access the function and its context from the
397850c7c0SBarry Smith     MatFDColoring that is passed in. This is the same way that fortran_func_pointers is used in PETSc objects.
40f4e70085SSatish Balay 
41f4e70085SSatish Balay    NOTE: FORTRAN USER CANNOT PUT IN A NEW J OR B currently.
42f4e70085SSatish Balay */
43f4e70085SSatish Balay 
44f4e70085SSatish Balay 
457850c7c0SBarry Smith void PETSC_STDCALL matfdcoloringsetfunctionts_(MatFDColoring *fd,void (PETSC_STDCALL *f)(TS*,double*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
46f4e70085SSatish Balay {
477850c7c0SBarry Smith   (*fd)->ftn_func_pointer = (void*) f;
487850c7c0SBarry Smith   (*fd)->ftn_func_cntx = ctx;
497850c7c0SBarry Smith   *ierr = MatFDColoringSetFunction(*fd,(PetscErrorCodeFunction)ourmatfdcoloringfunctionts,*fd);
50f4e70085SSatish Balay }
51f4e70085SSatish Balay 
527850c7c0SBarry Smith void PETSC_STDCALL matfdcoloringsetfunction_(MatFDColoring *fd,void (PETSC_STDCALL *f)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
53f4e70085SSatish Balay {
547850c7c0SBarry Smith   (*fd)->ftn_func_pointer = (void*) f;
557850c7c0SBarry Smith   (*fd)->ftn_func_cntx = ctx;
567850c7c0SBarry Smith   *ierr = MatFDColoringSetFunction(*fd,(PetscErrorCodeFunction)ourmatfdcoloringfunctionsnes,*fd);
57f4e70085SSatish Balay }
58f4e70085SSatish Balay 
591d2e4005SSatish Balay 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 
671d2e4005SSatish Balay 
68f4e70085SSatish Balay EXTERN_C_END
69