Direct access to wave function amplitudes and eigenvalues in TBTK
Most recent TBTK release at the time of writing: v1.0.3 (Updated to work with: v2.0.0.)
The wave functions and corresponding eigenvalues provide complete information about a system, from which other properties can be calculated. In this post we will therefore take a look at how to extract these directly using the Solver::Diagonalizer. In particular, we show how to calculate the energy and probability density for a given state in a two-dimensional rectangular geometry.
1 Model
The model that we will consider is a simple two-dimensional square lattice with nearest neighbor hopping t = 1, for which the Hamiltonian is
(1) |
Here denotes summation over nearest neighbors.
The Hamiltonian H can either be viewed as the simplest example of a two-dimensional tight-binding model, or as a discretized version of the two-dimensional Schrödinger equation
(2) |
with and . We therefore begin by introducing the following parameters.
The last parameter is used to indicate for which state we are going to calculate the energy and probability density.
We next create the model and loop over each site to feed the model with the hopping amplitudes. We could achieve this by for each site adding the hopping amplitudes corresponding to
(3) |
However, we note that this is equivalent to adding
(4) |
at each site since for example is the Hermitian conjugate of . 111 Note that the two expressions are not equivalent on each individual site since the Hermitian conjugate of one term is a term that appears in the former expression on a different site. The two prescriptions are only equivalent since we add the terms on all sites. Using the later notation we implement this as follows.
The if statements are added to guard against adding hopping amplitudes beyond the boundary of the system.
2 Solver
We are now ready to setup and run the solver.
3 Extract the eigenvalue and probability density
To extract the eigenvalue and probability density we first setup the PropertyExtractor.
After this we print the energy for the given state by requesting it from the PropertyExtractor.
Further, to calculate the probability density we create an array, which we fill with the square of the absolute value of the probability amplitude.
Finally, we plot the probability density and save it to file.
4 Results
Below we present the results for the six lowest energy states for a lattice size of 20×20. The states separate into four groups with eigenvalues
(5) |
The second and fourth of these eigenvalues are degenerate with two eigenfunctions per energy. We can understand this grouping by realizing that the solutions to our problem are sinus functions with wave numbers (m, n),222This is most easily understood from considering the continous Schrödinger equation above, but is also true for the discrete lattice. where for the six lowest states
(6) |
Among these and as well as and are degenerate.
4.1 E = -3.9553
![[Uncaptioned image]](post6/ProbabilityDensity0.png)
4.2 E = -3.88881 (two degenerate states)
![[Uncaptioned image]](post6/ProbabilityDensity1.png)
![[Uncaptioned image]](post6/ProbabilityDensity2.png)
4.3 E = -3.82229
![[Uncaptioned image]](post6/ProbabilityDensity3.png)
4.4 E = -3.7796 (two degenerate states)
![[Uncaptioned image]](post6/ProbabilityDensity4.png)
![[Uncaptioned image]](post6/ProbabilityDensity5.png)
5 Full code
Full code is available in src/main.cpp in the project 2018_10_27 of the Second Tech code package. See the README for instructions on how to build and run.