-
Kostas Vilkelis authoredKostas Vilkelis authored
jupytext:
text_representation:
extension: .md
format_name: myst
format_version: 0.13
jupytext_version: 1.14.4
kernelspec:
display_name: Python 3 (ipykernel)
language: python
name: python3
Algorithm overview
Self-consistent mean-field loop
To calculate the mean-field interaction in {eq}mf_infinite
, we require the ground-state density matrix \rho_{mn}(R).
However, {eq}density
is a function of the mean-field interaction \hat{V}_{\text{MF}} itself.
Therefore, we need to solve for both self-consistently.
A single iteration of this self-consistency loop is a function that computes a new mean-field correction from a given one:
\text{MF}(\hat{V}_{\text{init, MF}}) \to \hat{V}_{\text{new, MF}},
which is defined in {autolink}~meanfi.model.Model.mfield
method.
It performs the following steps:
- Calculate the total Hamiltonian \hat{H}(R) = \hat{H_0}(R) + \hat{V}_{\text{init, MF}}(R) in real-space.
- ({autolink}
~meanfi.mf.density_matrix
) Compute the ground-state density matrix \rho_{mn}(R):- ({autolink}
~meanfi.tb.transforms.tb_to_kgrid
) Fourier transform the total Hamiltonian to momentum space \hat{H}(R) \to \hat{H}(k). - ({autolink}
numpy.linalg.eigh
) Diagonalize the Hamiltonian \hat{H}(R) to obtain the eigenvalues and eigenvectors. - ({autolink}
~meanfi.mf.fermi_on_kgrid
) Calculate the fermi level given the desired filling of the unit cell. - ({autolink}
~meanfi.mf.density_matrix_kgrid
) Calculate the density matrix \rho_{mn}(k) using the eigenvectors and the fermi level. - ({autolink}
~meanfi.tb.transforms.kgrid_to_tb
) Inverse Fourier transform the density matrix to real-space \rho_{mn}(k) \to \rho_{mn}(R).
- ({autolink}
- ({autolink}
~meanfi.mf.meanfield
) Calculate the new mean-field correction \hat{V}_{\text{new, MF}}(R) using {eq}mf_infinite
.
Self-consistency criteria
To define the self-consistency condition, we first introduce an invertible function f that uniquely maps \hat{V}_{\text{MF}} to a real-valued vector which minimally parameterizes it:
f : \hat{V}_{\text{MF}} \to f(\hat{V}_{\text{MF}}) \in \mathbb{R}^N.
In the code, f corresponds to the {autolink}~meanfi.params.rparams.tb_to_rparams
function (inverse is {autolink}~meanfi.params.rparams.rparams_to_tb
).
Currently, f parameterizes the mean-field interaction by taking only the upper triangular elements of the matrix V_{\text{MF}, nm}(R) (the lower triangular part is redundant due to the Hermiticity of the Hamiltonian) and splitting it into real and imaginary parts to form a real-valued vector.
With this, we define the self-consistency criterion as a fixed-point problem:
f(\text{MF}(\hat{V}_{\text{MF}})) = f(\hat{V}_{\text{MF}}).
Instead of solving the fixed point problem, we rewrite it as the difference of the two successive self-consistent mean-field iterations in {autolink}~meanfi.solvers.cost_mf
.
That re-defines the problem into a root-finding problem which is more consistent with available numerical solvers such as {autolink}~scipy.optimize.anderson
.
That is exactly what we do in the {autolink}~meanfi.solvers.solver
function, although we also provide the option to use a custom optimizer.