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(PetscInt); 72 PetscErrorCode ierr; 73 74 PetscFunctionBegin; 75 for (matop = 0; matop < nop; matop++) { 76 char opts[256]; 77 PetscBool hasop; 78 PetscInt i; 79 80 ierr = PetscSNPrintf(opts,256,"-enable %s",optstr[matop]);CHKERRQ(ierr); 81 ierr = PetscPrintf(PETSC_COMM_WORLD,"Testing with %s\n",opts);CHKERRQ(ierr); 82 ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr); 83 ierr = MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,0,0);CHKERRQ(ierr); 84 ierr = MatSetType(A,MATPYTHON);CHKERRQ(ierr); 85 ierr = MatPythonSetType(A,"ex140.py:Matrix");CHKERRQ(ierr); 86 /* default case, no user implementation */ 87 for (i = 0; i < nop; i++) { 88 ierr = MatHasOperation(A,optenum[i],&hasop);CHKERRQ(ierr); 89 if (hasop) { 90 ierr = PetscPrintf(PETSC_COMM_WORLD," Error: %s present\n",optstr[i]);CHKERRQ(ierr); 91 } else { 92 ierr = PetscPrintf(PETSC_COMM_WORLD," Pass: %s\n",optstr[i]);CHKERRQ(ierr); 93 } 94 } 95 /* customize Matrix class at a later stage and add support for optenum[matop] */ 96 ierr = PetscOptionsInsertString(NULL,opts);CHKERRQ(ierr); 97 ierr = MatSetFromOptions(A);CHKERRQ(ierr); 98 for (i = 0; i < nop; i++) { 99 ierr = MatHasOperation(A,optenum[i],&hasop);CHKERRQ(ierr); 100 if (hasop && i != matop) { 101 ierr = PetscPrintf(PETSC_COMM_WORLD," Error: %s present\n",optstr[i]);CHKERRQ(ierr); 102 } else if (!hasop && i == matop) { 103 ierr = PetscPrintf(PETSC_COMM_WORLD," Error: %s not present\n",optstr[i]);CHKERRQ(ierr); 104 } else { 105 ierr = PetscPrintf(PETSC_COMM_WORLD," Pass: %s\n",optstr[i]);CHKERRQ(ierr); 106 } 107 } 108 ierr = MatDestroy(&A);CHKERRQ(ierr); 109 ierr = PetscOptionsClearValue(NULL,opts);CHKERRQ(ierr); 110 } 111 PetscFunctionReturn(0); 112 } 113 114 int main(int argc,char **argv) 115 { 116 PetscErrorCode ierr; 117 118 ierr = PetscInitialize(&argc,&argv,(char*) 0,help);if (ierr) return ierr; 119 ierr = PetscPythonInitialize(NULL,NULL);CHKERRQ(ierr); 120 ierr = RunHasOperationTest();PetscPythonPrintError();CHKERRQ(ierr); 121 ierr = PetscFinalize(); 122 return ierr; 123 } 124 125 /*TEST 126 127 test: 128 requires: petsc4py 129 localrunfiles: ex140.py 130 131 TEST*/ 132