xref: /petsc/src/mat/matfd/ftn-custom/zfdmatrixf.c (revision 84df9cb40eca90ea9b18a456fab7a4ecc7f6c1a4)
1 #include <private/fortranimpl.h>
2 #include <private/matimpl.h>
3 #include <petscts.h>
4 
5 #if defined(PETSC_HAVE_FORTRAN_CAPS)
6 #define matfdcoloringsetfunctionts_      MATFDCOLORINGSETFUNCTIONTS
7 #define matfdcoloringsetfunction_        MATFDCOLORINGSETFUNCTION
8 #define matfdcoloringview_               MATFDCOLORINGVIEW
9 #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
10 #define matfdcoloringsetfunctionts_      matfdcoloringsetfunctionts
11 #define matfdcoloringsetfunction_        matfdcoloringsetfunction
12 #define matfdcoloringview_               matfdcoloringview
13 #endif
14 
15 
16 /* These are not extern C because they are passed into non-extern C user level functions */
17 static PetscErrorCode ourmatfdcoloringfunctionts(TS ts,PetscReal t,Vec x,Vec y,MatFDColoring fd)
18 {
19   PetscErrorCode ierr = 0;
20   (*(void (PETSC_STDCALL *)(TS*,PetscReal*,Vec*,Vec*,void*,PetscErrorCode*))(fd->ftn_func_pointer)) (&ts,&t,&x,&y,fd->ftn_func_cntx,&ierr);
21   return ierr;
22 }
23 
24 static PetscErrorCode ourmatfdcoloringfunctionsnes(SNES snes,Vec x,Vec y,MatFDColoring fd)
25 {
26   PetscErrorCode ierr = 0;
27   (*(void (PETSC_STDCALL *)(SNES*,Vec*,Vec*,void*,PetscErrorCode*))(fd->ftn_func_pointer)) (&snes,&x,&y,fd->ftn_func_cntx,&ierr);
28   return ierr;
29 }
30 
31 EXTERN_C_BEGIN
32 
33 /*
34         MatFDColoringSetFunction sticks the Fortran function and its context into the MatFDColoring structure and passes the MatFDColoring object
35     in as the function context. ourmafdcoloringfunctionsnes() and ourmatfdcoloringfunctionts()  then access the function and its context from the
36     MatFDColoring that is passed in. This is the same way that fortran_func_pointers is used in PETSc objects.
37 
38    NOTE: FORTRAN USER CANNOT PUT IN A NEW J OR B currently.
39 */
40 
41 
42 void PETSC_STDCALL matfdcoloringsetfunctionts_(MatFDColoring *fd,void (PETSC_STDCALL *f)(TS*,double*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
43 {
44   (*fd)->ftn_func_pointer = (void*) f;
45   (*fd)->ftn_func_cntx = ctx;
46   *ierr = MatFDColoringSetFunction(*fd,(PetscErrorCodeFunction)ourmatfdcoloringfunctionts,*fd);
47 }
48 
49 void PETSC_STDCALL matfdcoloringsetfunction_(MatFDColoring *fd,void (PETSC_STDCALL *f)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
50 {
51   (*fd)->ftn_func_pointer = (void*) f;
52   (*fd)->ftn_func_cntx = ctx;
53   *ierr = MatFDColoringSetFunction(*fd,(PetscErrorCodeFunction)ourmatfdcoloringfunctionsnes,*fd);
54 }
55 
56 void PETSC_STDCALL matfdcoloringview_(MatFDColoring *c,PetscViewer *vin,PetscErrorCode *ierr)
57 {
58   PetscViewer v;
59 
60   PetscPatchDefaultViewers_Fortran(vin,v);
61   *ierr = MatFDColoringView(*c,v);
62 }
63 
64 
65 EXTERN_C_END
66