xref: /petsc/src/mat/impls/shell/ftn-custom/zshellf.c (revision 01f93aa2feb5cea225702f81765cbcdff6f6f7c0)
1af0996ceSBarry Smith #include <petsc/private/fortranimpl.h>
2c6db04a5SJed Brown #include <petscmat.h>
3f4e70085SSatish Balay 
4f4e70085SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
5f4e70085SSatish Balay   #define matshellsetoperation_ MATSHELLSETOPERATION
6f4e70085SSatish Balay   #define matcreateshell_       MATCREATESHELL
7f4e70085SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
8f4e70085SSatish Balay   #define matcreateshell_       matcreateshell
9f4e70085SSatish Balay   #define matshellsetoperation_ matshellsetoperation
10f4e70085SSatish Balay #endif
11f4e70085SSatish Balay 
1286686b9bSAlex Fikl /**
1386686b9bSAlex Fikl  * Subset of MatOperation that is supported by the Fortran wrappers.
1486686b9bSAlex Fikl  */
1586686b9bSAlex Fikl enum FortranMatOperation {
1686686b9bSAlex Fikl   FORTRAN_MATOP_MULT               = 0,
1786686b9bSAlex Fikl   FORTRAN_MATOP_MULT_ADD           = 1,
1886686b9bSAlex Fikl   FORTRAN_MATOP_MULT_TRANSPOSE     = 2,
1986686b9bSAlex Fikl   FORTRAN_MATOP_MULT_TRANSPOSE_ADD = 3,
2086686b9bSAlex Fikl   FORTRAN_MATOP_SOR                = 4,
2186686b9bSAlex Fikl   FORTRAN_MATOP_TRANSPOSE          = 5,
2286686b9bSAlex Fikl   FORTRAN_MATOP_GET_DIAGONAL       = 6,
2386686b9bSAlex Fikl   FORTRAN_MATOP_DIAGONAL_SCALE     = 7,
2486686b9bSAlex Fikl   FORTRAN_MATOP_ZERO_ENTRIES       = 8,
2586686b9bSAlex Fikl   FORTRAN_MATOP_AXPY               = 9,
2686686b9bSAlex Fikl   FORTRAN_MATOP_SHIFT              = 10,
2786686b9bSAlex Fikl   FORTRAN_MATOP_DIAGONAL_SET       = 11,
2886686b9bSAlex Fikl   FORTRAN_MATOP_DESTROY            = 12,
2986686b9bSAlex Fikl   FORTRAN_MATOP_VIEW               = 13,
30b41ce5d5SBarry Smith   FORTRAN_MATOP_CREATE_VECS        = 14,
31a5b7ff6bSBarry Smith   FORTRAN_MATOP_GET_DIAGONAL_BLOCK = 15,
32626206dbSAlex Fikl   FORTRAN_MATOP_COPY               = 16,
33626206dbSAlex Fikl   FORTRAN_MATOP_SCALE              = 17,
346b3eee04SVincent Le Chenadec   FORTRAN_MATOP_SET_RANDOM         = 18,
356b3eee04SVincent Le Chenadec   FORTRAN_MATOP_ASSEMBLY_BEGIN     = 19,
366b3eee04SVincent Le Chenadec   FORTRAN_MATOP_ASSEMBLY_END       = 20,
37*01f93aa2SJose E. Roman   FORTRAN_MATOP_DUPLICATE          = 21,
38*01f93aa2SJose E. Roman   FORTRAN_MATOP_SIZE               = 22
3986686b9bSAlex Fikl };
4086686b9bSAlex Fikl 
41f4e70085SSatish Balay /*
42f4e70085SSatish Balay   The MatShell Matrix Vector product requires a C routine.
43f4e70085SSatish Balay   This C routine then calls the corresponding Fortran routine that was
44f4e70085SSatish Balay   set by the user.
45f4e70085SSatish Balay */
4619caf8f3SSatish Balay PETSC_EXTERN void matcreateshell_(MPI_Comm *comm, PetscInt *m, PetscInt *n, PetscInt *M, PetscInt *N, void *ctx, Mat *mat, PetscErrorCode *ierr)
47f4e70085SSatish Balay {
482e843561SJed Brown   *ierr = MatCreateShell(MPI_Comm_f2c(*(MPI_Fint *)&*comm), *m, *n, *M, *N, ctx, mat);
49f4e70085SSatish Balay }
50f4e70085SSatish Balay 
51f4e70085SSatish Balay static PetscErrorCode ourmult(Mat mat, Vec x, Vec y)
52f4e70085SSatish Balay {
533ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_MULT]))(&mat, &x, &y, &ierr));
543ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
55f4e70085SSatish Balay }
56f4e70085SSatish Balay 
57f4e70085SSatish Balay static PetscErrorCode ourmultadd(Mat mat, Vec x, Vec y, Vec z)
58f4e70085SSatish Balay {
593ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, Vec *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_ADD]))(&mat, &x, &y, &z, &ierr));
603ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
6186686b9bSAlex Fikl }
6286686b9bSAlex Fikl 
6386686b9bSAlex Fikl static PetscErrorCode ourmulttranspose(Mat mat, Vec x, Vec y)
6486686b9bSAlex Fikl {
653ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_TRANSPOSE]))(&mat, &x, &y, &ierr));
663ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
67f4e70085SSatish Balay }
68f4e70085SSatish Balay 
69f4e70085SSatish Balay static PetscErrorCode ourmulttransposeadd(Mat mat, Vec x, Vec y, Vec z)
70f4e70085SSatish Balay {
713ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, Vec *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_TRANSPOSE_ADD]))(&mat, &x, &y, &z, &ierr));
723ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
732950f7e7SBarry Smith }
742950f7e7SBarry Smith 
753446fae8SBarry Smith static PetscErrorCode oursor(Mat mat, Vec b, PetscReal omega, MatSORType flg, PetscReal shift, PetscInt its, PetscInt lits, Vec x)
763446fae8SBarry Smith {
773ba16761SJacob Faibussowitsch   PetscErrorCode ierr = PETSC_SUCCESS;
7886686b9bSAlex Fikl 
793ba16761SJacob Faibussowitsch   (*(void (*)(Mat *, Vec *, PetscReal *, MatSORType *, PetscReal *, PetscInt *, PetscInt *, Vec *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_SOR]))(&mat, &b, &omega, &flg, &shift, &its, &lits, &x, &ierr);
8086686b9bSAlex Fikl   return ierr;
8186686b9bSAlex Fikl }
8286686b9bSAlex Fikl 
8386686b9bSAlex Fikl static PetscErrorCode ourtranspose(Mat mat, MatReuse reuse, Mat *B)
8486686b9bSAlex Fikl {
851b266c99SBarry Smith   Mat  bb = (Mat)-1;
861b266c99SBarry Smith   Mat *b  = (!B ? &bb : B);
8786686b9bSAlex Fikl 
883ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, MatReuse *, Mat *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_TRANSPOSE]))(&mat, &reuse, b, &ierr));
893ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
9086686b9bSAlex Fikl }
9186686b9bSAlex Fikl 
9286686b9bSAlex Fikl static PetscErrorCode ourgetdiagonal(Mat mat, Vec x)
9386686b9bSAlex Fikl {
943ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, Vec *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_GET_DIAGONAL]))(&mat, &x, &ierr));
953ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
9686686b9bSAlex Fikl }
9786686b9bSAlex Fikl 
9886686b9bSAlex Fikl static PetscErrorCode ourdiagonalscale(Mat mat, Vec l, Vec r)
9986686b9bSAlex Fikl {
1001b266c99SBarry Smith   Vec  aa = (Vec)-1;
1011b266c99SBarry Smith   Vec *a  = (!l ? &aa : &l);
1021b266c99SBarry Smith   Vec *b  = (!r ? &aa : &r);
10386686b9bSAlex Fikl 
1043ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_DIAGONAL_SCALE]))(&mat, a, b, &ierr));
1053ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
10686686b9bSAlex Fikl }
10786686b9bSAlex Fikl 
10886686b9bSAlex Fikl static PetscErrorCode ourzeroentries(Mat mat)
10986686b9bSAlex Fikl {
1103ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_ZERO_ENTRIES]))(&mat, &ierr));
1113ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
11286686b9bSAlex Fikl }
11386686b9bSAlex Fikl 
11486686b9bSAlex Fikl static PetscErrorCode ouraxpy(Mat mat, PetscScalar a, Mat X, MatStructure str)
11586686b9bSAlex Fikl {
1163ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, PetscScalar *, Mat *, MatStructure *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_AXPY]))(&mat, &a, &X, &str, &ierr));
1173ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
1183446fae8SBarry Smith }
1193446fae8SBarry Smith 
120cdf26a31SSatish Balay static PetscErrorCode ourshift(Mat mat, PetscScalar a)
121cdf26a31SSatish Balay {
1223ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, PetscScalar *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_SHIFT]))(&mat, &a, &ierr));
1233ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
12486686b9bSAlex Fikl }
12586686b9bSAlex Fikl 
12686686b9bSAlex Fikl static PetscErrorCode ourdiagonalset(Mat mat, Vec x, InsertMode ins)
12786686b9bSAlex Fikl {
1283ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, Vec *, InsertMode *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_DIAGONAL_SET]))(&mat, &x, &ins, &ierr));
1293ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
13086686b9bSAlex Fikl }
13186686b9bSAlex Fikl 
13286686b9bSAlex Fikl static PetscErrorCode ourdestroy(Mat mat)
13386686b9bSAlex Fikl {
1343ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_DESTROY]))(&mat, &ierr));
1353ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
13686686b9bSAlex Fikl }
13786686b9bSAlex Fikl 
13886686b9bSAlex Fikl static PetscErrorCode ourview(Mat mat, PetscViewer v)
13986686b9bSAlex Fikl {
1403ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, PetscViewer *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_VIEW]))(&mat, &v, &ierr));
1413ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
14286686b9bSAlex Fikl }
14386686b9bSAlex Fikl 
14486686b9bSAlex Fikl static PetscErrorCode ourgetvecs(Mat mat, Vec *l, Vec *r)
14586686b9bSAlex Fikl {
1461b266c99SBarry Smith   Vec  aa = (Vec)-1;
1471b266c99SBarry Smith   Vec *a  = (!l ? &aa : l);
1481b266c99SBarry Smith   Vec *b  = (!r ? &aa : r);
14986686b9bSAlex Fikl 
1503ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_CREATE_VECS]))(&mat, a, b, &ierr));
1513ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
152cdf26a31SSatish Balay }
153cdf26a31SSatish Balay 
154a5b7ff6bSBarry Smith static PetscErrorCode ourgetdiagonalblock(Mat mat, Mat *l)
155a5b7ff6bSBarry Smith {
1563ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, Mat *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_GET_DIAGONAL_BLOCK]))(&mat, l, &ierr));
1573ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
158a5b7ff6bSBarry Smith }
159a5b7ff6bSBarry Smith 
160626206dbSAlex Fikl static PetscErrorCode ourcopy(Mat mat, Mat B, MatStructure str)
161626206dbSAlex Fikl {
1623ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, Mat *, MatStructure *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_COPY]))(&mat, &B, &str, &ierr));
1633ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
164626206dbSAlex Fikl }
165626206dbSAlex Fikl 
166626206dbSAlex Fikl static PetscErrorCode ourscale(Mat mat, PetscScalar a)
167626206dbSAlex Fikl {
1683ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, PetscScalar *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_SCALE]))(&mat, &a, &ierr));
1693ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
170626206dbSAlex Fikl }
171626206dbSAlex Fikl 
172d18b9058SVincent Le Chenadec static PetscErrorCode oursetrandom(Mat mat, PetscRandom ctx)
173d18b9058SVincent Le Chenadec {
1743ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, PetscRandom *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_SET_RANDOM]))(&mat, &ctx, &ierr));
1753ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
176d18b9058SVincent Le Chenadec }
177d18b9058SVincent Le Chenadec 
17807833d17SVincent Le Chenadec static PetscErrorCode ourassemblybegin(Mat mat, MatAssemblyType type)
17907833d17SVincent Le Chenadec {
1803ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, MatAssemblyType *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_ASSEMBLY_BEGIN]))(&mat, &type, &ierr));
1813ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
18207833d17SVincent Le Chenadec }
18307833d17SVincent Le Chenadec 
18407833d17SVincent Le Chenadec static PetscErrorCode ourassemblyend(Mat mat, MatAssemblyType type)
18507833d17SVincent Le Chenadec {
1863ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, MatAssemblyType *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_ASSEMBLY_END]))(&mat, &type, &ierr));
1873ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
18807833d17SVincent Le Chenadec }
18907833d17SVincent Le Chenadec 
190*01f93aa2SJose E. Roman static PetscErrorCode ourduplicate(Mat mat, MatDuplicateOption op, Mat *M)
191*01f93aa2SJose E. Roman {
192*01f93aa2SJose E. Roman   PetscCallFortranVoidFunction((*(void (*)(Mat *, MatDuplicateOption *, Mat *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_DUPLICATE]))(&mat, &op, M, &ierr));
193*01f93aa2SJose E. Roman   return PETSC_SUCCESS;
194*01f93aa2SJose E. Roman }
195*01f93aa2SJose E. Roman 
19619caf8f3SSatish Balay PETSC_EXTERN void matshellsetoperation_(Mat *mat, MatOperation *op, PetscErrorCode (*f)(Mat *, Vec *, Vec *, PetscErrorCode *), PetscErrorCode *ierr)
197f4e70085SSatish Balay {
198e32f2f54SBarry Smith   MPI_Comm comm;
199e32f2f54SBarry Smith 
2003ba16761SJacob Faibussowitsch   *ierr = PetscObjectGetComm((PetscObject)*mat, &comm);
2013ba16761SJacob Faibussowitsch   if (*ierr) return;
20286686b9bSAlex Fikl   PetscObjectAllocateFortranPointers(*mat, FORTRAN_MATOP_SIZE);
20386686b9bSAlex Fikl 
20486686b9bSAlex Fikl   switch (*op) {
20586686b9bSAlex Fikl   case MATOP_MULT:
206f68b968cSBarry Smith     *ierr                                                          = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourmult);
20786686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_MULT] = (PetscVoidFunction)f;
20886686b9bSAlex Fikl     break;
20986686b9bSAlex Fikl   case MATOP_MULT_ADD:
210f68b968cSBarry Smith     *ierr                                                              = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourmultadd);
21186686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_ADD] = (PetscVoidFunction)f;
21286686b9bSAlex Fikl     break;
21386686b9bSAlex Fikl   case MATOP_MULT_TRANSPOSE:
21486686b9bSAlex Fikl     *ierr                                                                    = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourmulttranspose);
21586686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_TRANSPOSE] = (PetscVoidFunction)f;
21686686b9bSAlex Fikl     break;
21786686b9bSAlex Fikl   case MATOP_MULT_TRANSPOSE_ADD:
218f68b968cSBarry Smith     *ierr                                                                        = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourmulttransposeadd);
21986686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_TRANSPOSE_ADD] = (PetscVoidFunction)f;
22086686b9bSAlex Fikl     break;
22186686b9bSAlex Fikl   case MATOP_SOR:
2223446fae8SBarry Smith     *ierr                                                         = MatShellSetOperation(*mat, *op, (PetscVoidFunction)oursor);
22386686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_SOR] = (PetscVoidFunction)f;
22486686b9bSAlex Fikl     break;
22586686b9bSAlex Fikl   case MATOP_TRANSPOSE:
22686686b9bSAlex Fikl     *ierr                                                               = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourtranspose);
22786686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_TRANSPOSE] = (PetscVoidFunction)f;
22886686b9bSAlex Fikl     break;
22986686b9bSAlex Fikl   case MATOP_GET_DIAGONAL:
23086686b9bSAlex Fikl     *ierr                                                                  = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourgetdiagonal);
23186686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_GET_DIAGONAL] = (PetscVoidFunction)f;
23286686b9bSAlex Fikl     break;
23386686b9bSAlex Fikl   case MATOP_DIAGONAL_SCALE:
23486686b9bSAlex Fikl     *ierr                                                                    = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourdiagonalscale);
23586686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_DIAGONAL_SCALE] = (PetscVoidFunction)f;
23686686b9bSAlex Fikl     break;
23786686b9bSAlex Fikl   case MATOP_ZERO_ENTRIES:
23886686b9bSAlex Fikl     *ierr                                                                  = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourzeroentries);
23986686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_ZERO_ENTRIES] = (PetscVoidFunction)f;
24086686b9bSAlex Fikl     break;
24186686b9bSAlex Fikl   case MATOP_AXPY:
24286686b9bSAlex Fikl     *ierr                                                          = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ouraxpy);
24386686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_AXPY] = (PetscVoidFunction)f;
24486686b9bSAlex Fikl     break;
24586686b9bSAlex Fikl   case MATOP_SHIFT:
246cdf26a31SSatish Balay     *ierr                                                           = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourshift);
24786686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_SHIFT] = (PetscVoidFunction)f;
24886686b9bSAlex Fikl     break;
24986686b9bSAlex Fikl   case MATOP_DIAGONAL_SET:
25086686b9bSAlex Fikl     *ierr                                                                  = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourdiagonalset);
25186686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_DIAGONAL_SET] = (PetscVoidFunction)f;
25286686b9bSAlex Fikl     break;
25386686b9bSAlex Fikl   case MATOP_DESTROY:
25486686b9bSAlex Fikl     *ierr                                                             = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourdestroy);
25586686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_DESTROY] = (PetscVoidFunction)f;
25686686b9bSAlex Fikl     break;
25786686b9bSAlex Fikl   case MATOP_VIEW:
25886686b9bSAlex Fikl     *ierr                                                          = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourview);
25986686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_VIEW] = (PetscVoidFunction)f;
26086686b9bSAlex Fikl     break;
261b41ce5d5SBarry Smith   case MATOP_CREATE_VECS:
26286686b9bSAlex Fikl     *ierr                                                                 = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourgetvecs);
263b41ce5d5SBarry Smith     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_CREATE_VECS] = (PetscVoidFunction)f;
26486686b9bSAlex Fikl     break;
265a5b7ff6bSBarry Smith   case MATOP_GET_DIAGONAL_BLOCK:
266a5b7ff6bSBarry Smith     *ierr                                                                        = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourgetdiagonalblock);
267a5b7ff6bSBarry Smith     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_GET_DIAGONAL_BLOCK] = (PetscVoidFunction)f;
268a5b7ff6bSBarry Smith     break;
269626206dbSAlex Fikl   case MATOP_COPY:
270626206dbSAlex Fikl     *ierr                                                          = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourcopy);
271626206dbSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_COPY] = (PetscVoidFunction)f;
272626206dbSAlex Fikl     break;
273626206dbSAlex Fikl   case MATOP_SCALE:
274626206dbSAlex Fikl     *ierr                                                           = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourscale);
275626206dbSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_SCALE] = (PetscVoidFunction)f;
276626206dbSAlex Fikl     break;
277d18b9058SVincent Le Chenadec   case MATOP_SET_RANDOM:
278d18b9058SVincent Le Chenadec     *ierr                                                                = MatShellSetOperation(*mat, *op, (PetscVoidFunction)oursetrandom);
279d18b9058SVincent Le Chenadec     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_SET_RANDOM] = (PetscVoidFunction)f;
280d18b9058SVincent Le Chenadec     break;
28107833d17SVincent Le Chenadec   case MATOP_ASSEMBLY_BEGIN:
28207833d17SVincent Le Chenadec     *ierr                                                                    = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourassemblybegin);
28307833d17SVincent Le Chenadec     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_ASSEMBLY_BEGIN] = (PetscVoidFunction)f;
28407833d17SVincent Le Chenadec     break;
28507833d17SVincent Le Chenadec   case MATOP_ASSEMBLY_END:
28607833d17SVincent Le Chenadec     *ierr                                                                  = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourassemblyend);
28707833d17SVincent Le Chenadec     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_ASSEMBLY_END] = (PetscVoidFunction)f;
28807833d17SVincent Le Chenadec     break;
289*01f93aa2SJose E. Roman   case MATOP_DUPLICATE:
290*01f93aa2SJose E. Roman     *ierr                                                               = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourduplicate);
291*01f93aa2SJose E. Roman     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_DUPLICATE] = (PetscVoidFunction)f;
292*01f93aa2SJose E. Roman     break;
29386686b9bSAlex Fikl   default:
2943ba16761SJacob Faibussowitsch     *ierr = PetscError(comm, __LINE__, "MatShellSetOperation_Fortran", __FILE__, PETSC_ERR_ARG_WRONG, PETSC_ERROR_INITIAL, "Cannot set that matrix operation");
2953ba16761SJacob Faibussowitsch     *ierr = PETSC_ERR_ARG_WRONG;
296f4e70085SSatish Balay   }
297f4e70085SSatish Balay }
298