xref: /petsc/src/mat/tests/ex140.c (revision 8ebe3e4e9e00d86ece2e9fcd0cc84910b0ad437c)
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(PetscInt);
72   PetscErrorCode ierr;
73 
74   PetscFunctionBegin;
75   for (matop = 0; matop < nop; matop++) {
76     char opts[256];
77     PetscBool hasop;
78     PetscInt i;
79 
80     ierr = PetscSNPrintf(opts,256,"-enable %s",optstr[matop]);CHKERRQ(ierr);
81     ierr = PetscPrintf(PETSC_COMM_WORLD,"Testing with %s\n",opts);CHKERRQ(ierr);
82     ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr);
83     ierr = MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,0,0);CHKERRQ(ierr);
84     ierr = MatSetType(A,MATPYTHON);CHKERRQ(ierr);
85     ierr = MatPythonSetType(A,"ex140.py:Matrix");CHKERRQ(ierr);
86     /* default case, no user implementation */
87     for (i = 0; i < nop; i++) {
88       ierr = MatHasOperation(A,optenum[i],&hasop);CHKERRQ(ierr);
89       if (hasop) {
90         ierr = PetscPrintf(PETSC_COMM_WORLD,"  Error: %s present\n",optstr[i]);CHKERRQ(ierr);
91       } else {
92         ierr = PetscPrintf(PETSC_COMM_WORLD,"  Pass: %s\n",optstr[i]);CHKERRQ(ierr);
93       }
94     }
95     /* customize Matrix class at a later stage and add support for optenum[matop] */
96     ierr = PetscOptionsInsertString(NULL,opts);CHKERRQ(ierr);
97     ierr = MatSetFromOptions(A);CHKERRQ(ierr);
98     for (i = 0; i < nop; i++) {
99       ierr = MatHasOperation(A,optenum[i],&hasop);CHKERRQ(ierr);
100       if (hasop && i != matop) {
101         ierr = PetscPrintf(PETSC_COMM_WORLD,"  Error: %s present\n",optstr[i]);CHKERRQ(ierr);
102       } else if (!hasop && i == matop) {
103         ierr = PetscPrintf(PETSC_COMM_WORLD,"  Error: %s not present\n",optstr[i]);CHKERRQ(ierr);
104       } else {
105         ierr = PetscPrintf(PETSC_COMM_WORLD,"  Pass: %s\n",optstr[i]);CHKERRQ(ierr);
106       }
107     }
108     ierr = MatDestroy(&A);CHKERRQ(ierr);
109     ierr = PetscOptionsClearValue(NULL,opts);CHKERRQ(ierr);
110   }
111   PetscFunctionReturn(0);
112 }
113 
114 int main(int argc,char **argv)
115 {
116   PetscErrorCode ierr;
117 
118   ierr = PetscInitialize(&argc,&argv,(char*) 0,help);if (ierr) return ierr;
119   ierr = PetscPythonInitialize(NULL,NULL);CHKERRQ(ierr);
120   ierr = RunHasOperationTest();PetscPythonPrintError();CHKERRQ(ierr);
121   ierr = PetscFinalize();
122   return ierr;
123 }
124 
125 /*TEST
126 
127    test:
128       requires: petsc4py
129       localrunfiles: ex140.py
130 
131 TEST*/
132