I'm calculating the spin 1 bilinear biquadratic model at the critical point $\theta=-PI/4$. For N=32, I did 13 sweeps. The ground state energy after each sweep is:

Sweep 01: -88.497967398468

Sweep 02: -88.909137146883

Sweep 03: -88.917526981673

Sweep 04: -88.917544395609

Sweep 05: -88.917545655638

Sweep 06: -88.917545847203

Sweep 07: -88.917545866916

Sweep 08: -88.917545867250

Sweep 09: -88.917545867323

Sweep 10: -88.917545867276

Sweep 11: -88.917545867230

Sweep 12: -88.917545867091

Sweep 13: -88.917545867087

We can see from sweep 10, the ground state energy start to increase at order 10^(-10) instead of decreasing. Is it because of the largest truncation error I set is 10^-10? Do I consider this as convergence or wrong result? (The sweep info and code is attached in the end)

Besides this, I have a few questions:

1. How should one set "niter" in each sweep? Large or small number?

How many sweeps should I do to reach convergence? Should I keep the same "maxm" and do a few sweeps or keep increasing "maxm" to do sweeps (as long as the "maxm" I set is larger than the largest m during sweep)?

About the mid step information produced by "dmrg", say this example, I get:

Sweep=1, HS=1, Bond=(1,2)

I 0 q 2E+00 E -65.7609306503

I 2 q 4E-14 E -66.9810071517

What does "I 0" "q 2E+00" "E -65.7609306503" mean? And why are there 2 sets of data?

- If I want to measure the correlation functions <Sz(j)Sz(N-j+1)>, how can I determine if the correlation function is convergent? Do I compare the correlation function after each sweep? And what's the accuracy of the correlation function compare to the ground state energy?

Thank you.

Sweep information:

input

{

N = 32

nsweeps = 13

sw_table

{

maxm minm cutoff niter noise

20 2 1E-8 9 1E-8

40 2 1E-8 8 1E-9

80 2 1E-10 7 1E-10

120 2 1E-10 6 1E-10

160 2 1E-10 5 0

200 2 1E-10 4 0

240 2 1E-10 4 0

280 2 1E-10 4 0

320 2 1E-10 5 0

360 2 1E-10 6 0

360 2 1E-10 7 0

360 2 1E-10 8 0

360 2 1E-10 9 0

}

quiet = no

}

Code:

## include "itensor/all.h"

## include <math.h>

using namespace itensor;

using std::vector;

using std::string;

using std::min;

using std::max;

## define PI 3.14159265358979323846

int main(int argc, char* argv[])

{

if(argc != 2)

{

//reminds us to give an input file if we forget

printfln("Usage: %s inputfile",argv[0]);

return 0;

}

```
auto input = InputGroup(argv[1],"input");
auto N = input.getInt("N");
auto nsweeps = input.getInt("nsweeps");
auto sw_table = InputGroup(input,"sw_table");
auto quiet = input.getYesNo("quiet",true);
auto sweeps = Sweeps(nsweeps,sw_table);
println(sweeps);
println(quiet);
double theta = -PI/4;
double cost = cos(theta);
double sint = sin(theta);
auto sites = SpinOne(N);
auto ampo = AutoMPO(sites);
for(int j = 1; j < N; ++j)
{
ampo += cost,"Sz",j,"Sz",j+1;
ampo += cost*0.5,"S+",j,"S-",j+1;
ampo += cost*0.5,"S-",j,"S+",j+1;
ampo += sint,"Sz*Sz",j,"Sz*Sz",j+1;
ampo += sint*0.5,"Sz*S+",j,"Sz*S-",j+1;
ampo += sint*0.5,"Sz*S-",j,"Sz*S+",j+1;
ampo += sint*0.5,"S+*Sz",j,"S-*Sz",j+1;
ampo += sint*0.5,"S-*Sz",j,"S+*Sz",j+1;
ampo += sint*0.25,"S+*S+",j,"S-*S-",j+1;
ampo += sint*0.25,"S-*S-",j,"S+*S+",j+1;
ampo += sint*0.25,"S+*S-",j,"S-*S+",j+1;
ampo += sint*0.25,"S-*S+",j,"S+*S-",j+1;
}
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 energy = dmrg(psi,H,sweeps,{"Quiet",quiet});
//
// Print the final energy reported by DMRG
//
printfln("\nGround State Energy = %.10f",energy);
return 0;
```

}