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_emb
is internally called from within the self-consistent loop in the RISBSolver
classes. The hybridzation term fromD
is stored asembedding.h_hybr
and the bath hopping fromLambda_c
stored asembedding.h_bath
as 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_emb
and 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:
EmbeddingAtomDiag
it 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:
EmbeddingDummy
returns. 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.