Actual source code: ex5f.F90
1: !
2: program main
3: #include <petsc/finclude/petscksp.h>
4: use petscksp
5: implicit none
6: !
7: ! Solves a linear system matrix-free
8: !
10: Mat A
11: Vec x, y
12: PetscInt m
13: PetscErrorCode ierr
14: KSP ksp
15: external mymatmult
16: PetscScalar one
18: m = 10
20: PetscCallA(PetscInitialize(ierr))
21: one = 1.0
22: PetscCallA(KSPCreate(PETSC_COMM_SELF, ksp, ierr))
24: PetscCallA(MatCreateShell(PETSC_COMM_SELF, m, m, m, m, 0, A, ierr))
25: PetscCallA(MatShellSetOperation(A, MATOP_MULT, mymatmult, ierr))
27: PetscCallA(VecCreateSeq(PETSC_COMM_SELF, m, x, ierr))
28: PetscCallA(VecDuplicate(x, y, ierr))
29: PetscCallA(VecSet(x, one, ierr))
31: PetscCallA(KSPSetOperators(ksp, A, A, ierr))
32: PetscCallA(KSPSetFromOptions(ksp, ierr))
34: PetscCallA(KSPSolve(ksp, x, y, ierr))
36: PetscCallA(MatDestroy(A, ierr))
37: PetscCallA(KSPDestroy(ksp, ierr))
38: PetscCallA(VecDestroy(x, ierr))
39: PetscCallA(VecDestroy(y, ierr))
41: PetscCallA(PetscFinalize(ierr))
42: end
44: ! This is a bogus multiply that copies the vector. This corresponds to
45: ! an identity matrix A
47: subroutine mymatmult(A, x, y, ierr)
48: use petscksp
49: implicit none
51: Mat A
52: Vec x, y
53: PetscErrorCode ierr
55: PetscCallA(VecCopy(x, y, ierr))
57: end
59: !/*TEST
60: !
61: ! test:
62: ! args: -ksp_monitor_short
63: !
64: !TEST*/