xref: /petsc/src/mat/tests/ex140.c (revision e8c0849ab8fe171bed529bea27238c9b402db591)
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 
RunHasOperationTest()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 
main(int argc,char ** argv)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