xref: /petsc/src/mat/tests/ex140.c (revision 3ba1676111f5c958fe6c2729b46ca4d523958bb3)
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