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, 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 */ 4519caf8f3SSatish Balay PETSC_EXTERN void 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 { 52*3ba16761SJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(Mat *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_MULT]))(&mat, &x, &y, &ierr)); 53*3ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 54f4e70085SSatish Balay } 55f4e70085SSatish Balay 56f4e70085SSatish Balay static PetscErrorCode ourmultadd(Mat mat, Vec x, Vec y, Vec z) 57f4e70085SSatish Balay { 58*3ba16761SJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(Mat *, Vec *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_ADD]))(&mat, &x, &y, &z, &ierr)); 59*3ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 6086686b9bSAlex Fikl } 6186686b9bSAlex Fikl 6286686b9bSAlex Fikl static PetscErrorCode ourmulttranspose(Mat mat, Vec x, Vec y) 6386686b9bSAlex Fikl { 64*3ba16761SJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(Mat *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_TRANSPOSE]))(&mat, &x, &y, &ierr)); 65*3ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 66f4e70085SSatish Balay } 67f4e70085SSatish Balay 68f4e70085SSatish Balay static PetscErrorCode ourmulttransposeadd(Mat mat, Vec x, Vec y, Vec z) 69f4e70085SSatish Balay { 70*3ba16761SJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(Mat *, Vec *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_TRANSPOSE_ADD]))(&mat, &x, &y, &z, &ierr)); 71*3ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 722950f7e7SBarry Smith } 732950f7e7SBarry Smith 743446fae8SBarry Smith static PetscErrorCode oursor(Mat mat, Vec b, PetscReal omega, MatSORType flg, PetscReal shift, PetscInt its, PetscInt lits, Vec x) 753446fae8SBarry Smith { 76*3ba16761SJacob Faibussowitsch PetscErrorCode ierr = PETSC_SUCCESS; 7786686b9bSAlex Fikl 78*3ba16761SJacob 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); 7986686b9bSAlex Fikl return ierr; 8086686b9bSAlex Fikl } 8186686b9bSAlex Fikl 8286686b9bSAlex Fikl static PetscErrorCode ourtranspose(Mat mat, MatReuse reuse, Mat *B) 8386686b9bSAlex Fikl { 841b266c99SBarry Smith Mat bb = (Mat)-1; 851b266c99SBarry Smith Mat *b = (!B ? &bb : B); 8686686b9bSAlex Fikl 87*3ba16761SJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(Mat *, MatReuse *, Mat *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_TRANSPOSE]))(&mat, &reuse, b, &ierr)); 88*3ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 8986686b9bSAlex Fikl } 9086686b9bSAlex Fikl 9186686b9bSAlex Fikl static PetscErrorCode ourgetdiagonal(Mat mat, Vec x) 9286686b9bSAlex Fikl { 93*3ba16761SJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(Mat *, Vec *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_GET_DIAGONAL]))(&mat, &x, &ierr)); 94*3ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 9586686b9bSAlex Fikl } 9686686b9bSAlex Fikl 9786686b9bSAlex Fikl static PetscErrorCode ourdiagonalscale(Mat mat, Vec l, Vec r) 9886686b9bSAlex Fikl { 991b266c99SBarry Smith Vec aa = (Vec)-1; 1001b266c99SBarry Smith Vec *a = (!l ? &aa : &l); 1011b266c99SBarry Smith Vec *b = (!r ? &aa : &r); 10286686b9bSAlex Fikl 103*3ba16761SJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(Mat *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_DIAGONAL_SCALE]))(&mat, a, b, &ierr)); 104*3ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 10586686b9bSAlex Fikl } 10686686b9bSAlex Fikl 10786686b9bSAlex Fikl static PetscErrorCode ourzeroentries(Mat mat) 10886686b9bSAlex Fikl { 109*3ba16761SJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(Mat *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_ZERO_ENTRIES]))(&mat, &ierr)); 110*3ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 11186686b9bSAlex Fikl } 11286686b9bSAlex Fikl 11386686b9bSAlex Fikl static PetscErrorCode ouraxpy(Mat mat, PetscScalar a, Mat X, MatStructure str) 11486686b9bSAlex Fikl { 115*3ba16761SJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(Mat *, PetscScalar *, Mat *, MatStructure *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_AXPY]))(&mat, &a, &X, &str, &ierr)); 116*3ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 1173446fae8SBarry Smith } 1183446fae8SBarry Smith 119cdf26a31SSatish Balay static PetscErrorCode ourshift(Mat mat, PetscScalar a) 120cdf26a31SSatish Balay { 121*3ba16761SJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(Mat *, PetscScalar *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_SHIFT]))(&mat, &a, &ierr)); 122*3ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 12386686b9bSAlex Fikl } 12486686b9bSAlex Fikl 12586686b9bSAlex Fikl static PetscErrorCode ourdiagonalset(Mat mat, Vec x, InsertMode ins) 12686686b9bSAlex Fikl { 127*3ba16761SJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(Mat *, Vec *, InsertMode *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_DIAGONAL_SET]))(&mat, &x, &ins, &ierr)); 128*3ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 12986686b9bSAlex Fikl } 13086686b9bSAlex Fikl 13186686b9bSAlex Fikl static PetscErrorCode ourdestroy(Mat mat) 13286686b9bSAlex Fikl { 133*3ba16761SJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(Mat *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_DESTROY]))(&mat, &ierr)); 134*3ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 13586686b9bSAlex Fikl } 13686686b9bSAlex Fikl 13786686b9bSAlex Fikl static PetscErrorCode ourview(Mat mat, PetscViewer v) 13886686b9bSAlex Fikl { 139*3ba16761SJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(Mat *, PetscViewer *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_VIEW]))(&mat, &v, &ierr)); 140*3ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 14186686b9bSAlex Fikl } 14286686b9bSAlex Fikl 14386686b9bSAlex Fikl static PetscErrorCode ourgetvecs(Mat mat, Vec *l, Vec *r) 14486686b9bSAlex Fikl { 1451b266c99SBarry Smith Vec aa = (Vec)-1; 1461b266c99SBarry Smith Vec *a = (!l ? &aa : l); 1471b266c99SBarry Smith Vec *b = (!r ? &aa : r); 14886686b9bSAlex Fikl 149*3ba16761SJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(Mat *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_CREATE_VECS]))(&mat, a, b, &ierr)); 150*3ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 151cdf26a31SSatish Balay } 152cdf26a31SSatish Balay 153a5b7ff6bSBarry Smith static PetscErrorCode ourgetdiagonalblock(Mat mat, Mat *l) 154a5b7ff6bSBarry Smith { 155*3ba16761SJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(Mat *, Mat *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_GET_DIAGONAL_BLOCK]))(&mat, l, &ierr)); 156*3ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 157a5b7ff6bSBarry Smith } 158a5b7ff6bSBarry Smith 159626206dbSAlex Fikl static PetscErrorCode ourcopy(Mat mat, Mat B, MatStructure str) 160626206dbSAlex Fikl { 161*3ba16761SJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(Mat *, Mat *, MatStructure *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_COPY]))(&mat, &B, &str, &ierr)); 162*3ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 163626206dbSAlex Fikl } 164626206dbSAlex Fikl 165626206dbSAlex Fikl static PetscErrorCode ourscale(Mat mat, PetscScalar a) 166626206dbSAlex Fikl { 167*3ba16761SJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(Mat *, PetscScalar *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_SCALE]))(&mat, &a, &ierr)); 168*3ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 169626206dbSAlex Fikl } 170626206dbSAlex Fikl 171d18b9058SVincent Le Chenadec static PetscErrorCode oursetrandom(Mat mat, PetscRandom ctx) 172d18b9058SVincent Le Chenadec { 173*3ba16761SJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(Mat *, PetscRandom *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_SET_RANDOM]))(&mat, &ctx, &ierr)); 174*3ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 175d18b9058SVincent Le Chenadec } 176d18b9058SVincent Le Chenadec 17707833d17SVincent Le Chenadec static PetscErrorCode ourassemblybegin(Mat mat, MatAssemblyType type) 17807833d17SVincent Le Chenadec { 179*3ba16761SJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(Mat *, MatAssemblyType *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_ASSEMBLY_BEGIN]))(&mat, &type, &ierr)); 180*3ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 18107833d17SVincent Le Chenadec } 18207833d17SVincent Le Chenadec 18307833d17SVincent Le Chenadec static PetscErrorCode ourassemblyend(Mat mat, MatAssemblyType type) 18407833d17SVincent Le Chenadec { 185*3ba16761SJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(Mat *, MatAssemblyType *, PetscErrorCode *))(((PetscObject)mat)->fortran_func_pointers[FORTRAN_MATOP_ASSEMBLY_END]))(&mat, &type, &ierr)); 186*3ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 18707833d17SVincent Le Chenadec } 18807833d17SVincent Le Chenadec 18919caf8f3SSatish Balay PETSC_EXTERN void matshellsetoperation_(Mat *mat, MatOperation *op, PetscErrorCode (*f)(Mat *, Vec *, Vec *, PetscErrorCode *), PetscErrorCode *ierr) 190f4e70085SSatish Balay { 191e32f2f54SBarry Smith MPI_Comm comm; 192e32f2f54SBarry Smith 193*3ba16761SJacob Faibussowitsch *ierr = PetscObjectGetComm((PetscObject)*mat, &comm); 194*3ba16761SJacob Faibussowitsch if (*ierr) return; 19586686b9bSAlex Fikl PetscObjectAllocateFortranPointers(*mat, FORTRAN_MATOP_SIZE); 19686686b9bSAlex Fikl 19786686b9bSAlex Fikl switch (*op) { 19886686b9bSAlex Fikl case MATOP_MULT: 199f68b968cSBarry Smith *ierr = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourmult); 20086686b9bSAlex Fikl ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_MULT] = (PetscVoidFunction)f; 20186686b9bSAlex Fikl break; 20286686b9bSAlex Fikl case MATOP_MULT_ADD: 203f68b968cSBarry Smith *ierr = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourmultadd); 20486686b9bSAlex Fikl ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_ADD] = (PetscVoidFunction)f; 20586686b9bSAlex Fikl break; 20686686b9bSAlex Fikl case MATOP_MULT_TRANSPOSE: 20786686b9bSAlex Fikl *ierr = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourmulttranspose); 20886686b9bSAlex Fikl ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_TRANSPOSE] = (PetscVoidFunction)f; 20986686b9bSAlex Fikl break; 21086686b9bSAlex Fikl case MATOP_MULT_TRANSPOSE_ADD: 211f68b968cSBarry Smith *ierr = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourmulttransposeadd); 21286686b9bSAlex Fikl ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_MULT_TRANSPOSE_ADD] = (PetscVoidFunction)f; 21386686b9bSAlex Fikl break; 21486686b9bSAlex Fikl case MATOP_SOR: 2153446fae8SBarry Smith *ierr = MatShellSetOperation(*mat, *op, (PetscVoidFunction)oursor); 21686686b9bSAlex Fikl ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_SOR] = (PetscVoidFunction)f; 21786686b9bSAlex Fikl break; 21886686b9bSAlex Fikl case MATOP_TRANSPOSE: 21986686b9bSAlex Fikl *ierr = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourtranspose); 22086686b9bSAlex Fikl ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_TRANSPOSE] = (PetscVoidFunction)f; 22186686b9bSAlex Fikl break; 22286686b9bSAlex Fikl case MATOP_GET_DIAGONAL: 22386686b9bSAlex Fikl *ierr = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourgetdiagonal); 22486686b9bSAlex Fikl ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_GET_DIAGONAL] = (PetscVoidFunction)f; 22586686b9bSAlex Fikl break; 22686686b9bSAlex Fikl case MATOP_DIAGONAL_SCALE: 22786686b9bSAlex Fikl *ierr = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourdiagonalscale); 22886686b9bSAlex Fikl ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_DIAGONAL_SCALE] = (PetscVoidFunction)f; 22986686b9bSAlex Fikl break; 23086686b9bSAlex Fikl case MATOP_ZERO_ENTRIES: 23186686b9bSAlex Fikl *ierr = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourzeroentries); 23286686b9bSAlex Fikl ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_ZERO_ENTRIES] = (PetscVoidFunction)f; 23386686b9bSAlex Fikl break; 23486686b9bSAlex Fikl case MATOP_AXPY: 23586686b9bSAlex Fikl *ierr = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ouraxpy); 23686686b9bSAlex Fikl ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_AXPY] = (PetscVoidFunction)f; 23786686b9bSAlex Fikl break; 23886686b9bSAlex Fikl case MATOP_SHIFT: 239cdf26a31SSatish Balay *ierr = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourshift); 24086686b9bSAlex Fikl ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_SHIFT] = (PetscVoidFunction)f; 24186686b9bSAlex Fikl break; 24286686b9bSAlex Fikl case MATOP_DIAGONAL_SET: 24386686b9bSAlex Fikl *ierr = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourdiagonalset); 24486686b9bSAlex Fikl ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_DIAGONAL_SET] = (PetscVoidFunction)f; 24586686b9bSAlex Fikl break; 24686686b9bSAlex Fikl case MATOP_DESTROY: 24786686b9bSAlex Fikl *ierr = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourdestroy); 24886686b9bSAlex Fikl ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_DESTROY] = (PetscVoidFunction)f; 24986686b9bSAlex Fikl break; 25086686b9bSAlex Fikl case MATOP_VIEW: 25186686b9bSAlex Fikl *ierr = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourview); 25286686b9bSAlex Fikl ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_VIEW] = (PetscVoidFunction)f; 25386686b9bSAlex Fikl break; 254b41ce5d5SBarry Smith case MATOP_CREATE_VECS: 25586686b9bSAlex Fikl *ierr = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourgetvecs); 256b41ce5d5SBarry Smith ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_CREATE_VECS] = (PetscVoidFunction)f; 25786686b9bSAlex Fikl break; 258a5b7ff6bSBarry Smith case MATOP_GET_DIAGONAL_BLOCK: 259a5b7ff6bSBarry Smith *ierr = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourgetdiagonalblock); 260a5b7ff6bSBarry Smith ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_GET_DIAGONAL_BLOCK] = (PetscVoidFunction)f; 261a5b7ff6bSBarry Smith break; 262626206dbSAlex Fikl case MATOP_COPY: 263626206dbSAlex Fikl *ierr = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourcopy); 264626206dbSAlex Fikl ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_COPY] = (PetscVoidFunction)f; 265626206dbSAlex Fikl break; 266626206dbSAlex Fikl case MATOP_SCALE: 267626206dbSAlex Fikl *ierr = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourscale); 268626206dbSAlex Fikl ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_SCALE] = (PetscVoidFunction)f; 269626206dbSAlex Fikl break; 270d18b9058SVincent Le Chenadec case MATOP_SET_RANDOM: 271d18b9058SVincent Le Chenadec *ierr = MatShellSetOperation(*mat, *op, (PetscVoidFunction)oursetrandom); 272d18b9058SVincent Le Chenadec ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_SET_RANDOM] = (PetscVoidFunction)f; 273d18b9058SVincent Le Chenadec break; 27407833d17SVincent Le Chenadec case MATOP_ASSEMBLY_BEGIN: 27507833d17SVincent Le Chenadec *ierr = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourassemblybegin); 27607833d17SVincent Le Chenadec ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_ASSEMBLY_BEGIN] = (PetscVoidFunction)f; 27707833d17SVincent Le Chenadec break; 27807833d17SVincent Le Chenadec case MATOP_ASSEMBLY_END: 27907833d17SVincent Le Chenadec *ierr = MatShellSetOperation(*mat, *op, (PetscVoidFunction)ourassemblyend); 28007833d17SVincent Le Chenadec ((PetscObject)*mat)->fortran_func_pointers[FORTRAN_MATOP_ASSEMBLY_END] = (PetscVoidFunction)f; 28107833d17SVincent Le Chenadec break; 28286686b9bSAlex Fikl default: 283*3ba16761SJacob Faibussowitsch *ierr = PetscError(comm, __LINE__, "MatShellSetOperation_Fortran", __FILE__, PETSC_ERR_ARG_WRONG, PETSC_ERROR_INITIAL, "Cannot set that matrix operation"); 284*3ba16761SJacob Faibussowitsch *ierr = PETSC_ERR_ARG_WRONG; 285f4e70085SSatish Balay } 286f4e70085SSatish Balay } 287