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*/