xref: /petsc/src/mat/tests/ex216.c (revision c2a7d86ef01b770ffbb1635cf52c7b6b8913c627)
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