mpi_lanczos_tridiag_c Subroutine

subroutine mpi_lanczos_tridiag_c(MpiComm, MatVec, vin, alanc, blanc, threshold)

Arguments

Type IntentOptional Attributes Name
integer :: MpiComm
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~~mpi_lanczos_tridiag_c~2~~CallsGraph proc~mpi_lanczos_tridiag_c~2 mpi_lanczos_tridiag_c get_master_mpi get_master_mpi proc~mpi_lanczos_tridiag_c~2->get_master_mpi mpi_lanczos_iteration_c mpi_lanczos_iteration_c proc~mpi_lanczos_tridiag_c~2->mpi_lanczos_iteration_c

Source Code

subroutine mpi_lanczos_tridiag_c(MpiComm,MatVec,vin,alanc,blanc,threshold)
  integer                                      :: MpiComm
  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 !Nloc
  complex(8),dimension(size(vin))              :: vout,vtmp
  real(8),dimension(:),intent(inout)           :: alanc
  real(8),dimension(size(alanc)),intent(inout) :: blanc
  integer                                      :: Nitermax,Nloc,i
  integer                                      :: iter
  real(8)                                      :: a_,b_
  real(8),optional                             :: threshold
  !
  logical                                      :: mpi_master
  !
  if(MpiComm==Mpi_Comm_Null)return
  !
  mpi_master=get_master_MPI(MpiComm)
  !
  Nloc = size(vin)
  !
  if(present(threshold))threshold_=threshold
  !
  vtmp=vin
  Nitermax = size(alanc)
  a_=0d0
  b_=0d0
  vout=zero
  do iter=1,Nitermax
     call mpi_lanczos_iteration_c(MpiComm,MatVec,iter,vtmp,vout,a_,b_)
     alanc(iter)=a_
     if(abs(b_)<threshold_)exit
     if(iter<nitermax)blanc(iter+1)=b_
  enddo
  if(iter==nitermax.AND.mpi_master)write(*,"(A)")"MPI_LANCZOS_TRIDIAG_C: reach Nitermax"
end subroutine mpi_lanczos_tridiag_c