Hi Miles,
Thanks again for the reply. Here are my answers:
(1) For the initial state, instead of using the Neel state |10101010...>, I used the one where singly occupied site (denoted by 1) and vacant site (denoted by 0) are randomly placed in the lattice.
(2) As you suggested, I added a small field term on the first site for the spin-1 case. The only difference I found was in the values of the the correlation between the first few sites.
(3) Likewise, I modeled this system with "Spinless" siteset, I obtained results nearly identical to the spin-1/2 case.
(4) Here's the code for the spin-1 case:
double pi = M_PI;
int N = 100;
double c = 0.1;
double h = 1;
double J_factor = -0.5;
int gamma = 180;
int theta = 0;
double B_o = 1;
double B_e = B_o;
double B_2 = B_o * exp(-c*(2 * sin ((gamma*pi/180)/2) - 1) );
double U = 30;
double V_e = 1 - 3 * pow(cos(pi - (gamma*pi/180)/2 - theta*pi/180), 2);
double V_o = 1 - 3 * pow(cos((gamma*pi/180)/2 - theta*pi/180), 2);
double V_2 = (1/pow((2*(1 - cos(gamma*pi/180))), 1.5)) * (1 - 3 * pow(cos(pi/2 - theta*pi/180), 2));
double a_o = V_o/B_o;
double a_e = V_e/B_e;
double a_2 = V_2/B_2;
auto sites = SpinOne(N);
auto ampo = AutoMPO(sites);
for(int j = 1; j <= N; ++j)
{
ampo += U, "Sz2",j;
ampo += U,"Sz",j;
}
for(int j = 1; j < N; ++j)
{
if(j%2 != 0)
{
ampo += B_o * J_factor,"S+",j,"S-",j+1;
ampo += B_o * J_factor,"S-",j,"S+",j+1;
ampo += B_o * a_o,"Sz",j,"Sz",j+1;
}
else
{
ampo += B_e * J_factor,"S+",j,"S-",j+1;
ampo += B_e * J_factor,"S-",j,"S+",j+1;
ampo += B_e * a_e,"Sz",j,"Sz",j+1;
}
}
for(int j = 1; j < N-1; ++j)
{
ampo += B_2 * J_factor,"S+",j,"S-",j+2;
ampo += B_2 * J_factor,"S-",j,"S+",j+2;
ampo += B_2 * a_2,"Sz",j,"Sz",j+2;
}
for(int j = 1; j <= N; ++j)
{
ampo += h,"Sz",j;
}
auto H = IQMPO(ampo);
auto initState = InitState(sites);
cout << endl << "#Vector v(N):" << endl;
int v[N] = {1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0};
cout << endl << endl << "#Initial wavefunction MPS mapped to vector v(N):" << endl;
for(int i = 1; i <= N; ++i)
{
if(v[i-1] == 1)
{
initState.set(i,"Z0");
cout << "0 ";
}
else if(v[i-1] == 0)
{
initState.set(i,"Dn");
cout << "-1 ";
}
}
auto psi = IQMPS(initState);
printfln("Initial energy = %.5f", overlap(psi,H,psi) );
auto sweeps = Sweeps(7);
sweeps.maxm() = 10,20,80,200,300,400,400;
sweeps.minm() = 1,1,1,1,1,1,1;
sweeps.cutoff() = 1E-5,1E-6,1E-7,1E-8,1E-8,1E-8;
sweeps.niter() = 4,3,3,2,2,2,2;
sweeps.noise() = 1E-5,1E-5,1E-8,1E-9,1E-10,1E-10,1E-10;
println(sweeps);
auto energy = dmrg(psi,H,sweeps,{"Quiet=",true});