1 static char help[] = "Tests MatCopy() for SHELL matrices\n\n"; 2 3 #include <petscmat.h> 4 5 typedef struct _n_User *User; 6 struct _n_User { 7 Mat A; 8 }; 9 10 static PetscErrorCode MatMult_User(Mat A,Vec X,Vec Y) 11 { 12 User user; 13 PetscErrorCode ierr; 14 15 PetscFunctionBegin; 16 ierr = MatShellGetContext(A,&user);CHKERRQ(ierr); 17 ierr = MatMult(user->A,X,Y);CHKERRQ(ierr); 18 PetscFunctionReturn(0); 19 } 20 21 static PetscErrorCode MatCopy_User(Mat A,Mat B,MatStructure str) 22 { 23 User userA,userB; 24 PetscErrorCode ierr; 25 26 PetscFunctionBegin; 27 ierr = MatShellGetContext(A,&userA);CHKERRQ(ierr); 28 if (userA) { 29 ierr = PetscNew(&userB);CHKERRQ(ierr); 30 ierr = MatDuplicate(userA->A,MAT_COPY_VALUES,&userB->A);CHKERRQ(ierr); 31 ierr = MatShellSetContext(B, userB);CHKERRQ(ierr); 32 } 33 PetscFunctionReturn(0); 34 } 35 36 static PetscErrorCode MatDestroy_User(Mat A) 37 { 38 User user; 39 PetscErrorCode ierr; 40 41 PetscFunctionBegin; 42 ierr = MatShellGetContext(A, &user);CHKERRQ(ierr); 43 if (user) { 44 ierr = MatDestroy(&user->A);CHKERRQ(ierr); 45 ierr = PetscFree(user);CHKERRQ(ierr); 46 } 47 PetscFunctionReturn(0); 48 } 49 50 int main(int argc,char **args) 51 { 52 const PetscScalar xvals[] = {11,13},yvals[] = {17,19}; 53 const PetscInt inds[] = {0,1}; 54 PetscScalar avals[] = {2,3,5,7}; 55 Mat S1,S2; 56 Vec X,Y; 57 User user; 58 PetscErrorCode ierr; 59 60 ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr; 61 62 ierr = PetscNew(&user);CHKERRQ(ierr); 63 ierr = MatCreateSeqAIJ(PETSC_COMM_WORLD,2,2,2,NULL,&user->A);CHKERRQ(ierr); 64 ierr = MatSetUp(user->A);CHKERRQ(ierr); 65 ierr = MatSetValues(user->A,2,inds,2,inds,avals,INSERT_VALUES);CHKERRQ(ierr); 66 ierr = MatAssemblyBegin(user->A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 67 ierr = MatAssemblyEnd(user->A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 68 ierr = VecCreateSeq(PETSC_COMM_WORLD,2,&X);CHKERRQ(ierr); 69 ierr = VecSetValues(X,2,inds,xvals,INSERT_VALUES);CHKERRQ(ierr); 70 ierr = VecAssemblyBegin(X);CHKERRQ(ierr); 71 ierr = VecAssemblyEnd(X);CHKERRQ(ierr); 72 ierr = VecDuplicate(X,&Y);CHKERRQ(ierr); 73 ierr = VecSetValues(Y,2,inds,yvals,INSERT_VALUES);CHKERRQ(ierr); 74 ierr = VecAssemblyBegin(Y);CHKERRQ(ierr); 75 ierr = VecAssemblyEnd(Y);CHKERRQ(ierr); 76 77 ierr = MatCreateShell(PETSC_COMM_WORLD,2,2,2,2,user,&S1);CHKERRQ(ierr); 78 ierr = MatSetUp(S1);CHKERRQ(ierr); 79 ierr = MatShellSetOperation(S1,MATOP_MULT,(void (*)(void))MatMult_User);CHKERRQ(ierr); 80 ierr = MatShellSetOperation(S1,MATOP_COPY,(void (*)(void))MatCopy_User);CHKERRQ(ierr); 81 ierr = MatShellSetOperation(S1,MATOP_DESTROY,(void (*)(void))MatDestroy_User);CHKERRQ(ierr); 82 ierr = MatCreateShell(PETSC_COMM_WORLD,2,2,2,2,NULL,&S2);CHKERRQ(ierr); 83 ierr = MatSetUp(S2);CHKERRQ(ierr); 84 ierr = MatShellSetOperation(S2,MATOP_MULT,(void (*)(void))MatMult_User);CHKERRQ(ierr); 85 ierr = MatShellSetOperation(S2,MATOP_COPY,(void (*)(void))MatCopy_User);CHKERRQ(ierr); 86 ierr = MatShellSetOperation(S2,MATOP_DESTROY,(void (*)(void))MatDestroy_User);CHKERRQ(ierr); 87 88 ierr = MatScale(S1,31);CHKERRQ(ierr); 89 ierr = MatShift(S1,37);CHKERRQ(ierr); 90 ierr = MatDiagonalScale(S1,X,Y);CHKERRQ(ierr); 91 ierr = MatCopy(S1,S2,SAME_NONZERO_PATTERN);CHKERRQ(ierr); 92 ierr = MatMult(S1,X,Y);CHKERRQ(ierr); 93 ierr = VecView(Y,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 94 ierr = MatMult(S2,X,Y);CHKERRQ(ierr); 95 ierr = VecView(Y,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 96 97 ierr = MatDestroy(&S1);CHKERRQ(ierr); 98 ierr = MatDestroy(&S2);CHKERRQ(ierr); 99 ierr = VecDestroy(&X);CHKERRQ(ierr); 100 ierr = VecDestroy(&Y);CHKERRQ(ierr); 101 ierr = PetscFinalize(); 102 return ierr; 103 } 104 105 /*TEST 106 107 test: 108 args: -malloc_dump 109 110 TEST*/ 111