1 #include <petscksp.h>
2
3 /* ------------------------------------------------------- */
4
RunTest(void)5 PetscErrorCode RunTest(void)
6 {
7 PetscInt N = 100, its = 0;
8 PetscBool draw = PETSC_FALSE, test = PETSC_FALSE;
9 PetscReal rnorm;
10 Mat A;
11 Vec b, x, r;
12 KSP ksp;
13 PC pc;
14
15 PetscFunctionBegin;
16 PetscCall(PetscOptionsGetInt(NULL, NULL, "-N", &N, NULL));
17 PetscCall(PetscOptionsGetBool(NULL, NULL, "-test", &test, NULL));
18 PetscCall(PetscOptionsGetBool(NULL, NULL, "-draw", &draw, NULL));
19
20 PetscCall(MatCreate(PETSC_COMM_WORLD, &A));
21 PetscCall(MatSetSizes(A, PETSC_DECIDE, PETSC_DECIDE, N, N));
22 PetscCall(MatSetType(A, MATPYTHON));
23 PetscCall(MatPythonSetType(A, "example100.py:Laplace1D"));
24 PetscCall(MatSetUp(A));
25
26 PetscCall(MatCreateVecs(A, &x, &b));
27 PetscCall(VecSet(b, 1));
28
29 PetscCall(KSPCreate(PETSC_COMM_WORLD, &ksp));
30 PetscCall(KSPSetType(ksp, KSPPYTHON));
31 PetscCall(KSPPythonSetType(ksp, "example100.py:ConjGrad"));
32
33 PetscCall(KSPGetPC(ksp, &pc));
34 PetscCall(PCSetType(pc, PCPYTHON));
35 PetscCall(PCPythonSetType(pc, "example100.py:Jacobi"));
36
37 PetscCall(KSPSetOperators(ksp, A, A));
38 PetscCall(KSPSetFromOptions(ksp));
39 PetscCall(KSPSolve(ksp, b, x));
40
41 if (test) {
42 PetscCall(KSPGetTotalIterations(ksp, &its));
43 PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Number of KSP iterations = %" PetscInt_FMT "\n", its));
44 } else {
45 PetscCall(VecDuplicate(b, &r));
46 PetscCall(MatMult(A, x, r));
47 PetscCall(VecAYPX(r, -1, b));
48 PetscCall(VecNorm(r, NORM_2, &rnorm));
49 PetscCall(PetscPrintf(PETSC_COMM_WORLD, "error norm = %g\n", (double)rnorm));
50 PetscCall(VecDestroy(&r));
51 }
52
53 if (draw) {
54 PetscCall(VecView(x, PETSC_VIEWER_DRAW_WORLD));
55 PetscCall(PetscSleep(2));
56 }
57
58 PetscCall(VecDestroy(&x));
59 PetscCall(VecDestroy(&b));
60 PetscCall(MatDestroy(&A));
61 PetscCall(KSPDestroy(&ksp));
62 PetscFunctionReturn(PETSC_SUCCESS);
63 }
64
65 /* ------------------------------------------------------- */
66
67 static char help[] = "Python-implemented Mat/KSP/PC.\n\n";
68
69 #if !defined(PYTHON_EXE)
70 #define PYTHON_EXE 0
71 #endif
72 #if !defined(PYTHON_LIB)
73 #define PYTHON_LIB 0
74 #endif
75
main(int argc,char * argv[])76 int main(int argc, char *argv[])
77 {
78 PetscFunctionBeginUser;
79 PetscCall(PetscInitialize(&argc, &argv, 0, help));
80 PetscCall(PetscPythonInitialize(PYTHON_EXE, PYTHON_LIB));
81 PetscCall(RunTest());
82 PetscCall(PetscPythonPrintError());
83 PetscCall(PetscFinalize());
84 return 0;
85 }
86
87 /*TEST
88
89 test:
90 args: -ksp_monitor_short
91 requires: petsc4py
92 localrunfiles: example100.py
93
94 TEST*/
95