Actual source code: ex5f.F
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: call PetscInitialize(PETSC_NULL_CHARACTER,ierr)
21: if (ierr .ne. 0) then
22: print*,'Unable to initialize PETSc'
23: stop
24: endif
25: one = 1.0
26: call KSPCreate(PETSC_COMM_SELF,ksp,ierr)
28: call MatCreateShell(PETSC_COMM_SELF,m,m,m,m,0,A,ierr)
29: call MatShellSetOperation(A,MATOP_MULT,mymatmult,ierr)
31: call VecCreateSeq(PETSC_COMM_SELF,m,x,ierr)
32: call VecDuplicate(x,y,ierr)
33: call VecSet(x,one,ierr)
35: call KSPSetOperators(ksp,A,A,ierr)
36: call KSPSetFromOptions(ksp,ierr)
38: call KSPSolve(ksp,x,y,ierr)
40: call MatDestroy(A,ierr)
41: call KSPDestroy(ksp,ierr)
42: call VecDestroy(x,ierr)
43: call VecDestroy(y,ierr)
45: call PetscFinalize(ierr)
46: end
48: ! This is a bogus multiply that copies the vector. This corresponds to
49: ! an identity matrix A
51: subroutine mymatmult(A,x,y,ierr)
52: use petscksp
53: implicit none
55: Mat A
56: Vec x,y
57: PetscErrorCode ierr
59: call VecCopy(x,y,ierr)
61: return
62: end
64: !/*TEST
65: !
66: ! test:
67: ! args: -ksp_monitor_short
68: !
69: !TEST*/