subroutine mpi_lanczos_tridiag_d(MpiComm,MatVec,vin,alanc,blanc,threshold)
integer :: MpiComm
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 !Nloc
real(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=0d0
do iter=1,Nitermax
call mpi_lanczos_iteration_d(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_D: reach Nitermax"
end subroutine mpi_lanczos_tridiag_d