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: return
58: end
60: !/*TEST
61: !
62: ! test:
63: ! args: -ksp_monitor_short
64: !
65: !TEST*/