xref: /petsc/src/mat/tests/ex10.c (revision 732aec7a18f2199fb53bb9a2f3aef439a834ce31)
1 static char help[] = "Tests repeated use of assembly for matrices.\n\n";
2 
3 #include <petscmat.h>
4 
main(int argc,char ** args)5 int main(int argc, char **args)
6 {
7   Mat         C, B;
8   PetscInt    i, j, m = 5, n = 2, Ii, J;
9   PetscMPIInt rank, size;
10   PetscScalar v;
11 
12   PetscFunctionBeginUser;
13   PetscCall(PetscInitialize(&argc, &args, NULL, help));
14   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
15   PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
16   n = 2 * size;
17 
18   /* create the matrix for the five point stencil, YET AGAIN*/
19   PetscCall(MatCreate(PETSC_COMM_WORLD, &C));
20   PetscCall(MatSetSizes(C, PETSC_DECIDE, PETSC_DECIDE, m * n, m * n));
21   PetscCall(MatSetFromOptions(C));
22   PetscCall(MatSetUp(C));
23   PetscCall(MatDuplicate(C, MAT_DO_NOT_COPY_VALUES, &B)); /* test that SeqAIJ non-preallocated matrices can be duplicated */
24   PetscCall(MatDestroy(&C));
25   C = B;
26   for (i = 0; i < m; i++) {
27     for (j = 2 * rank; j < 2 * rank + 2; j++) {
28       v  = -1.0;
29       Ii = j + n * i;
30       if (i > 0) {
31         J = Ii - n;
32         PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, INSERT_VALUES));
33       }
34       if (i < m - 1) {
35         J = Ii + n;
36         PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, INSERT_VALUES));
37       }
38       if (j > 0) {
39         J = Ii - 1;
40         PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, INSERT_VALUES));
41       }
42       if (j < n - 1) {
43         J = Ii + 1;
44         PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, INSERT_VALUES));
45       }
46       v = 4.0;
47       PetscCall(MatSetValues(C, 1, &Ii, 1, &Ii, &v, INSERT_VALUES));
48     }
49   }
50   PetscCall(MatAssemblyBegin(C, MAT_FINAL_ASSEMBLY));
51   PetscCall(MatAssemblyEnd(C, MAT_FINAL_ASSEMBLY));
52   for (i = 0; i < m; i++) {
53     for (j = 2 * rank; j < 2 * rank + 2; j++) {
54       v  = 1.0;
55       Ii = j + n * i;
56       if (i > 0) {
57         J = Ii - n;
58         PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, INSERT_VALUES));
59       }
60       if (i < m - 1) {
61         J = Ii + n;
62         PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, INSERT_VALUES));
63       }
64       if (j > 0) {
65         J = Ii - 1;
66         PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, INSERT_VALUES));
67       }
68       if (j < n - 1) {
69         J = Ii + 1;
70         PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, INSERT_VALUES));
71       }
72       v = -4.0;
73       PetscCall(MatSetValues(C, 1, &Ii, 1, &Ii, &v, INSERT_VALUES));
74     }
75   }
76   PetscCall(MatAssemblyBegin(C, MAT_FINAL_ASSEMBLY));
77   PetscCall(MatAssemblyEnd(C, MAT_FINAL_ASSEMBLY));
78 
79   PetscCall(MatView(C, PETSC_VIEWER_STDOUT_WORLD));
80 
81   PetscCall(MatDestroy(&C));
82   PetscCall(PetscFinalize());
83   return 0;
84 }
85 
86 /*TEST
87 
88    test:
89 
90 TEST*/
91