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 */ 79371c9d4SSatish Balay 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}; 8c786d857SStefano Zampini 9c786d857SStefano Zampini /* Name of the methods in the user's Python class */ 109371c9d4SSatish Balay 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"}; 11c786d857SStefano Zampini 12d71ae5a4SJacob Faibussowitsch PetscErrorCode RunHasOperationTest() 13d71ae5a4SJacob Faibussowitsch { 14c786d857SStefano Zampini Mat A; 15dd39110bSPierre Jolivet PetscInt matop, nop = PETSC_STATIC_ARRAY_LENGTH(optenum); 16c786d857SStefano Zampini 17c786d857SStefano Zampini PetscFunctionBegin; 18c786d857SStefano Zampini for (matop = 0; matop < nop; matop++) { 19c786d857SStefano Zampini char opts[256]; 20c786d857SStefano Zampini PetscBool hasop; 21c786d857SStefano Zampini PetscInt i; 22c786d857SStefano Zampini 239566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(opts, 256, "-enable %s", optstr[matop])); 249566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Testing with %s\n", opts)); 259566063dSJacob Faibussowitsch PetscCall(MatCreate(PETSC_COMM_WORLD, &A)); 269566063dSJacob Faibussowitsch PetscCall(MatSetSizes(A, PETSC_DECIDE, PETSC_DECIDE, 0, 0)); 279566063dSJacob Faibussowitsch PetscCall(MatSetType(A, MATPYTHON)); 289566063dSJacob Faibussowitsch PetscCall(MatPythonSetType(A, "ex140.py:Matrix")); 29c786d857SStefano Zampini /* default case, no user implementation */ 30c786d857SStefano Zampini for (i = 0; i < nop; i++) { 319566063dSJacob Faibussowitsch PetscCall(MatHasOperation(A, optenum[i], &hasop)); 32c786d857SStefano Zampini if (hasop) { 339566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, " Error: %s present\n", optstr[i])); 34c786d857SStefano Zampini } else { 359566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, " Pass: %s\n", optstr[i])); 36c786d857SStefano Zampini } 37c786d857SStefano Zampini } 38c786d857SStefano Zampini /* customize Matrix class at a later stage and add support for optenum[matop] */ 399566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertString(NULL, opts)); 409566063dSJacob Faibussowitsch PetscCall(MatSetFromOptions(A)); 41c786d857SStefano Zampini for (i = 0; i < nop; i++) { 429566063dSJacob Faibussowitsch PetscCall(MatHasOperation(A, optenum[i], &hasop)); 43c786d857SStefano Zampini if (hasop && i != matop) { 449566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, " Error: %s present\n", optstr[i])); 45c786d857SStefano Zampini } else if (!hasop && i == matop) { 469566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, " Error: %s not present\n", optstr[i])); 47c786d857SStefano Zampini } else { 489566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, " Pass: %s\n", optstr[i])); 49c786d857SStefano Zampini } 50c786d857SStefano Zampini } 519566063dSJacob Faibussowitsch PetscCall(MatDestroy(&A)); 529566063dSJacob Faibussowitsch PetscCall(PetscOptionsClearValue(NULL, opts)); 53c786d857SStefano Zampini } 54*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 55c786d857SStefano Zampini } 56c786d857SStefano Zampini 57d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv) 58d71ae5a4SJacob Faibussowitsch { 59327415f7SBarry Smith PetscFunctionBeginUser; 609566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &argv, (char *)0, help)); 619566063dSJacob Faibussowitsch PetscCall(PetscPythonInitialize(NULL, NULL)); 62*3ba16761SJacob Faibussowitsch PetscCall(RunHasOperationTest()); 63*3ba16761SJacob Faibussowitsch PetscCall(PetscPythonPrintError()); 649566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 65b122ec5aSJacob Faibussowitsch return 0; 66c786d857SStefano Zampini } 67c786d857SStefano Zampini 68c786d857SStefano Zampini /*TEST 69c786d857SStefano Zampini 70c786d857SStefano Zampini test: 71c786d857SStefano Zampini requires: petsc4py 72c786d857SStefano Zampini localrunfiles: ex140.py 73c786d857SStefano Zampini 74c786d857SStefano Zampini TEST*/ 75