xref: /petsc/src/ksp/ksp/tutorials/ex100.c (revision 970231d20df44f79b27787157e39d441e79f434b)
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