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