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: