1 static char help[] = "Tests MATPYTHON from C\n\n"; 2 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, 8 MATOP_MULT_ADD, 9 MATOP_MULT_TRANSPOSE, 10 MATOP_MULT_TRANSPOSE_ADD, 11 MATOP_SOLVE, 12 MATOP_SOLVE_ADD, 13 MATOP_SOLVE_TRANSPOSE, 14 MATOP_SOLVE_TRANSPOSE_ADD, 15 MATOP_SOR, 16 MATOP_GET_DIAGONAL, 17 MATOP_DIAGONAL_SCALE, 18 MATOP_NORM, 19 MATOP_ZERO_ENTRIES, 20 MATOP_GET_DIAGONAL_BLOCK, 21 MATOP_DUPLICATE, 22 MATOP_COPY, 23 MATOP_SCALE, 24 MATOP_SHIFT, 25 MATOP_DIAGONAL_SET, 26 MATOP_ZERO_ROWS_COLUMNS, 27 MATOP_CREATE_SUBMATRIX, 28 MATOP_CREATE_VECS, 29 MATOP_CONJUGATE, 30 MATOP_REAL_PART, 31 MATOP_IMAGINARY_PART, 32 MATOP_MISSING_DIAGONAL, 33 MATOP_MULT_DIAGONAL_BLOCK, 34 MATOP_MULT_HERMITIAN_TRANSPOSE, 35 MATOP_MULT_HERMITIAN_TRANS_ADD}; 36 37 /* Name of the methods in the user's Python class */ 38 const char* const optstr[] = {"mult", 39 "multAdd", 40 "multTranspose", 41 "multTransposeAdd", 42 "solve", 43 "solveAdd", 44 "solveTranspose", 45 "solveTransposeAdd", 46 "SOR", 47 "getDiagonal", 48 "diagonalScale", 49 "norm", 50 "zeroEntries", 51 "getDiagonalBlock", 52 "duplicate", 53 "copy", 54 "scale", 55 "shift", 56 "setDiagonal", 57 "zeroRowsColumns", 58 "createSubMatrix", 59 "getVecs", 60 "conjugate", 61 "realPart", 62 "imagPart", 63 "missingDiagonal", 64 "multDiagonalBlock", 65 "multHermitian", 66 "multHermitianAdd"}; 67 68 PetscErrorCode RunHasOperationTest() 69 { 70 Mat A; 71 PetscInt matop, nop = sizeof(optenum)/sizeof(optenum[0]); 72 73 PetscFunctionBegin; 74 for (matop = 0; matop < nop; matop++) { 75 char opts[256]; 76 PetscBool hasop; 77 PetscInt i; 78 79 PetscCall(PetscSNPrintf(opts,256,"-enable %s",optstr[matop])); 80 PetscCall(PetscPrintf(PETSC_COMM_WORLD,"Testing with %s\n",opts)); 81 PetscCall(MatCreate(PETSC_COMM_WORLD,&A)); 82 PetscCall(MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,0,0)); 83 PetscCall(MatSetType(A,MATPYTHON)); 84 PetscCall(MatPythonSetType(A,"ex140.py:Matrix")); 85 /* default case, no user implementation */ 86 for (i = 0; i < nop; i++) { 87 PetscCall(MatHasOperation(A,optenum[i],&hasop)); 88 if (hasop) { 89 PetscCall(PetscPrintf(PETSC_COMM_WORLD," Error: %s present\n",optstr[i])); 90 } else { 91 PetscCall(PetscPrintf(PETSC_COMM_WORLD," Pass: %s\n",optstr[i])); 92 } 93 } 94 /* customize Matrix class at a later stage and add support for optenum[matop] */ 95 PetscCall(PetscOptionsInsertString(NULL,opts)); 96 PetscCall(MatSetFromOptions(A)); 97 for (i = 0; i < nop; i++) { 98 PetscCall(MatHasOperation(A,optenum[i],&hasop)); 99 if (hasop && i != matop) { 100 PetscCall(PetscPrintf(PETSC_COMM_WORLD," Error: %s present\n",optstr[i])); 101 } else if (!hasop && i == matop) { 102 PetscCall(PetscPrintf(PETSC_COMM_WORLD," Error: %s not present\n",optstr[i])); 103 } else { 104 PetscCall(PetscPrintf(PETSC_COMM_WORLD," Pass: %s\n",optstr[i])); 105 } 106 } 107 PetscCall(MatDestroy(&A)); 108 PetscCall(PetscOptionsClearValue(NULL,opts)); 109 } 110 PetscFunctionReturn(0); 111 } 112 113 int main(int argc,char **argv) 114 { 115 116 PetscCall(PetscInitialize(&argc,&argv,(char*) 0,help)); 117 PetscCall(PetscPythonInitialize(NULL,NULL)); 118 PetscCall(RunHasOperationTest();PetscPythonPrintError()); 119 PetscCall(PetscFinalize()); 120 return 0; 121 } 122 123 /*TEST 124 125 test: 126 requires: petsc4py 127 localrunfiles: ex140.py 128 129 TEST*/ 130