- How to define a model
See mptoolkit/models
- For spinchain-su1.cpp
UnitCell Cell(Site);
UnitCellOperator Sp(Cell, "Sp"), Sm(Cell, "Sm"), Sz(Cell, "Sz");
InfiniteLattice Lattice(&Cell);
Lattice["H_J1z"] = sum_unit(Sz(0)*Sz(1));
Lattice["H_J1t"] = 0.5 * sum_unit(Sp(0)*Sm(1) + Sm(0)*Sp(1));
Lattice["H_J1"] = Lattice["H_J1z"] + Lattice["H_J1t"];
Lattice["H_J2z"] = sum_unit(Sz(0)*Sz(2));
Lattice["H_J2t"] = sum_unit(0.5*(Sp(0)*Sm(2) + Sm(0)*Sp(2)));
Lattice["H_J2"] = sum_unit(Sz(0)*Sz(2) + 0.5*(Sp(0)*Sm(2) + Sm(0)*Sp(2)));
Lattice["H_B1"] = sum_unit(pow(Sz(0)*Sz(1) + 0.5*(Sp(0)*Sm(1) + Sm(0)*Sp(1)), 2));
Lattice["H_B2"] = sum_unit(pow(Sz(0)*Sz(2) + 0.5*(Sp(0)*Sm(2) + Sm(0)*Sp(2)), 2));
Lattice["H_B1xy"] = sum_unit(pow(0.5*(Sp(0)*Sm(1) + Sm(0)*Sp(1)), 2));
Lattice["H_mu"] = sum_unit(Sz(0)*Sz(0));
Lattice["H_dimer"] = sum_unit(Sz(0)*Sz(1) + 0.5*(Sp(0)*Sm(1) + Sm(0)*Sp(1))
- (Sz(1)*Sz(2) + 0.5*(Sp(1)*Sm(2) + Sm(1)*Sp(2))), 2);
Lattice["H_stag"] = sum_unit(Sz(0) - Sz(1), 2);
- For spinchain-su2.cpp
half_int Spin = 0.5;
LatticeSite Site = SpinSU2(Spin);
// The UnitCell consists of a single site
UnitCell Cell(Site);
// Make an infinite lattice of our unit cell
InfiniteLattice Lattice(&Cell);
// A short-cut to refer to an operator defined within our unit cell
UnitCellOperator S(Cell, "S"), Q(Cell, "Q"), I(Cell, "I");
// Define operators that have support over the infinite lattice
Lattice["H_J1"] = sum_unit(inner(S(0), S(1)));
Lattice["H_J2"] = sum_unit(inner(S(0), S(2)));
Lattice["H_J3"] = sum_unit(inner(S(0), S(3)));
Lattice["H_B1"] = sum_unit(pow(inner(S(0), S(1)), 2));
Lattice["H_B2"] = sum_unit(pow(inner(S(0), S(2)), 2));
Lattice["H_B3"] = sum_unit(pow(inner(S(0), S(3)), 2));
Lattice["H_Q1"] = sum_unit(inner(Q(0), Q(1)));
Lattice["H_Q2"] = sum_unit(inner(Q(0), Q(2)));
Lattice["H_Q3"] = sum_unit(inner(Q(0), Q(3)));
Lattice["H_D"] = -sum_unit(pow(inner(S(0), S(1)), 2) - I(0));
UnitCellMPO S3 = inner(S(0)+S(1)+S(2), S(0)+S(1)+S(2));
Lattice["H_T"] = (1.0/24.0) * sum_unit((S3 - 2*I(0)) * (S3 - 6*I(0)) * (S3 - 12*I(0)));
- For spinchain.cpp
half_int Spin = 0.5;
LatticeSite Site = SpinSite(Spin);
UnitCell Cell(Site);
UnitCellOperator Sx(Cell, "Sx"), Sy(Cell, "Sy"), Sz(Cell, "Sz"), Sp(Cell, "Sp"), Sm(Cell, "Sm");
UnitCellOperator I(Cell, "I"); // identity operator
InfiniteLattice Lattice(&Cell);
UnitCellMPO SpinExchange = Sx(0)*Sx(1) + Sy(0)*Sy(1) + Sz(0)*Sz(1);
Lattice["H_xx"] = sum_unit(Sx(0)*Sx(1));
Lattice["H_yy"] = sum_unit(Sy(0)*Sy(1));
Lattice["H_zz"] = sum_unit(Sz(0)*Sz(1));
Lattice["H_x"] = sum_unit(Sx(0));
Lattice["H_y"] = sum_unit(Sy(0));
Lattice["H_z"] = sum_unit(Sz(0));
Lattice["H_J1z"] = Lattice["H_zz"];
Lattice["H_J1t"] = Lattice["H_xx"] + Lattice["H_yy"];
Lattice["H_J1"] = sum_unit(SpinExchange);
Lattice["H_B1"] = sum_unit(SpinExchange*SpinExchange);
Lattice["H_B1xy"] = sum_unit(pow(Sx(0)*Sx(1) + Sy(0)*Sy(1),2));
Lattice["H_mu"] = sum_unit(Sz(0)*Sz(0));
Lattice["H_dimer"] = sum_unit(Sz(0)*Sz(1) + 0.5*(Sp(0)*Sm(1) + Sm(0)*Sp(1))
- (Sz(1)*Sz(2) + 0.5*(Sp(1)*Sm(2) + Sm(1)*Sp(2))), 2);
Lattice["H_stag"] = sum_unit(Sz(0) - Sz(1), 2);
- For spinladdersu2.cpp
half_int Spin = 0.5;
int Legs = 2;
int CellSize = Legs;
LatticeSite Site = SpinSU2(Spin);
UnitCell Cell(repeat(Site, CellSize));
InfiniteLattice Lattice(&Cell);
UnitCellOperator S(Cell, "S");
UnitCellMPO J1x, J1y;
for (int i = 0; i < Legs-1; ++i)
{
J1x += inner(S(0)[i], S(1)[i]);
J1y += inner(S(0)[i], S(0)[i+1]);
}
J1x += inner(S(0)[Legs-1], S(1)[Legs-1]);
Lattice["H_J1x"] = sum_unit(J1x);
Lattice["H_J1y"] = sum_unit(J1y);
Lattice["H_J1yp"] = sum_unit(J1y + inner(S(0)[0], S(0)[Legs-1]));
Lattice["H_J1"] = sum_unit(J1x+J1y);
Lattice["H_J1p"] = sum_unit(J1x+J1y + inner(S(0)[0], S(0)[Legs-1]));
Sm(5)[1] : the spin S- operator at site 1 of the 5th unit cell
SpinLadder_iDMRGsvg.png
网友评论