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