#include "test.h"
#include "mps.h"
#include "sites/spinhalf.h"
#include "sites/spinless.h"
using namespace itensor;
TEST_CASE("MPSTest")
{
static const int N = 10;
SpinHalf shsites(N);
InitState shFerro(shsites,"Up");
InitState shNeel(shsites);
for(int j = 1; j <= N; ++j)
{
shNeel.set(j,j%2==1 ? "Up" : "Dn");
}
SECTION("Constructors")
{
}
SECTION("QNCheck")
{
IQMPS psiNeel(shNeel);
CHECK(checkQNs(psiNeel));
CHECK_EQUAL(totalQN(psiNeel),QN(0));
IQMPS psiFerro(shFerro);
CHECK(checkQNs(psiFerro));
CHECK_EQUAL(totalQN(psiFerro),QN(10));
}
SECTION("MPSAddition")
{
Spinless sites(10);
InitState i1(sites,"Emp"),
i2(sites,"Emp");
i1.set(1,"Occ");
i2.set(2,"Occ");
//"Valence bond" between sites 1 and 2
MPS psi = ISqrt2*sum(MPS(i1),MPS(i2));
CHECK_CLOSE(psi.norm(),1,1E-5);
IQMPS iqpsi = ISqrt2*sum(IQMPS(i1),IQMPS(i2));
CHECK_EQUAL(totalQN(iqpsi),QN(0,1));
}
SECTION("PositionTest")
{
Spinless sites(10);
InitState init(sites,"Emp");
init.set(2,"Occ");
init.set(4,"Occ");
init.set(6,"Occ");
IQMPS psi(init);
psi.Anc(1) *= Complex_i;
psi.position(1,"Cutoff=1E-8");
CHECK_EQUAL(findCenter(psi),1);
psi.position(4,"Cutoff=1E-8");
CHECK_EQUAL(findCenter(psi),4);
}
}