xref: /petsc/src/mat/tests/ex132.c (revision 039c6fba3b07bebff1e830e82a42905dc1e47ea3)
1c4762a1bSJed Brown 
2*039c6fbaSStefano Zampini static char help[] = "Test MatAXPY()\n\n";
3c4762a1bSJed Brown 
4c4762a1bSJed Brown #include <petscmat.h>
5c4762a1bSJed Brown 
6c4762a1bSJed Brown int main(int argc,char **args)
7c4762a1bSJed Brown {
8c4762a1bSJed Brown   Mat            C,C1,C2;           /* matrix */
9c4762a1bSJed Brown   PetscScalar    v;
10c4762a1bSJed Brown   PetscInt       Ii,J,Istart,Iend;
11c4762a1bSJed Brown   PetscErrorCode ierr;
12*039c6fbaSStefano Zampini   PetscInt       i,j,m = 3,n;
13*039c6fbaSStefano Zampini   PetscMPIInt    size;
14c4762a1bSJed Brown   PetscBool      mat_nonsymmetric = PETSC_FALSE;
15c4762a1bSJed Brown   MatInfo        info;
16c4762a1bSJed Brown 
17c4762a1bSJed Brown   ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr;
18c4762a1bSJed Brown   ierr = PetscOptionsGetInt(NULL,NULL,"-m",&m,NULL);CHKERRQ(ierr);
19ffc4695bSBarry Smith   ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRMPI(ierr);
20c4762a1bSJed Brown   n    = 2*size;
21c4762a1bSJed Brown 
22c4762a1bSJed Brown   /* Set flag if we are doing a nonsymmetric problem; the default is symmetric. */
23c4762a1bSJed Brown   ierr = PetscOptionsGetBool(NULL,NULL,"-mat_nonsym",&mat_nonsymmetric,NULL);CHKERRQ(ierr);
24c4762a1bSJed Brown 
25c4762a1bSJed Brown   ierr = MatCreate(PETSC_COMM_WORLD,&C);CHKERRQ(ierr);
26c4762a1bSJed Brown   ierr = MatSetSizes(C,PETSC_DECIDE,PETSC_DECIDE,m*n,m*n);CHKERRQ(ierr);
27c4762a1bSJed Brown   ierr = MatSetFromOptions(C);CHKERRQ(ierr);
28c4762a1bSJed Brown   ierr = MatSeqAIJSetPreallocation(C,5,NULL);CHKERRQ(ierr);
29*039c6fbaSStefano Zampini   ierr = MatMPIAIJSetPreallocation(C,5,NULL,5,NULL);CHKERRQ(ierr);
30c4762a1bSJed Brown 
31c4762a1bSJed Brown   ierr = MatGetOwnershipRange(C,&Istart,&Iend);CHKERRQ(ierr);
32c4762a1bSJed Brown   for (Ii=Istart; Ii<Iend; Ii++) {
33c4762a1bSJed Brown     v = -1.0; i = Ii/n; j = Ii - i*n;
34c4762a1bSJed Brown     if (i>0)   {J = Ii - n; ierr = MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES);CHKERRQ(ierr);}
35c4762a1bSJed Brown     if (i<m-1) {J = Ii + n; ierr = MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES);CHKERRQ(ierr);}
36c4762a1bSJed Brown     if (j>0)   {J = Ii - 1; ierr = MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES);CHKERRQ(ierr);}
37c4762a1bSJed Brown     if (j<n-1) {J = Ii + 1; ierr = MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES);CHKERRQ(ierr);}
38c4762a1bSJed Brown     v = 4.0; ierr = MatSetValues(C,1,&Ii,1,&Ii,&v,ADD_VALUES);CHKERRQ(ierr);
39c4762a1bSJed Brown   }
40c4762a1bSJed Brown 
41c4762a1bSJed Brown   /* Make the matrix nonsymmetric if desired */
42c4762a1bSJed Brown   if (mat_nonsymmetric) {
43c4762a1bSJed Brown     for (Ii=Istart; Ii<Iend; Ii++) {
44c4762a1bSJed Brown       v = -1.5; i = Ii/n;
45c4762a1bSJed Brown       if (i>1) {J = Ii-n-1; ierr = MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES);CHKERRQ(ierr);}
46c4762a1bSJed Brown     }
47c4762a1bSJed Brown   } else {
48c4762a1bSJed Brown     ierr = MatSetOption(C,MAT_SYMMETRIC,PETSC_TRUE);CHKERRQ(ierr);
49c4762a1bSJed Brown     ierr = MatSetOption(C,MAT_SYMMETRY_ETERNAL,PETSC_TRUE);CHKERRQ(ierr);
50c4762a1bSJed Brown   }
51c4762a1bSJed Brown   ierr = MatAssemblyBegin(C,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
52c4762a1bSJed Brown   ierr = MatAssemblyEnd(C,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
53*039c6fbaSStefano Zampini   ierr = PetscObjectSetName((PetscObject)C,"C");CHKERRQ(ierr);
54*039c6fbaSStefano Zampini   ierr = MatViewFromOptions(C,NULL,"-view");CHKERRQ(ierr);
55c4762a1bSJed Brown 
56*039c6fbaSStefano Zampini   /* C1 = 2.0*C1 + C, C1 has different non-zeros than C */
57c4762a1bSJed Brown   ierr = MatCreate(PETSC_COMM_WORLD,&C1);CHKERRQ(ierr);
58c4762a1bSJed Brown   ierr = MatSetSizes(C1,PETSC_DECIDE,PETSC_DECIDE,m*n,m*n);CHKERRQ(ierr);
59c4762a1bSJed Brown   ierr = MatSetFromOptions(C1);CHKERRQ(ierr);
60c4762a1bSJed Brown   ierr = MatSeqAIJSetPreallocation(C1,1,NULL);CHKERRQ(ierr);
61*039c6fbaSStefano Zampini   ierr = MatMPIAIJSetPreallocation(C1,1,NULL,1,NULL);CHKERRQ(ierr);
62c4762a1bSJed Brown   for (Ii=Istart; Ii<Iend; Ii++) {
63*039c6fbaSStefano Zampini     v = 1.0;
64*039c6fbaSStefano Zampini     i = m*n - Ii -1;
65*039c6fbaSStefano Zampini     j = Ii;
66*039c6fbaSStefano Zampini     ierr = MatSetValues(C1,1,&i,1,&j,&v,ADD_VALUES);CHKERRQ(ierr);
67c4762a1bSJed Brown   }
68c4762a1bSJed Brown   ierr = MatAssemblyBegin(C1,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
69c4762a1bSJed Brown   ierr = MatAssemblyEnd(C1,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
70*039c6fbaSStefano Zampini   ierr = PetscObjectSetName((PetscObject)C1,"C1");CHKERRQ(ierr);
71*039c6fbaSStefano Zampini   ierr = MatViewFromOptions(C1,NULL,"-view");CHKERRQ(ierr);
72c4762a1bSJed Brown   ierr = PetscPrintf(PETSC_COMM_WORLD," MatAXPY(C1,2.0,C,DIFFERENT_NONZERO_PATTERN)...\n");CHKERRQ(ierr);
73c4762a1bSJed Brown   ierr = MatAXPY(C1,2.0,C,DIFFERENT_NONZERO_PATTERN);CHKERRQ(ierr);
74c4762a1bSJed Brown   ierr = MatGetInfo(C1,MAT_GLOBAL_SUM,&info);CHKERRQ(ierr);
75c4762a1bSJed Brown   ierr = PetscPrintf(PETSC_COMM_WORLD," C1: nz_allocated = %g; nz_used = %g; nz_unneeded = %g\n",info.nz_allocated,info.nz_used, info.nz_unneeded);CHKERRQ(ierr);
76*039c6fbaSStefano Zampini   ierr = MatViewFromOptions(C1,NULL,"-view");CHKERRQ(ierr);
77c4762a1bSJed Brown 
78*039c6fbaSStefano Zampini   /* Secondly, create C1 = 2.0*C2 + C1, C2 has non-zero pattern of C */
79c4762a1bSJed Brown   ierr = MatDuplicate(C,MAT_DO_NOT_COPY_VALUES,&C2);CHKERRQ(ierr);
80c4762a1bSJed Brown 
81c4762a1bSJed Brown   for (Ii=Istart; Ii<Iend; Ii++) {
82c4762a1bSJed Brown     v    = 1.0;
83c4762a1bSJed Brown     ierr = MatSetValues(C2,1,&Ii,1,&Ii,&v,ADD_VALUES);CHKERRQ(ierr);
84c4762a1bSJed Brown   }
85c4762a1bSJed Brown   ierr = MatAssemblyBegin(C2,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
86c4762a1bSJed Brown   ierr = MatAssemblyEnd(C2,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
87*039c6fbaSStefano Zampini   ierr = PetscObjectSetName((PetscObject)C2,"C2");CHKERRQ(ierr);
88*039c6fbaSStefano Zampini   ierr = MatViewFromOptions(C2,NULL,"-view");CHKERRQ(ierr);
89*039c6fbaSStefano Zampini   ierr = PetscPrintf(PETSC_COMM_WORLD," MatAXPY(C1,2.0,C2,SUBSET_NONZERO_PATTERN)...\n");CHKERRQ(ierr);
90*039c6fbaSStefano Zampini   ierr = MatAXPY(C1,2.0,C2,SUBSET_NONZERO_PATTERN);CHKERRQ(ierr);
91*039c6fbaSStefano Zampini   ierr = MatGetInfo(C1,MAT_GLOBAL_SUM,&info);CHKERRQ(ierr);
92*039c6fbaSStefano Zampini   ierr = PetscPrintf(PETSC_COMM_WORLD," C1: nz_allocated = %g; nz_used = %g; nz_unneeded = %g\n",info.nz_allocated,info.nz_used, info.nz_unneeded);CHKERRQ(ierr);
93*039c6fbaSStefano Zampini   ierr = MatViewFromOptions(C1,NULL,"-view");CHKERRQ(ierr);
94*039c6fbaSStefano Zampini 
95*039c6fbaSStefano Zampini   /* Test SAME_NONZERO_PATTERN */
96*039c6fbaSStefano Zampini   ierr = PetscPrintf(PETSC_COMM_WORLD," MatAXPY(C2,2.0,C,SAME_NONZERO_PATTERN)...\n");CHKERRQ(ierr);
97c4762a1bSJed Brown   ierr = MatAXPY(C2,2.0,C,SUBSET_NONZERO_PATTERN);CHKERRQ(ierr);
98c4762a1bSJed Brown   ierr = MatGetInfo(C2,MAT_GLOBAL_SUM,&info);CHKERRQ(ierr);
99c4762a1bSJed Brown   ierr = PetscPrintf(PETSC_COMM_WORLD," C2: nz_allocated = %g; nz_used = %g; nz_unneeded = %g\n",info.nz_allocated,info.nz_used, info.nz_unneeded);CHKERRQ(ierr);
100*039c6fbaSStefano Zampini   ierr = MatViewFromOptions(C2,NULL,"-view");CHKERRQ(ierr);
101c4762a1bSJed Brown 
102c4762a1bSJed Brown   ierr = MatDestroy(&C1);CHKERRQ(ierr);
103c4762a1bSJed Brown   ierr = MatDestroy(&C2);CHKERRQ(ierr);
104c4762a1bSJed Brown   ierr = MatDestroy(&C);CHKERRQ(ierr);
105c4762a1bSJed Brown 
106c4762a1bSJed Brown   ierr = PetscFinalize();
107c4762a1bSJed Brown   return ierr;
108c4762a1bSJed Brown }
109c4762a1bSJed Brown 
110c4762a1bSJed Brown /*TEST
111c4762a1bSJed Brown 
112c4762a1bSJed Brown    test:
113*039c6fbaSStefano Zampini      suffix: 1
114*039c6fbaSStefano Zampini      filter: grep -v " type:" | grep -v "Mat Object"
115*039c6fbaSStefano Zampini      args: -view
116*039c6fbaSStefano Zampini      diff_args: -j
117*039c6fbaSStefano Zampini 
118*039c6fbaSStefano Zampini    test:
119*039c6fbaSStefano Zampini      output_file: output/ex132_1.out
120*039c6fbaSStefano Zampini      requires: cuda
121*039c6fbaSStefano Zampini      suffix: 1_cuda
122*039c6fbaSStefano Zampini      filter: grep -v " type:" | grep -v "Mat Object"
123*039c6fbaSStefano Zampini      args: -view -mat_type aijcusparse
124*039c6fbaSStefano Zampini      diff_args: -j
125*039c6fbaSStefano Zampini 
126*039c6fbaSStefano Zampini    test:
127*039c6fbaSStefano Zampini      output_file: output/ex132_1.out
128*039c6fbaSStefano Zampini      requires: kokkos_kernels
129*039c6fbaSStefano Zampini      suffix: 1_kokkos
130*039c6fbaSStefano Zampini      filter: grep -v " type:" | grep -v "Mat Object"
131*039c6fbaSStefano Zampini      args: -view -mat_type aijkokkos
132*039c6fbaSStefano Zampini      diff_args: -j
133*039c6fbaSStefano Zampini 
134*039c6fbaSStefano Zampini    test:
135*039c6fbaSStefano Zampini      suffix: 2
136*039c6fbaSStefano Zampini      filter: grep -v " type:" | grep -v "Mat Object"
137*039c6fbaSStefano Zampini      args: -view -mat_nonsym
138*039c6fbaSStefano Zampini      diff_args: -j
139*039c6fbaSStefano Zampini 
140*039c6fbaSStefano Zampini    test:
141*039c6fbaSStefano Zampini      output_file: output/ex132_2.out
142*039c6fbaSStefano Zampini      requires: cuda
143*039c6fbaSStefano Zampini      suffix: 2_cuda
144*039c6fbaSStefano Zampini      filter: grep -v " type:" | grep -v "Mat Object"
145*039c6fbaSStefano Zampini      args: -view -mat_type aijcusparse -mat_nonsym
146*039c6fbaSStefano Zampini      diff_args: -j
147*039c6fbaSStefano Zampini 
148*039c6fbaSStefano Zampini    test:
149*039c6fbaSStefano Zampini      output_file: output/ex132_2.out
150*039c6fbaSStefano Zampini      requires: kokkos_kernels
151*039c6fbaSStefano Zampini      suffix: 2_kokkos
152*039c6fbaSStefano Zampini      filter: grep -v " type:" | grep -v "Mat Object"
153*039c6fbaSStefano Zampini      args: -view -mat_type aijkokkos -mat_nonsym
154*039c6fbaSStefano Zampini      diff_args: -j
155*039c6fbaSStefano Zampini 
156*039c6fbaSStefano Zampini    test:
157*039c6fbaSStefano Zampini      nsize: 2
158*039c6fbaSStefano Zampini      suffix: 1_par
159*039c6fbaSStefano Zampini      filter: grep -v " type:" | grep -v "Mat Object"
160*039c6fbaSStefano Zampini      args: -view
161*039c6fbaSStefano Zampini      diff_args: -j
162*039c6fbaSStefano Zampini 
163*039c6fbaSStefano Zampini    test:
164*039c6fbaSStefano Zampini      nsize: 2
165*039c6fbaSStefano Zampini      output_file: output/ex132_1_par.out
166*039c6fbaSStefano Zampini      requires: cuda
167*039c6fbaSStefano Zampini      suffix: 1_par_cuda
168*039c6fbaSStefano Zampini      filter: grep -v " type:" | grep -v "Mat Object"
169*039c6fbaSStefano Zampini      args: -view -mat_type aijcusparse
170*039c6fbaSStefano Zampini      diff_args: -j
171*039c6fbaSStefano Zampini 
172*039c6fbaSStefano Zampini    test:
173*039c6fbaSStefano Zampini      nsize: 2
174*039c6fbaSStefano Zampini      output_file: output/ex132_1_par.out
175*039c6fbaSStefano Zampini      requires: kokkos_kernels
176*039c6fbaSStefano Zampini      suffix: 1_par_kokkos
177*039c6fbaSStefano Zampini      filter: grep -v " type:" | grep -v "Mat Object"
178*039c6fbaSStefano Zampini      args: -view -mat_type aijkokkos
179*039c6fbaSStefano Zampini      diff_args: -j
180*039c6fbaSStefano Zampini 
181*039c6fbaSStefano Zampini    test:
182*039c6fbaSStefano Zampini      nsize: 2
183*039c6fbaSStefano Zampini      suffix: 2_par
184*039c6fbaSStefano Zampini      filter: grep -v " type:" | grep -v "Mat Object"
185*039c6fbaSStefano Zampini      args: -view -mat_nonsym
186*039c6fbaSStefano Zampini      diff_args: -j
187*039c6fbaSStefano Zampini 
188*039c6fbaSStefano Zampini    test:
189*039c6fbaSStefano Zampini      nsize: 2
190*039c6fbaSStefano Zampini      output_file: output/ex132_2_par.out
191*039c6fbaSStefano Zampini      requires: cuda
192*039c6fbaSStefano Zampini      suffix: 2_par_cuda
193*039c6fbaSStefano Zampini      filter: grep -v " type:" | grep -v "Mat Object"
194*039c6fbaSStefano Zampini      args: -view -mat_type aijcusparse -mat_nonsym
195*039c6fbaSStefano Zampini      diff_args: -j
196*039c6fbaSStefano Zampini 
197*039c6fbaSStefano Zampini    test:
198*039c6fbaSStefano Zampini      nsize: 2
199*039c6fbaSStefano Zampini      output_file: output/ex132_2_par.out
200*039c6fbaSStefano Zampini      requires: kokkos_kernels
201*039c6fbaSStefano Zampini      suffix: 2_par_kokkos
202*039c6fbaSStefano Zampini      filter: grep -v " type:" | grep -v "Mat Object"
203*039c6fbaSStefano Zampini      args: -view -mat_type aijkokkos -mat_nonsym
204*039c6fbaSStefano Zampini      diff_args: -j
205c4762a1bSJed Brown 
206c4762a1bSJed Brown TEST*/
207