xref: /petsc/src/mat/impls/shell/ftn-custom/zshellf.c (revision 5ebfa9e9f88b822c006efbb9b0cb198b91a2e84d)
16dd63270SBarry Smith #include <petsc/private/ftnimpl.h>
2c6db04a5SJed Brown #include <petscmat.h>
3f4e70085SSatish Balay 
4f4e70085SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
5f4e70085SSatish Balay   #define matshellsetoperation_ MATSHELLSETOPERATION
6f4e70085SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
7f4e70085SSatish Balay   #define matshellsetoperation_ matshellsetoperation
8f4e70085SSatish Balay #endif
9f4e70085SSatish Balay 
1086686b9bSAlex Fikl /**
1186686b9bSAlex Fikl  * Subset of MatOperation that is supported by the Fortran wrappers.
1286686b9bSAlex Fikl  */
1386686b9bSAlex Fikl enum FortranMatOperation {
1486686b9bSAlex Fikl   FORTRAN_MATOP_MULT               = 0,
1586686b9bSAlex Fikl   FORTRAN_MATOP_MULT_ADD           = 1,
1686686b9bSAlex Fikl   FORTRAN_MATOP_MULT_TRANSPOSE     = 2,
1786686b9bSAlex Fikl   FORTRAN_MATOP_MULT_TRANSPOSE_ADD = 3,
1886686b9bSAlex Fikl   FORTRAN_MATOP_SOR                = 4,
1986686b9bSAlex Fikl   FORTRAN_MATOP_TRANSPOSE          = 5,
2086686b9bSAlex Fikl   FORTRAN_MATOP_GET_DIAGONAL       = 6,
2186686b9bSAlex Fikl   FORTRAN_MATOP_DIAGONAL_SCALE     = 7,
2286686b9bSAlex Fikl   FORTRAN_MATOP_ZERO_ENTRIES       = 8,
2386686b9bSAlex Fikl   FORTRAN_MATOP_AXPY               = 9,
2486686b9bSAlex Fikl   FORTRAN_MATOP_SHIFT              = 10,
2586686b9bSAlex Fikl   FORTRAN_MATOP_DIAGONAL_SET       = 11,
2686686b9bSAlex Fikl   FORTRAN_MATOP_DESTROY            = 12,
2786686b9bSAlex Fikl   FORTRAN_MATOP_VIEW               = 13,
28b41ce5d5SBarry Smith   FORTRAN_MATOP_CREATE_VECS        = 14,
29a5b7ff6bSBarry Smith   FORTRAN_MATOP_GET_DIAGONAL_BLOCK = 15,
30626206dbSAlex Fikl   FORTRAN_MATOP_COPY               = 16,
31626206dbSAlex Fikl   FORTRAN_MATOP_SCALE              = 17,
326b3eee04SVincent Le Chenadec   FORTRAN_MATOP_SET_RANDOM         = 18,
336b3eee04SVincent Le Chenadec   FORTRAN_MATOP_ASSEMBLY_BEGIN     = 19,
346b3eee04SVincent Le Chenadec   FORTRAN_MATOP_ASSEMBLY_END       = 20,
3501f93aa2SJose E. Roman   FORTRAN_MATOP_DUPLICATE          = 21,
36f8e07d23SBlanca Mellado Pinto   FORTRAN_MATOP_MULT_HT            = 22,
37f8e07d23SBlanca Mellado Pinto   FORTRAN_MATOP_MULT_HT_ADD        = 23,
38f8e07d23SBlanca Mellado Pinto   FORTRAN_MATOP_SIZE               = 24
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 */
46f4e70085SSatish Balay static PetscErrorCode ourmult(Mat mat, Vec x, Vec y)
47f4e70085SSatish Balay {
483ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_MULT]))(&mat, &x, &y, &ierr));
493ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
50f4e70085SSatish Balay }
51f4e70085SSatish Balay 
52f4e70085SSatish Balay static PetscErrorCode ourmultadd(Mat mat, Vec x, Vec y, Vec z)
53f4e70085SSatish Balay {
543ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, Vec *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_ADD]))(&mat, &x, &y, &z, &ierr));
553ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
5686686b9bSAlex Fikl }
5786686b9bSAlex Fikl 
5886686b9bSAlex Fikl static PetscErrorCode ourmulttranspose(Mat mat, Vec x, Vec y)
5986686b9bSAlex Fikl {
603ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_TRANSPOSE]))(&mat, &x, &y, &ierr));
613ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
62f4e70085SSatish Balay }
63f4e70085SSatish Balay 
64f8e07d23SBlanca Mellado Pinto static PetscErrorCode ourmulthermitiantranspose(Mat mat, Vec x, Vec y)
65f8e07d23SBlanca Mellado Pinto {
66f8e07d23SBlanca Mellado Pinto   PetscCallFortranVoidFunction((*(void (*)(Mat *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_HT]))(&mat, &x, &y, &ierr));
67f8e07d23SBlanca Mellado Pinto   return PETSC_SUCCESS;
68f8e07d23SBlanca Mellado Pinto }
69f8e07d23SBlanca Mellado Pinto 
70f4e70085SSatish Balay static PetscErrorCode ourmulttransposeadd(Mat mat, Vec x, Vec y, Vec z)
71f4e70085SSatish Balay {
723ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, Vec *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_TRANSPOSE_ADD]))(&mat, &x, &y, &z, &ierr));
733ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
742950f7e7SBarry Smith }
752950f7e7SBarry Smith 
76f8e07d23SBlanca Mellado Pinto static PetscErrorCode ourmulthermitiantransposeadd(Mat mat, Vec x, Vec y, Vec z)
77f8e07d23SBlanca Mellado Pinto {
78f8e07d23SBlanca Mellado Pinto   PetscCallFortranVoidFunction((*(void (*)(Mat *, Vec *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_HT_ADD]))(&mat, &x, &y, &z, &ierr));
79f8e07d23SBlanca Mellado Pinto   return PETSC_SUCCESS;
80f8e07d23SBlanca Mellado Pinto }
81f8e07d23SBlanca Mellado Pinto 
823446fae8SBarry Smith static PetscErrorCode oursor(Mat mat, Vec b, PetscReal omega, MatSORType flg, PetscReal shift, PetscInt its, PetscInt lits, Vec x)
833446fae8SBarry Smith {
843ba16761SJacob Faibussowitsch   PetscErrorCode ierr = PETSC_SUCCESS;
8586686b9bSAlex Fikl 
863ba16761SJacob 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);
8786686b9bSAlex Fikl   return ierr;
8886686b9bSAlex Fikl }
8986686b9bSAlex Fikl 
9086686b9bSAlex Fikl static PetscErrorCode ourtranspose(Mat mat, MatReuse reuse, Mat *B)
9186686b9bSAlex Fikl {
921b266c99SBarry Smith   Mat  bb = (Mat)-1;
931b266c99SBarry Smith   Mat *b  = (!B ? &bb : B);
9486686b9bSAlex Fikl 
953ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, MatReuse *, Mat *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_TRANSPOSE]))(&mat, &reuse, b, &ierr));
963ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
9786686b9bSAlex Fikl }
9886686b9bSAlex Fikl 
9986686b9bSAlex Fikl static PetscErrorCode ourgetdiagonal(Mat mat, Vec x)
10086686b9bSAlex Fikl {
1013ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, Vec *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_GET_DIAGONAL]))(&mat, &x, &ierr));
1023ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
10386686b9bSAlex Fikl }
10486686b9bSAlex Fikl 
10586686b9bSAlex Fikl static PetscErrorCode ourdiagonalscale(Mat mat, Vec l, Vec r)
10686686b9bSAlex Fikl {
1071b266c99SBarry Smith   Vec  aa = (Vec)-1;
1081b266c99SBarry Smith   Vec *a  = (!l ? &aa : &l);
1091b266c99SBarry Smith   Vec *b  = (!r ? &aa : &r);
11086686b9bSAlex Fikl 
1113ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_DIAGONAL_SCALE]))(&mat, a, b, &ierr));
1123ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
11386686b9bSAlex Fikl }
11486686b9bSAlex Fikl 
11586686b9bSAlex Fikl static PetscErrorCode ourzeroentries(Mat mat)
11686686b9bSAlex Fikl {
1173ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_ZERO_ENTRIES]))(&mat, &ierr));
1183ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
11986686b9bSAlex Fikl }
12086686b9bSAlex Fikl 
12186686b9bSAlex Fikl static PetscErrorCode ouraxpy(Mat mat, PetscScalar a, Mat X, MatStructure str)
12286686b9bSAlex Fikl {
1233ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, PetscScalar *, Mat *, MatStructure *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_AXPY]))(&mat, &a, &X, &str, &ierr));
1243ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
1253446fae8SBarry Smith }
1263446fae8SBarry Smith 
127cdf26a31SSatish Balay static PetscErrorCode ourshift(Mat mat, PetscScalar a)
128cdf26a31SSatish Balay {
1293ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, PetscScalar *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_SHIFT]))(&mat, &a, &ierr));
1303ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
13186686b9bSAlex Fikl }
13286686b9bSAlex Fikl 
13386686b9bSAlex Fikl static PetscErrorCode ourdiagonalset(Mat mat, Vec x, InsertMode ins)
13486686b9bSAlex Fikl {
1353ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, Vec *, InsertMode *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_DIAGONAL_SET]))(&mat, &x, &ins, &ierr));
1363ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
13786686b9bSAlex Fikl }
13886686b9bSAlex Fikl 
13986686b9bSAlex Fikl static PetscErrorCode ourdestroy(Mat mat)
14086686b9bSAlex Fikl {
1413ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_DESTROY]))(&mat, &ierr));
1423ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
14386686b9bSAlex Fikl }
14486686b9bSAlex Fikl 
14586686b9bSAlex Fikl static PetscErrorCode ourview(Mat mat, PetscViewer v)
14686686b9bSAlex Fikl {
1473ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, PetscViewer *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_VIEW]))(&mat, &v, &ierr));
1483ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
14986686b9bSAlex Fikl }
15086686b9bSAlex Fikl 
15186686b9bSAlex Fikl static PetscErrorCode ourgetvecs(Mat mat, Vec *l, Vec *r)
15286686b9bSAlex Fikl {
1531b266c99SBarry Smith   Vec  aa = (Vec)-1;
1541b266c99SBarry Smith   Vec *a  = (!l ? &aa : l);
1551b266c99SBarry Smith   Vec *b  = (!r ? &aa : r);
15686686b9bSAlex Fikl 
1573ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_CREATE_VECS]))(&mat, a, b, &ierr));
1583ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
159cdf26a31SSatish Balay }
160cdf26a31SSatish Balay 
161a5b7ff6bSBarry Smith static PetscErrorCode ourgetdiagonalblock(Mat mat, Mat *l)
162a5b7ff6bSBarry Smith {
1633ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, Mat *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_GET_DIAGONAL_BLOCK]))(&mat, l, &ierr));
1643ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
165a5b7ff6bSBarry Smith }
166a5b7ff6bSBarry Smith 
167626206dbSAlex Fikl static PetscErrorCode ourcopy(Mat mat, Mat B, MatStructure str)
168626206dbSAlex Fikl {
1693ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, Mat *, MatStructure *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_COPY]))(&mat, &B, &str, &ierr));
1703ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
171626206dbSAlex Fikl }
172626206dbSAlex Fikl 
173626206dbSAlex Fikl static PetscErrorCode ourscale(Mat mat, PetscScalar a)
174626206dbSAlex Fikl {
1753ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, PetscScalar *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_SCALE]))(&mat, &a, &ierr));
1763ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
177626206dbSAlex Fikl }
178626206dbSAlex Fikl 
179d18b9058SVincent Le Chenadec static PetscErrorCode oursetrandom(Mat mat, PetscRandom ctx)
180d18b9058SVincent Le Chenadec {
1813ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, PetscRandom *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_SET_RANDOM]))(&mat, &ctx, &ierr));
1823ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
183d18b9058SVincent Le Chenadec }
184d18b9058SVincent Le Chenadec 
18507833d17SVincent Le Chenadec static PetscErrorCode ourassemblybegin(Mat mat, MatAssemblyType type)
18607833d17SVincent Le Chenadec {
1873ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, MatAssemblyType *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_ASSEMBLY_BEGIN]))(&mat, &type, &ierr));
1883ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
18907833d17SVincent Le Chenadec }
19007833d17SVincent Le Chenadec 
19107833d17SVincent Le Chenadec static PetscErrorCode ourassemblyend(Mat mat, MatAssemblyType type)
19207833d17SVincent Le Chenadec {
1933ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, MatAssemblyType *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_ASSEMBLY_END]))(&mat, &type, &ierr));
1943ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
19507833d17SVincent Le Chenadec }
19607833d17SVincent Le Chenadec 
19701f93aa2SJose E. Roman static PetscErrorCode ourduplicate(Mat mat, MatDuplicateOption op, Mat *M)
19801f93aa2SJose E. Roman {
1999a3891c8SBarry Smith   *((void **)(M)) = (void *)-2; // Initialize matrix since it will be passed to Fortran
20001f93aa2SJose E. Roman   PetscCallFortranVoidFunction((*(void (*)(Mat *, MatDuplicateOption *, Mat *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_DUPLICATE]))(&mat, &op, M, &ierr));
20101f93aa2SJose E. Roman   return PETSC_SUCCESS;
20201f93aa2SJose E. Roman }
20301f93aa2SJose E. Roman 
20419caf8f3SSatish Balay PETSC_EXTERN void matshellsetoperation_(Mat *mat, MatOperation *op, PetscErrorCode (*f)(Mat *, Vec *, Vec *, PetscErrorCode *), PetscErrorCode *ierr)
205f4e70085SSatish Balay {
206e32f2f54SBarry Smith   MPI_Comm comm;
207e32f2f54SBarry Smith 
2083ba16761SJacob Faibussowitsch   *ierr = PetscObjectGetComm((PetscObject)*mat, &comm);
2093ba16761SJacob Faibussowitsch   if (*ierr) return;
21086686b9bSAlex Fikl   PetscObjectAllocateFortranPointers(*mat, FORTRAN_MATOP_SIZE);
21186686b9bSAlex Fikl 
21286686b9bSAlex Fikl   switch (*op) {
21386686b9bSAlex Fikl   case MATOP_MULT:
21457d50842SBarry Smith     *ierr                                                          = MatShellSetOperation(*mat, *op, (PetscErrorCodeFn *)ourmult);
215*5ebfa9e9SBarry Smith     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_MULT] = (PetscFortranCallbackFn *)f;
21686686b9bSAlex Fikl     break;
21786686b9bSAlex Fikl   case MATOP_MULT_ADD:
21857d50842SBarry Smith     *ierr                                                              = MatShellSetOperation(*mat, *op, (PetscErrorCodeFn *)ourmultadd);
219*5ebfa9e9SBarry Smith     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_ADD] = (PetscFortranCallbackFn *)f;
22086686b9bSAlex Fikl     break;
22186686b9bSAlex Fikl   case MATOP_MULT_TRANSPOSE:
22257d50842SBarry Smith     *ierr                                                                    = MatShellSetOperation(*mat, *op, (PetscErrorCodeFn *)ourmulttranspose);
223*5ebfa9e9SBarry Smith     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_TRANSPOSE] = (PetscFortranCallbackFn *)f;
22486686b9bSAlex Fikl     break;
225f8e07d23SBlanca Mellado Pinto   case MATOP_MULT_HERMITIAN_TRANSPOSE:
22657d50842SBarry Smith     *ierr                                                             = MatShellSetOperation(*mat, *op, (PetscErrorCodeFn *)ourmulthermitiantranspose);
227*5ebfa9e9SBarry Smith     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_HT] = (PetscFortranCallbackFn *)f;
228f8e07d23SBlanca Mellado Pinto     break;
22986686b9bSAlex Fikl   case MATOP_MULT_TRANSPOSE_ADD:
23057d50842SBarry Smith     *ierr                                                                        = MatShellSetOperation(*mat, *op, (PetscErrorCodeFn *)ourmulttransposeadd);
231*5ebfa9e9SBarry Smith     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_TRANSPOSE_ADD] = (PetscFortranCallbackFn *)f;
23286686b9bSAlex Fikl     break;
233f8e07d23SBlanca Mellado Pinto   case MATOP_MULT_HERMITIAN_TRANS_ADD:
23457d50842SBarry Smith     *ierr                                                                 = MatShellSetOperation(*mat, *op, (PetscErrorCodeFn *)ourmulthermitiantransposeadd);
235*5ebfa9e9SBarry Smith     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_HT_ADD] = (PetscFortranCallbackFn *)f;
236f8e07d23SBlanca Mellado Pinto     break;
23786686b9bSAlex Fikl   case MATOP_SOR:
23857d50842SBarry Smith     *ierr                                                         = MatShellSetOperation(*mat, *op, (PetscErrorCodeFn *)oursor);
239*5ebfa9e9SBarry Smith     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_SOR] = (PetscFortranCallbackFn *)f;
24086686b9bSAlex Fikl     break;
24186686b9bSAlex Fikl   case MATOP_TRANSPOSE:
24257d50842SBarry Smith     *ierr                                                               = MatShellSetOperation(*mat, *op, (PetscErrorCodeFn *)ourtranspose);
243*5ebfa9e9SBarry Smith     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_TRANSPOSE] = (PetscFortranCallbackFn *)f;
24486686b9bSAlex Fikl     break;
24586686b9bSAlex Fikl   case MATOP_GET_DIAGONAL:
24657d50842SBarry Smith     *ierr                                                                  = MatShellSetOperation(*mat, *op, (PetscErrorCodeFn *)ourgetdiagonal);
247*5ebfa9e9SBarry Smith     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_GET_DIAGONAL] = (PetscFortranCallbackFn *)f;
24886686b9bSAlex Fikl     break;
24986686b9bSAlex Fikl   case MATOP_DIAGONAL_SCALE:
25057d50842SBarry Smith     *ierr                                                                    = MatShellSetOperation(*mat, *op, (PetscErrorCodeFn *)ourdiagonalscale);
251*5ebfa9e9SBarry Smith     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_DIAGONAL_SCALE] = (PetscFortranCallbackFn *)f;
25286686b9bSAlex Fikl     break;
25386686b9bSAlex Fikl   case MATOP_ZERO_ENTRIES:
25457d50842SBarry Smith     *ierr                                                                  = MatShellSetOperation(*mat, *op, (PetscErrorCodeFn *)ourzeroentries);
255*5ebfa9e9SBarry Smith     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_ZERO_ENTRIES] = (PetscFortranCallbackFn *)f;
25686686b9bSAlex Fikl     break;
25786686b9bSAlex Fikl   case MATOP_AXPY:
25857d50842SBarry Smith     *ierr                                                          = MatShellSetOperation(*mat, *op, (PetscErrorCodeFn *)ouraxpy);
259*5ebfa9e9SBarry Smith     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_AXPY] = (PetscFortranCallbackFn *)f;
26086686b9bSAlex Fikl     break;
26186686b9bSAlex Fikl   case MATOP_SHIFT:
26257d50842SBarry Smith     *ierr                                                           = MatShellSetOperation(*mat, *op, (PetscErrorCodeFn *)ourshift);
263*5ebfa9e9SBarry Smith     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_SHIFT] = (PetscFortranCallbackFn *)f;
26486686b9bSAlex Fikl     break;
26586686b9bSAlex Fikl   case MATOP_DIAGONAL_SET:
26657d50842SBarry Smith     *ierr                                                                  = MatShellSetOperation(*mat, *op, (PetscErrorCodeFn *)ourdiagonalset);
267*5ebfa9e9SBarry Smith     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_DIAGONAL_SET] = (PetscFortranCallbackFn *)f;
26886686b9bSAlex Fikl     break;
26986686b9bSAlex Fikl   case MATOP_DESTROY:
27057d50842SBarry Smith     *ierr                                                             = MatShellSetOperation(*mat, *op, (PetscErrorCodeFn *)ourdestroy);
271*5ebfa9e9SBarry Smith     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_DESTROY] = (PetscFortranCallbackFn *)f;
27286686b9bSAlex Fikl     break;
27386686b9bSAlex Fikl   case MATOP_VIEW:
27457d50842SBarry Smith     *ierr                                                          = MatShellSetOperation(*mat, *op, (PetscErrorCodeFn *)ourview);
275*5ebfa9e9SBarry Smith     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_VIEW] = (PetscFortranCallbackFn *)f;
27686686b9bSAlex Fikl     break;
277b41ce5d5SBarry Smith   case MATOP_CREATE_VECS:
27857d50842SBarry Smith     *ierr                                                                 = MatShellSetOperation(*mat, *op, (PetscErrorCodeFn *)ourgetvecs);
279*5ebfa9e9SBarry Smith     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_CREATE_VECS] = (PetscFortranCallbackFn *)f;
28086686b9bSAlex Fikl     break;
281a5b7ff6bSBarry Smith   case MATOP_GET_DIAGONAL_BLOCK:
28257d50842SBarry Smith     *ierr                                                                        = MatShellSetOperation(*mat, *op, (PetscErrorCodeFn *)ourgetdiagonalblock);
283*5ebfa9e9SBarry Smith     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_GET_DIAGONAL_BLOCK] = (PetscFortranCallbackFn *)f;
284a5b7ff6bSBarry Smith     break;
285626206dbSAlex Fikl   case MATOP_COPY:
28657d50842SBarry Smith     *ierr                                                          = MatShellSetOperation(*mat, *op, (PetscErrorCodeFn *)ourcopy);
287*5ebfa9e9SBarry Smith     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_COPY] = (PetscFortranCallbackFn *)f;
288626206dbSAlex Fikl     break;
289626206dbSAlex Fikl   case MATOP_SCALE:
29057d50842SBarry Smith     *ierr                                                           = MatShellSetOperation(*mat, *op, (PetscErrorCodeFn *)ourscale);
291*5ebfa9e9SBarry Smith     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_SCALE] = (PetscFortranCallbackFn *)f;
292626206dbSAlex Fikl     break;
293d18b9058SVincent Le Chenadec   case MATOP_SET_RANDOM:
29457d50842SBarry Smith     *ierr                                                                = MatShellSetOperation(*mat, *op, (PetscErrorCodeFn *)oursetrandom);
295*5ebfa9e9SBarry Smith     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_SET_RANDOM] = (PetscFortranCallbackFn *)f;
296d18b9058SVincent Le Chenadec     break;
29707833d17SVincent Le Chenadec   case MATOP_ASSEMBLY_BEGIN:
29857d50842SBarry Smith     *ierr                                                                    = MatShellSetOperation(*mat, *op, (PetscErrorCodeFn *)ourassemblybegin);
299*5ebfa9e9SBarry Smith     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_ASSEMBLY_BEGIN] = (PetscFortranCallbackFn *)f;
30007833d17SVincent Le Chenadec     break;
30107833d17SVincent Le Chenadec   case MATOP_ASSEMBLY_END:
30257d50842SBarry Smith     *ierr                                                                  = MatShellSetOperation(*mat, *op, (PetscErrorCodeFn *)ourassemblyend);
303*5ebfa9e9SBarry Smith     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_ASSEMBLY_END] = (PetscFortranCallbackFn *)f;
30407833d17SVincent Le Chenadec     break;
30501f93aa2SJose E. Roman   case MATOP_DUPLICATE:
30657d50842SBarry Smith     *ierr                                                               = MatShellSetOperation(*mat, *op, (PetscErrorCodeFn *)ourduplicate);
307*5ebfa9e9SBarry Smith     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_DUPLICATE] = (PetscFortranCallbackFn *)f;
30801f93aa2SJose E. Roman     break;
30986686b9bSAlex Fikl   default:
3103ba16761SJacob Faibussowitsch     *ierr = PetscError(comm, __LINE__, "MatShellSetOperation_Fortran", __FILE__, PETSC_ERR_ARG_WRONG, PETSC_ERROR_INITIAL, "Cannot set that matrix operation");
3113ba16761SJacob Faibussowitsch     *ierr = PETSC_ERR_ARG_WRONG;
312f4e70085SSatish Balay   }
313f4e70085SSatish Balay }
314