1 #include <petsc.h> 2 3 static char help[] = "Tests for MatEliminateZeros().\n\n"; 4 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