1 static char help[] = "Tests MatTranspose() and MatEqual() for MPIAIJ matrices.\n\n";
2
3 #include <petscmat.h>
4
main(int argc,char ** argv)5 int main(int argc, char **argv)
6 {
7 Mat A, B;
8 PetscInt m = 7, n, i, rstart, rend, cols[3];
9 PetscScalar v[3];
10 PetscBool equal;
11 const char *eq[2];
12
13 PetscFunctionBeginUser;
14 PetscCall(PetscInitialize(&argc, &argv, NULL, help));
15 PetscCall(PetscOptionsGetInt(NULL, NULL, "-m", &m, NULL));
16 n = m;
17
18 /* ------- Assemble matrix, --------- */
19
20 PetscCall(MatCreateAIJ(PETSC_COMM_WORLD, PETSC_DECIDE, PETSC_DECIDE, m, n, 0, 0, 0, 0, &A));
21 PetscCall(MatSetOption(A, MAT_NEW_NONZERO_LOCATION_ERR, PETSC_FALSE));
22 PetscCall(MatGetOwnershipRange(A, &rstart, &rend));
23 if (!rstart) {
24 cols[0] = 0;
25 cols[1] = 1;
26 v[0] = 2.0;
27 v[1] = -1.0;
28 PetscCall(MatSetValues(A, 1, &rstart, 2, cols, v, INSERT_VALUES));
29 rstart++;
30 }
31 if (rend == m) {
32 rend--;
33 cols[0] = rend - 1;
34 cols[1] = rend;
35 v[0] = -1.0;
36 v[1] = 2.0;
37 PetscCall(MatSetValues(A, 1, &rend, 2, cols, v, INSERT_VALUES));
38 }
39 v[0] = -1.0;
40 v[1] = 2.0;
41 v[2] = -1.0;
42 for (i = rstart; i < rend; i++) {
43 cols[0] = i - 1;
44 cols[1] = i;
45 cols[2] = i + 1;
46 PetscCall(MatSetValues(A, 1, &i, 3, cols, v, INSERT_VALUES));
47 }
48 PetscCall(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY));
49 PetscCall(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY));
50
51 PetscCall(MatTranspose(A, MAT_INITIAL_MATRIX, &B));
52
53 PetscCall(MatEqual(A, B, &equal));
54
55 eq[0] = "not equal";
56 eq[1] = "equal";
57 PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Matrices are %s\n", eq[equal]));
58
59 PetscCall(MatTranspose(A, MAT_REUSE_MATRIX, &B));
60 PetscCall(MatEqual(A, B, &equal));
61 if (!equal) PetscCall(PetscPrintf(PETSC_COMM_WORLD, "MatTranspose with MAT_REUSE_MATRIX failed"));
62
63 /* Free data structures */
64 PetscCall(MatDestroy(&A));
65 PetscCall(MatDestroy(&B));
66
67 PetscCall(PetscFinalize());
68 return 0;
69 }
70
71 /*TEST
72
73 test:
74
75 test:
76 suffix: 2
77 nsize: 2
78 output_file: output/ex58_1.out
79
80 TEST*/
81