xref: /petsc/src/mat/impls/shell/ftn-custom/zshellf.c (revision b41ce5d507ea9a58bfa83cf403107a702e77a67d)
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,
30*b41ce5d5SBarry 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,
376b3eee04SVincent Le Chenadec   FORTRAN_MATOP_SIZE = 21
3886686b9bSAlex Fikl };
3986686b9bSAlex Fikl 
40f4e70085SSatish Balay /*
41f4e70085SSatish Balay   The MatShell Matrix Vector product requires a C routine.
42f4e70085SSatish Balay   This C routine then calls the corresponding Fortran routine that was
43f4e70085SSatish Balay   set by the user.
44f4e70085SSatish Balay */
458cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matcreateshell_(MPI_Comm *comm,PetscInt *m,PetscInt *n,PetscInt *M,PetscInt *N,void *ctx,Mat *mat,PetscErrorCode *ierr)
46f4e70085SSatish Balay {
472e843561SJed Brown   *ierr = MatCreateShell(MPI_Comm_f2c(*(MPI_Fint*)&*comm),*m,*n,*M,*N,ctx,mat);
48f4e70085SSatish Balay }
49f4e70085SSatish Balay 
50f4e70085SSatish Balay static PetscErrorCode ourmult(Mat mat,Vec x,Vec y)
51f4e70085SSatish Balay {
52f4e70085SSatish Balay   PetscErrorCode ierr = 0;
53f4e70085SSatish Balay 
5486686b9bSAlex Fikl   (*(PetscErrorCode (PETSC_STDCALL *)(Mat*,Vec*,Vec*,PetscErrorCode*))(((PetscObject) mat)->fortran_func_pointers[FORTRAN_MATOP_MULT]))(&mat,&x,&y,&ierr);
55f4e70085SSatish Balay   return ierr;
56f4e70085SSatish Balay }
57f4e70085SSatish Balay 
58f4e70085SSatish Balay static PetscErrorCode ourmultadd(Mat mat,Vec x,Vec y,Vec z)
59f4e70085SSatish Balay {
60f4e70085SSatish Balay   PetscErrorCode ierr = 0;
6186686b9bSAlex Fikl 
6286686b9bSAlex Fikl   (*(PetscErrorCode (PETSC_STDCALL *)(Mat*,Vec*,Vec*,Vec*,PetscErrorCode*))(((PetscObject) mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_ADD]))(&mat,&x,&y,&z,&ierr);
6386686b9bSAlex Fikl   return ierr;
6486686b9bSAlex Fikl }
6586686b9bSAlex Fikl 
6686686b9bSAlex Fikl static PetscErrorCode ourmulttranspose(Mat mat,Vec x,Vec y)
6786686b9bSAlex Fikl {
6886686b9bSAlex Fikl   PetscErrorCode ierr = 0;
6986686b9bSAlex Fikl 
7086686b9bSAlex Fikl   (*(PetscErrorCode (PETSC_STDCALL *)(Mat*,Vec*,Vec*,PetscErrorCode*))(((PetscObject) mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_TRANSPOSE]))(&mat,&x,&y,&ierr);
71f4e70085SSatish Balay   return ierr;
72f4e70085SSatish Balay }
73f4e70085SSatish Balay 
74f4e70085SSatish Balay static PetscErrorCode ourmulttransposeadd(Mat mat,Vec x,Vec y,Vec z)
75f4e70085SSatish Balay {
76f4e70085SSatish Balay   PetscErrorCode ierr = 0;
77f4e70085SSatish Balay 
7886686b9bSAlex Fikl   (*(PetscErrorCode (PETSC_STDCALL *)(Mat*,Vec*,Vec*,Vec*,PetscErrorCode*))(((PetscObject) mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_TRANSPOSE_ADD]))(&mat,&x,&y,&z,&ierr);
792950f7e7SBarry Smith   return ierr;
802950f7e7SBarry Smith }
812950f7e7SBarry Smith 
823446fae8SBarry Smith static PetscErrorCode oursor(Mat mat,Vec b,PetscReal omega,MatSORType flg,PetscReal shift,PetscInt its,PetscInt lits,Vec x)
833446fae8SBarry Smith {
843446fae8SBarry Smith   PetscErrorCode ierr = 0;
8586686b9bSAlex Fikl 
8686686b9bSAlex Fikl   (*(PetscErrorCode (PETSC_STDCALL *)(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 {
9286686b9bSAlex Fikl   PetscErrorCode ierr = 0;
931b266c99SBarry Smith   Mat bb = (Mat)-1;
941b266c99SBarry Smith   Mat *b = (!B ? &bb : B);
9586686b9bSAlex Fikl 
9686686b9bSAlex Fikl   (*(PetscErrorCode (PETSC_STDCALL *)(Mat*,MatReuse*,Mat*,PetscErrorCode*))(((PetscObject) mat)->fortran_func_pointers[FORTRAN_MATOP_TRANSPOSE]))(&mat,&reuse,b,&ierr);
9786686b9bSAlex Fikl   return ierr;
9886686b9bSAlex Fikl }
9986686b9bSAlex Fikl 
10086686b9bSAlex Fikl static PetscErrorCode ourgetdiagonal(Mat mat,Vec x)
10186686b9bSAlex Fikl {
10286686b9bSAlex Fikl   PetscErrorCode ierr = 0;
10386686b9bSAlex Fikl 
10486686b9bSAlex Fikl   (*(PetscErrorCode (PETSC_STDCALL *)(Mat*,Vec*,PetscErrorCode*))(((PetscObject) mat)->fortran_func_pointers[FORTRAN_MATOP_GET_DIAGONAL]))(&mat,&x,&ierr);
10586686b9bSAlex Fikl   return ierr;
10686686b9bSAlex Fikl }
10786686b9bSAlex Fikl 
10886686b9bSAlex Fikl static PetscErrorCode ourdiagonalscale(Mat mat,Vec l,Vec r)
10986686b9bSAlex Fikl {
11086686b9bSAlex Fikl   PetscErrorCode ierr = 0;
1111b266c99SBarry Smith   Vec aa = (Vec)-1;
1121b266c99SBarry Smith   Vec *a = (!l ? &aa : &l);
1131b266c99SBarry Smith   Vec *b = (!r ? &aa : &r);
11486686b9bSAlex Fikl 
11586686b9bSAlex Fikl   (*(PetscErrorCode (PETSC_STDCALL *)(Mat*,Vec*,Vec*,PetscErrorCode*))(((PetscObject) mat)->fortran_func_pointers[FORTRAN_MATOP_DIAGONAL_SCALE]))(&mat,a,b,&ierr);
11686686b9bSAlex Fikl   return ierr;
11786686b9bSAlex Fikl }
11886686b9bSAlex Fikl 
11986686b9bSAlex Fikl static PetscErrorCode ourzeroentries(Mat mat)
12086686b9bSAlex Fikl {
12186686b9bSAlex Fikl   PetscErrorCode ierr = 0;
12286686b9bSAlex Fikl 
12386686b9bSAlex Fikl   (*(PetscErrorCode (PETSC_STDCALL *)(Mat*,PetscErrorCode*))(((PetscObject) mat)->fortran_func_pointers[FORTRAN_MATOP_ZERO_ENTRIES]))(&mat,&ierr);
12486686b9bSAlex Fikl   return ierr;
12586686b9bSAlex Fikl }
12686686b9bSAlex Fikl 
12786686b9bSAlex Fikl static PetscErrorCode ouraxpy(Mat mat,PetscScalar a,Mat X,MatStructure str)
12886686b9bSAlex Fikl {
12986686b9bSAlex Fikl   PetscErrorCode ierr = 0;
13086686b9bSAlex Fikl 
13186686b9bSAlex Fikl   (*(PetscErrorCode (PETSC_STDCALL *)(Mat*,PetscScalar*,Mat*,MatStructure*,PetscErrorCode*))(((PetscObject) mat)->fortran_func_pointers[FORTRAN_MATOP_AXPY]))(&mat,&a,&X,&str,&ierr);
1323446fae8SBarry Smith   return ierr;
1333446fae8SBarry Smith }
1343446fae8SBarry Smith 
135cdf26a31SSatish Balay static PetscErrorCode ourshift(Mat mat,PetscScalar a)
136cdf26a31SSatish Balay {
137cdf26a31SSatish Balay   PetscErrorCode ierr = 0;
13886686b9bSAlex Fikl 
13986686b9bSAlex Fikl   (*(PetscErrorCode (PETSC_STDCALL *)(Mat*,PetscScalar*,PetscErrorCode*))(((PetscObject) mat)->fortran_func_pointers[FORTRAN_MATOP_SHIFT]))(&mat,&a,&ierr);
14086686b9bSAlex Fikl   return ierr;
14186686b9bSAlex Fikl }
14286686b9bSAlex Fikl 
14386686b9bSAlex Fikl static PetscErrorCode ourdiagonalset(Mat mat,Vec x,InsertMode ins)
14486686b9bSAlex Fikl {
14586686b9bSAlex Fikl   PetscErrorCode ierr = 0;
14686686b9bSAlex Fikl 
14786686b9bSAlex Fikl   (*(PetscErrorCode (PETSC_STDCALL *)(Mat*,Vec*,InsertMode*,PetscErrorCode*))(((PetscObject) mat)->fortran_func_pointers[FORTRAN_MATOP_DIAGONAL_SET]))(&mat,&x,&ins,&ierr);
14886686b9bSAlex Fikl   return ierr;
14986686b9bSAlex Fikl }
15086686b9bSAlex Fikl 
15186686b9bSAlex Fikl static PetscErrorCode ourdestroy(Mat mat)
15286686b9bSAlex Fikl {
15386686b9bSAlex Fikl   PetscErrorCode ierr = 0;
15486686b9bSAlex Fikl 
15586686b9bSAlex Fikl   (*(PetscErrorCode (PETSC_STDCALL *)(Mat*,PetscErrorCode*))(((PetscObject) mat)->fortran_func_pointers[FORTRAN_MATOP_DESTROY]))(&mat,&ierr);
15686686b9bSAlex Fikl   return ierr;
15786686b9bSAlex Fikl }
15886686b9bSAlex Fikl 
15986686b9bSAlex Fikl static PetscErrorCode ourview(Mat mat,PetscViewer v)
16086686b9bSAlex Fikl {
16186686b9bSAlex Fikl   PetscErrorCode ierr = 0;
16286686b9bSAlex Fikl 
16386686b9bSAlex Fikl   (*(PetscErrorCode (PETSC_STDCALL *)(Mat*,PetscViewer*,PetscErrorCode*))(((PetscObject) mat)->fortran_func_pointers[FORTRAN_MATOP_VIEW]))(&mat,&v,&ierr);
16486686b9bSAlex Fikl   return ierr;
16586686b9bSAlex Fikl }
16686686b9bSAlex Fikl 
16786686b9bSAlex Fikl static PetscErrorCode ourgetvecs(Mat mat,Vec *l,Vec *r)
16886686b9bSAlex Fikl {
16986686b9bSAlex Fikl   PetscErrorCode ierr = 0;
1701b266c99SBarry Smith   Vec aa = (Vec)-1;
1711b266c99SBarry Smith   Vec *a = (!l ? &aa : l);
1721b266c99SBarry Smith   Vec *b = (!r ? &aa : r);
17386686b9bSAlex Fikl 
174*b41ce5d5SBarry Smith   (*(PetscErrorCode (PETSC_STDCALL *)(Mat*,Vec*,Vec*,PetscErrorCode*))(((PetscObject) mat)->fortran_func_pointers[FORTRAN_MATOP_CREATE_VECS]))(&mat,a,b,&ierr);
175cdf26a31SSatish Balay   return ierr;
176cdf26a31SSatish Balay }
177cdf26a31SSatish Balay 
178a5b7ff6bSBarry Smith static PetscErrorCode ourgetdiagonalblock(Mat mat,Mat *l)
179a5b7ff6bSBarry Smith {
180a5b7ff6bSBarry Smith   PetscErrorCode ierr = 0;
181a5b7ff6bSBarry Smith   (*(PetscErrorCode (PETSC_STDCALL *)(Mat*,Mat*,PetscErrorCode*))(((PetscObject) mat)->fortran_func_pointers[FORTRAN_MATOP_GET_DIAGONAL_BLOCK]))(&mat,l,&ierr);
182a5b7ff6bSBarry Smith   return ierr;
183a5b7ff6bSBarry Smith }
184a5b7ff6bSBarry Smith 
185626206dbSAlex Fikl static PetscErrorCode ourcopy(Mat mat,Mat B,MatStructure str)
186626206dbSAlex Fikl {
187626206dbSAlex Fikl   PetscErrorCode ierr = 0;
188626206dbSAlex Fikl   (*(PetscErrorCode (PETSC_STDCALL *)(Mat*,Mat*,MatStructure*,PetscErrorCode*))(((PetscObject) mat)->fortran_func_pointers[FORTRAN_MATOP_COPY]))(&mat,&B,&str,&ierr);
189626206dbSAlex Fikl   return ierr;
190626206dbSAlex Fikl }
191626206dbSAlex Fikl 
192626206dbSAlex Fikl static PetscErrorCode ourscale(Mat mat,PetscScalar a)
193626206dbSAlex Fikl {
194626206dbSAlex Fikl   PetscErrorCode ierr = 0;
195626206dbSAlex Fikl   (*(PetscErrorCode (PETSC_STDCALL *)(Mat*,PetscScalar*,PetscErrorCode*))(((PetscObject) mat)->fortran_func_pointers[FORTRAN_MATOP_SCALE]))(&mat,&a,&ierr);
196626206dbSAlex Fikl   return ierr;
197626206dbSAlex Fikl }
198626206dbSAlex Fikl 
199d18b9058SVincent Le Chenadec static PetscErrorCode oursetrandom(Mat mat,PetscRandom ctx)
200d18b9058SVincent Le Chenadec {
201d18b9058SVincent Le Chenadec   PetscErrorCode ierr = 0;
202d18b9058SVincent Le Chenadec   (*(PetscErrorCode (PETSC_STDCALL *)(Mat*,PetscRandom*,PetscErrorCode*))(((PetscObject) mat)->fortran_func_pointers[FORTRAN_MATOP_SET_RANDOM]))(&mat,&ctx,&ierr);
203d18b9058SVincent Le Chenadec   return ierr;
204d18b9058SVincent Le Chenadec }
205d18b9058SVincent Le Chenadec 
20607833d17SVincent Le Chenadec static PetscErrorCode ourassemblybegin(Mat mat,MatAssemblyType type)
20707833d17SVincent Le Chenadec {
20807833d17SVincent Le Chenadec   PetscErrorCode ierr = 0;
20907833d17SVincent Le Chenadec   (*(PetscErrorCode (PETSC_STDCALL *)(Mat*,MatAssemblyType*,PetscErrorCode*))(((PetscObject) mat)->fortran_func_pointers[FORTRAN_MATOP_ASSEMBLY_BEGIN]))(&mat,&type,&ierr);
21007833d17SVincent Le Chenadec   return ierr;
21107833d17SVincent Le Chenadec }
21207833d17SVincent Le Chenadec 
21307833d17SVincent Le Chenadec static PetscErrorCode ourassemblyend(Mat mat,MatAssemblyType type)
21407833d17SVincent Le Chenadec {
21507833d17SVincent Le Chenadec   PetscErrorCode ierr = 0;
21607833d17SVincent Le Chenadec   (*(PetscErrorCode (PETSC_STDCALL *)(Mat*,MatAssemblyType*,PetscErrorCode*))(((PetscObject) mat)->fortran_func_pointers[FORTRAN_MATOP_ASSEMBLY_END]))(&mat,&type,&ierr);
21707833d17SVincent Le Chenadec   return ierr;
21807833d17SVincent Le Chenadec }
21907833d17SVincent Le Chenadec 
2208cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matshellsetoperation_(Mat *mat,MatOperation *op,PetscErrorCode (PETSC_STDCALL *f)(Mat*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr)
221f4e70085SSatish Balay {
222e32f2f54SBarry Smith   MPI_Comm comm;
223e32f2f54SBarry Smith 
224e32f2f54SBarry Smith   *ierr = PetscObjectGetComm((PetscObject) *mat,&comm);if (*ierr) return;
22586686b9bSAlex Fikl   PetscObjectAllocateFortranPointers(*mat,FORTRAN_MATOP_SIZE);
22686686b9bSAlex Fikl 
22786686b9bSAlex Fikl   switch (*op) {
22886686b9bSAlex Fikl   case MATOP_MULT:
229f68b968cSBarry Smith     *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ourmult);
23086686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_MULT] = (PetscVoidFunction) f;
23186686b9bSAlex Fikl     break;
23286686b9bSAlex Fikl   case MATOP_MULT_ADD:
233f68b968cSBarry Smith     *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ourmultadd);
23486686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_ADD] = (PetscVoidFunction) f;
23586686b9bSAlex Fikl     break;
23686686b9bSAlex Fikl   case MATOP_MULT_TRANSPOSE:
23786686b9bSAlex Fikl     *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ourmulttranspose);
23886686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_TRANSPOSE] = (PetscVoidFunction) f;
23986686b9bSAlex Fikl     break;
24086686b9bSAlex Fikl   case MATOP_MULT_TRANSPOSE_ADD:
241f68b968cSBarry Smith     *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ourmulttransposeadd);
24286686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_TRANSPOSE_ADD] = (PetscVoidFunction) f;
24386686b9bSAlex Fikl     break;
24486686b9bSAlex Fikl   case MATOP_SOR:
2453446fae8SBarry Smith     *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) oursor);
24686686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_SOR] = (PetscVoidFunction) f;
24786686b9bSAlex Fikl     break;
24886686b9bSAlex Fikl   case MATOP_TRANSPOSE:
24986686b9bSAlex Fikl     *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ourtranspose);
25086686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_TRANSPOSE] = (PetscVoidFunction) f;
25186686b9bSAlex Fikl     break;
25286686b9bSAlex Fikl   case MATOP_GET_DIAGONAL:
25386686b9bSAlex Fikl     *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ourgetdiagonal);
25486686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_GET_DIAGONAL] = (PetscVoidFunction) f;
25586686b9bSAlex Fikl     break;
25686686b9bSAlex Fikl   case MATOP_DIAGONAL_SCALE:
25786686b9bSAlex Fikl     *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ourdiagonalscale);
25886686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_DIAGONAL_SCALE] = (PetscVoidFunction) f;
25986686b9bSAlex Fikl     break;
26086686b9bSAlex Fikl   case MATOP_ZERO_ENTRIES:
26186686b9bSAlex Fikl     *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ourzeroentries);
26286686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_ZERO_ENTRIES] = (PetscVoidFunction) f;
26386686b9bSAlex Fikl     break;
26486686b9bSAlex Fikl   case MATOP_AXPY:
26586686b9bSAlex Fikl     *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ouraxpy);
26686686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_AXPY] = (PetscVoidFunction) f;
26786686b9bSAlex Fikl     break;
26886686b9bSAlex Fikl   case MATOP_SHIFT:
269cdf26a31SSatish Balay     *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ourshift);
27086686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_SHIFT] = (PetscVoidFunction) f;
27186686b9bSAlex Fikl     break;
27286686b9bSAlex Fikl   case MATOP_DIAGONAL_SET:
27386686b9bSAlex Fikl     *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ourdiagonalset);
27486686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_DIAGONAL_SET] = (PetscVoidFunction) f;
27586686b9bSAlex Fikl     break;
27686686b9bSAlex Fikl   case MATOP_DESTROY:
27786686b9bSAlex Fikl     *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ourdestroy);
27886686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_DESTROY] = (PetscVoidFunction) f;
27986686b9bSAlex Fikl     break;
28086686b9bSAlex Fikl   case MATOP_VIEW:
28186686b9bSAlex Fikl     *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ourview);
28286686b9bSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_VIEW] = (PetscVoidFunction) f;
28386686b9bSAlex Fikl     break;
284*b41ce5d5SBarry Smith   case MATOP_CREATE_VECS:
28586686b9bSAlex Fikl     *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ourgetvecs);
286*b41ce5d5SBarry Smith     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_CREATE_VECS] = (PetscVoidFunction) f;
28786686b9bSAlex Fikl     break;
288a5b7ff6bSBarry Smith   case MATOP_GET_DIAGONAL_BLOCK:
289a5b7ff6bSBarry Smith     *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ourgetdiagonalblock);
290a5b7ff6bSBarry Smith     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_GET_DIAGONAL_BLOCK] = (PetscVoidFunction) f;
291a5b7ff6bSBarry Smith     break;
292626206dbSAlex Fikl   case MATOP_COPY:
293626206dbSAlex Fikl     *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ourcopy);
294626206dbSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_COPY] = (PetscVoidFunction) f;
295626206dbSAlex Fikl     break;
296626206dbSAlex Fikl   case MATOP_SCALE:
297626206dbSAlex Fikl     *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ourscale);
298626206dbSAlex Fikl     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_SCALE] = (PetscVoidFunction) f;
299626206dbSAlex Fikl     break;
300d18b9058SVincent Le Chenadec   case MATOP_SET_RANDOM:
301d18b9058SVincent Le Chenadec     *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) oursetrandom);
302d18b9058SVincent Le Chenadec     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_SET_RANDOM] = (PetscVoidFunction) f;
303d18b9058SVincent Le Chenadec     break;
30407833d17SVincent Le Chenadec   case MATOP_ASSEMBLY_BEGIN:
30507833d17SVincent Le Chenadec     *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ourassemblybegin);
30607833d17SVincent Le Chenadec     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_ASSEMBLY_BEGIN] = (PetscVoidFunction) f;
30707833d17SVincent Le Chenadec     break;
30807833d17SVincent Le Chenadec   case MATOP_ASSEMBLY_END:
30907833d17SVincent Le Chenadec     *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ourassemblyend);
31007833d17SVincent Le Chenadec     ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_ASSEMBLY_END] = (PetscVoidFunction) f;
31107833d17SVincent Le Chenadec     break;
31286686b9bSAlex Fikl   default:
31386686b9bSAlex Fikl     PetscError(comm,__LINE__,"MatShellSetOperation_Fortran",__FILE__,PETSC_ERR_ARG_WRONG,PETSC_ERROR_INITIAL,"Cannot set that matrix operation");
314f4e70085SSatish Balay     *ierr = 1;
315f4e70085SSatish Balay   }
316f4e70085SSatish Balay }
317