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/petscksp.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
 20:       KSP        ksp
 21:       external    mymatmult
 22:       PetscScalar one

 24:       m = 10
 25: 
 26:       call PetscInitialize(PETSC_NULL_CHARACTER,ierr)
 27:       one = 1.d0
 28:       call KSPCreate(PETSC_COMM_SELF,ksp,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 KSPSetOperators(ksp,A,A,SAME_NONZERO_PATTERN,ierr)
 39:       call KSPSetFromOptions(ksp,ierr)

 41:       call KSPSetRhs(ksp,x,ierr)
 42:       call KSPSetSolution(ksp,y,ierr)
 43:       call KSPSolve(ksp,ierr)

 45:       call MatDestroy(A,ierr)
 46:       call KSPDestroy(ksp,ierr)
 47:       call VecDestroy(x,ierr)
 48:       call VecDestroy(y,ierr)

 50:       call PetscFinalize(ierr)
 51:       end


 54: !  This is a bogus multiply that copies the vector. This corresponds to
 55: !  an identity matrix A
 56: 
 57:       subroutine mymatmult(A,x,y,ierr)
 58: 
 59:       Mat A
 60:       Vec x,y
 61:       integer m,ierr
 62: 
 63:       m = 10

 65:       call VecCopy(y,x,ierr)

 67:       return
 68:       end
 69: