Actual source code: ex140.c

  1: static char help[] = "Tests MATPYTHON from C\n\n";

  3: #include <petscmat.h>
  4: /* MATPYTHON has support for wrapping these operations
  5:    MatHasOperation_Python inspects the user's Python class and checks
  6:    if the methods are provided */
  7: MatOperation optenum[] = {MATOP_MULT, MATOP_MULT_ADD, MATOP_MULT_TRANSPOSE, MATOP_MULT_TRANSPOSE_ADD, MATOP_SOLVE, MATOP_SOLVE_ADD, MATOP_SOLVE_TRANSPOSE, MATOP_SOLVE_TRANSPOSE_ADD, MATOP_SOR, MATOP_GET_DIAGONAL, MATOP_DIAGONAL_SCALE, MATOP_NORM, MATOP_ZERO_ENTRIES, MATOP_GET_DIAGONAL_BLOCK, MATOP_DUPLICATE, MATOP_COPY, MATOP_SCALE, MATOP_SHIFT, MATOP_DIAGONAL_SET, MATOP_ZERO_ROWS_COLUMNS, MATOP_CREATE_SUBMATRIX, MATOP_CREATE_VECS, MATOP_CONJUGATE, MATOP_REAL_PART, MATOP_IMAGINARY_PART, MATOP_MULT_DIAGONAL_BLOCK, MATOP_MULT_HERMITIAN_TRANSPOSE, MATOP_MULT_HERMITIAN_TRANS_ADD};

  9: /* Name of the methods in the user's Python class */
 10: const char *const optstr[] = {"mult",
 11:                               "multAdd",
 12:                               "multTranspose",
 13:                               "multTransposeAdd",
 14:                               "solve",
 15:                               "solveAdd",
 16:                               "solveTranspose",
 17:                               "solveTransposeAdd",
 18:                               "SOR",
 19:                               "getDiagonal",
 20:                               "diagonalScale",
 21:                               "norm",
 22:                               "zeroEntries",
 23:                               "getDiagonalBlock",
 24:                               "duplicate",
 25:                               "copy",
 26:                               "scale",
 27:                               "shift",
 28:                               "setDiagonal",
 29:                               "zeroRowsColumns",
 30:                               "createSubMatrix",
 31:                               "getVecs",
 32:                               "conjugate",
 33:                               "realPart",
 34:                               "imagPart",
 35:                               "multDiagonalBlock",
 36:                               "multHermitian",
 37:                               "multHermitianAdd"};

 39: PetscErrorCode RunHasOperationTest(void)
 40: {
 41:   Mat      A;
 42:   PetscInt matop, nop = PETSC_STATIC_ARRAY_LENGTH(optenum);

 44:   PetscFunctionBegin;
 45:   for (matop = 0; matop < nop; matop++) {
 46:     char      opts[256];
 47:     PetscBool hasop;
 48:     PetscInt  i;

 50:     PetscCall(PetscSNPrintf(opts, 256, "-enable %s", optstr[matop]));
 51:     PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Testing with %s\n", opts));
 52:     PetscCall(MatCreate(PETSC_COMM_WORLD, &A));
 53:     PetscCall(MatSetSizes(A, PETSC_DECIDE, PETSC_DECIDE, 0, 0));
 54:     PetscCall(MatSetType(A, MATPYTHON));
 55:     PetscCall(MatPythonSetType(A, "ex140.py:Matrix"));
 56:     /* default case, no user implementation */
 57:     for (i = 0; i < nop; i++) {
 58:       PetscCall(MatHasOperation(A, optenum[i], &hasop));
 59:       if (hasop) {
 60:         PetscCall(PetscPrintf(PETSC_COMM_WORLD, "  Error: %s present\n", optstr[i]));
 61:       } else {
 62:         PetscCall(PetscPrintf(PETSC_COMM_WORLD, "  Pass: %s\n", optstr[i]));
 63:       }
 64:     }
 65:     /* customize Matrix class at a later stage and add support for optenum[matop] */
 66:     PetscCall(PetscOptionsInsertString(NULL, opts));
 67:     PetscCall(MatSetFromOptions(A));
 68:     for (i = 0; i < nop; i++) {
 69:       PetscCall(MatHasOperation(A, optenum[i], &hasop));
 70:       if (hasop && i != matop) {
 71:         PetscCall(PetscPrintf(PETSC_COMM_WORLD, "  Error: %s present\n", optstr[i]));
 72:       } else if (!hasop && i == matop) {
 73:         PetscCall(PetscPrintf(PETSC_COMM_WORLD, "  Error: %s not present\n", optstr[i]));
 74:       } else {
 75:         PetscCall(PetscPrintf(PETSC_COMM_WORLD, "  Pass: %s\n", optstr[i]));
 76:       }
 77:     }
 78:     PetscCall(MatDestroy(&A));
 79:     PetscCall(PetscOptionsClearValue(NULL, opts));
 80:   }
 81:   PetscFunctionReturn(PETSC_SUCCESS);
 82: }

 84: int main(int argc, char **argv)
 85: {
 86:   PetscFunctionBeginUser;
 87:   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
 88:   PetscCall(PetscPythonInitialize(NULL, NULL));
 89:   PetscCall(RunHasOperationTest());
 90:   PetscCall(PetscPythonPrintError());
 91:   PetscCall(PetscFinalize());
 92:   return 0;
 93: }

 95: /*TEST

 97:    test:
 98:       requires: petsc4py
 99:       localrunfiles: ex140.py

101: TEST*/