1 2 static char help[] = "Tests MatShellTestMult()\n\n"; 3 4 #include <petscmat.h> 5 6 typedef struct _n_User *User; 7 struct _n_User { 8 Mat B; 9 }; 10 11 static PetscErrorCode MatMult_User(Mat A,Vec X,Vec Y) 12 { 13 User user; 14 PetscErrorCode ierr; 15 16 PetscFunctionBegin; 17 ierr = MatShellGetContext(A,&user);CHKERRQ(ierr); 18 ierr = MatMult(user->B,X,Y);CHKERRQ(ierr); 19 PetscFunctionReturn(0); 20 } 21 22 static PetscErrorCode MatMultTranspose_User(Mat A,Vec X,Vec Y) 23 { 24 User user; 25 PetscErrorCode ierr; 26 27 PetscFunctionBegin; 28 ierr = MatShellGetContext(A,&user);CHKERRQ(ierr); 29 ierr = MatMultTranspose(user->B,X,Y);CHKERRQ(ierr); 30 PetscFunctionReturn(0); 31 } 32 33 static PetscErrorCode MyFunction(void *ctx,Vec x,Vec y) 34 { 35 User user = (User) ctx; 36 PetscErrorCode ierr; 37 38 PetscFunctionBegin; 39 ierr = MatMult(user->B,x,y);CHKERRQ(ierr); 40 PetscFunctionReturn(0); 41 } 42 43 int main(int argc,char **args) 44 { 45 const PetscInt inds[] = {0,1}; 46 PetscScalar avals[] = {2,3,5,7}; 47 Mat S; 48 User user; 49 PetscErrorCode ierr; 50 Vec base; 51 52 ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr; 53 ierr = PetscNew(&user);CHKERRQ(ierr); 54 ierr = MatCreateSeqAIJ(PETSC_COMM_WORLD,2,2,2,NULL,&user->B);CHKERRQ(ierr); 55 ierr = MatSetUp(user->B);CHKERRQ(ierr); 56 ierr = MatSetValues(user->B,2,inds,2,inds,avals,INSERT_VALUES);CHKERRQ(ierr); 57 ierr = MatAssemblyBegin(user->B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 58 ierr = MatAssemblyEnd(user->B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 59 ierr = MatCreateVecs(user->B,&base,NULL);CHKERRQ(ierr); 60 ierr = MatCreateShell(PETSC_COMM_WORLD,2,2,2,2,user,&S);CHKERRQ(ierr); 61 ierr = MatSetUp(S);CHKERRQ(ierr); 62 ierr = MatShellSetOperation(S,MATOP_MULT,(void (*)(void))MatMult_User);CHKERRQ(ierr); 63 ierr = MatShellSetOperation(S,MATOP_MULT_TRANSPOSE,(void (*)(void))MatMultTranspose_User);CHKERRQ(ierr); 64 65 ierr = MatShellTestMult(S,MyFunction,base,user,NULL);CHKERRQ(ierr); 66 ierr = MatShellTestMultTranspose(S,MyFunction,base,user,NULL);CHKERRQ(ierr); 67 68 ierr = VecDestroy(&base);CHKERRQ(ierr); 69 ierr = MatDestroy(&user->B);CHKERRQ(ierr); 70 ierr = MatDestroy(&S);CHKERRQ(ierr); 71 ierr = PetscFree(user);CHKERRQ(ierr); 72 ierr = PetscFinalize(); 73 return ierr; 74 } 75 76 77 /*TEST 78 79 test: 80 args: -mat_shell_test_mult_view -mat_shell_test_mult_transpose_view 81 82 TEST*/ 83