Skip to content

Spin-½ Models

The spin-½ framework in qkrylov is built around the SpinHalfBasis and SpinHalfSite classes.

Basis and Sectors

The SpinHalfBasis class manages the many-body Hilbert space.

Constructor Arguments: - N: Number of sites. - sector: An optional Sector object.

The Sector object for spin-½ systems supports the following fields: - use_sz: Boolean flag to enable total \(S^z\) conservation. - sz2: Integer value representing \(2S^z\) (twice the total magnetization, to ensure integer values).

Sector Table

Here is a quick reference for sz2 values for different numbers of spin-up and spin-down particles:

\(N_{\uparrow}\) \(N_{\downarrow}\) Total \(N\) sz2 (\(2S^z\))
3 0 3 +3
2 1 3 +1
1 2 3 -1
0 3 3 -3

Site Operators

The SpinHalfSite provides local operators: - Sz: \(S^z\) operator. - Sp: \(S^+\) raising operator. - Sm: \(S^-\) lowering operator.

Examples

Heisenberg Chain

The canonical anti-ferromagnetic Heisenberg spin chain: \(H = J \sum_{\langle i, j \rangle} \vec{S}_i \cdot \vec{S}_j\).

from qkrylov import SpinHalfBasis, SpinHalfSite, Sector, OpSum, MatrixFreeHamiltonian

# 10 sites, sz=0 sector
basis = SpinHalfBasis(10, Sector(use_sz=True, sz2=0))
site = SpinHalfSite()
opsum = OpSum()

J = 1.0
for i in range(10):
    j = (i + 1) % 10
    # S^z_i S^z_j
    opsum += (J, site.Sz, i, site.Sz, j)
    # 0.5 * (S^+_i S^-_j + S^-_i S^+_j)
    opsum += (0.5 * J, site.Sp, i, site.Sm, j)
    opsum += (0.5 * J, site.Sm, i, site.Sp, j)

H = MatrixFreeHamiltonian(basis, opsum)
#include <qkrylov/models/spin_half.hpp>
#include <qkrylov/core/opsum.hpp>
#include <qkrylov/core/hamiltonian.hpp>

using namespace qkrylov;

int main() {
    Sector sector;
    sector.use_sz = true;
    sector.sz2 = 0;

    SpinHalfBasis basis(10, sector);
    SpinHalfSite site;
    OpSum opsum;

    double J = 1.0;
    for(int i = 0; i < 10; ++i) {
        int j = (i + 1) % 10;
        opsum.add({J, site.Sz, i, site.Sz, j});
        opsum.add({0.5 * J, site.Sp, i, site.Sm, j});
        opsum.add({0.5 * J, site.Sm, i, site.Sp, j});
    }

    MatrixFreeHamiltonian H(basis, opsum);
    return 0;
}

Coming Soon

Julia bindings are planned via extern "C" FFI. See the roadmap.

Transverse Field Ising Model

Model: \(H = -J \sum_{\langle i, j \rangle} S^z_i S^z_j - h \sum_i S^x_i\). Note: \(S^x = \frac{1}{2}(S^+ + S^-)\).

from qkrylov import SpinHalfBasis, SpinHalfSite, OpSum, MatrixFreeHamiltonian

basis = SpinHalfBasis(10) # No sz conservation due to Sx
site = SpinHalfSite()
opsum = OpSum()

J = 1.0
h = 0.5
for i in range(10):
    j = (i + 1) % 10
    opsum += (-J, site.Sz, i, site.Sz, j)
    opsum += (-h * 0.5, site.Sp, i)
    opsum += (-h * 0.5, site.Sm, i)

H = MatrixFreeHamiltonian(basis, opsum)
#include <qkrylov/models/spin_half.hpp>
#include <qkrylov/core/opsum.hpp>
#include <qkrylov/core/hamiltonian.hpp>

using namespace qkrylov;

int main() {
    SpinHalfBasis basis(10);
    SpinHalfSite site;
    OpSum opsum;

    double J = 1.0, h = 0.5;
    for(int i = 0; i < 10; ++i) {
        int j = (i + 1) % 10;
        opsum.add({-J, site.Sz, i, site.Sz, j});
        opsum.add({-h * 0.5, site.Sp, i});
        opsum.add({-h * 0.5, site.Sm, i});
    }

    MatrixFreeHamiltonian H(basis, opsum);
    return 0;
}

Coming Soon

Julia bindings are planned via extern "C" FFI. See the roadmap.