module TBit.Hamiltonian.Eigenstates ( eigenstates
, eigenbras
, eigenkets
, eigenenergies
, eigensystem ) where
import TBit.Types
import Data.List (sortBy, zip, sort, map)
import Prelude hiding (zip, map)
import Numeric.LinearAlgebra.HMatrix
eigenstates :: Hamiltonian -> Wavevector -> Parameterized [Eigenstate]
eigenstates h k = return . map snd $ eigensystem' (h k)
eigenkets :: Hamiltonian -> Wavevector -> Parameterized [Eigenket]
eigenkets h k = eigenstates h k >>= (return . map asColumn)
eigenbras :: Hamiltonian -> Wavevector -> Parameterized [Eigenbra]
eigenbras h k = eigenkets h k >>= (return . map tr)
eigenenergies :: Hamiltonian -> Wavevector -> Parameterized [Energy]
eigenenergies h = return . energies . h
energies :: Matrix ℂ -> [Energy]
energies = sort . toList . eigenvaluesSH'
eigensystem' :: Matrix ℂ -> [(Energy,Eigenstate)]
eigensystem' = sortBy (\t1 t2 -> compare (fst t1) (fst t2))
. (\(vals,vecs) -> zip (toList vals) (toColumns vecs))
. eigSH'
eigensystem :: Hamiltonian -> Wavevector -> Parameterized [(Energy,Eigenstate)]
eigensystem h k = return $ eigensystem' (h k)