Type | Intent | Optional | Attributes | Name | ||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
subroutine MatVec(Nloc, vin, vout)Arguments
|
||||||||||||||||||||||||||||||||||
real(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 |
subroutine lanczos_tridiag_d(MatVec,vin,alanc,blanc,threshold) 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 real(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=0d0 do iter=1,Nitermax call lanczos_iteration_d(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)write(*,"(A)")"LANCZOS_TRIDIAG_D: reach Nitermax" end subroutine lanczos_tridiag_d