Actual source code: ex203.c
2: static char help[] = "Tests incorrect use of MatDiagonalSet() for SHELL matrices\n\n";
4: #include <petscmat.h>
6: typedef struct _n_User *User;
7: struct _n_User {
8: Mat B;
9: };
11: static PetscErrorCode MatGetDiagonal_User(Mat A,Vec X)
12: {
13: User user;
15: MatShellGetContext(A,&user);
16: MatGetDiagonal(user->B,X);
17: return 0;
18: }
20: int main(int argc,char **args)
21: {
22: const PetscScalar xvals[] = {11,13};
23: const PetscInt inds[] = {0,1};
24: PetscScalar avals[] = {2,3,5,7};
25: Mat A,S;
26: Vec X,Y;
27: User user;
29: PetscInitialize(&argc,&args,(char*)0,help);
30: MatCreateSeqAIJ(PETSC_COMM_WORLD,2,2,2,NULL,&A);
31: MatSetUp(A);
32: MatSetValues(A,2,inds,2,inds,avals,INSERT_VALUES);
33: MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);
34: MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);
35: VecCreateSeq(PETSC_COMM_WORLD,2,&X);
36: VecSetValues(X,2,inds,xvals,INSERT_VALUES);
37: VecAssemblyBegin(X);
38: VecAssemblyEnd(X);
39: VecDuplicate(X,&Y);
41: PetscNew(&user);
42: user->B = A;
44: MatCreateShell(PETSC_COMM_WORLD,2,2,2,2,user,&S);
45: MatShellSetOperation(S,MATOP_GET_DIAGONAL,(void (*)(void))MatGetDiagonal_User);
46: MatSetUp(S);
48: MatShift(S,42);
49: MatGetDiagonal(S,Y);
50: VecView(Y,PETSC_VIEWER_STDOUT_WORLD);
51: MatDiagonalSet(S,X,ADD_VALUES);
52: MatGetDiagonal(S,Y);
53: VecView(Y,PETSC_VIEWER_STDOUT_WORLD);
54: MatScale(S,42);
55: MatGetDiagonal(S,Y);
56: VecView(Y,PETSC_VIEWER_STDOUT_WORLD);
58: MatDestroy(&A);
59: MatDestroy(&S);
60: VecDestroy(&X);
61: VecDestroy(&Y);
62: PetscFree(user);
63: PetscFinalize();
64: return 0;
65: }
67: /*TEST
69: test:
70: args: -malloc_dump
72: TEST*/