1 2 static char help[] = "Tests incorrect use of MatDiagonalSet() for SHELL matrices\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 MatGetDiagonal_User(Mat A,Vec X) 12 { 13 User user; 14 PetscErrorCode ierr; 15 16 PetscFunctionBegin; 17 ierr = MatShellGetContext(A,&user);CHKERRQ(ierr); 18 ierr = MatGetDiagonal(user->B,X);CHKERRQ(ierr); 19 PetscFunctionReturn(0); 20 } 21 22 int main(int argc,char **args) 23 { 24 const PetscScalar xvals[] = {11,13}; 25 const PetscInt inds[] = {0,1}; 26 PetscScalar avals[] = {2,3,5,7}; 27 Mat A,S; 28 Vec X,Y; 29 User user; 30 PetscErrorCode ierr; 31 32 ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr; 33 ierr = MatCreateSeqAIJ(PETSC_COMM_WORLD,2,2,2,NULL,&A);CHKERRQ(ierr); 34 ierr = MatSetUp(A);CHKERRQ(ierr); 35 ierr = MatSetValues(A,2,inds,2,inds,avals,INSERT_VALUES);CHKERRQ(ierr); 36 ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 37 ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 38 ierr = VecCreateSeq(PETSC_COMM_WORLD,2,&X);CHKERRQ(ierr); 39 ierr = VecSetValues(X,2,inds,xvals,INSERT_VALUES);CHKERRQ(ierr); 40 ierr = VecAssemblyBegin(X);CHKERRQ(ierr); 41 ierr = VecAssemblyEnd(X);CHKERRQ(ierr); 42 ierr = VecDuplicate(X,&Y);CHKERRQ(ierr); 43 44 ierr = PetscNew(&user);CHKERRQ(ierr); 45 user->B = A; 46 47 ierr = MatCreateShell(PETSC_COMM_WORLD,2,2,2,2,user,&S);CHKERRQ(ierr); 48 ierr = MatShellSetOperation(S,MATOP_GET_DIAGONAL,(void (*)(void))MatGetDiagonal_User);CHKERRQ(ierr); 49 ierr = MatSetUp(S);CHKERRQ(ierr); 50 51 ierr = MatShift(S,42);CHKERRQ(ierr); 52 ierr = MatGetDiagonal(S,Y);CHKERRQ(ierr); 53 ierr = VecView(Y,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 54 ierr = MatDiagonalSet(S,X,ADD_VALUES);CHKERRQ(ierr); 55 ierr = MatGetDiagonal(S,Y);CHKERRQ(ierr); 56 ierr = VecView(Y,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 57 ierr = MatScale(S,42);CHKERRQ(ierr); 58 ierr = MatGetDiagonal(S,Y);CHKERRQ(ierr); 59 ierr = VecView(Y,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 60 61 ierr = MatDestroy(&A);CHKERRQ(ierr); 62 ierr = MatDestroy(&S);CHKERRQ(ierr); 63 ierr = VecDestroy(&X);CHKERRQ(ierr); 64 ierr = VecDestroy(&Y);CHKERRQ(ierr); 65 ierr = PetscFree(user);CHKERRQ(ierr); 66 ierr = PetscFinalize(); 67 return ierr; 68 } 69 70 /*TEST 71 72 test: 73 args: -malloc_dump 74 75 TEST*/ 76