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