Well, it works. The error mentioned above didn’t occur.
But sadly, I didn’t get some data and there is definitely some mistakes in my codes.
It says “ITensoITensor::operator+=: different index structure”
Does that means the way I construct trotter gates is not correct?
Here is my code:
auto gates = vector<BondGate>();
auto hterm = -j*op(sites,"Adag",1)*op(sites,"A",2);
hterm += -j*op(sites,"A",1)*op(sites,"Adag",2);
hterm += -U/2*op(sites,"N",1)*op(sites,"Id",2);
hterm += U/2*op(sites,"N*N",1)*op(sites,"Id",2);
auto g = BondGate(sites,1,2,BondGate::tReal,tstep/2.,hterm);
gates.push_back(g);
for (int b = 2; b <= L-1; b++)
{
hterm += U/2*op(sites,"N*N",b)*op(sites,"Id",b+1);
hterm += -j*op(sites,"Adag",b)*op(sites,"A",b+1);
hterm += -j*op(sites,"A",b)*op(sites,"Adag",b+1);
hterm += -U/2*op(sites,"N",b)*op(sites,"Id",b+1);
//extra terms
hterm += delta*op(sites,"N",b)*op(sites,"Id",b+1);
if(b==L-1)
{
hterm += U/2*op(sites,"Id",b)*op(sites,"N*N",b+1);
hterm += -U/2*op(sites,"Id",b)*op(sites,"N",b+1);
//extra terms
hterm += delta*op(sites,"Id",b)*op(sites,"N",b+1);
}
g = BondGate(sites,b,b+1,BondGate::tReal,tstep/2.,hterm);
gates.push_back(g);
}
hterm += U/2*op(sites,"Id",L-1)*op(sites,"N*N",L);
hterm += -U/2*op(sites,"Id",L-1)*op(sites,"N",L);
//extra terms
hterm += delta*op(sites,"Id",L-1)*op(sites,"N",L);
g = BondGate(sites,L-1,L,BondGate::tReal,tstep/2.,hterm);
gates.push_back(g);
for(int b = L-1; b >= 1; --b)
{
hterm += U/2*op(sites,"N*N",b)*op(sites,"Id",b+1);
hterm = -j*op(sites,"Adag",b)*op(sites,"A",b+1);
hterm += -j*op(sites,"A",b)*op(sites,"Adag",b+1);
hterm += -U/2*op(sites,"N",b)*op(sites,"Id",b+1);
//extra terms
if(b>1){
hterm += delta*op(sites,"N",b)*op(sites,"Id",b+1);
}
g = BondGate(sites,b,b+1,BondGate::tReal,tstep/2.,hterm);
gates.push_back(g);
}
gateTEvol(gates,ttotal,tstep,psi,{"Cutoff=",cutoff,"Verbose=",true});