Actual source code: ex5f.F90

  1: !
  2: #include <petsc/finclude/petscksp.h>
  3: module ex5fmodule
  4:   use petscksp
  5:   implicit none

  7: contains
  8: !  This is a bogus multiply that copies the vector. This corresponds to
  9: !  an identity matrix A
 10:   subroutine mymatmult(A, x, y, ierr)

 12:     Mat A
 13:     Vec x, y
 14:     PetscErrorCode ierr

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

 18:   end
 19: end module ex5fmodule

 21: program main
 22:   use petscksp
 23:   use ex5fmodule
 24:   implicit none
 25: !
 26: !      Solves a linear system matrix-free
 27: !

 29:   Mat A
 30:   Vec x, y
 31:   PetscInt m
 32:   PetscErrorCode ierr
 33:   KSP ksp
 34:   PetscScalar one

 36:   m = 10

 38:   PetscCallA(PetscInitialize(ierr))
 39:   one = 1.0
 40:   PetscCallA(KSPCreate(PETSC_COMM_SELF, ksp, ierr))

 42:   PetscCallA(MatCreateShell(PETSC_COMM_SELF, m, m, m, m, 0, A, ierr))
 43:   PetscCallA(MatShellSetOperation(A, MATOP_MULT, mymatmult, ierr))

 45:   PetscCallA(VecCreateSeq(PETSC_COMM_SELF, m, x, ierr))
 46:   PetscCallA(VecDuplicate(x, y, ierr))
 47:   PetscCallA(VecSet(x, one, ierr))

 49:   PetscCallA(KSPSetOperators(ksp, A, A, ierr))
 50:   PetscCallA(KSPSetFromOptions(ksp, ierr))

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

 54:   PetscCallA(MatDestroy(A, ierr))
 55:   PetscCallA(KSPDestroy(ksp, ierr))
 56:   PetscCallA(VecDestroy(x, ierr))
 57:   PetscCallA(VecDestroy(y, ierr))

 59:   PetscCallA(PetscFinalize(ierr))
 60: end

 62: !/*TEST
 63: !
 64: !    test:
 65: !      args: -ksp_monitor_short
 66: !
 67: !TEST*/