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