Actual source code: ex5f.F90

  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:       PetscCallA(PetscInitialize(ierr))
 21:       one = 1.0
 22:       PetscCallA(KSPCreate(PETSC_COMM_SELF,ksp,ierr))

 24:       PetscCallA(MatCreateShell(PETSC_COMM_SELF,m,m,m,m,0,A,ierr))
 25:       PetscCallA(MatShellSetOperation(A,MATOP_MULT,mymatmult,ierr))

 27:       PetscCallA(VecCreateSeq(PETSC_COMM_SELF,m,x,ierr))
 28:       PetscCallA(VecDuplicate(x,y,ierr))
 29:       PetscCallA(VecSet(x,one,ierr))

 31:       PetscCallA(KSPSetOperators(ksp,A,A,ierr))
 32:       PetscCallA(KSPSetFromOptions(ksp,ierr))

 34:       PetscCallA(KSPSolve(ksp,x,y,ierr))

 36:       PetscCallA(MatDestroy(A,ierr))
 37:       PetscCallA(KSPDestroy(ksp,ierr))
 38:       PetscCallA(VecDestroy(x,ierr))
 39:       PetscCallA(VecDestroy(y,ierr))

 41:       PetscCallA(PetscFinalize(ierr))
 42:       end

 44: !  This is a bogus multiply that copies the vector. This corresponds to
 45: !  an identity matrix A

 47:       subroutine mymatmult(A,x,y,ierr)
 48:       use petscksp
 49:       implicit none

 51:       Mat A
 52:       Vec x,y
 53:       PetscErrorCode ierr

 55:       PetscCallA(VecCopy(x,y,ierr))

 57:       return
 58:       end

 60: !/*TEST
 61: !
 62: !    test:
 63: !      args:  -ksp_monitor_short
 64: !
 65: !TEST*/