Using embedding classes¶
This guide shows you how to use the embedding classes and describes a little bit about how they do things.
See also
EmbeddingAtomDiag¶
First a gf_struct object has to be created that describes the correlated
subspace \(\mathcal{C}_i\). This object should be constructed in the same way
as TRIQS Green’s function objects are created: as a list of tuple pairs
describing a symmetry block and its dimension. For example, for the \(e_g\)
symmetry sector (two orbitals) in a system where spin is conserved, the
structure can be encoded as
gf_struct = [ ('up_eg', 2), ('dn_eg', 2)]
Next a local Hamiltonian has to be constructed. This must be a TRIQS operator that includes the interaction terms. It can include the local quadratic terms in \(\mathcal{C}_i\), but these can also be set later on. It does not make any difference for the solvers. For example, a two-orbital Hubbard model with hopping between the orbitals can be constructed as
from triqs.operators import Operator, c_dag, c, n
n_orb = 2
U = 1
h_int = Operator()
for o in range(n_orb):
h_int += U * n('up', o) * n('dn', o)
# Optional local terms
#V = 0.25
#for s in ['up', 'dn']:
# h_int += V * ( c_dag(s, 0) * c(s, 1) + c_dag(s, 1) * c(s, 0) )
Constructor¶
The solver is instantiated as
from risb.embedding import EmbeddingAtomDiag
embedding = EmbeddingAtomDiag(h_int, gf_struct)
The interaction Hamiltonian is stored in embedding.h_int and the block
matrix structure is stored in embedding.gf_struct.
Setting h_emb¶
Next the embedding Hamiltonian h_emb has to be set with
embedding.set_h_emb(Lambda_c, D)
where Lambda_c and D are block matrices that describe the impurity problem
with the structure of gf_struct.
- py:
meth:
EmbeddingAtomDiag.set_h_embis internally called from within the self-consistent loop in the RISBSolverclasses. The hybridzation term fromDis stored asembedding.h_hybrand the bath hopping fromLambda_cstored asembedding.h_bathas TRIQS operators.
If the non-interacting quadratic couplings are not included in h_int, then
they must be passed as
embedding.set_h_emb(Lambda_c, D, h0_loc_matrix)
where h0_loc_matrix is a matrix that describes the couplings, with the same
block matrix structure as Lambda_c and D. This is stored in
embedding.h0_loc as a TRIQS operator.
Setting h_int¶
If you want to update the interaction terms on the impurity
# A new h_int
h_int = ...
embedding.set_h_int(h_int)
Solving¶
It is solved as
embedding.solve()
There are no arguments. All solve() does is call
- py:
class:
triqs.atom_diag.AtomDiag, passes ith_emband restricts the Hilbert space to the half-filled particle sector. The instance of this class is stored inembedding.ad. See the TRIQS documentation for its function.
Getting the density matrices¶
The single-particle density matrix of the \(f\) electrons in the embedding
space in one of the blocks specified by gf_struct is obtained as
embedding.get_rho_f(block)
The off-diagonal density matrix between the \(c\) and \(f\) electrons is obtained as
embedding.get_rho_cf(block)
The density matrix of the \(c\) electrons is obtained as
embedding.get_rho_c(block)
The three terms above give the full single-particle density matrix in the embedding space.
Local expectation values¶
Any local expectation value of an operator Op in the embedding space is
obtained as
embedding.overlap(Op)
Op must be a TRIQS operator. See the TRIQS manual for helper
functions to construct some common observables. To get observables
in the \(f\) electrons, the structure is obtained as
embedding.gf_struct_bath
The whole embedding space structure is obtained as
embedding.gf_struct_emb
EmbeddingDummy¶
If you want to have some correlated subspaces \(\mathcal{C}_i\) as inequivalent, but they are related by some symmetry, it is not necessary to solve for the ground state in each subspace separately.
This class is a copy of another
Embedding class. For example, to create a copy of
- py:
class:
EmbeddingAtomDiagit is instantiated as
from risb.embedding import EmbeddingDummy
embedding = EmbeddingDummy(embedding = embedding_atom_diag_instance)
Rotations¶
If the copy is related by symmetry, you can pass rotations as a list of
functions that operate in sequence on the block matrices that
- py:
class:
EmbeddingDummyreturns. For example, if the correlated subspace is equivalent except that the spin is rotated, like in an antiferromagnetic phase, this can be done with
from itertools import deepcopy
def rotate_spin(A):
B = deepcopy(A)
B['up'] = A['dn']
B['dn'] = A['up']
return B
embedding = EmbeddingDummy(embedding = ...,
rotations = [rotate_spin])
Note
set_h_emb() and solve() are methods that just pass and do nothing.
The density matrix functions get_rho_f, get_rho_cf, and get_rho_c grab
what is stored in embedding_atom_diag and rotates according to the list of
functions in rotations.
Warning
The operator passed to overlap is not rotated. Likely only rotationally
invariant quantities make sense to calculate, which are can be obtained from
the embedding class that EmbeddingDummy copies.