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