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