Hamiltonian Setup

In ed_hamiltonian_nonsu2 we implement procedures to setup and build the sector Hamiltonian which are then used elsewhere to obtain the low part of the energy spectrum or construct the dynamical response functions.

The sector electron Hamiltonian has the form:

\[H_e = H_{\rm imp} + H_{\rm int}+ H_{\rm bath} + H_{\rm hyb}\]

where \(H_{\rm imp}\) describes all the impurity Hamiltonian terms

\[H_{\rm imp} = \sum_{ab,\sigma} \left[ H^{\rm imp}_{ab,\sigma\sigma`} -\mu\delta_{ab}\delta_{\sigma\sigma`}\right] c^{\dagger}_{a\sigma}c_{b\sigma'} + \sum_{i=0,x,y,z}\sum_{a} c^\dagger_{a\sigma} T^i_{a,\sigma\sigma'} c_{a\sigma'} + H.c.\]

where \(T^i_a\) are the excitonic field components, each proportional to the 4 generators of the \(SU(2)\), coupled to the exciton amplitudes.

The term \(H_{\rm int}\) describes the local electron-electron interaction in the generic Hubbard-Kanamori form with tunable parameters:

\[H_{\rm int} = \sum_{a} U_a n_{a\uparrow}n_{a\downarrow} + U'\sum_{a<b,\sigma} n_{a\sigma}n_{b\bar{\sigma}} + (U'-J)\sum_{a<b,\sigma} n_{a\sigma}n_{b\sigma} + J_x \sum_{ab} c^{\dagger}_{a\uparrow}c^{\dagger}_{b\uparrow}c_{a\downarrow}c_{b\uparrow} + J_p \sum_{ab}c^{\dagger}_{a\uparrow}c^{\dagger}_{a\downarrow}c_{b\downarrow}c_{b\uparrow}\]

where \(U_a=\) uloc, \(U'=\) ust, \(J=\) jh, \(J_x=\) jx and \(J_p=\) jp.

The \(H_{\rm bath}\) and \(H_{\rm hyb}\) describe, respectively, the bath terms of the Hamiltonian and the hopping between the impurity and the bath levels.

\[\begin{split}H_{\rm bath} & = \sum_p \sum_{ab\sigma\sigma'} h^p_{ab\sigma\sigma'}p^{\dagger}_{a\sigma}p_{b\sigma'} + H.c.\\\\ H_{\rm hyb} & = \sum_p \sum_{a\sigma} V^p_{a\sigma} c^{\dagger}_{a\sigma} p_{p\sigma} + H.c.\end{split}\]

Note

In the current implementation the nonsu2 mode does not support (yet?) the presence of electron-phonon coupling terms.

Quick access

Routines:

build_hv_sector_nonsu2(), delete_hv_sector_nonsu2(), vecdim_hv_sector_nonsu2(), tridiag_hv_sector_nonsu2()

Used modules

Subroutines and functions

subroutine  ed_hamiltonian_nonsu2/build_hv_sector_nonsu2(isector[, hmat])

Builds the matrix-vector product \(H\times \vec{v}\) in the current sector.

  1. Building the sector through build_sector() for isector

  2. Retrieve all dimensions of the sectors, setup the MPI split in parallel mode.

  3. If total sector dimension is < lanc_dim_threshold then Hamiltonian is stored into dense matrix for Lapack diagonalization

  4. Else we proceeds according to the followins scheme:

Build Hamiltonian, \(H\times\vec{v}\) products.

ed_sparse_h = T

ed_sparse_h = F

call ed_buildh_nonsu2_main
serial: sphtimesv_p => spmatvec_nonsu2_main
MPI: sphtimesv_p => spmatvec_mpi_nonsu2_main
serial: sphtimesv_p => directmatvec_nonsu2_main
MPI: sphtimesv_p => directmatvec_mpi_nonsu2_main
Parameters:

isector [integer] – Index of the actual sector to be analyzed

Options:

hmat (•, •) [complex] – Dense matrix to store the sector Hamiltonian is dim < lanc_dim_threshold

subroutine  ed_hamiltonian_nonsu2/delete_hv_sector_nonsu2()

Delete the all the memory used to construct the sector Hamiltonian and the corresponding matrix vector products. The sector is deleted, all the dimensions and MPI splitting variables are reset to zero. All the sparse matrices are deallocated having gone out of scope. The abstract interface pointer spHtimesV_p for the matrix-vector product is nullified.

function  ed_hamiltonian_nonsu2/vecdim_hv_sector_nonsu2(isector)

Returns the dimensions vecdim of the vectors used in the Arpack/Lanczos produces given the current sector index isector . If parallel mode is active the returned dimension corresponds to the correct chunk for each thread.

Parameters:

isector [integer] – current sector index

Return:

vecdim [integer] – vector or vector chunck dimension

subroutine  ed_hamiltonian_nonsu2/tridiag_hv_sector_nonsu2(isector, vvinit, alanc, blanc, norm2)

Returns the parameters \(\vec{\alpha}\) and \(\vec{\beta}\) , respectively alanc and blanc , of the partial tridiagonalization of the sector Hamiltonian on a Krylov basis with starting vector vvinit.

Input:
  • isector

  • vvinit

Output:
  • alanc corresponding to \(\vec{\alpha}\)

  • blanc corresponding to \(\vec{\beta}\)

  • norm2 the norm of the input vector \(\langle {\rm vvinit}|{\rm vvinit}\rangle\)

Parameters:
  • isector [integer]

  • vvinit (•) [complex]

  • alanc (•) [real, allocatable]

  • blanc (•) [real, allocatable]

  • norm2 [real]