Perturbation order histograms¶
To analyze the behaviour of the Markov chain in CTHYB the perturbation order histograms are a central tool. This is a simple example showing how to sample and plot these histograms.
As an example we solve the one-orbital Anderson impurity at inverse temperature \(\beta\), embedded in a flat (Wilson) bath with non-interacting Green’s function \(G^{-1}_{0,\sigma} (i\omega_n) = i \omega_n - \epsilon_f - V^2 \Gamma_\sigma(i \omega_n)\), and local interaction \(H_\mathrm{int} = U n_\uparrow n_\downarrow\), where \(U\) is the Hubbard interaction, \(\epsilon_f\) is the local energy. The bath \(\Gamma\), and the bath has bandwidth \(D\) and hybridization \(V\).
In [2]:
from pytriqs.operators import n
from pytriqs.archive import HDFArchive
from pytriqs.gf import inverse, iOmega_n, Wilson
from triqs_cthyb import Solver
U, e_f, D, V, beta = 2., -1., 1., 1., 20.
Sz = 0.5 * ( n('up', 0) - n('down', 0) )
S = Solver(
beta=beta, gf_struct=[('up',[0]), ('down',[0])],
n_tau=400, n_iw=50,)
S.G0_iw << inverse(iOmega_n - e_f - V**2 * Wilson(D))
S.solve(
h_int=U*n('up',0)*n('down',0),
n_cycles=100000,
length_cycle=20,
n_warmup_cycles=100,
measure_G_tau=False,
measure_pert_order=True,
)
Starting on 1 Nodes at : 2019-06-05 17:20:04.584678
╔╦╗╦═╗╦╔═╗ ╔═╗ ┌─┐┌┬┐┬ ┬┬ ┬┌┐
║ ╠╦╝║║═╬╗╚═╗ │ │ ├─┤└┬┘├┴┐
╩ ╩╚═╩╚═╝╚╚═╝ └─┘ ┴ ┴ ┴ ┴ └─┘
The local Hamiltonian of the problem:
(-1,0)*c_dag('down',0)*c('down',0) + (-1,0)*c_dag('up',0)*c('up',0) + (2,0)*c_dag('down',0)*c_dag('up',0)*c('up',0)*c('down',0)
Using autopartition algorithm to partition the local Hilbert space
Found 4 subspaces.
Warming up ...
Accumulating ...
17:20:04 0% ETA 00:00:14 cycle 667 of 100000
17:20:06 14% ETA 00:00:12 cycle 14816 of 100000
17:20:09 31% ETA 00:00:10 cycle 31517 of 100000
17:20:12 51% ETA 00:00:07 cycle 51752 of 100000
17:20:16 78% ETA 00:00:03 cycle 78933 of 100000
[Rank 0] Collect results: Waiting for all mpi-threads to finish accumulating...
[Rank 0] Timings for all measures:
Measure | seconds
Average sign | 0.0121935
Perturbation order | 0.017634
Perturbation order (down) | 0.0144553
Perturbation order (up) | 0.011125
Total measure time | 0.0554078
[Rank 0] Acceptance rate for all moves:
Move set Insert two operators: 0.056355
Move Insert Delta_up: 0.0565787
Move Insert Delta_down: 0.0561309
Move set Remove two operators: 0.0564614
Move Remove Delta_up: 0.0566373
Move Remove Delta_down: 0.0562848
Move Shift one operator: 0.758509
[Rank 0] Warmup lasted: 0.0125826 seconds [00:00:00]
[Rank 0] Simulation lasted: 14.9179 seconds [00:00:14]
[Rank 0] Number of measures: 100000
Total number of measures: 100000
Average sign: (1,0)
Plotting perturbation order histograms¶
The measured histograms are available as the member properties
S.perturbation_order
and S.perturbation_order_total
of the cthyb
solver.
For an ergodic Markov chain with sufficient number of warmup sweeps, the perturbation order distribution should be approximately Gaussian (or Possonian for low average orders).
In [3]:
from pytriqs.plot.mpl_interface import oplot, oplotr, plt
oplot(S.perturbation_order_total, label='total')
for b in S.perturbation_order:
oplot(S.perturbation_order[b], label='block {:s}'.format(b))
plt.semilogy([], [])
plt.xlim([0, 40]);
The total average perturbation order is important information to
determine the length_cycle
parameter that controls the number of
attempted moves between measurements. To ensure low correlation between
measurements the length_cycle
should be high enough that the
attempted moves can significanty change the configuration.
Autor: H. U.R. Strand (2019)