xref: /petsc/src/mat/tests/ex114.c (revision 9371c9d470a9602b6d10a8bf50c9b2280a79e45a)
1c4762a1bSJed Brown 
2c4762a1bSJed Brown static char help[] = "Tests MatGetRowMax(), MatGetRowMin(), MatGetRowMaxAbs()\n";
3c4762a1bSJed Brown 
4c4762a1bSJed Brown #include <petscmat.h>
5c4762a1bSJed Brown 
6c4762a1bSJed Brown #define M 5
7c4762a1bSJed Brown #define N 6
8c4762a1bSJed Brown 
9*9371c9d4SSatish Balay int main(int argc, char **args) {
10c4762a1bSJed Brown   Mat         A;
11fa213d2fSHong Zhang   Vec         min, max, maxabs, e;
124e879edeSHong Zhang   PetscInt    m, n, j, imin[M], imax[M], imaxabs[M], indices[N], row, testcase = 0;
13c4762a1bSJed Brown   PetscScalar values[N];
141a254869SHong Zhang   PetscMPIInt size, rank;
15fa213d2fSHong Zhang   PetscReal   enorm;
16c4762a1bSJed Brown 
17327415f7SBarry Smith   PetscFunctionBeginUser;
189566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &args, (char *)0, help));
199566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
209566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
219566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetInt(NULL, NULL, "-testcase", &testcase, NULL));
22c4762a1bSJed Brown 
239566063dSJacob Faibussowitsch   PetscCall(MatCreate(PETSC_COMM_WORLD, &A));
241a254869SHong Zhang   if (testcase == 1) { /* proc[0] holds entire A and other processes have no entry */
25dd400576SPatrick Sanan     if (rank == 0) {
269566063dSJacob Faibussowitsch       PetscCall(MatSetSizes(A, M, N, PETSC_DECIDE, PETSC_DECIDE));
271a254869SHong Zhang     } else {
289566063dSJacob Faibussowitsch       PetscCall(MatSetSizes(A, 0, 0, PETSC_DECIDE, PETSC_DECIDE));
291a254869SHong Zhang     }
301a254869SHong Zhang     testcase = 0;
311a254869SHong Zhang   } else {
329566063dSJacob Faibussowitsch     PetscCall(MatSetSizes(A, PETSC_DECIDE, PETSC_DECIDE, M, N));
331a254869SHong Zhang   }
349566063dSJacob Faibussowitsch   PetscCall(MatSetFromOptions(A));
359566063dSJacob Faibussowitsch   PetscCall(MatSetUp(A));
361a254869SHong Zhang 
37dd400576SPatrick Sanan   if (rank == 0) { /* proc[0] sets matrix A */
381a254869SHong Zhang     for (j = 0; j < N; j++) indices[j] = j;
391a254869SHong Zhang     switch (testcase) {
40*9371c9d4SSatish Balay     case 1: /* see testcast 0 */ break;
411a254869SHong Zhang     case 2:
42c4762a1bSJed Brown       row       = 0;
43*9371c9d4SSatish Balay       values[0] = -2.0;
44*9371c9d4SSatish Balay       values[1] = -2.0;
45*9371c9d4SSatish Balay       values[2] = -2.0;
46*9371c9d4SSatish Balay       values[3] = -4.0;
47*9371c9d4SSatish Balay       values[4] = 1.0;
48*9371c9d4SSatish Balay       values[5] = 1.0;
499566063dSJacob Faibussowitsch       PetscCall(MatSetValues(A, 1, &row, N, indices, values, INSERT_VALUES));
501a254869SHong Zhang       row        = 2;
51*9371c9d4SSatish Balay       indices[0] = 0;
52*9371c9d4SSatish Balay       indices[1] = 3;
53*9371c9d4SSatish Balay       indices[2] = 5;
54*9371c9d4SSatish Balay       values[0]  = -2.0;
55*9371c9d4SSatish Balay       values[1]  = -2.0;
56*9371c9d4SSatish Balay       values[2]  = -2.0;
579566063dSJacob Faibussowitsch       PetscCall(MatSetValues(A, 1, &row, 3, indices, values, INSERT_VALUES));
581a254869SHong Zhang       row        = 3;
59*9371c9d4SSatish Balay       indices[0] = 0;
60*9371c9d4SSatish Balay       indices[1] = 1;
61*9371c9d4SSatish Balay       indices[2] = 4;
62*9371c9d4SSatish Balay       values[0]  = -2.0;
63*9371c9d4SSatish Balay       values[1]  = -2.0;
64*9371c9d4SSatish Balay       values[2]  = -2.0;
659566063dSJacob Faibussowitsch       PetscCall(MatSetValues(A, 1, &row, 3, indices, values, INSERT_VALUES));
66c4762a1bSJed Brown       row        = 4;
67*9371c9d4SSatish Balay       indices[0] = 0;
68*9371c9d4SSatish Balay       indices[1] = 1;
69*9371c9d4SSatish Balay       indices[2] = 2;
70*9371c9d4SSatish Balay       values[0]  = -2.0;
71*9371c9d4SSatish Balay       values[1]  = -2.0;
72*9371c9d4SSatish Balay       values[2]  = -2.0;
739566063dSJacob Faibussowitsch       PetscCall(MatSetValues(A, 1, &row, 3, indices, values, INSERT_VALUES));
741a254869SHong Zhang       break;
751a254869SHong Zhang     case 3:
761a254869SHong Zhang       row       = 0;
77*9371c9d4SSatish Balay       values[0] = -2.0;
78*9371c9d4SSatish Balay       values[1] = -2.0;
79*9371c9d4SSatish Balay       values[2] = -2.0;
809566063dSJacob Faibussowitsch       PetscCall(MatSetValues(A, 1, &row, 3, indices + 1, values, INSERT_VALUES));
811a254869SHong Zhang       row       = 1;
82*9371c9d4SSatish Balay       values[0] = -2.0;
83*9371c9d4SSatish Balay       values[1] = -2.0;
84*9371c9d4SSatish Balay       values[2] = -2.0;
859566063dSJacob Faibussowitsch       PetscCall(MatSetValues(A, 1, &row, 3, indices, values, INSERT_VALUES));
861a254869SHong Zhang       row       = 2;
87*9371c9d4SSatish Balay       values[0] = -2.0;
88*9371c9d4SSatish Balay       values[1] = -2.0;
89*9371c9d4SSatish Balay       values[2] = -2.0;
909566063dSJacob Faibussowitsch       PetscCall(MatSetValues(A, 1, &row, 3, indices, values, INSERT_VALUES));
911a254869SHong Zhang       row       = 3;
92*9371c9d4SSatish Balay       values[0] = -2.0;
93*9371c9d4SSatish Balay       values[1] = -2.0;
94*9371c9d4SSatish Balay       values[2] = -2.0;
95*9371c9d4SSatish Balay       values[3] = -1.0;
969566063dSJacob Faibussowitsch       PetscCall(MatSetValues(A, 1, &row, 4, indices, values, INSERT_VALUES));
971a254869SHong Zhang       row       = 4;
98*9371c9d4SSatish Balay       values[0] = -2.0;
99*9371c9d4SSatish Balay       values[1] = -2.0;
100*9371c9d4SSatish Balay       values[2] = -2.0;
101*9371c9d4SSatish Balay       values[3] = -1.0;
1029566063dSJacob Faibussowitsch       PetscCall(MatSetValues(A, 1, &row, 4, indices, values, INSERT_VALUES));
1031a254869SHong Zhang       break;
1041a254869SHong Zhang 
1051a254869SHong Zhang     default:
1061a254869SHong Zhang       row       = 0;
107*9371c9d4SSatish Balay       values[0] = -1.0;
108*9371c9d4SSatish Balay       values[1] = 0.0;
109*9371c9d4SSatish Balay       values[2] = 1.0;
110*9371c9d4SSatish Balay       values[3] = 3.0;
111*9371c9d4SSatish Balay       values[4] = 4.0;
112*9371c9d4SSatish Balay       values[5] = -5.0;
1139566063dSJacob Faibussowitsch       PetscCall(MatSetValues(A, 1, &row, N, indices, values, INSERT_VALUES));
1141a254869SHong Zhang       row = 1;
1159566063dSJacob Faibussowitsch       PetscCall(MatSetValues(A, 1, &row, 3, indices, values, INSERT_VALUES));
1161a254869SHong Zhang       row = 3;
1179566063dSJacob Faibussowitsch       PetscCall(MatSetValues(A, 1, &row, 1, indices + 4, values + 4, INSERT_VALUES));
118c4762a1bSJed Brown       row = 4;
1199566063dSJacob Faibussowitsch       PetscCall(MatSetValues(A, 1, &row, 2, indices + 4, values + 4, INSERT_VALUES));
1201a254869SHong Zhang     }
1211a254869SHong Zhang   }
1229566063dSJacob Faibussowitsch   PetscCall(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY));
1239566063dSJacob Faibussowitsch   PetscCall(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY));
1249566063dSJacob Faibussowitsch   PetscCall(MatView(A, PETSC_VIEWER_STDOUT_WORLD));
125c4762a1bSJed Brown 
1269566063dSJacob Faibussowitsch   PetscCall(MatGetLocalSize(A, &m, &n));
1279566063dSJacob Faibussowitsch   PetscCall(VecCreate(PETSC_COMM_WORLD, &min));
1289566063dSJacob Faibussowitsch   PetscCall(VecSetSizes(min, m, PETSC_DECIDE));
1299566063dSJacob Faibussowitsch   PetscCall(VecSetFromOptions(min));
1309566063dSJacob Faibussowitsch   PetscCall(VecDuplicate(min, &max));
1319566063dSJacob Faibussowitsch   PetscCall(VecDuplicate(min, &maxabs));
1329566063dSJacob Faibussowitsch   PetscCall(VecDuplicate(min, &e));
133c4762a1bSJed Brown 
134f07e67edSHong Zhang   /* MatGetRowMax() */
1359566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "\n MatGetRowMax\n"));
1369566063dSJacob Faibussowitsch   PetscCall(MatGetRowMax(A, max, NULL));
1379566063dSJacob Faibussowitsch   PetscCall(MatGetRowMax(A, max, imax));
1389566063dSJacob Faibussowitsch   PetscCall(VecView(max, PETSC_VIEWER_STDOUT_WORLD));
1399566063dSJacob Faibussowitsch   PetscCall(VecGetLocalSize(max, &n));
1409566063dSJacob Faibussowitsch   PetscCall(PetscIntView(n, imax, PETSC_VIEWER_STDOUT_WORLD));
141fa213d2fSHong Zhang 
142f07e67edSHong Zhang   /* MatGetRowMin() */
1439566063dSJacob Faibussowitsch   PetscCall(MatScale(A, -1.0));
1449566063dSJacob Faibussowitsch   PetscCall(MatView(A, PETSC_VIEWER_STDOUT_WORLD));
1459566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "\n MatGetRowMin\n"));
1469566063dSJacob Faibussowitsch   PetscCall(MatGetRowMin(A, min, NULL));
1479566063dSJacob Faibussowitsch   PetscCall(MatGetRowMin(A, min, imin));
148fa213d2fSHong Zhang 
1499566063dSJacob Faibussowitsch   PetscCall(VecWAXPY(e, 1.0, max, min)); /* e = max + min */
1509566063dSJacob Faibussowitsch   PetscCall(VecNorm(e, NORM_INFINITY, &enorm));
151e00437b9SBarry Smith   PetscCheck(enorm <= PETSC_MACHINE_EPSILON, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "max+min > PETSC_MACHINE_EPSILON ");
152*9371c9d4SSatish Balay   for (j = 0; j < n; j++) { PetscCheck(imin[j] == imax[j], PETSC_COMM_SELF, PETSC_ERR_PLIB, "imin[%" PetscInt_FMT "] %" PetscInt_FMT " != imax %" PetscInt_FMT, j, imin[j], imax[j]); }
153fa213d2fSHong Zhang 
154f07e67edSHong Zhang   /* MatGetRowMaxAbs() */
1559566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "\n MatGetRowMaxAbs\n"));
1569566063dSJacob Faibussowitsch   PetscCall(MatGetRowMaxAbs(A, maxabs, NULL));
1579566063dSJacob Faibussowitsch   PetscCall(MatGetRowMaxAbs(A, maxabs, imaxabs));
1589566063dSJacob Faibussowitsch   PetscCall(VecView(maxabs, PETSC_VIEWER_STDOUT_WORLD));
1599566063dSJacob Faibussowitsch   PetscCall(PetscIntView(n, imaxabs, PETSC_VIEWER_STDOUT_WORLD));
1601a254869SHong Zhang 
161f07e67edSHong Zhang   /* MatGetRowMinAbs() */
1629566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "\n MatGetRowMinAbs\n"));
1639566063dSJacob Faibussowitsch   PetscCall(MatGetRowMinAbs(A, min, NULL));
1649566063dSJacob Faibussowitsch   PetscCall(MatGetRowMinAbs(A, min, imin));
1659566063dSJacob Faibussowitsch   PetscCall(VecView(min, PETSC_VIEWER_STDOUT_WORLD));
1669566063dSJacob Faibussowitsch   PetscCall(PetscIntView(n, imin, PETSC_VIEWER_STDOUT_WORLD));
167f07e67edSHong Zhang 
168f07e67edSHong Zhang   if (size == 1) {
169f07e67edSHong Zhang     /* Test MatGetRowMax, MatGetRowMin and MatGetRowMaxAbs for SeqDense and MPIBAIJ matrix */
1704e879edeSHong Zhang     Mat Adense;
1714e879edeSHong Zhang     Vec max_d, maxabs_d;
1729566063dSJacob Faibussowitsch     PetscCall(VecDuplicate(min, &max_d));
1739566063dSJacob Faibussowitsch     PetscCall(VecDuplicate(min, &maxabs_d));
174f07e67edSHong Zhang 
1759566063dSJacob Faibussowitsch     PetscCall(MatScale(A, -1.0));
1769566063dSJacob Faibussowitsch     PetscCall(MatConvert(A, MATDENSE, MAT_INITIAL_MATRIX, &Adense));
1779566063dSJacob Faibussowitsch     PetscCall(PetscPrintf(PETSC_COMM_WORLD, "MatGetRowMax for seqdense matrix\n"));
1789566063dSJacob Faibussowitsch     PetscCall(MatGetRowMax(Adense, max_d, imax));
1794e879edeSHong Zhang 
1809566063dSJacob Faibussowitsch     PetscCall(VecWAXPY(e, -1.0, max, max_d)); /* e = -max + max_d */
1819566063dSJacob Faibussowitsch     PetscCall(VecNorm(e, NORM_INFINITY, &enorm));
182e00437b9SBarry Smith     PetscCheck(enorm <= PETSC_MACHINE_EPSILON, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "norm(-max + max_d) %g > PETSC_MACHINE_EPSILON", (double)enorm);
1834e879edeSHong Zhang 
1849566063dSJacob Faibussowitsch     PetscCall(MatScale(Adense, -1.0));
1859566063dSJacob Faibussowitsch     PetscCall(PetscPrintf(PETSC_COMM_WORLD, "MatGetRowMin for seqdense matrix\n"));
1869566063dSJacob Faibussowitsch     PetscCall(MatGetRowMin(Adense, min, imin));
187f07e67edSHong Zhang 
1889566063dSJacob Faibussowitsch     PetscCall(VecWAXPY(e, 1.0, max, min)); /* e = max + min */
1899566063dSJacob Faibussowitsch     PetscCall(VecNorm(e, NORM_INFINITY, &enorm));
190e00437b9SBarry Smith     PetscCheck(enorm <= PETSC_MACHINE_EPSILON, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "max+min > PETSC_MACHINE_EPSILON ");
191*9371c9d4SSatish Balay     for (j = 0; j < n; j++) { PetscCheck(imin[j] == imax[j], PETSC_COMM_SELF, PETSC_ERR_PLIB, "imin[%" PetscInt_FMT "] %" PetscInt_FMT " != imax %" PetscInt_FMT " for seqdense matrix", j, imin[j], imax[j]); }
192f07e67edSHong Zhang 
1939566063dSJacob Faibussowitsch     PetscCall(PetscPrintf(PETSC_COMM_WORLD, "MatGetRowMaxAbs for seqdense matrix\n"));
1949566063dSJacob Faibussowitsch     PetscCall(MatGetRowMaxAbs(Adense, maxabs_d, imaxabs));
1959566063dSJacob Faibussowitsch     PetscCall(VecWAXPY(e, -1.0, maxabs, maxabs_d)); /* e = -maxabs + maxabs_d */
1969566063dSJacob Faibussowitsch     PetscCall(VecNorm(e, NORM_INFINITY, &enorm));
197e00437b9SBarry Smith     PetscCheck(enorm <= PETSC_MACHINE_EPSILON, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "norm(-maxabs + maxabs_d) %g > PETSC_MACHINE_EPSILON", (double)enorm);
198c4762a1bSJed Brown 
1999566063dSJacob Faibussowitsch     PetscCall(MatDestroy(&Adense));
2009566063dSJacob Faibussowitsch     PetscCall(VecDestroy(&max_d));
2019566063dSJacob Faibussowitsch     PetscCall(VecDestroy(&maxabs_d));
20243359b5eSHong Zhang   }
20343359b5eSHong Zhang 
20443359b5eSHong Zhang   { /* BAIJ matrix */
2054e879edeSHong Zhang     Mat                B;
20643359b5eSHong Zhang     Vec                maxabsB, maxabsB2;
20743359b5eSHong Zhang     PetscInt           bs = 2, *imaxabsB, *imaxabsB2, rstart, rend, cstart, cend, ncols, col, Brows[2], Bcols[2];
20843359b5eSHong Zhang     const PetscInt    *cols;
20943359b5eSHong Zhang     const PetscScalar *vals, *vals2;
21043359b5eSHong Zhang     PetscScalar        Bvals[4];
21143359b5eSHong Zhang 
2129566063dSJacob Faibussowitsch     PetscCall(PetscMalloc2(M, &imaxabsB, bs * M, &imaxabsB2));
21343359b5eSHong Zhang 
21443359b5eSHong Zhang     /* bs = 1 */
2159566063dSJacob Faibussowitsch     PetscCall(MatConvert(A, MATMPIBAIJ, MAT_INITIAL_MATRIX, &B));
2169566063dSJacob Faibussowitsch     PetscCall(VecDuplicate(min, &maxabsB));
2179566063dSJacob Faibussowitsch     PetscCall(MatGetRowMaxAbs(B, maxabsB, NULL));
2189566063dSJacob Faibussowitsch     PetscCall(MatGetRowMaxAbs(B, maxabsB, imaxabsB));
2199566063dSJacob Faibussowitsch     PetscCall(PetscPrintf(PETSC_COMM_WORLD, "\n MatGetRowMaxAbs for BAIJ matrix\n"));
2209566063dSJacob Faibussowitsch     PetscCall(VecWAXPY(e, -1.0, maxabs, maxabsB)); /* e = -maxabs + maxabsB */
2219566063dSJacob Faibussowitsch     PetscCall(VecNorm(e, NORM_INFINITY, &enorm));
222e00437b9SBarry Smith     PetscCheck(enorm <= PETSC_MACHINE_EPSILON, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "norm(-maxabs + maxabs_d) %g > PETSC_MACHINE_EPSILON", (double)enorm);
2234e879edeSHong Zhang 
224*9371c9d4SSatish Balay     for (j = 0; j < n; j++) { PetscCheck(imaxabs[j] == imaxabsB[j], PETSC_COMM_SELF, PETSC_ERR_PLIB, "imaxabs[%" PetscInt_FMT "] %" PetscInt_FMT " != imaxabsB %" PetscInt_FMT, j, imin[j], imax[j]); }
2259566063dSJacob Faibussowitsch     PetscCall(MatDestroy(&B));
22643359b5eSHong Zhang 
22743359b5eSHong Zhang     /* Test bs = 2: Create B with bs*bs block structure of A */
2289566063dSJacob Faibussowitsch     PetscCall(VecCreate(PETSC_COMM_WORLD, &maxabsB2));
2299566063dSJacob Faibussowitsch     PetscCall(VecSetSizes(maxabsB2, bs * m, PETSC_DECIDE));
2309566063dSJacob Faibussowitsch     PetscCall(VecSetFromOptions(maxabsB2));
23143359b5eSHong Zhang 
2329566063dSJacob Faibussowitsch     PetscCall(MatGetOwnershipRange(A, &rstart, &rend));
2339566063dSJacob Faibussowitsch     PetscCall(MatGetOwnershipRangeColumn(A, &cstart, &cend));
2349566063dSJacob Faibussowitsch     PetscCall(MatCreate(PETSC_COMM_WORLD, &B));
2359566063dSJacob Faibussowitsch     PetscCall(MatSetSizes(B, bs * (rend - rstart), bs * (cend - cstart), PETSC_DECIDE, PETSC_DECIDE));
2369566063dSJacob Faibussowitsch     PetscCall(MatSetFromOptions(B));
2379566063dSJacob Faibussowitsch     PetscCall(MatSetUp(B));
23843359b5eSHong Zhang 
23943359b5eSHong Zhang     for (row = rstart; row < rend; row++) {
2409566063dSJacob Faibussowitsch       PetscCall(MatGetRow(A, row, &ncols, &cols, &vals));
24143359b5eSHong Zhang       for (col = 0; col < ncols; col++) {
24243359b5eSHong Zhang         for (j = 0; j < bs; j++) {
24343359b5eSHong Zhang           Brows[j] = bs * row + j;
24443359b5eSHong Zhang           Bcols[j] = bs * cols[col] + j;
24543359b5eSHong Zhang         }
24643359b5eSHong Zhang         for (j = 0; j < bs * bs; j++) Bvals[j] = vals[col];
2479566063dSJacob Faibussowitsch         PetscCall(MatSetValues(B, bs, Brows, bs, Bcols, Bvals, INSERT_VALUES));
24843359b5eSHong Zhang       }
2499566063dSJacob Faibussowitsch       PetscCall(MatRestoreRow(A, row, &ncols, &cols, &vals));
25043359b5eSHong Zhang     }
2519566063dSJacob Faibussowitsch     PetscCall(MatAssemblyBegin(B, MAT_FINAL_ASSEMBLY));
2529566063dSJacob Faibussowitsch     PetscCall(MatAssemblyEnd(B, MAT_FINAL_ASSEMBLY));
25343359b5eSHong Zhang 
2549566063dSJacob Faibussowitsch     PetscCall(MatGetRowMaxAbs(B, maxabsB2, imaxabsB2));
25543359b5eSHong Zhang 
25643359b5eSHong Zhang     /* Check maxabsB2 and imaxabsB2 */
2579566063dSJacob Faibussowitsch     PetscCall(VecGetArrayRead(maxabsB, &vals));
2589566063dSJacob Faibussowitsch     PetscCall(VecGetArrayRead(maxabsB2, &vals2));
259*9371c9d4SSatish Balay     for (row = 0; row < m; row++) { PetscCheck(PetscAbsScalar(vals[row] - vals2[bs * row]) <= PETSC_MACHINE_EPSILON, PETSC_COMM_SELF, PETSC_ERR_PLIB, "row %" PetscInt_FMT " maxabsB != maxabsB2", row); }
2609566063dSJacob Faibussowitsch     PetscCall(VecRestoreArrayRead(maxabsB, &vals));
2619566063dSJacob Faibussowitsch     PetscCall(VecRestoreArrayRead(maxabsB2, &vals2));
26243359b5eSHong Zhang 
263*9371c9d4SSatish Balay     for (col = 0; col < n; col++) { PetscCheck(imaxabsB[col] == imaxabsB2[bs * col] / bs, PETSC_COMM_SELF, PETSC_ERR_PLIB, "col %" PetscInt_FMT " imaxabsB != imaxabsB2", col); }
2649566063dSJacob Faibussowitsch     PetscCall(VecDestroy(&maxabsB));
2659566063dSJacob Faibussowitsch     PetscCall(MatDestroy(&B));
2669566063dSJacob Faibussowitsch     PetscCall(VecDestroy(&maxabsB2));
2679566063dSJacob Faibussowitsch     PetscCall(PetscFree2(imaxabsB, imaxabsB2));
268c4762a1bSJed Brown   }
269c4762a1bSJed Brown 
2709566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&min));
2719566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&max));
2729566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&maxabs));
2739566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&e));
2749566063dSJacob Faibussowitsch   PetscCall(MatDestroy(&A));
2759566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
276b122ec5aSJacob Faibussowitsch   return 0;
277c4762a1bSJed Brown }
278c4762a1bSJed Brown 
279c4762a1bSJed Brown /*TEST
280c4762a1bSJed Brown 
281c4762a1bSJed Brown    test:
282c4762a1bSJed Brown       output_file: output/ex114.out
283c4762a1bSJed Brown 
284c4762a1bSJed Brown    test:
285c4762a1bSJed Brown       suffix: 2
2864e879edeSHong Zhang       args: -testcase 1
2874e879edeSHong Zhang       output_file: output/ex114.out
288c4762a1bSJed Brown 
289c4762a1bSJed Brown    test:
290c4762a1bSJed Brown       suffix: 3
2914e879edeSHong Zhang       args: -testcase 2
2924e879edeSHong Zhang       output_file: output/ex114_3.out
2934e879edeSHong Zhang 
2944e879edeSHong Zhang    test:
2954e879edeSHong Zhang       suffix: 4
2964e879edeSHong Zhang       args: -testcase 3
2974e879edeSHong Zhang       output_file: output/ex114_4.out
2984e879edeSHong Zhang 
2994e879edeSHong Zhang    test:
3004e879edeSHong Zhang       suffix: 5
3014e879edeSHong Zhang       nsize: 3
3024e879edeSHong Zhang       args: -testcase 0
3034e879edeSHong Zhang       output_file: output/ex114_5.out
3044e879edeSHong Zhang 
3054e879edeSHong Zhang    test:
3064e879edeSHong Zhang       suffix: 6
3074e879edeSHong Zhang       nsize: 3
3084e879edeSHong Zhang       args: -testcase 1
3094e879edeSHong Zhang       output_file: output/ex114_6.out
3104e879edeSHong Zhang 
3114e879edeSHong Zhang    test:
3124e879edeSHong Zhang       suffix: 7
3134e879edeSHong Zhang       nsize: 3
3144e879edeSHong Zhang       args: -testcase 2
3154e879edeSHong Zhang       output_file: output/ex114_7.out
3164e879edeSHong Zhang 
3174e879edeSHong Zhang    test:
3184e879edeSHong Zhang       suffix: 8
3194e879edeSHong Zhang       nsize: 3
3204e879edeSHong Zhang       args: -testcase 3
3214e879edeSHong Zhang       output_file: output/ex114_8.out
322c4762a1bSJed Brown 
323c4762a1bSJed Brown TEST*/
324