16dd63270SBarry Smith #include <petsc/private/ftnimpl.h>
2af0996ceSBarry Smith #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
11ce78bad3SBarry Smith #define matfdcoloringgetperturbedcolumns_ MATFDCOLORINGGETPERTURBEDCOLUMNS
12ce78bad3SBarry Smith #define matfdcoloringrestoreperturbedcolumns_ MATFDCOLORINGRESTOREPERTURBEDCOLUMNS
13f4e70085SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
14f4e70085SSatish Balay #define matfdcoloringsetfunctionts_ matfdcoloringsetfunctionts
15372a5eeaSSatish Balay #define matfdcoloringsetfunction_ matfdcoloringsetfunction
16ce78bad3SBarry Smith #define matfdcoloringgetperturbedcolumns_ matfdcoloringgetperturbedcolumns
17ce78bad3SBarry Smith #define matfdcoloringrestoreperturbedcolumns_ matfdcoloringrestoreperturbedcolumns
18f4e70085SSatish Balay #endif
19f4e70085SSatish Balay
matfdcoloringgetperturbedcolumns_(MatFDColoring * x,PetscInt * len,F90Array1d * ptr,int * __ierr PETSC_F90_2PTR_PROTO (ptrd))20ce78bad3SBarry Smith PETSC_EXTERN void matfdcoloringgetperturbedcolumns_(MatFDColoring *x, PetscInt *len, F90Array1d *ptr, int *__ierr PETSC_F90_2PTR_PROTO(ptrd))
21edaa7c33SBarry Smith {
22edaa7c33SBarry Smith const PetscInt *fa;
23edaa7c33SBarry Smith
24ce78bad3SBarry Smith *__ierr = MatFDColoringGetPerturbedColumns(*x, len, &fa);
255975b3b6SBarry Smith if (*__ierr) return;
26ce78bad3SBarry Smith *__ierr = F90Array1dCreate((void *)fa, MPIU_INT, 1, *len, ptr PETSC_F90_2PTR_PARAM(ptrd));
27edaa7c33SBarry Smith }
matfdcoloringrestoreperturbedcolumns_(MatFDColoring * x,PetscInt * len,F90Array1d * ptr,int * __ierr PETSC_F90_2PTR_PROTO (ptrd))28ce78bad3SBarry Smith PETSC_EXTERN void matfdcoloringrestoreperturbedcolumns_(MatFDColoring *x, PetscInt *len, F90Array1d *ptr, int *__ierr PETSC_F90_2PTR_PROTO(ptrd))
29edaa7c33SBarry Smith {
30b7b8f77aSBarry Smith *__ierr = F90Array1dDestroy(ptr, MPIU_INT PETSC_F90_2PTR_PARAM(ptrd));
31edaa7c33SBarry Smith }
32f4e70085SSatish Balay
33f4e70085SSatish Balay /* These are not extern C because they are passed into non-extern C user level functions */
ourmatfdcoloringfunctionts(TS ts,PetscReal t,Vec x,Vec y,MatFDColoring fd)347850c7c0SBarry Smith static PetscErrorCode ourmatfdcoloringfunctionts(TS ts, PetscReal t, Vec x, Vec y, MatFDColoring fd)
35f4e70085SSatish Balay {
363ba16761SJacob Faibussowitsch PetscErrorCode ierr = PETSC_SUCCESS;
37f4f49eeaSPierre Jolivet (*(void (*)(TS *, PetscReal *, Vec *, Vec *, void *, PetscErrorCode *))fd->ftn_func_pointer)(&ts, &t, &x, &y, fd->ftn_func_cntx, &ierr);
38f4e70085SSatish Balay return ierr;
39f4e70085SSatish Balay }
40f4e70085SSatish Balay
ourmatfdcoloringfunctionsnes(SNES snes,Vec x,Vec y,MatFDColoring fd)417850c7c0SBarry Smith static PetscErrorCode ourmatfdcoloringfunctionsnes(SNES snes, Vec x, Vec y, MatFDColoring fd)
42f4e70085SSatish Balay {
433ba16761SJacob Faibussowitsch PetscErrorCode ierr = PETSC_SUCCESS;
44f4f49eeaSPierre Jolivet (*(void (*)(SNES *, Vec *, Vec *, void *, PetscErrorCode *))fd->ftn_func_pointer)(&snes, &x, &y, fd->ftn_func_cntx, &ierr);
45f4e70085SSatish Balay return ierr;
46f4e70085SSatish Balay }
47f4e70085SSatish Balay
48f4e70085SSatish Balay /*
497850c7c0SBarry Smith MatFDColoringSetFunction sticks the Fortran function and its context into the MatFDColoring structure and passes the MatFDColoring object
507850c7c0SBarry Smith in as the function context. ourmafdcoloringfunctionsnes() and ourmatfdcoloringfunctionts() then access the function and its context from the
517850c7c0SBarry Smith MatFDColoring that is passed in. This is the same way that fortran_func_pointers is used in PETSc objects.
52f4e70085SSatish Balay
53f4e70085SSatish Balay NOTE: FORTRAN USER CANNOT PUT IN A NEW J OR B currently.
54f4e70085SSatish Balay */
55f4e70085SSatish Balay
matfdcoloringsetfunctionts_(MatFDColoring * fd,void (* f)(TS *,double *,Vec *,Vec *,void *,PetscErrorCode *),PetscCtx ctx,PetscErrorCode * ierr)56*2a8381b2SBarry Smith PETSC_EXTERN void matfdcoloringsetfunctionts_(MatFDColoring *fd, void (*f)(TS *, double *, Vec *, Vec *, void *, PetscErrorCode *), PetscCtx ctx, PetscErrorCode *ierr)
57f4e70085SSatish Balay {
585ebfa9e9SBarry Smith (*fd)->ftn_func_pointer = (PetscFortranCallbackFn *)f;
597850c7c0SBarry Smith (*fd)->ftn_func_cntx = ctx;
608865f1eaSKarl Rupp
61453a69bbSBarry Smith *ierr = MatFDColoringSetFunction(*fd, (MatFDColoringFn *)(PetscVoidFn *)ourmatfdcoloringfunctionts, *fd);
62f4e70085SSatish Balay }
63f4e70085SSatish Balay
matfdcoloringsetfunction_(MatFDColoring * fd,void (* f)(SNES *,Vec *,Vec *,void *,PetscErrorCode *),PetscCtx ctx,PetscErrorCode * ierr)64*2a8381b2SBarry Smith PETSC_EXTERN void matfdcoloringsetfunction_(MatFDColoring *fd, void (*f)(SNES *, Vec *, Vec *, void *, PetscErrorCode *), PetscCtx ctx, PetscErrorCode *ierr)
65f4e70085SSatish Balay {
665ebfa9e9SBarry Smith (*fd)->ftn_func_pointer = (PetscFortranCallbackFn *)f;
677850c7c0SBarry Smith (*fd)->ftn_func_cntx = ctx;
688865f1eaSKarl Rupp
692ba42892SBarry Smith *ierr = MatFDColoringSetFunction(*fd, (MatFDColoringFn *)ourmatfdcoloringfunctionsnes, *fd);
70f4e70085SSatish Balay }
71