xref: /petsc/src/mat/matfd/ftn-custom/zfdmatrixf.c (revision f4f49eeac7efa77fffa46b7ff95a3ed169f659ed)
1edaa7c33SBarry Smith #include <petsc/private/f90impl.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
111d2e4005SSatish Balay   #define matfdcoloringview_                       MATFDCOLORINGVIEW
1261ab5df0SBarry Smith   #define matfdcoloingsettype_                     MATFDCOLORINGSETTYPE
13edaa7c33SBarry Smith   #define matfdcoloringgetperturbedcolumnsf90_     MATFDCOLORINGGETPERTURBEDCOLUMNSF90
14edaa7c33SBarry Smith   #define matfdcoloringrestoreperturbedcolumnsf90_ MATFDCOLORINGRESTOREPERTURBEDCOLUMNSF90
15f4e70085SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
16f4e70085SSatish Balay   #define matfdcoloringsetfunctionts_              matfdcoloringsetfunctionts
17372a5eeaSSatish Balay   #define matfdcoloringsetfunction_                matfdcoloringsetfunction
181d2e4005SSatish Balay   #define matfdcoloringview_                       matfdcoloringview
1961ab5df0SBarry Smith   #define matfdcoloingsettype_                     matfdcoloringsettype
20edaa7c33SBarry Smith   #define matfdcoloringgetperturbedcolumnsf90_     matfdcoloringgetperturbedcolumnsf90
21edaa7c33SBarry Smith   #define matfdcoloringrestoreperturbedcolumnsf90_ matfdcoloringrestoreperturbedcolumnsf90
22f4e70085SSatish Balay #endif
23f4e70085SSatish Balay 
2419caf8f3SSatish Balay PETSC_EXTERN void matfdcoloringgetperturbedcolumnsf90_(MatFDColoring *x, F90Array1d *ptr, int *__ierr PETSC_F90_2PTR_PROTO(ptrd))
25edaa7c33SBarry Smith {
26edaa7c33SBarry Smith   const PetscInt *fa;
27edaa7c33SBarry Smith   PetscInt        len;
28edaa7c33SBarry Smith 
295975b3b6SBarry Smith   *__ierr = MatFDColoringGetPerturbedColumns(*x, &len, &fa);
305975b3b6SBarry Smith   if (*__ierr) return;
31b7b8f77aSBarry Smith   *__ierr = F90Array1dCreate((void *)fa, MPIU_INT, 1, len, ptr PETSC_F90_2PTR_PARAM(ptrd));
32edaa7c33SBarry Smith }
3319caf8f3SSatish Balay PETSC_EXTERN void matfdcoloringrestoreperturbedcolumnsf90_(MatFDColoring *x, F90Array1d *ptr, int *__ierr PETSC_F90_2PTR_PROTO(ptrd))
34edaa7c33SBarry Smith {
35b7b8f77aSBarry Smith   *__ierr = F90Array1dDestroy(ptr, MPIU_INT PETSC_F90_2PTR_PARAM(ptrd));
36edaa7c33SBarry Smith }
37f4e70085SSatish Balay 
38f4e70085SSatish Balay /* These are not extern C because they are passed into non-extern C user level functions */
397850c7c0SBarry Smith static PetscErrorCode ourmatfdcoloringfunctionts(TS ts, PetscReal t, Vec x, Vec y, MatFDColoring fd)
40f4e70085SSatish Balay {
413ba16761SJacob Faibussowitsch   PetscErrorCode ierr = PETSC_SUCCESS;
42*f4f49eeaSPierre Jolivet   (*(void (*)(TS *, PetscReal *, Vec *, Vec *, void *, PetscErrorCode *))fd->ftn_func_pointer)(&ts, &t, &x, &y, fd->ftn_func_cntx, &ierr);
43f4e70085SSatish Balay   return ierr;
44f4e70085SSatish Balay }
45f4e70085SSatish Balay 
467850c7c0SBarry Smith static PetscErrorCode ourmatfdcoloringfunctionsnes(SNES snes, Vec x, Vec y, MatFDColoring fd)
47f4e70085SSatish Balay {
483ba16761SJacob Faibussowitsch   PetscErrorCode ierr = PETSC_SUCCESS;
49*f4f49eeaSPierre Jolivet   (*(void (*)(SNES *, Vec *, Vec *, void *, PetscErrorCode *))fd->ftn_func_pointer)(&snes, &x, &y, fd->ftn_func_cntx, &ierr);
50f4e70085SSatish Balay   return ierr;
51f4e70085SSatish Balay }
52f4e70085SSatish Balay 
53f4e70085SSatish Balay /*
547850c7c0SBarry Smith         MatFDColoringSetFunction sticks the Fortran function and its context into the MatFDColoring structure and passes the MatFDColoring object
557850c7c0SBarry Smith     in as the function context. ourmafdcoloringfunctionsnes() and ourmatfdcoloringfunctionts()  then access the function and its context from the
567850c7c0SBarry Smith     MatFDColoring that is passed in. This is the same way that fortran_func_pointers is used in PETSc objects.
57f4e70085SSatish Balay 
58f4e70085SSatish Balay    NOTE: FORTRAN USER CANNOT PUT IN A NEW J OR B currently.
59f4e70085SSatish Balay */
60f4e70085SSatish Balay 
6119caf8f3SSatish Balay PETSC_EXTERN void matfdcoloringsetfunctionts_(MatFDColoring *fd, void (*f)(TS *, double *, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
62f4e70085SSatish Balay {
6378bd23c2SBarry Smith   (*fd)->ftn_func_pointer = (void (*)(void))f;
647850c7c0SBarry Smith   (*fd)->ftn_func_cntx    = ctx;
658865f1eaSKarl Rupp 
668434afd1SBarry Smith   *ierr = MatFDColoringSetFunction(*fd, (PetscErrorCodeFn *)ourmatfdcoloringfunctionts, *fd);
67f4e70085SSatish Balay }
68f4e70085SSatish Balay 
6919caf8f3SSatish Balay PETSC_EXTERN void matfdcoloringsetfunction_(MatFDColoring *fd, void (*f)(SNES *, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
70f4e70085SSatish Balay {
7178bd23c2SBarry Smith   (*fd)->ftn_func_pointer = (void (*)(void))f;
727850c7c0SBarry Smith   (*fd)->ftn_func_cntx    = ctx;
738865f1eaSKarl Rupp 
748434afd1SBarry Smith   *ierr = MatFDColoringSetFunction(*fd, (PetscErrorCodeFn *)ourmatfdcoloringfunctionsnes, *fd);
75f4e70085SSatish Balay }
76f4e70085SSatish Balay 
7719caf8f3SSatish Balay PETSC_EXTERN void matfdcoloringview_(MatFDColoring *c, PetscViewer *vin, PetscErrorCode *ierr)
781d2e4005SSatish Balay {
791d2e4005SSatish Balay   PetscViewer v;
801d2e4005SSatish Balay 
811d2e4005SSatish Balay   PetscPatchDefaultViewers_Fortran(vin, v);
821d2e4005SSatish Balay   *ierr = MatFDColoringView(*c, v);
831d2e4005SSatish Balay }
841d2e4005SSatish Balay 
8519caf8f3SSatish Balay PETSC_EXTERN void matfdcoloringsettype_(MatFDColoring *matfdcoloring, char *type, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len)
8661ab5df0SBarry Smith {
8761ab5df0SBarry Smith   char *t;
8861ab5df0SBarry Smith 
8961ab5df0SBarry Smith   FIXCHAR(type, len, t);
905975b3b6SBarry Smith   *ierr = MatFDColoringSetType(*matfdcoloring, t);
915975b3b6SBarry Smith   if (*ierr) return;
9261ab5df0SBarry Smith   FREECHAR(type, t);
9361ab5df0SBarry Smith }
94