Actual source code: ex276.c
1: static char help[] = "Tests MatGetValues() with and without MAT_ROW_ORIENTED\n";
3: #include <petscmat.h>
5: int main(int argc, char **args)
6: {
7: Mat A, B, C, D, E;
8: PetscViewer viewer;
9: PetscInt rstart, rend, *rows, *cols;
10: PetscScalar *valuesA, *valuesB, *valuesC, *valuesD, *valuesE;
11: PetscBool flg;
13: PetscFunctionBeginUser;
14: PetscCall(PetscInitialize(&argc, &args, NULL, help));
15: PetscCall(MatCreate(PETSC_COMM_WORLD, &A));
16: PetscCall(MatSetType(A, MATAIJ));
17: PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "${PETSC_DIR}/share/petsc/datafiles/matrices/spd-real-int32-float64", FILE_MODE_READ, &viewer));
18: PetscCall(MatLoad(A, viewer));
19: PetscCall(MatSetOption(A, MAT_SYMMETRIC, PETSC_TRUE));
20: PetscCall(PetscViewerDestroy(&viewer));
22: PetscCall(MatConvert(A, MATBAIJ, MAT_INITIAL_MATRIX, &B));
23: PetscCall(MatConvert(A, MATSBAIJ, MAT_INITIAL_MATRIX, &C));
24: PetscCall(MatConvert(A, MATSELL, MAT_INITIAL_MATRIX, &D));
25: PetscCall(MatConvert(A, MATDENSE, MAT_INITIAL_MATRIX, &E));
27: PetscCall(MatGetOwnershipRange(A, &rstart, &rend));
28: PetscCall(PetscMalloc2((rend - rstart - 2), &rows, 6, &cols));
29: for (PetscInt i = rstart + 1; i < rend - 1; i++) rows[i - rstart - 1] = i;
30: cols[0] = -1;
31: cols[1] = 1;
32: cols[2] = rstart;
33: cols[3] = rstart + 1;
34: cols[4] = rstart + 2;
35: cols[5] = rstart + 3;
37: PetscCall(PetscMalloc5((rend - rstart - 2) * 6, &valuesA, (rend - rstart - 2) * 6, &valuesB, (rend - rstart - 2) * 6, &valuesC, (rend - rstart - 2) * 6, &valuesD, (rend - rstart - 2) * 6, &valuesE));
39: PetscCall(PetscArrayzero(valuesA, 6 * (rend - rstart - 2)));
40: PetscCall(MatGetValues(A, rend - rstart - 2, rows, 6, cols, valuesA));
41: PetscCall(PetscArrayzero(valuesB, 6 * (rend - rstart - 2)));
42: PetscCall(MatGetValues(B, rend - rstart - 2, rows, 6, cols, valuesB));
43: PetscCall(PetscArrayzero(valuesC, 6 * (rend - rstart - 2)));
44: PetscCall(MatGetValues(C, rend - rstart - 2, rows, 6, cols, valuesC));
45: PetscCall(PetscArrayzero(valuesD, 6 * (rend - rstart - 2)));
46: PetscCall(MatGetValues(D, rend - rstart - 2, rows, 6, cols, valuesD));
47: PetscCall(PetscArrayzero(valuesE, 6 * (rend - rstart - 2)));
48: PetscCall(MatGetValues(E, rend - rstart - 2, rows, 6, cols, valuesE));
50: PetscCall(PetscArraycmp(valuesA, valuesB, 6 * (rend - rstart - 2), &flg));
51: PetscCheck(flg, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Error unexpected values from MatGetValues() valuesB");
52: // cannot compare with C since MatGetValues() on MATSBAIJ does not return all the entries
53: PetscCall(PetscArraycmp(valuesA, valuesD, 6 * (rend - rstart - 2), &flg));
54: PetscCheck(flg, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Error unexpected values from MatGetValues() valuesD");
55: PetscCall(PetscArraycmp(valuesA, valuesE, 6 * (rend - rstart - 2), &flg));
56: PetscCheck(flg, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Error unexpected values from MatGetValues() valuesE");
58: PetscCall(MatSetOption(A, MAT_ROW_ORIENTED, PETSC_FALSE));
59: PetscCall(MatSetOption(B, MAT_ROW_ORIENTED, PETSC_FALSE));
60: PetscCall(MatSetOption(C, MAT_ROW_ORIENTED, PETSC_FALSE));
61: PetscCall(MatSetOption(D, MAT_ROW_ORIENTED, PETSC_FALSE));
62: PetscCall(MatSetOption(E, MAT_ROW_ORIENTED, PETSC_FALSE));
64: PetscCall(PetscArrayzero(valuesA, 6 * (rend - rstart - 2)));
65: PetscCall(MatGetValues(A, rend - rstart - 2, rows, 6, cols, valuesA));
66: PetscCall(PetscArrayzero(valuesB, 6 * (rend - rstart - 2)));
67: PetscCall(MatGetValues(B, rend - rstart - 2, rows, 6, cols, valuesB));
68: PetscCall(PetscArrayzero(valuesC, 6 * (rend - rstart - 2)));
69: PetscCall(MatGetValues(C, rend - rstart - 2, rows, 6, cols, valuesC));
70: PetscCall(PetscArrayzero(valuesD, 6 * (rend - rstart - 2)));
71: PetscCall(MatGetValues(D, rend - rstart - 2, rows, 6, cols, valuesD));
72: PetscCall(PetscArrayzero(valuesE, 6 * (rend - rstart - 2)));
73: PetscCall(MatGetValues(E, rend - rstart - 2, rows, 6, cols, valuesE));
75: PetscCall(PetscArraycmp(valuesA, valuesB, 6 * (rend - rstart - 2), &flg));
76: PetscCheck(flg, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Error unexpected values from MatGetValues() MAT_ROW_ORIENTED false valuesB");
77: // cannot compare with C since MatGetValues() on MATSBAIJ does not return all the entries
78: PetscCall(PetscArraycmp(valuesA, valuesD, 6 * (rend - rstart - 2), &flg));
79: PetscCheck(flg, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Error unexpected values from MatGetValues() MAT_ROW_ORIENTED false valuesD");
80: PetscCall(PetscArraycmp(valuesA, valuesE, 6 * (rend - rstart - 2), &flg));
81: PetscCheck(flg, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Error unexpected values from MatGetValues() MAT_ROW_ORIENTED false valuesE");
83: PetscCall(PetscFree2(rows, cols));
84: PetscCall(PetscFree5(valuesA, valuesB, valuesC, valuesD, valuesE));
85: PetscCall(MatDestroy(&A));
86: PetscCall(MatDestroy(&B));
87: PetscCall(MatDestroy(&C));
88: PetscCall(MatDestroy(&D));
89: PetscCall(MatDestroy(&E));
90: PetscCall(PetscFinalize());
91: return 0;
92: }
94: /*TEST
96: test:
97: requires: double !complex !defined(PETSC_USE_64BIT_INDICES)
98: output_file: output/empty.out
100: test:
101: suffix: 2
102: requires: double !complex !defined(PETSC_USE_64BIT_INDICES)
103: nsize: 2
104: output_file: output/empty.out
106: TEST*/