How to define Hamiltonians in a portable way
Summary
Current version includes:
- description of the input of the general geometry of the lattice (unit cell geometry, number and location of adatoms and vacancies, etc.)
- description of hoppings
- description of interactions in generalized Coulomb-like form (see below)
TODO:
- description of interaction in the form of full squares - DONE - see the comment section
- description of observables
- format for output
Detailed description
Ideally, description of lattice Hamiltonian and observables should be made outside of the ALF code, in some (human-readeable) text files with a specified format.
Description of the Hamiltonian, especially its kinetic part, should be made as close as possible to the output format of DFT codes, for example wannier90. This is a way to make connection to much larger community and make the usage of ALF more convenient for people who are already get used to the DFT file formats.
However, the wannier90 file formats in their native form are a bit too restrictive, and do not allow to describe all lattice Hamiltonians, accessible for ALF (e.g. wannier90 format does not allow spin-dependent hoppings, nor does it contain vacancies or adatoms, not repeated in all unit cells). Thus, it would be better to adopt a closely related, but still different file format, which then can be transferred back and forth to wannier90 format e.g. using rather elementary python script.
General notation: Elementary object is orbital - electronic state, which can host both spin-up and spin-down electrons. Next level is unit cell. Each unit cell contains N orbitals, repeated from unit cell to unit cell, and arbitrary number of adatom orbitals N_a (their number can vary from unit cell to unit cell). Finally, we have 2D lattice, which contains L_x \times L_y unit cells, where adatoms and vacancies are specified individually for each unit cell, containing them. Thus, the electronic state is fully characterized by the following set of numbers: 1) two integers \vec R=(x,y) representing 2D unit cell index \vec R; 2) integer index \mu inside the unit cell, running from 0 to N+N_a(\vec R)-1, where N_a(\vec R) is number of adatoms in the current unit cell (it is zero by default). 3) spin: \sigma=0,\, 1. Thus e.g. annihilation operator with all its indexes can be written as \hat a_{\vec R, \mu, \sigma}. Note that \mu index covers both repeated orbitals and adatom orbitals.
Any repeated orbital and any adatom orbital can be declared vacant, which means that any hoppings to this orbital, and any interaction terms (see below) including this orbital are set to zero automatically. In order to make it more user-friendly, vacancy is realized as an additional attribute. It means that the user should not e.g. discount number of vacancies from N or N_a(x,y) while numbering orbitals for hoppings or interactions, it should be done inside the input routine automatically. The attribute of vacancy has the highest priority, meaning that the hoppings and interactions involving vacant orbitals are set to zero even if they were nonzero initially in the files describing hoppings and interactions.
Hoppings are characterized by indexes of orbitals, which they connect, and complex number for hopping integral. All hoppings are divided into two classes: repeated, or regular ones, which are repeated in each unit cell; and irregular, which are not repeated. The latter ones can be used e.g. to describe hoppings to adatom orbitals or as pinning fields. It is enough to describe regular hoppings only at one unit cell, while irregular hoppings need individual description. Irregular hoppings have higher priority, in a sense that if an irregular hopping connects some orbitals, which are already connected by a regular one, irregular hoppings overrides the regular.
Symmetries: SU(N) symmetry is still defined in parameters file. Flavor symmetry is parsed automatically using the combination of orbital and spin index in the input files (see below).
Interactions are assumed to have the following form (1): \hat H_{I}= \frac{1}{2} \sum_{i,j}^{N_I} U_{i,j} \hat A_i \hat A_j where operators \hat A_i=c_i \hat a^\dag_{\vec R_1(i), \mu_1(i), \sigma_1(i)} \hat a_{\vec R_2(i), \mu_2(i), \sigma_2(i)} + \bar {c_i} \hat a^\dag_{\vec R_2(i), \mu_2(i), \sigma_2(i)} \hat a_{\vec R_1(i), \mu_1(i), \sigma_1(i)} + b_i are elementary fermionic bilinears with complex coefficients c_i and real shifts b_i. U is complex-valued hermitian matrix. Similar to hoppings, interaction terms are divided into regular ones, which are repeated in all unit cells and irregular ones, which are not repeated, and should be described individually. Input routine can subsequently diagonalize the U matrix to convert the interaction term into sum of squares automatically, or alternatively, we can work with them without diagonalization, using HS transformation on the basis of multi-dimensional Gaussian integral.
It might be even advantageous to have separate input files describing interaction terms to be dealt with by different versions of HS transformation. It will provide additional flexibility: the same physical interaction can be divided into several parts, with the aim to use different HS transformations for them. Example: Hubbard interaction H_{Hub.}= U \sum_{\vec R, \mu} \hat {\tilde n}_{\vec R, \mu, \uparrow} \hat {\tilde n}_{\vec R, \mu, \downarrow}, where \hat {\tilde n}_{\vec R, \mu, \uparrow}=\hat a^\dag_{\vec R, \mu, 0} \hat a_{\vec R, \mu, 0} - \frac{1}{2}, \hat {\tilde n}_{\vec R, \mu, \downarrow}=\hat a^\dag_{\vec R, \mu, 1} \hat a_{\vec R, \mu, 1}-\frac{1}{2}, can be written as H_{Hub.}= \frac{\alpha U}{2} \sum_{\vec R, \mu} \left( \hat {\tilde n}_{\vec R, \mu, \uparrow} + \hat {\tilde n}_{\vec R, \mu, \downarrow} \right)^2 - \frac{(1-\alpha) U}{2} \sum_{\vec R, \mu} \left( \hat {\tilde n}_{\vec R, \mu, \uparrow} - \hat {\tilde n}_{\vec R, \mu, \downarrow} \right)^2. Both of these terms can be subsequently written as expression from eq. (1): \hat H_{Hub.}=\hat H_{I_1} + \hat H_{I_2}, \hat H_{I_1}= \frac{\alpha U}{2} \sum_{\vec R, \mu} \left( \hat {\tilde n}_{\vec R, \mu, \uparrow} \hat {\tilde n}_{\vec R, \mu, \uparrow} + 2 \hat {\tilde n}_{\vec R, \mu, \uparrow} \hat {\tilde n}_{\vec R, \mu, \downarrow} + \hat {\tilde n}_{\vec R, \mu, \downarrow} \hat {\tilde n}_{\vec R, \mu, \downarrow} \right), \hat H_{I_2}= - \frac{(1-\alpha) U}{2} \sum_{\vec R, \mu} \left( \hat {\tilde n}_{\vec R, \mu, \uparrow} \hat {\tilde n}_{\vec R, \mu, \uparrow} - 2 \hat {\tilde n}_{\vec R, \mu, \uparrow} \hat {\tilde n}_{\vec R, \mu, \downarrow} + \hat {\tilde n}_{\vec R, \mu, \downarrow} \hat {\tilde n}_{\vec R, \mu, \downarrow} \right),
Subsequently, \hat H_{I_1} and \hat H_{I_2} can be assigned to different HS fields by describing them in separate files, thus creating effectively complex auxiliary field.
Preliminary, we can include 3 versions of HS transformations:
-
discrete fields, dealing with full squares obtained after diagonalization of the U matrix in (1): \frac{1}{2} \sum U_{i,j} \hat A_i \hat A_j = \frac{1}{2} \sum_{p=0}^{N_{\bar 0}} \lambda_p \left(\hat {Q^{R}_p}^2 + \hat {Q^{L}_p}^2 \right), where \hat Q^{R}_p=\sum_k \Re C^{(p)}_k \hat A_k, \,\,\, \hat Q^{I}_p=\sum_k \Im C^{(p)}_k \hat A_k, N_{\bar 0} is the number of nonzero eigenvalues \lambda_p of U matrix, and C^{(p)}_k are corresponding eigenvectors. In practice, the sums for \hat Q^{R}_p and \hat Q^{I}_p should also take into account that some C^{(p)}_k are zero.
-
continuous fields, but also coupled to full squares in the same manner as the discrete fields above.
-
continuous field using multi-dimensional Gaussian integral: e^{-\frac{1}{2} \sum U_{i,j} \hat A_i \hat A_j}=\int \prod_p d\Re z_p d\Im z_p e^{- \frac{1}{2} \sum _{n,m} \bar z_n U^{-1}_{n,m} z_m} e^{i \frac{1}{2} \sum_k (\bar z_k \hat A^\dag_k + z_k \hat A_k)}, if all eigenvalues of U matrix are positive and e^{-\frac{1}{2} \sum U_{i,j} \hat A_i \hat A_j}=\int \prod_p d\Re z_p d\Im z_p e^{\frac{1}{2} \sum _{n,m} \bar z_n U^{-1}_{n,m} z_m} e^{\frac{1}{2} \sum_k (\bar z_k \hat A^\dag_k + z_k \hat A_k)}, if all eigenvalues of U matrix are negative.
Optionally, we can also include interactions directly written as sum of squares: \hat H_{I}= \frac{1}{2} \sum_{i}^{N_I} U_{i} \hat B_i^2, where \hat B_i is a fermionic bilinear (see the comment section).
Summarising, the description of the Hamiltonian and observables should consist of at least 4 files:
- Geometry of the lattice - contains the information about number of unit cells, shape and number of orbitals in an individual unit cell, as well as number and location of adatoms and vacancies.
- Hoppings - description of periodical hoppings (repeated in each unit cell), and non-periodic ones (e.g. hoppings connecting adatom orbitals with regular orbital).
- One or more files for interactions - description of interactions in Hamiltonian, separate file for each type of auxiliary field.
- Optionally - one or more files with the description of observables, providing the definition for some non-built-in observables (TODO: provide general file format for observables, taking into account violation of translational symmetry by vacancies and adatoms).
Below I give an example of these files corresponding to 18x18 honeycomb hBN lattice (thus 2 orbitals in unit cell) with two hydrogen adatoms and 1 vacancy hoppings_3D.pdf. Interactions consist of Hubbard terms, equal for B and N atoms, and a bit weaker for H atoms.
18 18 #2D lattice size
0.0 1.0 0.0 #3 unit cell vectors (cartesian coordinates)
0.866 0.5 0.0
0.0 0.0 1.0 #the third vector added despite the system to be 2D to be able to place adatoms off the plane
2 #Number of repeated orbitals (spin up and spin down states are present at each orbital)
0 0.0 0.0 0.0 #label and coordinates (in unit cell vectors) for each regular (repeating) orbital
1 0.666 -0.333 0.0
2 #number of unit cells hosting adatoms
9 9 #index $\vec R$ of the first cell hosting adatoms
1 #number of adatoms in this unit cell
0 0.0 0.0 1.0 #coordinate of adatom (in unit cell vectors - label-3 coordinates)
9 11 #repetition for the next cell hosting adatoms
1 #number of adatoms in this unit cell
0 0.0 0.0 1.0
1 #number of vacancies
0 1 1 0 #for each vacancy - label, index $\vec R$ of the cell, index $\mu$ inside the cell\
10 #number of regular hoppings, repeated in each unit cell
0 0 0 0 0 1 0 2.33 0.0 #for each hopping: $c \hat a^\dag_{\vec R, \mu_1, \sigma_1} \hat a_{\vec R + \vec \Delta, \mu_2, \sigma_2} + h.c. $ label - index $\mu_1$ - spin $\sigma_1$ - shift of unit cell $\vec \Delta$ - index $\mu_2$ - spin $\sigma_2$ - hopping $\Re c$ and $\Im c$, initial cell index $\vec R$ is running through all unit cells
1 0 1 0 0 1 1 2.33 0.0
2 0 0 -1 0 1 0 2.33 0.0
3 0 1 -1 0 1 1 2.33 0.0
4 0 0 -1 1 1 0 2.33 0.0
5 0 1 -1 1 1 1 2.33. 0.0
6 1 0 0 0 1 0 5.0 0.0
7 1 1 0 0 1 1 5.0 0.0
8 0 0 0 0 0 0 -5.0 0.0
9 0 1 0 0 0 1 -5.0 0.0
8 #number of irregular hoppings (NOT repeated in each unit cell)
0 9 9 0 0 0 0 2 0 10.0 0.0 #for each hopping: $c \hat a^\dag_{\vec R, \mu_1, \sigma_1} \hat a_{\vec R + \vec \Delta, \mu_2, \sigma_2} + h.c. $ label - $\vec R$ - index $\mu_1$ - spin $\sigma_1$ - shift of unit cell $\vec \Delta$ - index $\mu_2$ - spin $\sigma_2$ - hopping $\Re c$ and $\Im c$
1 9 9 0 1 0 0 2 1 10.0 0.0
2 9 9 2 0 0 0 2 0 -0.1 0.0
3 9 9 2 1 0 0 2 1 -0.1 0.0
4 9 11 0 0 0 0 2 0 10.0 0.0
5 9 11 0 1 0 0 2 1 10.0 0.0
6 9 11 2 0 0 0 2 0 -0.1 0.0
7 9 11 2 1 0 0 2 1 -0.1 0.0
This setup corresponds to SU(2)-symmetrical coupling to auxiliary field: \hat H_I= \sum_{\vec R, \mu} \frac{U_{\vec R, \mu}}{2} \left( \hat {\tilde n}_{\vec R, \mu, \uparrow} \hat {\tilde n}_{\vec R, \mu, \uparrow} + 2 \hat {\tilde n}_{\vec R, \mu, \uparrow} \hat {\tilde n}_{\vec R, \mu, \downarrow} + \hat {\tilde n}_{\vec R, \mu, \downarrow} \hat {\tilde n}_{\vec R, \mu, \downarrow} \right), where U_{\vec R, \mu} is 10.0 on regular (B or N) orbitals, and 5.0 on irregular (H) orbitals. One can obviously change this file to Mz-setup, by writing the interaction term as \hat H_I= - \sum_{\vec R, \mu} \frac{U_{\vec R, \mu}}{2} \left( \hat {\tilde n}_{\vec R, \mu, \uparrow} \hat {\tilde n}_{\vec R, \mu, \uparrow} - 2 \hat {\tilde n}_{\vec R, \mu, \uparrow} \hat {\tilde n}_{\vec R, \mu, \downarrow} + \hat {\tilde n}_{\vec R, \mu, \downarrow} \hat {\tilde n}_{\vec R, \mu, \downarrow} \right), and changing signs of different terms accordingly.
6 #number of regular(repeated) terms in interaction
0 5.0 0.0 0 0 0 0 0 0 1.0 0.0 -0.5 0 0 0 0 0 0 0 0 1.0 0.0 -0.5
1 5.0 0.0 0 1 0 0 0 1 1.0 0.0 -0.5 0 0 0 1 0 0 0 1 1.0 0.0 -0.5
2 5.0 0.0 0 0 0 0 0 0 1.0 0.0 -0.5 0 0 0 1 0 0 0 1 1.0 0.0 -0.5
3 5.0 0.0 1 0 0 0 1 0 1.0 0.0 -0.5 0 0 1 0 0 0 1 0 1.0 0.0 -0.5
4 5.0 0.0 1 1 0 0 1 1 1.0 0.0 -0.5 0 0 1 1 0 0 1 1 1.0 0.0 -0.5
5 5.0 0.0 1 0 0 0 1 0 1.0 0.0 -0.5 0 0 1 1 0 0 1 1 1.0 0.0 -0.5
6 #number of irregular terms in interaction
0 2.5 0.0 9 9 2 0 0 0 0 0 1.0 0.0 -0.5 0 0 2 0 0 0 0 0 1.0 0.0 -0.5
1 2.5 0.0 9 9 2 0 0 0 0 0 1.0 0.0 -0.5 0 0 2 1 0 0 0 1 1.0 0.0 -0.5
2 2.5 0.0 9 9 2 1 0 0 0 1 1.0 0.0 -0.5 0 0 2 1 0 0 0 1 1.0 0.0 -0.5
3 2.5 0.0 9 11 2 0 0 0 0 0 1.0 0.0 -0.5 0 0 2 0 0 0 0 0 1.0 0.0 -0.5
4 2.5 0.0 9 11 2 0 0 0 0 0 1.0 0.0 -0.5 0 0 2 1 0 0 0 1 1.0 0.0 -0.5
5 2.5 0.0 9 11 2 1 0 0 0 1 1.0 0.0 -0.5 0 0 2 1 0 0 0 1 1.0 0.0 -0.5
For regular terms:
Each line describes one sum
\hat H_{I}= \frac{1}{2} \left( U_i \sum_{\vec R} \hat A_{i,1} (\vec R) \hat A_{i,2} (\vec R) + \bar{U}_i \sum_{\vec R} \hat A_{i,2} (\vec R) \hat A_{i,1} (\vec R) \right),
if the operators A are different (where the second sum is added to keep the Hamiltonian explicitly hermitian) or
\hat H_{I}= \frac{1}{2} U_i \sum_{\vec R} \hat A_{i,1} (\vec R) \hat A_{i,2} (\vec R)
if operators A are the same (diagonal elements of matrix of interactions are not repeated).
Operators A are defined as:
\hat A_{i,1}=c_{i,1} \hat a^\dag_{\vec R, \mu_1(i), \sigma_1(i)} \hat a_{\vec R + \vec \Delta_2(i), \mu_2(i), \sigma_2(i)} + h.c + b_{i,1}
and
\hat A_{i,2}=c_{i,2} \hat a^\dag_{\vec R + \vec \Delta_3 (i), \mu_3(i), \sigma_3(i)} \hat a_{\vec R + \vec \Delta_4(i), \mu_4(i), \sigma_4(i)} + h.c + b_{i,2}
Order of terms in each line (skipping the first number which can be used as a label): \Re U_i \,\,\, \Im U_i \,\,\, \mu_1(i) \,\,\, \sigma_1(i) \,\,\, \vec \Delta_2(i) \,\,\, \mu_2(i) \,\,\, \sigma_2(i) \,\,\, \Re c_{i,1} \,\,\, \Im c_{i,1} \,\,\, b_{i,1} \,\,\, \vec \Delta_3 (i) \,\,\, \mu_3(i) \,\,\, \sigma_3(i) \,\,\, \vec \Delta_4(i) \,\,\, \mu_4(i) \,\,\, \sigma_4(i) \,\,\, \Re c_{i,2} \,\,\, \Im c_{i,2} \,\,\, b_{i,2}
One should be careful about possible repetitions of regular terms: e.g. if charge-charge interaction with nearest neighbors is defined for both shifts +1 and -1, it will be repeated in matrix of interactions, thus the interaction U should be either rescaled in 2 times, or only one type of shifts should be present in the file describing interactions (+1 or -1).
Irregular terms are described in similar manner, with the only exception that initial unit cell \vec R is set explicitly:
\Re U_i \,\,\, \Im U_i \,\,\, \vec R(i) \,\,\, \mu_1(i) \,\,\, \sigma_1(i) \,\,\, \vec \Delta_2(i) \,\,\, \mu_2(i) \,\,\, \sigma_2(i) \,\,\, \Re c_{i,1} \,\,\, \Im c_{i,1} \,\,\, b_{i,1} \,\,\, \vec \Delta_3 (i) \,\,\, \mu_3(i) \,\,\, \sigma_3(i) \,\,\, \vec \Delta_4(i) \,\,\, \mu_4(i) \,\,\, \sigma_4(i) \,\,\, \Re c_{i,2} \,\,\, \Im c_{i,2} \,\,\, b_{i,2}