Actual source code: ex177.c
2: static char help[] = "Tests various routines in MatKAIJ format.\n";
4: #include <petscmat.h>
5: #define IMAX 15
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;
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));
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));
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;
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: }
44: /* Test KAIJ when both S & T are not NULL */
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));
51: PetscCall(MatConvert(TA, MATAIJ, MAT_INITIAL_MATRIX, &B));
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");
63: PetscCall(MatDestroy(&TA));
64: PetscCall(MatDestroy(&B));
66: /* Test KAIJ when S is NULL */
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));
73: PetscCall(MatConvert(TA, MATAIJ, MAT_INITIAL_MATRIX, &B));
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");
85: PetscCall(MatDestroy(&TA));
86: PetscCall(MatDestroy(&B));
88: /* Test KAIJ when T is NULL */
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));
95: PetscCall(MatConvert(TA, MATAIJ, MAT_INITIAL_MATRIX, &B));
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");
107: PetscCall(MatDestroy(&TA));
108: PetscCall(MatDestroy(&B));
110: /* Test KAIJ when T is is an identity matrix */
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: }
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));
125: PetscCall(MatConvert(TA, MATAIJ, MAT_INITIAL_MATRIX, &B));
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");
137: PetscCall(MatDestroy(&TA));
138: PetscCall(MatDestroy(&B));
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));
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: }
159: /* Done with all tests */
161: PetscCall(PetscFree2(S, T));
162: PetscCall(MatDestroy(&A));
163: PetscCall(PetscFinalize());
164: return 0;
165: }
167: /*TEST
169: build:
170: requires: !complex
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
178: TEST*/