Actual source code: ex5f.F
1: !
2: ! "$Id: ex5f.F,v 1.9 2000/09/27 20:08:42 bsmith Exp $";
3: !
4: program main
5: implicit none
7: #include include/finclude/petsc.h
8: #include include/finclude/petscvec.h
9: #include include/finclude/petscmat.h
10: #include include/finclude/petscpc.h
11: #include include/finclude/petscsles.h
12: #include include/finclude/petscviewer.h
13: !
14: ! Solves a linear system matrix free
15: !
17: Mat A
18: Vec x,y
19: integer m,ierr,its
20: SLES sles
21: external mymatmult
22: PetscScalar one
24: m = 10
25:
26: call PetscInitialize(PETSC_NULL_CHARACTER,ierr)
27: one = 1.d0
28: call SLESCreate(PETSC_COMM_SELF,sles,ierr)
30: call MatCreateShell(PETSC_COMM_SELF,m,m,m,m,PETSC_NULL_OBJECT, &
31: & A,ierr)
32: call MatShellSetOperation(A,MATOP_MULT,mymatmult,ierr)
34: call VecCreateSeq(PETSC_COMM_SELF,m,x,ierr)
35: call VecDuplicate(x,y,ierr)
36: call VecSet(one,x,ierr)
38: call SLESSetOperators(sles,A,A,SAME_NONZERO_PATTERN,ierr)
39: call SLESSetFromOptions(sles,ierr)
41: call SLESSolve(sles,x,y,its,ierr)
43: call MatDestroy(A,ierr)
44: call SLESDestroy(sles,ierr)
45: call VecDestroy(x,ierr)
46: call VecDestroy(y,ierr)
48: call PetscFinalize(ierr)
49: end
52: ! This is a bogus multiply that copies the vector. This corresponds to
53: ! an identity matrix A
54:
55: subroutine mymatmult(A,x,y,ierr)
56:
57: Mat A
58: Vec x,y
59: integer m,ierr
60:
61: m = 10
63: call VecCopy(y,x,ierr)
65: return
66: end
67: