A single header file for itebd calculations based on the ITensor library.
Installation and Linking
Refer to ITensor's instruction for using iTensor. You just need to add
and make sure the header file is within path.
I have created a few examples to reproduce figures of some arXiv papers that utilized iTEBD:
arXiv:cond-mat/0605597 (figs. 5 and 6)
make the corresponding file's name you want to compile. For example,
make 1503.02010 generates executable
1503.02010 that produces figure 1 of arXiv:1503.02010.
By default, it is now set to reproduce figures 5 and 6 of Vidal's original paper.
Henceforth I assume we have
using namespace itensor;
IQIndex, depending on whether you want to use symmetries.
zoptional and defaults to 2. The coordination number. Could be useful for exotic system with >2 neighbors e.g. arXiv:0712.1806 (I have not tried).
QNBare optional and defaults to 1. The initial quantum numbers of the two sites (site A and site B). Physical meanings of these numbers are determined by the sites which are IQIndex .
Chi0is optional and defaults to 1. The initial bond dimension of each set of quantum numbers.
double itebd::step(std::complex<double> dt, size_t steps = 1, double thres = 1E-10, int maxm = 0);
dtis the timestep on real axis. When it is real, it propagates in real time.
stepsnumber of steps
Cutoffvalue used for SVD.
Maxmvalue used for SVD.
returns: Energy estimated based on the log of the expection value of the evolution operator
double itebd::step_imag(std::complex<double> dt, size_t steps = 1, double thres = 1E-10, int maxm = 0);
- identical to above but in the imaginary axis.
std::complex<double> itebd::measure(const T &op)
opis a two-neighboring sites operator with indices the same as the site used to construct
returns: Expectation value of the operator at the current state
Long-Range two-opeartor correlation measurements
std::vector<std::complex<double>> itebd::measure(const T &op1A, const T &op2, const std::vector<int> &rv);
op1Ais the operator at the origin and must have the same Index as the first site in the sites used to contruct
opt2is the opeartor at the second site. Can have either one of the site indices.
rvis the list of integer distances between sites 1 and 2 to compute <opt1A*opt2>
returns: a vector of complex values of <opt1A*opt2>
Helpful member variables / functions
.tv(vector of doubles): the times (in absolute values) traversed by the system since it starts
.Sv(vector of doubles): the entanglement entropies the system had for each time in
.bonddim(int): current bond dimension
.L: the Gammas and Lambdas of the state as used in Vidal's paper
.resetTime()(void): resets both
.setH(const AutoMPO &o)(void): sets a new Hamiltonian while keeping the current states unchanged.
.restore()(void): backup and restore the state
.randomize()(void): randomize all the tensors (e.g. before imaginary time propagation)
By instantiating with
z=4 you can try to use this for 2-dimensional systems where the "environment" is never computed. Some call this "simplified update" of iPEPS and saw good results if the environment is at least computed for measurements. I have not implemented this yet so it should never be used for serious work in 2D. cond-mat.0605597 implements simplified update without calculation of environment.