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;
30: PetscInitialize(&argc, &args, (char *)0, help);
31: MatCreateSeqAIJ(PETSC_COMM_WORLD, 2, 2, 2, NULL, &A);
32: MatSetUp(A);
33: MatSetValues(A, 2, inds, 2, inds, avals, INSERT_VALUES);
34: MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY);
35: MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY);
36: VecCreateSeq(PETSC_COMM_WORLD, 2, &X);
37: VecSetValues(X, 2, inds, xvals, INSERT_VALUES);
38: VecAssemblyBegin(X);
39: VecAssemblyEnd(X);
40: VecDuplicate(X, &Y);
42: PetscNew(&user);
43: user->B = A;
45: MatCreateShell(PETSC_COMM_WORLD, 2, 2, 2, 2, user, &S);
46: MatShellSetOperation(S, MATOP_GET_DIAGONAL, (void (*)(void))MatGetDiagonal_User);
47: MatSetUp(S);
49: MatShift(S, 42);
50: MatGetDiagonal(S, Y);
51: VecView(Y, PETSC_VIEWER_STDOUT_WORLD);
52: MatDiagonalSet(S, X, ADD_VALUES);
53: MatGetDiagonal(S, Y);
54: VecView(Y, PETSC_VIEWER_STDOUT_WORLD);
55: MatScale(S, 42);
56: MatGetDiagonal(S, Y);
57: VecView(Y, PETSC_VIEWER_STDOUT_WORLD);
59: MatDestroy(&A);
60: MatDestroy(&S);
61: VecDestroy(&X);
62: VecDestroy(&Y);
63: PetscFree(user);
64: PetscFinalize();
65: return 0;
66: }
68: /*TEST
70: test:
71: args: -malloc_dump
73: TEST*/