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