module TBit.Electronic.Conductance (nernstConductivity) where import Data.Complex (realPart) import Control.Monad (liftM) import Numeric.LinearAlgebra.HMatrix (size, vector) import TBit.Types import TBit.Framework import TBit.Parameterization import TBit.Hamiltonian.Eigenstates import TBit.Topological.Curvature nernstConductivity :: Hamiltonian -> Parameterized Double nernstConductivity h = bzIntegral (nernstIntegrand h) nernstIntegrand :: Hamiltonian -> Wavevector -> Parameterized Double nernstIntegrand h k = liftM sum . sequence $ [ nernstIntegrand' h b k | b <- [0..pred dim] ] where dim = fst $ size $ h $ vector [0,0] nernstIntegrand' :: Hamiltonian -> BandIndex -> Wavevector -> Parameterized Double nernstIntegrand' h n k = do omega <- bandCurvature n h k energy <- eigenenergies h k beta <- getScalar "beta" mu <- getScalar "mu" let f = f' (realPart $ beta) (realPart $ mu) let s = negate $ f (energy!!n) * (log.f) (energy!!n) + (1 - f (energy!!n)) * log (1 - f (energy!!n) + eps) return $ if (energy!!n) < (realPart mu) then omega * s else 0.0 where f' beta mu e = 1.0 / (1.0 + (exp $ beta * (e - mu))) eps = 1.0e-50