1 2 static char help[] = "Tests various routines in MatKAIJ format.\n"; 3 4 #include <petscmat.h> 5 #define IMAX 15 6 7 int main(int argc, char **args) 8 { 9 Mat A, B, TA; 10 PetscScalar *S, *T; 11 PetscViewer fd; 12 char file[PETSC_MAX_PATH_LEN]; 13 PetscInt m, n, M, N, p = 1, q = 1, i, j; 14 PetscMPIInt rank, size; 15 PetscBool flg; 16 17 PetscFunctionBeginUser; 18 PetscCall(PetscInitialize(&argc, &args, (char *)0, help)); 19 PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 20 PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size)); 21 22 /* Load AIJ matrix A */ 23 PetscCall(PetscOptionsGetString(NULL, NULL, "-f", file, sizeof(file), &flg)); 24 PetscCheck(flg, PETSC_COMM_WORLD, PETSC_ERR_USER, "Must indicate binary file with the -f option"); 25 PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, file, FILE_MODE_READ, &fd)); 26 PetscCall(MatCreate(PETSC_COMM_WORLD, &A)); 27 PetscCall(MatLoad(A, fd)); 28 PetscCall(PetscViewerDestroy(&fd)); 29 30 /* Get dof, then create S and T */ 31 PetscCall(PetscOptionsGetInt(NULL, NULL, "-p", &p, NULL)); 32 PetscCall(PetscOptionsGetInt(NULL, NULL, "-q", &q, NULL)); 33 PetscCall(PetscMalloc2(p * q, &S, p * q, &T)); 34 for (i = 0; i < p * q; i++) S[i] = 0; 35 36 for (i = 0; i < p; i++) { 37 for (j = 0; j < q; j++) { 38 /* Set some random non-zero values */ 39 S[i + p * j] = ((PetscReal)((i + 1) * (j + 1))) / ((PetscReal)(p + q)); 40 T[i + p * j] = ((PetscReal)((p - i) + j)) / ((PetscReal)(p * q)); 41 } 42 } 43 44 /* Test KAIJ when both S & T are not NULL */ 45 46 /* Create KAIJ matrix TA */ 47 PetscCall(MatCreateKAIJ(A, p, q, S, T, &TA)); 48 PetscCall(MatGetLocalSize(A, &m, &n)); 49 PetscCall(MatGetSize(A, &M, &N)); 50 51 PetscCall(MatConvert(TA, MATAIJ, MAT_INITIAL_MATRIX, &B)); 52 53 /* Test MatKAIJGetScaledIdentity() */ 54 PetscCall(MatKAIJGetScaledIdentity(TA, &flg)); 55 PetscCheck(!flg, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Error in Test 1: MatKAIJGetScaledIdentity()"); 56 /* Test MatMult() */ 57 PetscCall(MatMultEqual(TA, B, 10, &flg)); 58 PetscCheck(flg, PETSC_COMM_WORLD, PETSC_ERR_CONV_FAILED, "Error in Test 1: MatMult() for KAIJ matrix"); 59 /* Test MatMultAdd() */ 60 PetscCall(MatMultAddEqual(TA, B, 10, &flg)); 61 PetscCheck(flg, PETSC_COMM_WORLD, PETSC_ERR_CONV_FAILED, "Error in Test 1: MatMultAdd() for KAIJ matrix"); 62 63 PetscCall(MatDestroy(&TA)); 64 PetscCall(MatDestroy(&B)); 65 66 /* Test KAIJ when S is NULL */ 67 68 /* Create KAIJ matrix TA */ 69 PetscCall(MatCreateKAIJ(A, p, q, NULL, T, &TA)); 70 PetscCall(MatGetLocalSize(A, &m, &n)); 71 PetscCall(MatGetSize(A, &M, &N)); 72 73 PetscCall(MatConvert(TA, MATAIJ, MAT_INITIAL_MATRIX, &B)); 74 75 /* Test MatKAIJGetScaledIdentity() */ 76 PetscCall(MatKAIJGetScaledIdentity(TA, &flg)); 77 PetscCheck(!flg, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Error in Test 2: MatKAIJGetScaledIdentity()"); 78 /* Test MatMult() */ 79 PetscCall(MatMultEqual(TA, B, 10, &flg)); 80 PetscCheck(flg, PETSC_COMM_WORLD, PETSC_ERR_CONV_FAILED, "Error in Test 2: MatMult() for KAIJ matrix"); 81 /* Test MatMultAdd() */ 82 PetscCall(MatMultAddEqual(TA, B, 10, &flg)); 83 PetscCheck(flg, PETSC_COMM_WORLD, PETSC_ERR_CONV_FAILED, "Error in Test 2: MatMultAdd() for KAIJ matrix"); 84 85 PetscCall(MatDestroy(&TA)); 86 PetscCall(MatDestroy(&B)); 87 88 /* Test KAIJ when T is NULL */ 89 90 /* Create KAIJ matrix TA */ 91 PetscCall(MatCreateKAIJ(A, p, q, S, NULL, &TA)); 92 PetscCall(MatGetLocalSize(A, &m, &n)); 93 PetscCall(MatGetSize(A, &M, &N)); 94 95 PetscCall(MatConvert(TA, MATAIJ, MAT_INITIAL_MATRIX, &B)); 96 97 /* Test MatKAIJGetScaledIdentity() */ 98 PetscCall(MatKAIJGetScaledIdentity(TA, &flg)); 99 PetscCheck(!flg, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Error in Test 3: MatKAIJGetScaledIdentity()"); 100 /* Test MatMult() */ 101 PetscCall(MatMultEqual(TA, B, 10, &flg)); 102 PetscCheck(flg, PETSC_COMM_WORLD, PETSC_ERR_CONV_FAILED, "Error in Test 3: MatMult() for KAIJ matrix"); 103 /* Test MatMultAdd() */ 104 PetscCall(MatMultAddEqual(TA, B, 10, &flg)); 105 PetscCheck(flg, PETSC_COMM_WORLD, PETSC_ERR_CONV_FAILED, "Error in Test 3: MatMultAdd() for KAIJ matrix"); 106 107 PetscCall(MatDestroy(&TA)); 108 PetscCall(MatDestroy(&B)); 109 110 /* Test KAIJ when T is is an identity matrix */ 111 112 if (p == q) { 113 for (i = 0; i < p; i++) { 114 for (j = 0; j < q; j++) { 115 if (i == j) T[i + j * p] = 1.0; 116 else T[i + j * p] = 0.0; 117 } 118 } 119 120 /* Create KAIJ matrix TA */ 121 PetscCall(MatCreateKAIJ(A, p, q, S, T, &TA)); 122 PetscCall(MatGetLocalSize(A, &m, &n)); 123 PetscCall(MatGetSize(A, &M, &N)); 124 125 PetscCall(MatConvert(TA, MATAIJ, MAT_INITIAL_MATRIX, &B)); 126 127 /* Test MatKAIJGetScaledIdentity() */ 128 PetscCall(MatKAIJGetScaledIdentity(TA, &flg)); 129 PetscCheck(!flg, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Error in Test 4: MatKAIJGetScaledIdentity()"); 130 /* Test MatMult() */ 131 PetscCall(MatMultEqual(TA, B, 10, &flg)); 132 PetscCheck(flg, PETSC_COMM_WORLD, PETSC_ERR_CONV_FAILED, "Error in Test 4: MatMult() for KAIJ matrix"); 133 /* Test MatMultAdd() */ 134 PetscCall(MatMultAddEqual(TA, B, 10, &flg)); 135 PetscCheck(flg, PETSC_COMM_WORLD, PETSC_ERR_CONV_FAILED, "Error in Test 4: MatMultAdd() for KAIJ matrix"); 136 137 PetscCall(MatDestroy(&TA)); 138 PetscCall(MatDestroy(&B)); 139 140 PetscCall(MatCreateKAIJ(A, p, q, NULL, T, &TA)); 141 /* Test MatKAIJGetScaledIdentity() */ 142 PetscCall(MatKAIJGetScaledIdentity(TA, &flg)); 143 PetscCheck(flg, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Error in Test 5: MatKAIJGetScaledIdentity()"); 144 PetscCall(MatDestroy(&TA)); 145 146 for (i = 0; i < p; i++) { 147 for (j = 0; j < q; j++) { 148 if (i == j) S[i + j * p] = T[i + j * p] = 2.0; 149 else S[i + j * p] = T[i + j * p] = 0.0; 150 } 151 } 152 PetscCall(MatCreateKAIJ(A, p, q, S, T, &TA)); 153 /* Test MatKAIJGetScaledIdentity() */ 154 PetscCall(MatKAIJGetScaledIdentity(TA, &flg)); 155 PetscCheck(flg, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Error in Test 6: MatKAIJGetScaledIdentity()"); 156 PetscCall(MatDestroy(&TA)); 157 } 158 159 /* Done with all tests */ 160 161 PetscCall(PetscFree2(S, T)); 162 PetscCall(MatDestroy(&A)); 163 PetscCall(PetscFinalize()); 164 return 0; 165 } 166 167 /*TEST 168 169 build: 170 requires: !complex 171 172 test: 173 requires: datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES) 174 output_file: output/ex177.out 175 nsize: {{1 2 3 4}} 176 args: -f ${DATAFILESPATH}/matrices/small -p {{2 3 7}} -q {{3 7}} -viewer_binary_skip_info 177 178 TEST*/ 179