I tried some simulation with DMRG. I get different numbers with different sweeps.maxm(). The code is:
#include "itensor/all.h"
using namespace itensor;
int main()
{
int N = 32;
auto sites = SpinOne(N);
auto ampo = AutoMPO(sites);
for(int j = 1; j < N; ++j)
{
ampo += 10.0,"S+",j,"S-",j+1;
ampo += 10.0,"S-",j,"S+",j+1;
ampo += "Sz*Sz",j;
}
ampo += 10.0,"S+",N,"S-",1;
ampo += 10.0,"S-",N,"S+",1;
ampo += "Sz*Sz",N;
auto H = IQMPO(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 psi = IQMPS(state);
auto sweeps = Sweeps(200);
sweeps.maxm() = 20,40,100,100,200;
sweeps.cutoff() = 1E-10;
auto energy = dmrg(psi,H,sweeps,{"Quiet=",true});
return 0;
}
For this case, the vN Entropy at center bond converges at 1.834080476998. If I use "sweeps.maxm() = 20,40,60,80,100,120,140,160,180,200;", the vN Entropy at center bond converges at 1.834080201341. The difference is not big. But when I set "N=64", the two vN entropy become 2.059443246913 and 2.059446044498. It seems this difference will be bigger with larger N. Is this normal? Which one I should trust? Is there a rule to set "sweeps.maxm()"?