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