|
1 | | -using LinearAlgebra: Diagonal, Eigen, Hermitian, diag |
| 1 | +using LinearAlgebra: Diagonal, Eigen, Hermitian, Tridiagonal, diag |
2 | 2 | using IsApprox: Approx, ishermitian |
3 | 3 |
|
4 | | -export Hamiltonian, DiagonalHamiltonian, isapprox_rtol, set_isapprox_rtol |
| 4 | +export Hamiltonian, |
| 5 | + DiagonalHamiltonian, TridiagonalHamiltonian, isapprox_rtol, set_isapprox_rtol |
5 | 6 |
|
6 | 7 | abstract type AbstractHamiltonian{N,T} <: AbstractMatrix{T} end |
7 | 8 |
|
@@ -31,6 +32,15 @@ function DiagonalHamiltonian(A::AbstractMatrix) |
31 | 32 | return DiagonalHamiltonian(V) |
32 | 33 | end |
33 | 34 |
|
| 35 | +struct TridiagonalHamiltonian{N,T} <: AbstractHamiltonian{N,T} |
| 36 | + data::Tridiagonal{T,Vector{T}} |
| 37 | + function TridiagonalHamiltonian(dv::AbstractVector, ev::AbstractVector) |
| 38 | + @assert all(isreal.(dv)) "Hamiltonian matrices reuqire diagoanl elements to be real!" |
| 39 | + N, T = length(dv), promote_type(eltype(dv), eltype(ev)) |
| 40 | + return new{N,T}(Tridiagonal(ev, dv, conj(ev))) |
| 41 | + end |
| 42 | +end |
| 43 | + |
34 | 44 | const ISAPPROX_RTOL = Ref(1e-15) |
35 | 45 |
|
36 | 46 | isapprox_rtol() = ISAPPROX_RTOL[] |
|
0 commit comments