Spinhalf
A block in a spin \(S=1/2\) Hilbert space.
Sources
spinhalf.hpp
spinhalf.cpp
spinhalf.jl
Constructors
Spinhalf(int64_t nsites, std::string backend = "auto");
Spinhalf(int64_t nsites, int64_t nup, std::string backend = "auto");
Spinhalf(int64_t nsites, Representation const &irrep, std::string backend = "auto");
Spinhalf(int64_t nsites, int64_t nup, Representation const &irrep, std::string backend = "auto");
Name | Description | Default |
---|---|---|
nsites | number of sites (integer) | |
nup | number of "up" spin setting spin (integer) | |
irrep | Irreducible Representation of the symmetry group | |
backend | backend used for coding the basis states | auto |
The parameter backend
chooses how the block is coded internally. By using the default parameter auto
the backend is chosen automatically. Alternatives are 32bit
, 64bit
, 1sublattice
, 2sublattice
, 3sublattice
, 4sublattice
, and 5sublattice
. The backends xsublattice
implement the sublattice coding algorithm described in Wietek, Läuchli, Phys. Rev. E 98, 033309 (2018). The sublattice coding algorithms impose certain constraints on the symmetries used, as described in the reference.
Iteration
An Spinhalf block can be iterated over, where at each iteration a ProductState representing the corresponding basis state is returned.
Methods
index
Returns the index of a given ProductState in the basis of the Spinhalf block.
1-indexing
In the C++ version, the index count starts from "0" whereas in Julia the index count starts from "1".
nsites
Returns the number of sites of the block.
size
Returns the size of the block, i.e. its dimension.
dim
Returns the dimension of the block, same as "size" for non-distributed blocks.
isreal
Returns whether the block can be used with real arithmetic. Complex arithmetic is needed when a Representation is genuinely complex.
Usage Example
int N = 4;
int nup = 2;
// without Sz conservation
auto block = Spinhalf(N);
XDIAG_SHOW(block);
// with Sz conservation
auto block_sz = Spinhalf(N, nup);
XDIAG_SHOW(block_sz);
// with symmetries, without Sz
Permutation p1 = {0, 1, 2, 3};
Permutation p2 = {1, 2, 3, 0};
Permutation p3 = {2, 3, 0, 1};
Permutation p4 = {3, 0, 1, 2};
auto group = PermutationGroup({p1, p2, p3, p4});
auto irrep = Representation(group, arma::vec({1, -1, 1, -1}));
auto block_sym = Spinhalf(N, irrep);
XDIAG_SHOW(block_sym);
// with symmetries and Sz
auto block_sym_sz = Spinhalf(N, nup, irrep);
XDIAG_SHOW(block_sym_sz);
XDIAG_SHOW(block_sym_sz.nsites());
XDIAG_SHOW(block_sym_sz.size());
// Iteration
for (auto pstate : block_sym_sz) {
Log("{} {}", to_string(pstate), index(block_sym_sz, pstate));
}
N = 4
nup = 2
# without Sz conservation
block = Spinhalf(N)
@show block
# with Sz conservation
block_sz = Spinhalf(N, nup)
@show block_sz
# with symmetries, without Sz
p = Permutation([2, 3, 4, 1])
group = PermutationGroup([p^0, p^1, p^2, p^3])
rep = Representation(group, [1.0, -1.0, 1.0, -1.0])
block_sym = Spinhalf(N, rep)
@show block_sym
# with symmetries and Sz
block_sym_sz = Spinhalf(N, nup, rep)
@show block_sym_sz
@show nsites(block_sym_sz)
@show size(block_sym_sz)
# Iteration
for pstate in block_sym_sz
@show pstate, index(block_sym_sz, pstate)
end