Kernel Polynomial Method

Is there any packages that already implement KPM?

We have https://github.com/pablosanjose/Elsa.jl
Still in development but has KPM built in.
I would actually appreciate it if you take it for a spin and report issues.

3 Likes

your package seems really good!, I will try it soon.

Please do. For the moment I’m afraid you’ll have to make do with the docstrings, as we haven’t had time to write a narrative documentation. To get you started, you could compute the density of states of a simple graphene monolayer (circular flake of radius 300a0) using stochastic traces with something like

julia> using Elsa, FFTW, Plots

julia> h = LatticePresets.honeycomb() |> hamiltonian(hopping(1, range = 1/√3)) |> unitcell(region = RegionPresets.circle(300))
Hamiltonian{<:Lattice} : Hamiltonian on a 0D Lattice in 2D space
  Bloch harmonics  : 1 (SparseMatrixCSC, sparse)
  Harmonic size    : 652966 × 652966
  Orbitals         : ((:a,), (:a,))
  Element type     : scalar (Complex{Float64})
  Onsites          : 0
  Hoppings         : 1956506
  Coordination     : 2.9963367158473795

julia> dos = dosKPM(h, order = 1000, bandrange = (-3,3), randomkets = 1);

julia> plot(dos)

EDIT: to reduce noise, increase system size or randomkets. Also, if you use MKLSparse.jl you will get a nice performance boost on Intel machines, thanks to hyperthreaded sparse mul!, at least for single-orbital hamiltonians (scalar eltype).