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