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