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