xref: /petsc/src/mat/tests/ex203.c (revision ccb4e88a40f0b86eaeca07ff64c64e4de2fae686)
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