# Manipulating fermionic operators

Before we see how to use a CTQMC impurity solver, it will be useful to learn about operators. Indeed, one of the inputs of the CTQMC solver is a Hamiltonian in operator form.

## Fundamental operators

After importing the operator module, the keyword c_dag and c allow to define a new fermionic operator. c_dag and c are followed by two indices. Inspired by the block structure of Green’s functions, the first index is a block index, while the second is the index within the block. Here’s an example of operators as they would be defined if we had two blocks up and down of size 1:

[1]:

from triqs.operators import c, c_dag, n, Operator # n and Operator will be needed later
print(c_dag('up',0))
print(c('up',0))
print(c_dag('down',0))
print(c('down',0))

1*c_dag('up',0)
1*c('up',0)
1*c_dag('down',0)
1*c('down',0)


## Number operator

The keyword n is defined as $$C^\dagger C$$

[2]:

print(n('up',0))

1*c_dag('up',0)*c('up',0)


## Operations with operators

Operators can be manipulated and anti-commutation relations will be used to simplify expressions

[3]:

# Should give 0
print(n('up',0) - c_dag('up',0)*c('up',0))

0

[4]:

# Some calculation
print(n('up',0) - 2 * c_dag('up',0)*c('up',0))

-1*c_dag('up',0)*c('up',0)

[5]:

# Define the parameters
U = 4
mu = 3

# H is an empty operator
H = Operator()

# Add elements to define a Hamiltonian
H += U * n('up',0) * n('down',0)
H -= mu * (n('up',0) + n('down',0))
print(H)

-3*c_dag('down',0)*c('down',0) + -3*c_dag('up',0)*c('up',0) + 4*c_dag('down',0)*c_dag('up',0)*c('up',0)*c('down',0)


## Exact Diagonalization

For small system-sizes we can use AtomDiag provided by TRIQS to perform exact diagonalization on the Hamiltonian

[1]:

from triqs.atom_diag import AtomDiag
?AtomDiag

Signature: AtomDiag(*args, **kwargs)
Docstring:
Lightweight exact diagonalization solver

Use the QR algorithm to diagonalize the Hamiltonian.
Auto-partitions the Hamiltonian into subspaces (blocks)
such that all creation and annihilation operators map one
subspace to exactly one other subspace.

Parameters
----------
h: Operator
Hamiltonian to be diagonalized.
fops: list of tuple of strings and ints
List of all annihilation / creation operator flavors (indices).
Must at least contain all flavors met in h.
qn_vector: list of Operator, optional
Vector of quantum number operators to be used for the auto-partitioning
n_min, n_max: integers, optional
Truncate the Fock-space to states with particle number in [n_min, n_max]
Cannot be combined with qn_vector
File:      ~/opt/triqs/lib/python3.11/site-packages/triqs/atom_diag/__init__.py
Type:      function

[7]:

# List of operator flavors
fops = [('up',0), ('down',0)]

# Construct AtomDiag object, Performs diagonalization


-3.0


We can then use the AtomDiag object to obtain for example the atomic Green’s functions

[8]:

from triqs.atom_diag import atomic_g_tau
Gtau = atomic_g_tau(atom=AD, beta=10, gf_struct=[('up',1),('down',1)], n_tau=1001)

from triqs.plot.mpl_interface import oplot
%matplotlib inline
oplot(Gtau["up"][0,0].real, name='G')