lanczos_iteration_c Subroutine

subroutine lanczos_iteration_c(MatVec, iter, vin, vout, alfa, beta)

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
integer :: iter
complex(kind=8), intent(inout), dimension(:) :: vin
complex(kind=8), intent(inout), dimension(size(vin)) :: vout
real(kind=8), intent(inout) :: alfa
real(kind=8), intent(inout) :: beta

Source Code

subroutine lanczos_iteration_c(MatVec,iter,vin,vout,alfa,beta)
  interface
     subroutine MatVec(Nloc,vin,vout)
       integer                    :: Nloc
       complex(8),dimension(Nloc) :: vin
       complex(8),dimension(Nloc) :: vout
     end subroutine MatVec
  end interface
  integer                                       :: iter
  complex(8),dimension(:),intent(inout)         :: vin
  complex(8),dimension(size(vin)),intent(inout) :: vout
  complex(8),dimension(size(vin))               :: tmp
  real(8),intent(inout)                         :: alfa,beta
  integer                                       :: nloc
  real(8)                                       :: norm
  !
  nloc=size(vin)
  !
  if(iter==1)then
     norm=sqrt(dot_product(vin,vin))
     if(norm==0d0)stop "LANCZOS_ITERATION_C: norm =0!!"
     vin    = vin/norm
  else
     tmp = vin
     vin = vout/beta
     vout= -beta*tmp
  endif
  call MatVec(nloc,vin,tmp)
  vout = vout + tmp
  alfa = dot_product(vin,vout)
  vout = vout - alfa*vin
  beta = sqrt(dot_product(vout,vout))
end subroutine lanczos_iteration_c