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, 3086686b9bSAlex Fikl FORTRAN_MATOP_GET_VECS = 14, 31a5b7ff6bSBarry Smith FORTRAN_MATOP_GET_DIAGONAL_BLOCK = 15, 32626206dbSAlex Fikl FORTRAN_MATOP_COPY = 16, 33626206dbSAlex Fikl FORTRAN_MATOP_SCALE = 17, 34d18b9058SVincent Le Chenadec FORTRAN_MATOP_SIZE = 18, 35*07833d17SVincent Le Chenadec FORTRAN_MATOP_SET_RANDOM = 19, 36*07833d17SVincent Le Chenadec FORTRAN_MATOP_ASSEMBLY_BEGIN = 20, 37*07833d17SVincent Le Chenadec FORTRAN_MATOP_ASSEMBLY_END = 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; 9386686b9bSAlex Fikl Mat *b = (!B ? (Mat *) PETSC_NULL_OBJECT_Fortran : B); 9486686b9bSAlex Fikl 9586686b9bSAlex Fikl (*(PetscErrorCode (PETSC_STDCALL *)(Mat*,MatReuse*,Mat*,PetscErrorCode*))(((PetscObject) mat)->fortran_func_pointers[FORTRAN_MATOP_TRANSPOSE]))(&mat,&reuse,b,&ierr); 9686686b9bSAlex Fikl return ierr; 9786686b9bSAlex Fikl } 9886686b9bSAlex Fikl 9986686b9bSAlex Fikl static PetscErrorCode ourgetdiagonal(Mat mat,Vec x) 10086686b9bSAlex Fikl { 10186686b9bSAlex Fikl PetscErrorCode ierr = 0; 10286686b9bSAlex Fikl 10386686b9bSAlex Fikl (*(PetscErrorCode (PETSC_STDCALL *)(Mat*,Vec*,PetscErrorCode*))(((PetscObject) mat)->fortran_func_pointers[FORTRAN_MATOP_GET_DIAGONAL]))(&mat,&x,&ierr); 10486686b9bSAlex Fikl return ierr; 10586686b9bSAlex Fikl } 10686686b9bSAlex Fikl 10786686b9bSAlex Fikl static PetscErrorCode ourdiagonalscale(Mat mat,Vec l,Vec r) 10886686b9bSAlex Fikl { 10986686b9bSAlex Fikl PetscErrorCode ierr = 0; 11086686b9bSAlex Fikl Vec *a = (!l ? (Vec*) PETSC_NULL_OBJECT_Fortran : &l); 11186686b9bSAlex Fikl Vec *b = (!r ? (Vec*) PETSC_NULL_OBJECT_Fortran : &r); 11286686b9bSAlex Fikl 11386686b9bSAlex Fikl (*(PetscErrorCode (PETSC_STDCALL *)(Mat*,Vec*,Vec*,PetscErrorCode*))(((PetscObject) mat)->fortran_func_pointers[FORTRAN_MATOP_DIAGONAL_SCALE]))(&mat,a,b,&ierr); 11486686b9bSAlex Fikl return ierr; 11586686b9bSAlex Fikl } 11686686b9bSAlex Fikl 11786686b9bSAlex Fikl static PetscErrorCode ourzeroentries(Mat mat) 11886686b9bSAlex Fikl { 11986686b9bSAlex Fikl PetscErrorCode ierr = 0; 12086686b9bSAlex Fikl 12186686b9bSAlex Fikl (*(PetscErrorCode (PETSC_STDCALL *)(Mat*,PetscErrorCode*))(((PetscObject) mat)->fortran_func_pointers[FORTRAN_MATOP_ZERO_ENTRIES]))(&mat,&ierr); 12286686b9bSAlex Fikl return ierr; 12386686b9bSAlex Fikl } 12486686b9bSAlex Fikl 12586686b9bSAlex Fikl static PetscErrorCode ouraxpy(Mat mat,PetscScalar a,Mat X,MatStructure str) 12686686b9bSAlex Fikl { 12786686b9bSAlex Fikl PetscErrorCode ierr = 0; 12886686b9bSAlex Fikl 12986686b9bSAlex Fikl (*(PetscErrorCode (PETSC_STDCALL *)(Mat*,PetscScalar*,Mat*,MatStructure*,PetscErrorCode*))(((PetscObject) mat)->fortran_func_pointers[FORTRAN_MATOP_AXPY]))(&mat,&a,&X,&str,&ierr); 1303446fae8SBarry Smith return ierr; 1313446fae8SBarry Smith } 1323446fae8SBarry Smith 133cdf26a31SSatish Balay static PetscErrorCode ourshift(Mat mat,PetscScalar a) 134cdf26a31SSatish Balay { 135cdf26a31SSatish Balay PetscErrorCode ierr = 0; 13686686b9bSAlex Fikl 13786686b9bSAlex Fikl (*(PetscErrorCode (PETSC_STDCALL *)(Mat*,PetscScalar*,PetscErrorCode*))(((PetscObject) mat)->fortran_func_pointers[FORTRAN_MATOP_SHIFT]))(&mat,&a,&ierr); 13886686b9bSAlex Fikl return ierr; 13986686b9bSAlex Fikl } 14086686b9bSAlex Fikl 14186686b9bSAlex Fikl static PetscErrorCode ourdiagonalset(Mat mat,Vec x,InsertMode ins) 14286686b9bSAlex Fikl { 14386686b9bSAlex Fikl PetscErrorCode ierr = 0; 14486686b9bSAlex Fikl 14586686b9bSAlex Fikl (*(PetscErrorCode (PETSC_STDCALL *)(Mat*,Vec*,InsertMode*,PetscErrorCode*))(((PetscObject) mat)->fortran_func_pointers[FORTRAN_MATOP_DIAGONAL_SET]))(&mat,&x,&ins,&ierr); 14686686b9bSAlex Fikl return ierr; 14786686b9bSAlex Fikl } 14886686b9bSAlex Fikl 14986686b9bSAlex Fikl static PetscErrorCode ourdestroy(Mat mat) 15086686b9bSAlex Fikl { 15186686b9bSAlex Fikl PetscErrorCode ierr = 0; 15286686b9bSAlex Fikl 15386686b9bSAlex Fikl (*(PetscErrorCode (PETSC_STDCALL *)(Mat*,PetscErrorCode*))(((PetscObject) mat)->fortran_func_pointers[FORTRAN_MATOP_DESTROY]))(&mat,&ierr); 15486686b9bSAlex Fikl return ierr; 15586686b9bSAlex Fikl } 15686686b9bSAlex Fikl 15786686b9bSAlex Fikl static PetscErrorCode ourview(Mat mat,PetscViewer v) 15886686b9bSAlex Fikl { 15986686b9bSAlex Fikl PetscErrorCode ierr = 0; 16086686b9bSAlex Fikl 16186686b9bSAlex Fikl (*(PetscErrorCode (PETSC_STDCALL *)(Mat*,PetscViewer*,PetscErrorCode*))(((PetscObject) mat)->fortran_func_pointers[FORTRAN_MATOP_VIEW]))(&mat,&v,&ierr); 16286686b9bSAlex Fikl return ierr; 16386686b9bSAlex Fikl } 16486686b9bSAlex Fikl 16586686b9bSAlex Fikl static PetscErrorCode ourgetvecs(Mat mat,Vec *l,Vec *r) 16686686b9bSAlex Fikl { 16786686b9bSAlex Fikl PetscErrorCode ierr = 0; 16886686b9bSAlex Fikl Vec *a = (!l ? (Vec *) PETSC_NULL_OBJECT_Fortran : l); 16986686b9bSAlex Fikl Vec *b = (!r ? (Vec *) PETSC_NULL_OBJECT_Fortran : r); 17086686b9bSAlex Fikl 17186686b9bSAlex Fikl (*(PetscErrorCode (PETSC_STDCALL *)(Mat*,Vec*,Vec*,PetscErrorCode*))(((PetscObject) mat)->fortran_func_pointers[FORTRAN_MATOP_GET_VECS]))(&mat,a,b,&ierr); 172cdf26a31SSatish Balay return ierr; 173cdf26a31SSatish Balay } 174cdf26a31SSatish Balay 175a5b7ff6bSBarry Smith static PetscErrorCode ourgetdiagonalblock(Mat mat,Mat *l) 176a5b7ff6bSBarry Smith { 177a5b7ff6bSBarry Smith PetscErrorCode ierr = 0; 178a5b7ff6bSBarry Smith (*(PetscErrorCode (PETSC_STDCALL *)(Mat*,Mat*,PetscErrorCode*))(((PetscObject) mat)->fortran_func_pointers[FORTRAN_MATOP_GET_DIAGONAL_BLOCK]))(&mat,l,&ierr); 179a5b7ff6bSBarry Smith return ierr; 180a5b7ff6bSBarry Smith } 181a5b7ff6bSBarry Smith 182626206dbSAlex Fikl static PetscErrorCode ourcopy(Mat mat,Mat B,MatStructure str) 183626206dbSAlex Fikl { 184626206dbSAlex Fikl PetscErrorCode ierr = 0; 185626206dbSAlex Fikl (*(PetscErrorCode (PETSC_STDCALL *)(Mat*,Mat*,MatStructure*,PetscErrorCode*))(((PetscObject) mat)->fortran_func_pointers[FORTRAN_MATOP_COPY]))(&mat,&B,&str,&ierr); 186626206dbSAlex Fikl return ierr; 187626206dbSAlex Fikl } 188626206dbSAlex Fikl 189626206dbSAlex Fikl static PetscErrorCode ourscale(Mat mat,PetscScalar a) 190626206dbSAlex Fikl { 191626206dbSAlex Fikl PetscErrorCode ierr = 0; 192626206dbSAlex Fikl (*(PetscErrorCode (PETSC_STDCALL *)(Mat*,PetscScalar*,PetscErrorCode*))(((PetscObject) mat)->fortran_func_pointers[FORTRAN_MATOP_SCALE]))(&mat,&a,&ierr); 193626206dbSAlex Fikl return ierr; 194626206dbSAlex Fikl } 195626206dbSAlex Fikl 196d18b9058SVincent Le Chenadec static PetscErrorCode oursetrandom(Mat mat,PetscRandom ctx) 197d18b9058SVincent Le Chenadec { 198d18b9058SVincent Le Chenadec PetscErrorCode ierr = 0; 199d18b9058SVincent Le Chenadec (*(PetscErrorCode (PETSC_STDCALL *)(Mat*,PetscRandom*,PetscErrorCode*))(((PetscObject) mat)->fortran_func_pointers[FORTRAN_MATOP_SET_RANDOM]))(&mat,&ctx,&ierr); 200d18b9058SVincent Le Chenadec return ierr; 201d18b9058SVincent Le Chenadec } 202d18b9058SVincent Le Chenadec 203*07833d17SVincent Le Chenadec static PetscErrorCode ourassemblybegin(Mat mat,MatAssemblyType type) 204*07833d17SVincent Le Chenadec { 205*07833d17SVincent Le Chenadec PetscErrorCode ierr = 0; 206*07833d17SVincent Le Chenadec (*(PetscErrorCode (PETSC_STDCALL *)(Mat*,MatAssemblyType*,PetscErrorCode*))(((PetscObject) mat)->fortran_func_pointers[FORTRAN_MATOP_ASSEMBLY_BEGIN]))(&mat,&type,&ierr); 207*07833d17SVincent Le Chenadec return ierr; 208*07833d17SVincent Le Chenadec } 209*07833d17SVincent Le Chenadec 210*07833d17SVincent Le Chenadec static PetscErrorCode ourassemblyend(Mat mat,MatAssemblyType type) 211*07833d17SVincent Le Chenadec { 212*07833d17SVincent Le Chenadec PetscErrorCode ierr = 0; 213*07833d17SVincent Le Chenadec (*(PetscErrorCode (PETSC_STDCALL *)(Mat*,MatAssemblyType*,PetscErrorCode*))(((PetscObject) mat)->fortran_func_pointers[FORTRAN_MATOP_ASSEMBLY_END]))(&mat,&type,&ierr); 214*07833d17SVincent Le Chenadec return ierr; 215*07833d17SVincent Le Chenadec } 216*07833d17SVincent Le Chenadec 2178cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL matshellsetoperation_(Mat *mat,MatOperation *op,PetscErrorCode (PETSC_STDCALL *f)(Mat*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr) 218f4e70085SSatish Balay { 219e32f2f54SBarry Smith MPI_Comm comm; 220e32f2f54SBarry Smith 221e32f2f54SBarry Smith *ierr = PetscObjectGetComm((PetscObject) *mat,&comm);if (*ierr) return; 22286686b9bSAlex Fikl PetscObjectAllocateFortranPointers(*mat,FORTRAN_MATOP_SIZE); 22386686b9bSAlex Fikl 22486686b9bSAlex Fikl switch (*op) { 22586686b9bSAlex Fikl case MATOP_MULT: 226f68b968cSBarry Smith *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ourmult); 22786686b9bSAlex Fikl ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_MULT] = (PetscVoidFunction) f; 22886686b9bSAlex Fikl break; 22986686b9bSAlex Fikl case MATOP_MULT_ADD: 230f68b968cSBarry Smith *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ourmultadd); 23186686b9bSAlex Fikl ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_ADD] = (PetscVoidFunction) f; 23286686b9bSAlex Fikl break; 23386686b9bSAlex Fikl case MATOP_MULT_TRANSPOSE: 23486686b9bSAlex Fikl *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ourmulttranspose); 23586686b9bSAlex Fikl ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_TRANSPOSE] = (PetscVoidFunction) f; 23686686b9bSAlex Fikl break; 23786686b9bSAlex Fikl case MATOP_MULT_TRANSPOSE_ADD: 238f68b968cSBarry Smith *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ourmulttransposeadd); 23986686b9bSAlex Fikl ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_TRANSPOSE_ADD] = (PetscVoidFunction) f; 24086686b9bSAlex Fikl break; 24186686b9bSAlex Fikl case MATOP_SOR: 2423446fae8SBarry Smith *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) oursor); 24386686b9bSAlex Fikl ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_SOR] = (PetscVoidFunction) f; 24486686b9bSAlex Fikl break; 24586686b9bSAlex Fikl case MATOP_TRANSPOSE: 24686686b9bSAlex Fikl *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ourtranspose); 24786686b9bSAlex Fikl ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_TRANSPOSE] = (PetscVoidFunction) f; 24886686b9bSAlex Fikl break; 24986686b9bSAlex Fikl case MATOP_GET_DIAGONAL: 25086686b9bSAlex Fikl *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ourgetdiagonal); 25186686b9bSAlex Fikl ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_GET_DIAGONAL] = (PetscVoidFunction) f; 25286686b9bSAlex Fikl break; 25386686b9bSAlex Fikl case MATOP_DIAGONAL_SCALE: 25486686b9bSAlex Fikl *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ourdiagonalscale); 25586686b9bSAlex Fikl ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_DIAGONAL_SCALE] = (PetscVoidFunction) f; 25686686b9bSAlex Fikl break; 25786686b9bSAlex Fikl case MATOP_ZERO_ENTRIES: 25886686b9bSAlex Fikl *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ourzeroentries); 25986686b9bSAlex Fikl ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_ZERO_ENTRIES] = (PetscVoidFunction) f; 26086686b9bSAlex Fikl break; 26186686b9bSAlex Fikl case MATOP_AXPY: 26286686b9bSAlex Fikl *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ouraxpy); 26386686b9bSAlex Fikl ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_AXPY] = (PetscVoidFunction) f; 26486686b9bSAlex Fikl break; 26586686b9bSAlex Fikl case MATOP_SHIFT: 266cdf26a31SSatish Balay *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ourshift); 26786686b9bSAlex Fikl ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_SHIFT] = (PetscVoidFunction) f; 26886686b9bSAlex Fikl break; 26986686b9bSAlex Fikl case MATOP_DIAGONAL_SET: 27086686b9bSAlex Fikl *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ourdiagonalset); 27186686b9bSAlex Fikl ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_DIAGONAL_SET] = (PetscVoidFunction) f; 27286686b9bSAlex Fikl break; 27386686b9bSAlex Fikl case MATOP_DESTROY: 27486686b9bSAlex Fikl *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ourdestroy); 27586686b9bSAlex Fikl ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_DESTROY] = (PetscVoidFunction) f; 27686686b9bSAlex Fikl break; 27786686b9bSAlex Fikl case MATOP_VIEW: 27886686b9bSAlex Fikl *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ourview); 27986686b9bSAlex Fikl ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_VIEW] = (PetscVoidFunction) f; 28086686b9bSAlex Fikl break; 28186686b9bSAlex Fikl case MATOP_GET_VECS: 28286686b9bSAlex Fikl *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ourgetvecs); 28386686b9bSAlex Fikl ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_GET_VECS] = (PetscVoidFunction) f; 28486686b9bSAlex Fikl break; 285a5b7ff6bSBarry Smith case MATOP_GET_DIAGONAL_BLOCK: 286a5b7ff6bSBarry Smith *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ourgetdiagonalblock); 287a5b7ff6bSBarry Smith ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_GET_DIAGONAL_BLOCK] = (PetscVoidFunction) f; 288a5b7ff6bSBarry Smith break; 289626206dbSAlex Fikl case MATOP_COPY: 290626206dbSAlex Fikl *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ourcopy); 291626206dbSAlex Fikl ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_COPY] = (PetscVoidFunction) f; 292626206dbSAlex Fikl break; 293626206dbSAlex Fikl case MATOP_SCALE: 294626206dbSAlex Fikl *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ourscale); 295626206dbSAlex Fikl ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_SCALE] = (PetscVoidFunction) f; 296626206dbSAlex Fikl break; 297d18b9058SVincent Le Chenadec case MATOP_SET_RANDOM: 298d18b9058SVincent Le Chenadec *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) oursetrandom); 299d18b9058SVincent Le Chenadec ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_SET_RANDOM] = (PetscVoidFunction) f; 300d18b9058SVincent Le Chenadec break; 301*07833d17SVincent Le Chenadec case MATOP_ASSEMBLY_BEGIN: 302*07833d17SVincent Le Chenadec *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ourassemblybegin); 303*07833d17SVincent Le Chenadec ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_ASSEMBLY_BEGIN] = (PetscVoidFunction) f; 304*07833d17SVincent Le Chenadec break; 305*07833d17SVincent Le Chenadec case MATOP_ASSEMBLY_END: 306*07833d17SVincent Le Chenadec *ierr = MatShellSetOperation(*mat,*op,(PetscVoidFunction) ourassemblyend); 307*07833d17SVincent Le Chenadec ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_ASSEMBLY_END] = (PetscVoidFunction) f; 308*07833d17SVincent Le Chenadec break; 30986686b9bSAlex Fikl default: 31086686b9bSAlex Fikl PetscError(comm,__LINE__,"MatShellSetOperation_Fortran",__FILE__,PETSC_ERR_ARG_WRONG,PETSC_ERROR_INITIAL,"Cannot set that matrix operation"); 311f4e70085SSatish Balay *ierr = 1; 312f4e70085SSatish Balay } 313f4e70085SSatish Balay } 314