Skip to content

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");
Spinhalf(nsites::Int64, backend::String="auto")
Spinhalf(nsites::Int64, nup::Int64, backend::String="auto")
Spinhalf(nsites::Int64, irrep::Representation, backend::String="auto")
Spinhalf(nsites::Int64, nup::Int64, irrep::Representation, backend::String="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.

auto block = Spinhalf(4, 2);
for (auto pstate : block) {
  Log("{} {}", to_string(pstate), block.index(pstate));
}
block = Spinhalf(4, 2)
for pstate in block
    @show pstate, index(block, pstate) 
end

Methods

index

Returns the index of a given ProductState in the basis of the Spinhalf block.

int64_t index(Spinhalf const &block, ProductState const &pstate);
index(block::Spinhalf, pstate::ProductState)::Int64

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.

int64_t nsites(Spinhalf const &block);
nsites(block::Spinhalf)::Int64

size

Returns the size of the block, i.e. its dimension.

int64_t size(Spinhalf const &block) const;
size(block::Spinhalf)::Int64

dim

Returns the dimension of the block, same as "size" for non-distributed blocks.

int64_t dim(Spinhalf const &block) const;
dim(block::Spinhalf)::Int64

isreal

Returns whether the block can be used with real arithmetic. Complex arithmetic is needed when a Representation is genuinely complex.

bool isreal(Spinhalf const &block);
isreal(block::Spinhalf)::Bool

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