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