ArnoldiMethod.jl: highly recommended. It does the job accurately and faster than Arpack.
And, it is pure Julia! Kudos to Harmen Stoppels! (I can’t find his handle on this forum, but if you know it please link it here.)
EDIT: I think Harmen is known as @stabbles.
I’m really excited to move over to this from Arpack once it supports initial guesses.
If I may ask, what is your use case?
Im making a package called MatrixProductStates.jl that solves for ground states of large 1D quantum mechanical systems in a way that’s linear in the system size instead of exponential as would be the case in an exact diagonalization of the Hamiltonian. This method allows one to find eigenvalues and eigenstates of linear operators (if they have some special properties) where even the eigenvector would be too big to store on the memory of a computer, ie. I’ve already used to to solve a system that would be represented by a
2^70 x 2^70 complex, Hermitian matrix, so one eigenvector would take about the storage space of all hard drives on earth to write out.
During the solving, one breaks the problem into many, smaller ‘local’ eigenproblems which are actually tractable (~ 40,000 x 40,000 matrices) and solves those eigenproblems in sweeps across the crystal lattice one at a time until you arrive at a ground state. After my first sweep, I already have a bunch of vectors that are approximately eigenvectors so there’s a pretty big performance improvement if I’m able to use those as an initial guess for the subsequent eigenproblems.
Nice project, I’m also working on a MatrixProductState.jl (here: https://github.com/under-Peter/MatrixProductStates.jl). I’m using KrylovKit.jl which has eigen where you provide an initial guess and you can use a general linear operator (see here: https://github.com/under-Peter/MatrixProductStates.jl/blob/master/src/heffapplication.jl where functions that apply effective hamiltonians are defined).
That saves you from constructing the effective hamiltonian. I’m not actively working on it atm but if you’re interested in combining our efforts let me know
Very nice! I had looked around to see if anyone was using that name already but I must have somehow missed your package. Apologies for that!
Yeah, I had thought about using a solver that didn’t require me to have the linear operator in matrix form but it turned out that if you do the contractions in
L * W * R the right way, forming that into a matrix is an essentially free operation since the data doesn’t need to be shifted around so I’m able to use matrix solvers anyway.
If you’d like to combine efforts I’m certainly game. My package will probably go dormant for a little while whilst I finish up my Masters thesis and then I’ll resume development since I plan on using it for research in my PhD. I just implemented it now because I wanted to present on this method for my group’s journal club.