Actual source code: ex276.c

  1: static char help[] = "Tests MatGetValues() with and without MAT_ROW_ORIENTED\n";

  3: #include <petscmat.h>

  5: int main(int argc, char **args)
  6: {
  7:   Mat          A, B, C, D, E;
  8:   PetscViewer  viewer;
  9:   PetscInt     rstart, rend, *rows, *cols;
 10:   PetscScalar *valuesA, *valuesB, *valuesC, *valuesD, *valuesE;
 11:   PetscBool    flg;

 13:   PetscFunctionBeginUser;
 14:   PetscCall(PetscInitialize(&argc, &args, NULL, help));
 15:   PetscCall(MatCreate(PETSC_COMM_WORLD, &A));
 16:   PetscCall(MatSetType(A, MATAIJ));
 17:   PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "${PETSC_DIR}/share/petsc/datafiles/matrices/spd-real-int32-float64", FILE_MODE_READ, &viewer));
 18:   PetscCall(MatLoad(A, viewer));
 19:   PetscCall(MatSetOption(A, MAT_SYMMETRIC, PETSC_TRUE));
 20:   PetscCall(PetscViewerDestroy(&viewer));

 22:   PetscCall(MatConvert(A, MATBAIJ, MAT_INITIAL_MATRIX, &B));
 23:   PetscCall(MatConvert(A, MATSBAIJ, MAT_INITIAL_MATRIX, &C));
 24:   PetscCall(MatConvert(A, MATSELL, MAT_INITIAL_MATRIX, &D));
 25:   PetscCall(MatConvert(A, MATDENSE, MAT_INITIAL_MATRIX, &E));

 27:   PetscCall(MatGetOwnershipRange(A, &rstart, &rend));
 28:   PetscCall(PetscMalloc2((rend - rstart - 2), &rows, 6, &cols));
 29:   for (PetscInt i = rstart + 1; i < rend - 1; i++) rows[i - rstart - 1] = i;
 30:   cols[0] = -1;
 31:   cols[1] = 1;
 32:   cols[2] = rstart;
 33:   cols[3] = rstart + 1;
 34:   cols[4] = rstart + 2;
 35:   cols[5] = rstart + 3;

 37:   PetscCall(PetscMalloc5((rend - rstart - 2) * 6, &valuesA, (rend - rstart - 2) * 6, &valuesB, (rend - rstart - 2) * 6, &valuesC, (rend - rstart - 2) * 6, &valuesD, (rend - rstart - 2) * 6, &valuesE));

 39:   PetscCall(PetscArrayzero(valuesA, 6 * (rend - rstart - 2)));
 40:   PetscCall(MatGetValues(A, rend - rstart - 2, rows, 6, cols, valuesA));
 41:   PetscCall(PetscArrayzero(valuesB, 6 * (rend - rstart - 2)));
 42:   PetscCall(MatGetValues(B, rend - rstart - 2, rows, 6, cols, valuesB));
 43:   PetscCall(PetscArrayzero(valuesC, 6 * (rend - rstart - 2)));
 44:   PetscCall(MatGetValues(C, rend - rstart - 2, rows, 6, cols, valuesC));
 45:   PetscCall(PetscArrayzero(valuesD, 6 * (rend - rstart - 2)));
 46:   PetscCall(MatGetValues(D, rend - rstart - 2, rows, 6, cols, valuesD));
 47:   PetscCall(PetscArrayzero(valuesE, 6 * (rend - rstart - 2)));
 48:   PetscCall(MatGetValues(E, rend - rstart - 2, rows, 6, cols, valuesE));

 50:   PetscCall(PetscArraycmp(valuesA, valuesB, 6 * (rend - rstart - 2), &flg));
 51:   PetscCheck(flg, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Error unexpected values from MatGetValues() valuesB");
 52:   // cannot compare with C since MatGetValues() on MATSBAIJ does not return all the entries
 53:   PetscCall(PetscArraycmp(valuesA, valuesD, 6 * (rend - rstart - 2), &flg));
 54:   PetscCheck(flg, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Error unexpected values from MatGetValues() valuesD");
 55:   PetscCall(PetscArraycmp(valuesA, valuesE, 6 * (rend - rstart - 2), &flg));
 56:   PetscCheck(flg, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Error unexpected values from MatGetValues() valuesE");

 58:   PetscCall(MatSetOption(A, MAT_ROW_ORIENTED, PETSC_FALSE));
 59:   PetscCall(MatSetOption(B, MAT_ROW_ORIENTED, PETSC_FALSE));
 60:   PetscCall(MatSetOption(C, MAT_ROW_ORIENTED, PETSC_FALSE));
 61:   PetscCall(MatSetOption(D, MAT_ROW_ORIENTED, PETSC_FALSE));
 62:   PetscCall(MatSetOption(E, MAT_ROW_ORIENTED, PETSC_FALSE));

 64:   PetscCall(PetscArrayzero(valuesA, 6 * (rend - rstart - 2)));
 65:   PetscCall(MatGetValues(A, rend - rstart - 2, rows, 6, cols, valuesA));
 66:   PetscCall(PetscArrayzero(valuesB, 6 * (rend - rstart - 2)));
 67:   PetscCall(MatGetValues(B, rend - rstart - 2, rows, 6, cols, valuesB));
 68:   PetscCall(PetscArrayzero(valuesC, 6 * (rend - rstart - 2)));
 69:   PetscCall(MatGetValues(C, rend - rstart - 2, rows, 6, cols, valuesC));
 70:   PetscCall(PetscArrayzero(valuesD, 6 * (rend - rstart - 2)));
 71:   PetscCall(MatGetValues(D, rend - rstart - 2, rows, 6, cols, valuesD));
 72:   PetscCall(PetscArrayzero(valuesE, 6 * (rend - rstart - 2)));
 73:   PetscCall(MatGetValues(E, rend - rstart - 2, rows, 6, cols, valuesE));

 75:   PetscCall(PetscArraycmp(valuesA, valuesB, 6 * (rend - rstart - 2), &flg));
 76:   PetscCheck(flg, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Error unexpected values from MatGetValues() MAT_ROW_ORIENTED false valuesB");
 77:   // cannot compare with C since MatGetValues() on MATSBAIJ does not return all the entries
 78:   PetscCall(PetscArraycmp(valuesA, valuesD, 6 * (rend - rstart - 2), &flg));
 79:   PetscCheck(flg, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Error unexpected values from MatGetValues() MAT_ROW_ORIENTED false valuesD");
 80:   PetscCall(PetscArraycmp(valuesA, valuesE, 6 * (rend - rstart - 2), &flg));
 81:   PetscCheck(flg, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Error unexpected values from MatGetValues() MAT_ROW_ORIENTED false valuesE");

 83:   PetscCall(PetscFree2(rows, cols));
 84:   PetscCall(PetscFree5(valuesA, valuesB, valuesC, valuesD, valuesE));
 85:   PetscCall(MatDestroy(&A));
 86:   PetscCall(MatDestroy(&B));
 87:   PetscCall(MatDestroy(&C));
 88:   PetscCall(MatDestroy(&D));
 89:   PetscCall(MatDestroy(&E));
 90:   PetscCall(PetscFinalize());
 91:   return 0;
 92: }

 94: /*TEST

 96:    test:
 97:       requires: double !complex !defined(PETSC_USE_64BIT_INDICES)
 98:       output_file: output/empty.out

100:    test:
101:       suffix: 2
102:       requires: double !complex !defined(PETSC_USE_64BIT_INDICES)
103:       nsize: 2
104:       output_file: output/empty.out

106: TEST*/