Make a Ladder Hamiltonian for DMRG
#include "itensor/all.h"
using namespace itensor;
int
main()
{
int Nx = 50;
auto N = 2*Nx;
auto Jx = 1.0;
auto Jy = 1.0;
// QNs are conserved by default. Use
// the arg {"ConserveQNs=",false} to not
// conserve QNs
auto sites = SpinHalf(N);
auto ampo = AutoMPO(sites);
for(int j = 1; j <= N-3; j += 2)
{
ampo += Jx,"Sz",j,"Sz",j+2;
ampo += Jx/2,"S+",j,"S-",j+2;
ampo += Jx/2,"S-",j,"S+",j+2;
ampo += Jx,"Sz",j+1,"Sz",j+3;
ampo += Jx/2,"S+",j+1,"S-",j+3;
ampo += Jx/2,"S-",j+1,"S+",j+3;
}
for(int j = 1; j <= N-1; j += 2)
{
ampo += Jy,"Sz",j,"Sz",j+1;
ampo += Jy/2,"S+",j,"S-",j+1;
ampo += Jy/2,"S-",j,"S+",j+1;
}
auto H = toMPO(ampo);
auto state = InitState(sites);
for(int i = 1; i <= N; ++i)
{
if(i%2 == 1) state.set(i,"Up");
else state.set(i,"Dn");
}
auto psi0 = MPS(state);
auto sweeps = Sweeps(10);
sweeps.maxdim() = 50,100,200,300,400;
sweeps.cutoff() = 1E-10;
println(sweeps);
auto [energy,psi] = dmrg(H,psi0,sweeps,{"Quiet",true});
return 0;
}
Back to Formulas
Back to Main