Hi,
I tested some calculations with Kitaev Chain. The energy levels should not depend on the sign of @@\Delta@@ (the coefficient of @@c^\dagger c^\dagger + cc@@ term). ITensor gives correct energy, but there is some problems for the entanglement entropy. The following code works with ITensor3. But ITensor2 gives different entanglement entropy (close to zero).
#include "itensor/all.h"
using namespace itensor;
int
main()
{
auto N = 100;
auto sites = Spinless(N,{"ConserveNf",false});
auto ampo = AutoMPO(sites);
for(int b = 1; b <= N-1; ++b)
{
ampo += -1,"N",b;
ampo += -1,"Cdag",b,"C",b+1;
ampo += -1,"Cdag",b+1,"C",b;
ampo += -1,"Cdag",b,"Cdag",b+1;
ampo += -1,"C",b+1,"C",b;
}
ampo += -1,"N",N;
auto H = toMPO(ampo);
auto state = InitState(sites);
for(int is = 1; is <= N; ++is)
{
state.set(is,is%2==1 ? "1" : "0");
}
auto psi0 = randomMPS(state);
auto sweeps = Sweeps(20);
sweeps.maxdim() = 20,20,40,40,100,200,300,400;
sweeps.cutoff() = 1E-10;
auto [energy0, psi] = dmrg(H, psi0, sweeps, {"Quiet=",true});
Print(energy0);
return 0;
}
When Jordan-Wigner transformed to spin-1/2. Neither ITensor3 nor ITensor2 gives correct entanglement entropy.
#include "itensor/all.h"
using namespace itensor;
int
main()
{
auto N = 100;
auto sites = SpinHalf(N, {"ConserveSz=",false});
auto ampo = AutoMPO(sites);
for(int b = 1; b <= N-1; ++b)
{
ampo += -1,"Sz",b;
ampo += -1,"S+",b,"S-",b+1;
ampo += -1,"S+",b+1,"S-",b;
ampo += -1,"S+",b,"S+",b+1;
ampo += -1,"S-",b+1,"S-",b;
}
ampo += -1,"Sz",N;
auto H = toMPO(ampo);
auto state = InitState(sites);
for(int is = 1; is <= N; ++is)
{
state.set(is,is%2==1 ? "Up" : "Dn");
}
auto psi0 = randomMPS(state);
auto sweeps = Sweeps(200);
sweeps.maxdim() = 20,20,40,40,100,200,300,400;
sweeps.cutoff() = 1E-10;
auto [energy,psi] = dmrg(H,psi0,sweeps,{"Quiet",true,"EnergyErrgoal=",1E-8,"EntropyErrgoal=",1E-7});
Print(energy);
return 0;
}
But everything works well when the coefficient of @@c^\dagger c^\dagger + cc@@ term reverses sign. Is there something wrong? Thanks.
Jin