Start Page

TBTK is an open-source C++ framework for modeling and solving problems formulated using the language of second quantization. It can be used to set up general models with little effort and provides a variety of native solution methods.

To get started, see the installation instructions, the manual, and the tutorials. Also, see the blog posts and other resources collected on second-tech.com.

Download TBTK from GitHub. See the installation instructions to make sure you checkout the right version before installation.

- The speed of a low-level language with the syntax of a high-level language.
- Results in readable code that puts emphasis on the physics.
- Allows for a wide variety of models and solution methods to be combined in different ways.
- Focus on your own task, while still benefiting from the work of others.
- Gives method developers complete freedom to optimize their solvers without having to worry about model-specific details.
- A versioning system that ensures that results are reproducible forever.

Consider a two-dimensional substrate of size 51x51 described by the Hamiltonian

Here \(\mathbf{i}\) is a two-dimensional index, \(\sigma\) is a spin index, and \(\langle\mathbf{i}\mathbf{j}\rangle\) denotes summation over nearest-neighbors. Further, consider a magnetic impurity on top of the substrate described by the Hamiltonian

Finally, the impurity connects to the site (25, 25) in the substrate through the term

The total Hamiltonian is

**Question:** What is the spin-polarized LDOS in the substrate as a function of \(U_S, U_{Imp}, t, J\), and \(\delta\)?

//Parameters.

const int SIZE_X = 51;

const int SIZE_Y = 51;

double U_S = 1;

double U_Imp = 1;

double t = 1;

double J = 1;

double delta = 1;

//Create model.

Model model;

//Setup substrate.

for(int x = 0; x < SIZE_X; x++){

for(int y = 0; y < SIZE_Y; y++){

for(int spin = 0; spin < 2; spin++){

model << HoppingAmplitude(

U_S,

{0, x, y, spin},

{0, x, y, spin}

);

if(x+1 < SIZE_X){

model << HoppingAmplitude(

-t,

{0, x+1, y, spin},

{0, x, y, spin}

) + HC;

}

if(y+1 < SIZE_Y){

model << HoppingAmplitude(

-t,

{0, x, y+1, spin},

{0, x, y, spin}

) + HC;

}

}

}

}

for(int spin = 0; spin < 2; spin++){

//Setup impurity.

model << HoppingAmplitude( U_Imp, {1, spin}, {1, spin});

model << HoppingAmplitude(-J*(1-2*spin), {1, spin}, {1, spin});

//Add coupling between the substrate and impurity.

model << HoppingAmplitude(

delta,

{0, SIZE_X/2, SIZE_Y/2, spin},

{1, spin}

) + HC;

}

//Construct model.

model.construct();

//Setup Solver

Solver::Diagonalizer solver;

solver.setModel(model);

solver.run();

//Extract the spin-polarized LDOS in the substrate.

PropertyExtractor::Diagonalizer propertyExtractor(solver);

propertyExtractor.setEnergyWindow(-1, 1, 1000);

Property::SpinPolarizedLDOS spinPolarizedLDOS

= propertyExtractor.calculateSpinPolarizedLDOS(

{{0, _a_, _a_, IDX_SPIN}}

);