subroutine mpi_lanczos_iteration_c(MpiComm,MatVec,iter,vin,vout,alfa,beta)
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)),intent(inout) :: vout
complex(8),dimension(size(vin)) :: tmp
real(8),intent(inout) :: alfa,beta
real(8) :: atmp,btmp
integer :: iter,nloc
real(8) :: norm,norm_tmp
!
logical :: mpi_master
!
if(MpiComm==Mpi_Comm_Null)return
!
nloc=size(vin)
!
mpi_master=get_master_MPI(MpiComm)
!
if(iter==1)then
norm_tmp=dot_product(vin,vin);norm = 0d0; call AllReduce_MPI(MpiComm,norm_tmp,norm)
if(mpi_master.AND.norm==0d0)stop "MPI_LANCZOS_ITERATION_C: norm = 0!!"
vin=vin/sqrt(norm)
else
tmp = vin
vin = vout/beta
vout= -beta*tmp
endif
call MatVec(nloc,vin,tmp)
vout = vout + tmp
atmp = dot_product(vin,vout) ; alfa = 0d0; call AllReduce_MPI(MpiComm,atmp,alfa)
vout = vout - alfa*vin
btmp = dot_product(vout,vout); beta = 0d0; call AllReduce_MPI(MpiComm,btmp,beta)
beta = sqrt(beta)
end subroutine mpi_lanczos_iteration_c