1 #include <petsc.h>
2
3 static char help[] = "Tests for MatEliminateZeros().\n\n";
4
main(int argc,char ** args)5 int main(int argc, char **args)
6 {
7 Mat A, B, C, D, E;
8 PetscInt M = 40, bs = 2;
9 PetscReal threshold = 1.2;
10 PetscBool flg;
11
12 PetscFunctionBeginUser;
13 PetscCall(PetscInitialize(&argc, &args, NULL, help));
14 PetscCall(PetscOptionsGetInt(NULL, NULL, "-M", &M, NULL));
15 PetscCall(PetscOptionsGetInt(NULL, NULL, "-bs", &bs, NULL));
16 PetscCall(PetscOptionsGetReal(NULL, NULL, "-threshold", &threshold, NULL));
17 PetscCall(MatCreateDense(PETSC_COMM_WORLD, PETSC_DECIDE, PETSC_DECIDE, M, M, NULL, &D));
18 PetscCall(MatSetRandom(D, NULL));
19 PetscCall(MatTranspose(D, MAT_INITIAL_MATRIX, &A));
20 PetscCall(MatAXPY(D, 1.0, A, SAME_NONZERO_PATTERN));
21 PetscCall(MatDestroy(&A));
22 PetscCall(MatSetBlockSize(D, bs));
23 PetscCall(MatDuplicate(D, MAT_COPY_VALUES, &E));
24 PetscCall(MatViewFromOptions(D, NULL, "-input_dense"));
25 for (PetscInt i = 0; i < 2; ++i) {
26 PetscCall(MatConvert(D, MATAIJ, MAT_INITIAL_MATRIX, &A));
27 PetscCall(MatConvert(D, MATBAIJ, MAT_INITIAL_MATRIX, &B));
28 PetscCall(MatConvert(D, MATSBAIJ, MAT_INITIAL_MATRIX, &C));
29 if (i == 0) { // filtering, elimination, but no compression
30 PetscCall(MatViewFromOptions(A, NULL, "-input_aij"));
31 PetscCall(MatViewFromOptions(B, NULL, "-input_baij"));
32 PetscCall(MatViewFromOptions(C, NULL, "-input_sbaij"));
33 PetscCall(MatFilter(D, threshold, PETSC_FALSE, PETSC_FALSE));
34 PetscCall(MatFilter(A, threshold, PETSC_FALSE, PETSC_FALSE));
35 PetscCall(MatEliminateZeros(A, PETSC_TRUE));
36 PetscCall(MatFilter(B, threshold, PETSC_FALSE, PETSC_FALSE));
37 PetscCall(MatEliminateZeros(B, PETSC_TRUE));
38 PetscCall(MatFilter(C, threshold, PETSC_FALSE, PETSC_FALSE));
39 PetscCall(MatEliminateZeros(C, PETSC_TRUE));
40 } else { // filtering, elimination, and compression
41 PetscCall(MatFilter(D, threshold, PETSC_TRUE, PETSC_FALSE));
42 PetscCall(MatFilter(A, threshold, PETSC_TRUE, PETSC_FALSE));
43 PetscCall(MatFilter(B, threshold, PETSC_TRUE, PETSC_FALSE));
44 PetscCall(MatFilter(C, threshold, PETSC_TRUE, PETSC_FALSE));
45 }
46 PetscCall(MatViewFromOptions(D, NULL, "-output_dense"));
47 PetscCall(MatViewFromOptions(A, NULL, "-output_aij"));
48 PetscCall(MatViewFromOptions(B, NULL, "-output_baij"));
49 PetscCall(MatViewFromOptions(C, NULL, "-output_sbaij"));
50 PetscCall(MatMultEqual(D, A, 10, &flg));
51 PetscCheck(flg, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "A != D");
52 PetscCall(MatMultEqual(D, B, 10, &flg));
53 PetscCheck(flg, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "B != D");
54 PetscCall(MatMultEqual(D, C, 10, &flg));
55 PetscCheck(flg, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "C != D");
56 PetscCall(MatDestroy(&C));
57 PetscCall(MatDestroy(&B));
58 PetscCall(MatDestroy(&A));
59 PetscCall(MatDestroy(&D));
60 D = E;
61 }
62 PetscCall(PetscFinalize());
63 return 0;
64 }
65
66 /*TEST
67
68 test:
69 nsize: {{1 2}}
70 output_file: output/empty.out
71
72 TEST*/
73