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_MISSING_DIAGONAL, 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", "multAdd", "multTranspose", "multTransposeAdd", "solve", "solveAdd", "solveTranspose", "solveTransposeAdd", "SOR", "getDiagonal", "diagonalScale", "norm", "zeroEntries", "getDiagonalBlock", "duplicate", "copy", "scale", "shift", "setDiagonal", "zeroRowsColumns", "createSubMatrix", "getVecs", "conjugate", "realPart", "imagPart", "missingDiagonal", "multDiagonalBlock", "multHermitian", "multHermitianAdd"};

 12: PetscErrorCode RunHasOperationTest()
 13: {
 14:   Mat      A;
 15:   PetscInt matop, nop = PETSC_STATIC_ARRAY_LENGTH(optenum);

 17:   for (matop = 0; matop < nop; matop++) {
 18:     char      opts[256];
 19:     PetscBool hasop;
 20:     PetscInt  i;

 22:     PetscSNPrintf(opts, 256, "-enable %s", optstr[matop]);
 23:     PetscPrintf(PETSC_COMM_WORLD, "Testing with %s\n", opts);
 24:     MatCreate(PETSC_COMM_WORLD, &A);
 25:     MatSetSizes(A, PETSC_DECIDE, PETSC_DECIDE, 0, 0);
 26:     MatSetType(A, MATPYTHON);
 27:     MatPythonSetType(A, "ex140.py:Matrix");
 28:     /* default case, no user implementation */
 29:     for (i = 0; i < nop; i++) {
 30:       MatHasOperation(A, optenum[i], &hasop);
 31:       if (hasop) {
 32:         PetscPrintf(PETSC_COMM_WORLD, "  Error: %s present\n", optstr[i]);
 33:       } else {
 34:         PetscPrintf(PETSC_COMM_WORLD, "  Pass: %s\n", optstr[i]);
 35:       }
 36:     }
 37:     /* customize Matrix class at a later stage and add support for optenum[matop] */
 38:     PetscOptionsInsertString(NULL, opts);
 39:     MatSetFromOptions(A);
 40:     for (i = 0; i < nop; i++) {
 41:       MatHasOperation(A, optenum[i], &hasop);
 42:       if (hasop && i != matop) {
 43:         PetscPrintf(PETSC_COMM_WORLD, "  Error: %s present\n", optstr[i]);
 44:       } else if (!hasop && i == matop) {
 45:         PetscPrintf(PETSC_COMM_WORLD, "  Error: %s not present\n", optstr[i]);
 46:       } else {
 47:         PetscPrintf(PETSC_COMM_WORLD, "  Pass: %s\n", optstr[i]);
 48:       }
 49:     }
 50:     MatDestroy(&A);
 51:     PetscOptionsClearValue(NULL, opts);
 52:   }
 53:   return 0;
 54: }

 56: int main(int argc, char **argv)
 57: {
 59:   PetscInitialize(&argc, &argv, (char *)0, help);
 60:   PetscPythonInitialize(NULL, NULL);
 61:   RunHasOperationTest(); PetscPythonPrintError();
 62:   PetscFinalize();
 63:   return 0;
 64: }

 66: /*TEST

 68:    test:
 69:       requires: petsc4py
 70:       localrunfiles: ex140.py

 72: TEST*/