lanczos_tridiag_c Subroutine

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

Arguments

Type IntentOptional Attributes Name
subroutine MatVec(Nloc, vin, vout)
Arguments
Type IntentOptional Attributes Name
integer :: Nloc
complex(kind=8), dimension(Nloc) :: vin
complex(kind=8), dimension(Nloc) :: vout
complex(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_c~~CallsGraph proc~lanczos_tridiag_c lanczos_tridiag_c lanczos_iteration_c lanczos_iteration_c proc~lanczos_tridiag_c->lanczos_iteration_c

Source Code

subroutine lanczos_tridiag_c(MatVec,vin,alanc,blanc,threshold)
  interface
     subroutine MatVec(Nloc,vin,vout)
       integer                    :: Nloc
       complex(8),dimension(Nloc) :: vin
       complex(8),dimension(Nloc) :: vout
     end subroutine MatVec
  end interface
  complex(8),dimension(:),intent(inout)        :: vin
  complex(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=zero
  do iter=1,Nitermax
     call lanczos_iteration_c(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)print*,"LANCZOS_TRIDIAG_C: reach Nitermax"
end subroutine lanczos_tridiag_c