Actual source code: ex5f.F
1: !
2: program main
3: implicit none
5: #include finclude/petscsys.h
6: #include finclude/petscvec.h
7: #include finclude/petscmat.h
8: #include finclude/petscpc.h
9: #include finclude/petscksp.h
10: #include finclude/petscviewer.h
11: !
12: ! Solves a linear system matrix free
13: !
15: Mat A
16: Vec x,y
17: PetscInt m
18: PetscErrorCode ierr
19: KSP ksp
20: external mymatmult
21: PetscScalar one
23: m = 10
24:
25: call PetscInitialize(PETSC_NULL_CHARACTER,ierr)
26: one = 1.d0
27: call KSPCreate(PETSC_COMM_SELF,ksp,ierr)
29: call MatCreateShell(PETSC_COMM_SELF,m,m,m,m,PETSC_NULL_OBJECT, &
30: & A,ierr)
31: call MatShellSetOperation(A,MATOP_MULT,mymatmult,ierr)
33: call VecCreateSeq(PETSC_COMM_SELF,m,x,ierr)
34: call VecDuplicate(x,y,ierr)
35: call VecSet(x,one,ierr)
37: call KSPSetOperators(ksp,A,A,SAME_NONZERO_PATTERN,ierr)
38: call KSPSetFromOptions(ksp,ierr)
40: call KSPSolve(ksp,x,y,ierr)
42: call MatDestroy(A,ierr)
43: call KSPDestroy(ksp,ierr)
44: call VecDestroy(x,ierr)
45: call VecDestroy(y,ierr)
47: call PetscFinalize(ierr)
48: end
51: ! This is a bogus multiply that copies the vector. This corresponds to
52: ! an identity matrix A
53:
54: subroutine mymatmult(A,x,y,ierr)
55:
56: Mat A
57: Vec x,y
58: PetscErrorCode ierr
59:
60: call VecCopy(x,y,ierr)
62: return
63: end
64: