xref: /petsc/src/mat/impls/shell/ftn-custom/zshellf.c (revision f8e07d23ddf66943c8ff1b4ce09eace82a62b995)
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,
3701f93aa2SJose E. Roman   FORTRAN_MATOP_DUPLICATE          = 21,
38*f8e07d23SBlanca Mellado Pinto   FORTRAN_MATOP_MULT_HT            = 22,
39*f8e07d23SBlanca Mellado Pinto   FORTRAN_MATOP_MULT_HT_ADD        = 23,
40*f8e07d23SBlanca Mellado Pinto   FORTRAN_MATOP_SIZE               = 24
4186686b9bSAlex Fikl };
4286686b9bSAlex Fikl 
43f4e70085SSatish Balay /*
44f4e70085SSatish Balay   The MatShell Matrix Vector product requires a C routine.
45f4e70085SSatish Balay   This C routine then calls the corresponding Fortran routine that was
46f4e70085SSatish Balay   set by the user.
47f4e70085SSatish Balay */
4819caf8f3SSatish Balay PETSC_EXTERN void matcreateshell_(MPI_Comm *comm, PetscInt *m, PetscInt *n, PetscInt *M, PetscInt *N, void *ctx, Mat *mat, PetscErrorCode *ierr)
49f4e70085SSatish Balay {
502e843561SJed Brown   *ierr = MatCreateShell(MPI_Comm_f2c(*(MPI_Fint *)&*comm), *m, *n, *M, *N, ctx, mat);
51f4e70085SSatish Balay }
52f4e70085SSatish Balay 
53f4e70085SSatish Balay static PetscErrorCode ourmult(Mat mat, Vec x, Vec y)
54f4e70085SSatish Balay {
553ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_MULT]))(&mat, &x, &y, &ierr));
563ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
57f4e70085SSatish Balay }
58f4e70085SSatish Balay 
59f4e70085SSatish Balay static PetscErrorCode ourmultadd(Mat mat, Vec x, Vec y, Vec z)
60f4e70085SSatish Balay {
613ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, Vec *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_ADD]))(&mat, &x, &y, &z, &ierr));
623ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
6386686b9bSAlex Fikl }
6486686b9bSAlex Fikl 
6586686b9bSAlex Fikl static PetscErrorCode ourmulttranspose(Mat mat, Vec x, Vec y)
6686686b9bSAlex Fikl {
673ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_TRANSPOSE]))(&mat, &x, &y, &ierr));
683ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
69f4e70085SSatish Balay }
70f4e70085SSatish Balay 
71*f8e07d23SBlanca Mellado Pinto static PetscErrorCode ourmulthermitiantranspose(Mat mat, Vec x, Vec y)
72*f8e07d23SBlanca Mellado Pinto {
73*f8e07d23SBlanca Mellado Pinto   PetscCallFortranVoidFunction((*(void (*)(Mat *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_HT]))(&mat, &x, &y, &ierr));
74*f8e07d23SBlanca Mellado Pinto   return PETSC_SUCCESS;
75*f8e07d23SBlanca Mellado Pinto }
76*f8e07d23SBlanca Mellado Pinto 
77f4e70085SSatish Balay static PetscErrorCode ourmulttransposeadd(Mat mat, Vec x, Vec y, Vec z)
78f4e70085SSatish Balay {
793ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, Vec *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_TRANSPOSE_ADD]))(&mat, &x, &y, &z, &ierr));
803ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
812950f7e7SBarry Smith }
822950f7e7SBarry Smith 
83*f8e07d23SBlanca Mellado Pinto static PetscErrorCode ourmulthermitiantransposeadd(Mat mat, Vec x, Vec y, Vec z)
84*f8e07d23SBlanca Mellado Pinto {
85*f8e07d23SBlanca Mellado Pinto   PetscCallFortranVoidFunction((*(void (*)(Mat *, Vec *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_HT_ADD]))(&mat, &x, &y, &z, &ierr));
86*f8e07d23SBlanca Mellado Pinto   return PETSC_SUCCESS;
87*f8e07d23SBlanca Mellado Pinto }
88*f8e07d23SBlanca Mellado Pinto 
893446fae8SBarry Smith static PetscErrorCode oursor(Mat mat, Vec b, PetscReal omega, MatSORType flg, PetscReal shift, PetscInt its, PetscInt lits, Vec x)
903446fae8SBarry Smith {
913ba16761SJacob Faibussowitsch   PetscErrorCode ierr = PETSC_SUCCESS;
9286686b9bSAlex Fikl 
933ba16761SJacob 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);
9486686b9bSAlex Fikl   return ierr;
9586686b9bSAlex Fikl }
9686686b9bSAlex Fikl 
9786686b9bSAlex Fikl static PetscErrorCode ourtranspose(Mat mat, MatReuse reuse, Mat *B)
9886686b9bSAlex Fikl {
991b266c99SBarry Smith   Mat  bb = (Mat)-1;
1001b266c99SBarry Smith   Mat *b  = (!B ? &bb : B);
10186686b9bSAlex Fikl 
1023ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, MatReuse *, Mat *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_TRANSPOSE]))(&mat, &reuse, b, &ierr));
1033ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
10486686b9bSAlex Fikl }
10586686b9bSAlex Fikl 
10686686b9bSAlex Fikl static PetscErrorCode ourgetdiagonal(Mat mat, Vec x)
10786686b9bSAlex Fikl {
1083ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, Vec *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_GET_DIAGONAL]))(&mat, &x, &ierr));
1093ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
11086686b9bSAlex Fikl }
11186686b9bSAlex Fikl 
11286686b9bSAlex Fikl static PetscErrorCode ourdiagonalscale(Mat mat, Vec l, Vec r)
11386686b9bSAlex Fikl {
1141b266c99SBarry Smith   Vec  aa = (Vec)-1;
1151b266c99SBarry Smith   Vec *a  = (!l ? &aa : &l);
1161b266c99SBarry Smith   Vec *b  = (!r ? &aa : &r);
11786686b9bSAlex Fikl 
1183ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_DIAGONAL_SCALE]))(&mat, a, b, &ierr));
1193ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
12086686b9bSAlex Fikl }
12186686b9bSAlex Fikl 
12286686b9bSAlex Fikl static PetscErrorCode ourzeroentries(Mat mat)
12386686b9bSAlex Fikl {
1243ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_ZERO_ENTRIES]))(&mat, &ierr));
1253ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
12686686b9bSAlex Fikl }
12786686b9bSAlex Fikl 
12886686b9bSAlex Fikl static PetscErrorCode ouraxpy(Mat mat, PetscScalar a, Mat X, MatStructure str)
12986686b9bSAlex Fikl {
1303ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, PetscScalar *, Mat *, MatStructure *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_AXPY]))(&mat, &a, &X, &str, &ierr));
1313ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
1323446fae8SBarry Smith }
1333446fae8SBarry Smith 
134cdf26a31SSatish Balay static PetscErrorCode ourshift(Mat mat, PetscScalar a)
135cdf26a31SSatish Balay {
1363ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, PetscScalar *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_SHIFT]))(&mat, &a, &ierr));
1373ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
13886686b9bSAlex Fikl }
13986686b9bSAlex Fikl 
14086686b9bSAlex Fikl static PetscErrorCode ourdiagonalset(Mat mat, Vec x, InsertMode ins)
14186686b9bSAlex Fikl {
1423ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, Vec *, InsertMode *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_DIAGONAL_SET]))(&mat, &x, &ins, &ierr));
1433ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
14486686b9bSAlex Fikl }
14586686b9bSAlex Fikl 
14686686b9bSAlex Fikl static PetscErrorCode ourdestroy(Mat mat)
14786686b9bSAlex Fikl {
1483ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_DESTROY]))(&mat, &ierr));
1493ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
15086686b9bSAlex Fikl }
15186686b9bSAlex Fikl 
15286686b9bSAlex Fikl static PetscErrorCode ourview(Mat mat, PetscViewer v)
15386686b9bSAlex Fikl {
1543ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, PetscViewer *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_VIEW]))(&mat, &v, &ierr));
1553ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
15686686b9bSAlex Fikl }
15786686b9bSAlex Fikl 
15886686b9bSAlex Fikl static PetscErrorCode ourgetvecs(Mat mat, Vec *l, Vec *r)
15986686b9bSAlex Fikl {
1601b266c99SBarry Smith   Vec  aa = (Vec)-1;
1611b266c99SBarry Smith   Vec *a  = (!l ? &aa : l);
1621b266c99SBarry Smith   Vec *b  = (!r ? &aa : r);
16386686b9bSAlex Fikl 
1643ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_CREATE_VECS]))(&mat, a, b, &ierr));
1653ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
166cdf26a31SSatish Balay }
167cdf26a31SSatish Balay 
168a5b7ff6bSBarry Smith static PetscErrorCode ourgetdiagonalblock(Mat mat, Mat *l)
169a5b7ff6bSBarry Smith {
1703ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, Mat *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_GET_DIAGONAL_BLOCK]))(&mat, l, &ierr));
1713ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
172a5b7ff6bSBarry Smith }
173a5b7ff6bSBarry Smith 
174626206dbSAlex Fikl static PetscErrorCode ourcopy(Mat mat, Mat B, MatStructure str)
175626206dbSAlex Fikl {
1763ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, Mat *, MatStructure *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_COPY]))(&mat, &B, &str, &ierr));
1773ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
178626206dbSAlex Fikl }
179626206dbSAlex Fikl 
180626206dbSAlex Fikl static PetscErrorCode ourscale(Mat mat, PetscScalar a)
181626206dbSAlex Fikl {
1823ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, PetscScalar *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_SCALE]))(&mat, &a, &ierr));
1833ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
184626206dbSAlex Fikl }
185626206dbSAlex Fikl 
186d18b9058SVincent Le Chenadec static PetscErrorCode oursetrandom(Mat mat, PetscRandom ctx)
187d18b9058SVincent Le Chenadec {
1883ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, PetscRandom *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_SET_RANDOM]))(&mat, &ctx, &ierr));
1893ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
190d18b9058SVincent Le Chenadec }
191d18b9058SVincent Le Chenadec 
19207833d17SVincent Le Chenadec static PetscErrorCode ourassemblybegin(Mat mat, MatAssemblyType type)
19307833d17SVincent Le Chenadec {
1943ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, MatAssemblyType *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_ASSEMBLY_BEGIN]))(&mat, &type, &ierr));
1953ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
19607833d17SVincent Le Chenadec }
19707833d17SVincent Le Chenadec 
19807833d17SVincent Le Chenadec static PetscErrorCode ourassemblyend(Mat mat, MatAssemblyType type)
19907833d17SVincent Le Chenadec {
2003ba16761SJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(Mat *, MatAssemblyType *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_ASSEMBLY_END]))(&mat, &type, &ierr));
2013ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
20207833d17SVincent Le Chenadec }
20307833d17SVincent Le Chenadec 
20401f93aa2SJose E. Roman static PetscErrorCode ourduplicate(Mat mat, MatDuplicateOption op, Mat *M)
20501f93aa2SJose E. Roman {
20601f93aa2SJose E. Roman   PetscCallFortranVoidFunction((*(void (*)(Mat *, MatDuplicateOption *, Mat *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_DUPLICATE]))(&mat, &op, M, &ierr));
20701f93aa2SJose E. Roman   return PETSC_SUCCESS;
20801f93aa2SJose E. Roman }
20901f93aa2SJose E. Roman 
21019caf8f3SSatish Balay PETSC_EXTERN void matshellsetoperation_(Mat *mat, MatOperation *op, PetscErrorCode (*f)(Mat *, Vec *, Vec *, PetscErrorCode *), PetscErrorCode *ierr)
211f4e70085SSatish Balay {
212e32f2f54SBarry Smith   MPI_Comm comm;
213e32f2f54SBarry Smith 
2143ba16761SJacob Faibussowitsch   *ierr = PetscObjectGetComm((PetscObject)*mat, &comm);
2153ba16761SJacob Faibussowitsch   if (*ierr) return;
21686686b9bSAlex Fikl   PetscObjectAllocateFortranPointers(*mat, FORTRAN_MATOP_SIZE);
21786686b9bSAlex Fikl 
21886686b9bSAlex Fikl   switch (*op) {
21986686b9bSAlex Fikl   case MATOP_MULT:
220f68b968cSBarry Smith     *ierr                                                          = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourmult);
22186686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_MULT] = (PetscVoidFunction)f;
22286686b9bSAlex Fikl     break;
22386686b9bSAlex Fikl   case MATOP_MULT_ADD:
224f68b968cSBarry Smith     *ierr                                                              = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourmultadd);
22586686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_ADD] = (PetscVoidFunction)f;
22686686b9bSAlex Fikl     break;
22786686b9bSAlex Fikl   case MATOP_MULT_TRANSPOSE:
22886686b9bSAlex Fikl     *ierr                                                                    = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourmulttranspose);
22986686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_TRANSPOSE] = (PetscVoidFunction)f;
23086686b9bSAlex Fikl     break;
231*f8e07d23SBlanca Mellado Pinto   case MATOP_MULT_HERMITIAN_TRANSPOSE:
232*f8e07d23SBlanca Mellado Pinto     *ierr                                                             = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourmulthermitiantranspose);
233*f8e07d23SBlanca Mellado Pinto     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_HT] = (PetscVoidFunction)f;
234*f8e07d23SBlanca Mellado Pinto     break;
23586686b9bSAlex Fikl   case MATOP_MULT_TRANSPOSE_ADD:
236f68b968cSBarry Smith     *ierr                                                                        = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourmulttransposeadd);
23786686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_TRANSPOSE_ADD] = (PetscVoidFunction)f;
23886686b9bSAlex Fikl     break;
239*f8e07d23SBlanca Mellado Pinto   case MATOP_MULT_HERMITIAN_TRANS_ADD:
240*f8e07d23SBlanca Mellado Pinto     *ierr                                                                 = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourmulthermitiantransposeadd);
241*f8e07d23SBlanca Mellado Pinto     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_HT_ADD] = (PetscVoidFunction)f;
242*f8e07d23SBlanca Mellado Pinto     break;
24386686b9bSAlex Fikl   case MATOP_SOR:
2443446fae8SBarry Smith     *ierr                                                         = MatShellSetOperation(*mat, *op, (PetscVoidFunction)oursor);
24586686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_SOR] = (PetscVoidFunction)f;
24686686b9bSAlex Fikl     break;
24786686b9bSAlex Fikl   case MATOP_TRANSPOSE:
24886686b9bSAlex Fikl     *ierr                                                               = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourtranspose);
24986686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_TRANSPOSE] = (PetscVoidFunction)f;
25086686b9bSAlex Fikl     break;
25186686b9bSAlex Fikl   case MATOP_GET_DIAGONAL:
25286686b9bSAlex Fikl     *ierr                                                                  = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourgetdiagonal);
25386686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_GET_DIAGONAL] = (PetscVoidFunction)f;
25486686b9bSAlex Fikl     break;
25586686b9bSAlex Fikl   case MATOP_DIAGONAL_SCALE:
25686686b9bSAlex Fikl     *ierr                                                                    = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourdiagonalscale);
25786686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_DIAGONAL_SCALE] = (PetscVoidFunction)f;
25886686b9bSAlex Fikl     break;
25986686b9bSAlex Fikl   case MATOP_ZERO_ENTRIES:
26086686b9bSAlex Fikl     *ierr                                                                  = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourzeroentries);
26186686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_ZERO_ENTRIES] = (PetscVoidFunction)f;
26286686b9bSAlex Fikl     break;
26386686b9bSAlex Fikl   case MATOP_AXPY:
26486686b9bSAlex Fikl     *ierr                                                          = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ouraxpy);
26586686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_AXPY] = (PetscVoidFunction)f;
26686686b9bSAlex Fikl     break;
26786686b9bSAlex Fikl   case MATOP_SHIFT:
268cdf26a31SSatish Balay     *ierr                                                           = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourshift);
26986686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_SHIFT] = (PetscVoidFunction)f;
27086686b9bSAlex Fikl     break;
27186686b9bSAlex Fikl   case MATOP_DIAGONAL_SET:
27286686b9bSAlex Fikl     *ierr                                                                  = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourdiagonalset);
27386686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_DIAGONAL_SET] = (PetscVoidFunction)f;
27486686b9bSAlex Fikl     break;
27586686b9bSAlex Fikl   case MATOP_DESTROY:
27686686b9bSAlex Fikl     *ierr                                                             = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourdestroy);
27786686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_DESTROY] = (PetscVoidFunction)f;
27886686b9bSAlex Fikl     break;
27986686b9bSAlex Fikl   case MATOP_VIEW:
28086686b9bSAlex Fikl     *ierr                                                          = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourview);
28186686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_VIEW] = (PetscVoidFunction)f;
28286686b9bSAlex Fikl     break;
283b41ce5d5SBarry Smith   case MATOP_CREATE_VECS:
28486686b9bSAlex Fikl     *ierr                                                                 = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourgetvecs);
285b41ce5d5SBarry Smith     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_CREATE_VECS] = (PetscVoidFunction)f;
28686686b9bSAlex Fikl     break;
287a5b7ff6bSBarry Smith   case MATOP_GET_DIAGONAL_BLOCK:
288a5b7ff6bSBarry Smith     *ierr                                                                        = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourgetdiagonalblock);
289a5b7ff6bSBarry Smith     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_GET_DIAGONAL_BLOCK] = (PetscVoidFunction)f;
290a5b7ff6bSBarry Smith     break;
291626206dbSAlex Fikl   case MATOP_COPY:
292626206dbSAlex Fikl     *ierr                                                          = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourcopy);
293626206dbSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_COPY] = (PetscVoidFunction)f;
294626206dbSAlex Fikl     break;
295626206dbSAlex Fikl   case MATOP_SCALE:
296626206dbSAlex Fikl     *ierr                                                           = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourscale);
297626206dbSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_SCALE] = (PetscVoidFunction)f;
298626206dbSAlex Fikl     break;
299d18b9058SVincent Le Chenadec   case MATOP_SET_RANDOM:
300d18b9058SVincent Le Chenadec     *ierr                                                                = MatShellSetOperation(*mat, *op, (PetscVoidFunction)oursetrandom);
301d18b9058SVincent Le Chenadec     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_SET_RANDOM] = (PetscVoidFunction)f;
302d18b9058SVincent Le Chenadec     break;
30307833d17SVincent Le Chenadec   case MATOP_ASSEMBLY_BEGIN:
30407833d17SVincent Le Chenadec     *ierr                                                                    = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourassemblybegin);
30507833d17SVincent Le Chenadec     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_ASSEMBLY_BEGIN] = (PetscVoidFunction)f;
30607833d17SVincent Le Chenadec     break;
30707833d17SVincent Le Chenadec   case MATOP_ASSEMBLY_END:
30807833d17SVincent Le Chenadec     *ierr                                                                  = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourassemblyend);
30907833d17SVincent Le Chenadec     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_ASSEMBLY_END] = (PetscVoidFunction)f;
31007833d17SVincent Le Chenadec     break;
31101f93aa2SJose E. Roman   case MATOP_DUPLICATE:
31201f93aa2SJose E. Roman     *ierr                                                               = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourduplicate);
31301f93aa2SJose E. Roman     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_DUPLICATE] = (PetscVoidFunction)f;
31401f93aa2SJose E. Roman     break;
31586686b9bSAlex Fikl   default:
3163ba16761SJacob Faibussowitsch     *ierr = PetscError(comm, __LINE__, "MatShellSetOperation_Fortran", __FILE__, PETSC_ERR_ARG_WRONG, PETSC_ERROR_INITIAL, "Cannot set that matrix operation");
3173ba16761SJacob Faibussowitsch     *ierr = PETSC_ERR_ARG_WRONG;
318f4e70085SSatish Balay   }
319f4e70085SSatish Balay }
320