xref: /petsc/src/mat/impls/shell/ftn-custom/zshellf.c (revision 2286efddd54511ab18e8e2adb1e023c4bf8f0b92)
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 */
ourmult(Mat mat,Vec x,Vec y)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 
ourmultadd(Mat mat,Vec x,Vec y,Vec z)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 
ourmulttranspose(Mat mat,Vec x,Vec y)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 
ourmulthermitiantranspose(Mat mat,Vec x,Vec y)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 
ourmulttransposeadd(Mat mat,Vec x,Vec y,Vec z)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 
ourmulthermitiantransposeadd(Mat mat,Vec x,Vec y,Vec z)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 
oursor(Mat mat,Vec b,PetscReal omega,MatSORType flg,PetscReal shift,PetscInt its,PetscInt lits,Vec x)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 
ourtranspose(Mat mat,MatReuse reuse,Mat * B)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 
ourgetdiagonal(Mat mat,Vec x)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 
ourdiagonalscale(Mat mat,Vec l,Vec r)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 
ourzeroentries(Mat mat)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 
ouraxpy(Mat mat,PetscScalar a,Mat X,MatStructure str)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 
ourshift(Mat mat,PetscScalar a)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 
ourdiagonalset(Mat mat,Vec x,InsertMode ins)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 
ourdestroy(Mat mat)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 
ourview(Mat mat,PetscViewer v)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 
ourgetvecs(Mat mat,Vec * l,Vec * r)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 
ourgetdiagonalblock(Mat mat,Mat * l)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 
ourcopy(Mat mat,Mat B,MatStructure str)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 
ourscale(Mat mat,PetscScalar a)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 
oursetrandom(Mat mat,PetscRandom ctx)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 
ourassemblybegin(Mat mat,MatAssemblyType type)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 
ourassemblyend(Mat mat,MatAssemblyType type)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 
ourduplicate(Mat mat,MatDuplicateOption op,Mat * M)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 
matshellsetoperation_(Mat * mat,MatOperation * op,PetscErrorCode (* f)(Mat *,Vec *,Vec *,PetscErrorCode *),PetscErrorCode * ierr)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