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: end

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