Actual source code: ex100f.F90
1: program main
2: #include "petsc/finclude/petscksp.h"
3: use petscksp
5: PetscInt N
6: PetscBool draw, flg
7: PetscReal rnorm,rtwo
8: PetscScalar one,mone
9: Mat A
10: Vec b,x,r
11: KSP ksp
12: PC pc
13: PetscErrorCode ierr
15: N = 100
16: draw = .FALSE.
17: one = 1.0
18: mone = -1.0
19: rtwo = 2.0
21: PetscCallA(PetscInitialize(ierr))
22: PetscCallA(PetscPythonInitialize(PETSC_NULL_CHARACTER,PETSC_NULL_CHARACTER,ierr))
24: PetscCallA(PetscOptionsGetInt(PETSC_NULL_OPTIONS,PETSC_NULL_CHARACTER,'-N', N,flg,ierr))
25: PetscCallA(PetscOptionsGetBool(PETSC_NULL_OPTIONS,PETSC_NULL_CHARACTER,'-draw',draw,flg,ierr))
27: PetscCallA(MatCreate(PETSC_COMM_WORLD,A,ierr))
28: PetscCallA(MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,N,N,ierr))
29: PetscCallA(MatSetType(A,'python',ierr))
30: PetscCallA(MatPythonSetType(A,'example100.py:Laplace1D',ierr))
31: PetscCallA(MatSetUp(A,ierr))
33: PetscCallA(MatCreateVecs(A,x,b,ierr))
34: PetscCallA(VecSet(b,one,ierr))
36: PetscCallA(KSPCreate(PETSC_COMM_WORLD,ksp,ierr))
37: PetscCallA(KSPSetType(ksp,'python',ierr))
38: PetscCallA(KSPPythonSetType(ksp,'example100.py:ConjGrad',ierr))
40: PetscCallA(KSPGetPC(ksp,pc,ierr))
41: PetscCallA(PCSetType(pc,'python',ierr))
42: PetscCallA(PCPythonSetType(pc,'example100.py:Jacobi',ierr))
44: PetscCallA(KSPSetOperators(ksp,A,A,ierr))
45: PetscCallA(KSPSetFromOptions(ksp,ierr))
46: PetscCallA(KSPSolve(ksp,b,x,ierr))
48: PetscCallA(VecDuplicate(b,r,ierr))
49: PetscCallA(MatMult(A,x,r,ierr))
50: PetscCallA(VecAYPX(r,mone,b,ierr))
51: PetscCallA(VecNorm(r,NORM_2,rnorm,ierr))
52: print*,'error norm = ',rnorm
54: if (draw) then
55: PetscCallA(VecView(x,PETSC_VIEWER_DRAW_WORLD,ierr))
56: PetscCallA(PetscSleep(rtwo,ierr))
57: endif
59: PetscCallA(VecDestroy(x,ierr))
60: PetscCallA(VecDestroy(b,ierr))
61: PetscCallA(VecDestroy(r,ierr))
62: PetscCallA(MatDestroy(A,ierr))
63: PetscCallA(KSPDestroy(ksp,ierr))
65: PetscCallA(PetscFinalize(ierr))
66: end
68: !/*TEST
69: !
70: ! test:
71: ! requires: petsc4py
72: ! localrunfiles: example100.py
73: !
74: !TEST*/