Actual source code: ex205.c
1: static char help[] = "Tests MatCopy() for SHELL matrices\n\n";
3: #include <petscmat.h>
5: typedef struct _n_User *User;
6: struct _n_User {
7: Mat A;
8: };
10: static PetscErrorCode MatMult_User(Mat A,Vec X,Vec Y)
11: {
12: User user;
14: MatShellGetContext(A,&user);
15: MatMult(user->A,X,Y);
16: return 0;
17: }
19: static PetscErrorCode MatCopy_User(Mat A,Mat B,MatStructure str)
20: {
21: User userA,userB;
23: MatShellGetContext(A,&userA);
24: if (userA) {
25: PetscNew(&userB);
26: MatDuplicate(userA->A,MAT_COPY_VALUES,&userB->A);
27: MatShellSetContext(B, userB);
28: }
29: return 0;
30: }
32: static PetscErrorCode MatDestroy_User(Mat A)
33: {
34: User user;
36: MatShellGetContext(A, &user);
37: if (user) {
38: MatDestroy(&user->A);
39: PetscFree(user);
40: }
41: return 0;
42: }
44: int main(int argc,char **args)
45: {
46: const PetscScalar xvals[] = {11,13},yvals[] = {17,19};
47: const PetscInt inds[] = {0,1};
48: PetscScalar avals[] = {2,3,5,7};
49: Mat S1,S2;
50: Vec X,Y;
51: User user;
53: PetscInitialize(&argc,&args,(char*)0,help);
55: PetscNew(&user);
56: MatCreateSeqAIJ(PETSC_COMM_WORLD,2,2,2,NULL,&user->A);
57: MatSetUp(user->A);
58: MatSetValues(user->A,2,inds,2,inds,avals,INSERT_VALUES);
59: MatAssemblyBegin(user->A,MAT_FINAL_ASSEMBLY);
60: MatAssemblyEnd(user->A,MAT_FINAL_ASSEMBLY);
61: VecCreateSeq(PETSC_COMM_WORLD,2,&X);
62: VecSetValues(X,2,inds,xvals,INSERT_VALUES);
63: VecAssemblyBegin(X);
64: VecAssemblyEnd(X);
65: VecDuplicate(X,&Y);
66: VecSetValues(Y,2,inds,yvals,INSERT_VALUES);
67: VecAssemblyBegin(Y);
68: VecAssemblyEnd(Y);
70: MatCreateShell(PETSC_COMM_WORLD,2,2,2,2,user,&S1);
71: MatSetUp(S1);
72: MatShellSetOperation(S1,MATOP_MULT,(void (*)(void))MatMult_User);
73: MatShellSetOperation(S1,MATOP_COPY,(void (*)(void))MatCopy_User);
74: MatShellSetOperation(S1,MATOP_DESTROY,(void (*)(void))MatDestroy_User);
75: MatCreateShell(PETSC_COMM_WORLD,2,2,2,2,NULL,&S2);
76: MatSetUp(S2);
77: MatShellSetOperation(S2,MATOP_MULT,(void (*)(void))MatMult_User);
78: MatShellSetOperation(S2,MATOP_COPY,(void (*)(void))MatCopy_User);
79: MatShellSetOperation(S2,MATOP_DESTROY,(void (*)(void))MatDestroy_User);
81: MatScale(S1,31);
82: MatShift(S1,37);
83: MatDiagonalScale(S1,X,Y);
84: MatCopy(S1,S2,SAME_NONZERO_PATTERN);
85: MatMult(S1,X,Y);
86: VecView(Y,PETSC_VIEWER_STDOUT_WORLD);
87: MatMult(S2,X,Y);
88: VecView(Y,PETSC_VIEWER_STDOUT_WORLD);
90: MatDestroy(&S1);
91: MatDestroy(&S2);
92: VecDestroy(&X);
93: VecDestroy(&Y);
94: PetscFinalize();
95: return 0;
96: }
98: /*TEST
100: test:
101: args: -malloc_dump
103: TEST*/