lanczos_tridiag_d Subroutine

subroutine lanczos_tridiag_d(MatVec, vin, alanc, blanc, threshold)

Arguments

Type IntentOptional Attributes Name
subroutine MatVec(Nloc, vin, vout)
Arguments
Type IntentOptional Attributes Name
integer :: Nloc
real(kind=8), dimension(Nloc) :: vin
real(kind=8), dimension(Nloc) :: vout
real(kind=8), intent(inout), dimension(:) :: vin
real(kind=8), intent(inout), dimension(:) :: alanc
real(kind=8), intent(inout), dimension(size(alanc)) :: blanc
real(kind=8), optional :: threshold

Calls

proc~~lanczos_tridiag_d~2~~CallsGraph proc~lanczos_tridiag_d~2 lanczos_tridiag_d lanczos_iteration_d lanczos_iteration_d proc~lanczos_tridiag_d~2->lanczos_iteration_d

Source Code

subroutine lanczos_tridiag_d(MatVec,vin,alanc,blanc,threshold)
  interface
     subroutine MatVec(Nloc,vin,vout)
       integer                 :: Nloc
       real(8),dimension(Nloc) :: vin
       real(8),dimension(Nloc) :: vout
     end subroutine MatVec
  end interface
  real(8),dimension(:),intent(inout)           :: vin
  real(8),dimension(size(vin))                 :: vout
  real(8),dimension(:),intent(inout)           :: alanc
  real(8),dimension(size(alanc)),intent(inout) :: blanc
  integer                                      :: Nitermax
  integer                                      :: iter
  real(8)                                      :: a_,b_
  real(8),optional                             :: threshold
  !
  if(present(threshold))threshold_=threshold
  !
  Nitermax = size(alanc)
  a_=0d0
  b_=0d0
  vout=0d0
  do iter=1,Nitermax
     call lanczos_iteration_d(MatVec,iter,vin,vout,a_,b_)
     alanc(iter)=a_
     if(abs(b_)<threshold_)exit
     if(iter<nitermax)blanc(iter+1)=b_
  enddo
  if(iter==nitermax)write(*,"(A)")"LANCZOS_TRIDIAG_D: reach Nitermax"
end subroutine lanczos_tridiag_d