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