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 */ 7*421480d9SBarry Smith 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_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 */ 10*421480d9SBarry Smith const char *const optstr[] = {"mult", 11*421480d9SBarry Smith "multAdd", 12*421480d9SBarry Smith "multTranspose", 13*421480d9SBarry Smith "multTransposeAdd", 14*421480d9SBarry Smith "solve", 15*421480d9SBarry Smith "solveAdd", 16*421480d9SBarry Smith "solveTranspose", 17*421480d9SBarry Smith "solveTransposeAdd", 18*421480d9SBarry Smith "SOR", 19*421480d9SBarry Smith "getDiagonal", 20*421480d9SBarry Smith "diagonalScale", 21*421480d9SBarry Smith "norm", 22*421480d9SBarry Smith "zeroEntries", 23*421480d9SBarry Smith "getDiagonalBlock", 24*421480d9SBarry Smith "duplicate", 25*421480d9SBarry Smith "copy", 26*421480d9SBarry Smith "scale", 27*421480d9SBarry Smith "shift", 28*421480d9SBarry Smith "setDiagonal", 29*421480d9SBarry Smith "zeroRowsColumns", 30*421480d9SBarry Smith "createSubMatrix", 31*421480d9SBarry Smith "getVecs", 32*421480d9SBarry Smith "conjugate", 33*421480d9SBarry Smith "realPart", 34*421480d9SBarry Smith "imagPart", 35*421480d9SBarry Smith "multDiagonalBlock", 36*421480d9SBarry Smith "multHermitian", 37*421480d9SBarry Smith "multHermitianAdd"}; 38c786d857SStefano Zampini 39d71ae5a4SJacob Faibussowitsch PetscErrorCode RunHasOperationTest() 40d71ae5a4SJacob Faibussowitsch { 41c786d857SStefano Zampini Mat A; 42dd39110bSPierre Jolivet PetscInt matop, nop = PETSC_STATIC_ARRAY_LENGTH(optenum); 43c786d857SStefano Zampini 44c786d857SStefano Zampini PetscFunctionBegin; 45c786d857SStefano Zampini for (matop = 0; matop < nop; matop++) { 46c786d857SStefano Zampini char opts[256]; 47c786d857SStefano Zampini PetscBool hasop; 48c786d857SStefano Zampini PetscInt i; 49c786d857SStefano Zampini 509566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(opts, 256, "-enable %s", optstr[matop])); 519566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Testing with %s\n", opts)); 529566063dSJacob Faibussowitsch PetscCall(MatCreate(PETSC_COMM_WORLD, &A)); 539566063dSJacob Faibussowitsch PetscCall(MatSetSizes(A, PETSC_DECIDE, PETSC_DECIDE, 0, 0)); 549566063dSJacob Faibussowitsch PetscCall(MatSetType(A, MATPYTHON)); 559566063dSJacob Faibussowitsch PetscCall(MatPythonSetType(A, "ex140.py:Matrix")); 56c786d857SStefano Zampini /* default case, no user implementation */ 57c786d857SStefano Zampini for (i = 0; i < nop; i++) { 589566063dSJacob Faibussowitsch PetscCall(MatHasOperation(A, optenum[i], &hasop)); 59c786d857SStefano Zampini if (hasop) { 609566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, " Error: %s present\n", optstr[i])); 61c786d857SStefano Zampini } else { 629566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, " Pass: %s\n", optstr[i])); 63c786d857SStefano Zampini } 64c786d857SStefano Zampini } 65c786d857SStefano Zampini /* customize Matrix class at a later stage and add support for optenum[matop] */ 669566063dSJacob Faibussowitsch PetscCall(PetscOptionsInsertString(NULL, opts)); 679566063dSJacob Faibussowitsch PetscCall(MatSetFromOptions(A)); 68c786d857SStefano Zampini for (i = 0; i < nop; i++) { 699566063dSJacob Faibussowitsch PetscCall(MatHasOperation(A, optenum[i], &hasop)); 70c786d857SStefano Zampini if (hasop && i != matop) { 719566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, " Error: %s present\n", optstr[i])); 72c786d857SStefano Zampini } else if (!hasop && i == matop) { 739566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, " Error: %s not present\n", optstr[i])); 74c786d857SStefano Zampini } else { 759566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, " Pass: %s\n", optstr[i])); 76c786d857SStefano Zampini } 77c786d857SStefano Zampini } 789566063dSJacob Faibussowitsch PetscCall(MatDestroy(&A)); 799566063dSJacob Faibussowitsch PetscCall(PetscOptionsClearValue(NULL, opts)); 80c786d857SStefano Zampini } 813ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 82c786d857SStefano Zampini } 83c786d857SStefano Zampini 84d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv) 85d71ae5a4SJacob Faibussowitsch { 86327415f7SBarry Smith PetscFunctionBeginUser; 87c8025a54SPierre Jolivet PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 889566063dSJacob Faibussowitsch PetscCall(PetscPythonInitialize(NULL, NULL)); 893ba16761SJacob Faibussowitsch PetscCall(RunHasOperationTest()); 903ba16761SJacob Faibussowitsch PetscCall(PetscPythonPrintError()); 919566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 92b122ec5aSJacob Faibussowitsch return 0; 93c786d857SStefano Zampini } 94c786d857SStefano Zampini 95c786d857SStefano Zampini /*TEST 96c786d857SStefano Zampini 97c786d857SStefano Zampini test: 98c786d857SStefano Zampini requires: petsc4py 99c786d857SStefano Zampini localrunfiles: ex140.py 100c786d857SStefano Zampini 101c786d857SStefano Zampini TEST*/ 102