Follow up on this question: https://itensor.org/support/1920/valence-bond-states-fast-implementation
Now my purpose instead of having 2-site products of singlets is to create 2-site products of states that are of the form (|uiuj>)x(|ukul>), etc.
For singlets, I did this:
for(int n = 1; n <= N; n += 2)
{
auto s1 = sites(n);
auto s2 = sites(n+1);
auto wf = ITensor(s1,s2);
wf.set(s1(1),s2(2), ISqrt2);
wf.set(s1(2),s2(1), -ISqrt2);
ITensor D;
psi.ref(n) = ITensor(s1);
psi.ref(n+1) = ITensor(s2);
svd(wf,psi.ref(n),D,psi.ref(n+1));
psi.ref(n) *= D;
}
So I thought that this should be easy and it should be:
wf.set(s1(1),s2(1), 1);
Unfortunately, when I compute its expectation value with the H that I have (it doesn't really matter which one it is), I do not get the same result as when I construct an all up state explicitly.
Any idea about what I might be doing wrong?
In addition to that, I would also like to construct products of tetramers. The example of a tetramer on sites 1,2,3,4 is here:
I tried:
for(int n = 1; n <= N; n += 4)
{
auto s1 = sites(n);
auto s2 = sites(n+1);
auto s3 = sites(n+2);
auto s4 = sites(n+3);
auto wf = ITensor(s1,s2,s3,s4);
wf.set(s1(1),s2(1),s3(2),s4(2), sqrt(12));
wf.set(s1(1),s2(2),s3(1),s4(2), -sqrt(12));
wf.set(s1(1),s2(2),s3(2),s4(1), 2*-sqrt(12));
wf.set(s1(2),s2(1),s3(1),s4(2), 2*-sqrt(12));
wf.set(s1(2),s2(1),s3(2),s4(1), -sqrt(12));
wf.set(s1(2),s2(2),s3(1),s4(1), sqrt(12));
ITensor D;
psi.ref(n) = ITensor(s1);
psi.ref(n+1) = ITensor(s2);
svd(wf,psi.ref(n),D,psi.ref(n+1));
psi.ref(n) *= D;
ITensor D2;
psi.ref(n+2) = ITensor(s3);
psi.ref(n+3) = ITensor(s4);
svd(wf,psi.ref(n+2),D2,psi.ref(n+3));
psi.ref(n) *= D2;
}
but I am getting a findInds error (and I am not really sure that I am doing the SVD right anyway...)
Any thoughts on that?
Thank you very much,
Thanos