Bodge is a Python package for constructing large real-space tight-binding models. Although quite general tight-binding models can be constructed, we focus on the Bogoliubov-DeGennes ("BoDGe") Hamiltonian, which is used to model superconductivity in clean materials. In other words: If you want a lattice model for superconducting nanostructures, and want something that is computationally efficient yet easy to use, you've come to the right place.
An introduction to the Bodge software package has been published in the Journal of Open Source Software (JOSS). If you find this software useful for your research, please consider citing that article:
@article{ouassou2024,
author = {Ouassou, Jabir Ali},
doi = {10.21105/joss.07134},
journal = {Journal of Open Source Software},
number = {102},
pages = {7134},
title = {{Bodge: Python package for efficient tight-binding modeling of superconducting nanostructures}},
volume = {9},
year = {2024}
}
Research papers where this code has been used include:
- DC Josephson effect in altermagnets
- RKKY interaction in triplet superconductors
- Dzyaloshinskii-Moriya spin-spin interaction from mixed-parity superconductivity
Bodge can be used on anything from a normal laptop to an HPC cluster, as long as it runs an operating system where the SciPy stack is available (e.g. Linux, MacOS, or Windows). It is mainly meant for CPU-based or GPU-based calculations on one computer (so there is no support for e.g. MPI).
Internally, Bodge uses a sparse matrix (scipy.sparse
) to represent the Hamiltonian,
which allows you to efficiently construct tight-binding models with millions of
lattice sites if needed. However, you can also easily convert the result to a
dense matrix (numpy.array
) if that's more convenient. The package follows
modern software development practices: full test coverage (pytest
), fast
runtime type checking (beartype
), and mostly PEP-8 compliant (black
).
In addition to the JOSS paper you can find a Bodge tutorial here.
This package is published on PyPi, and is easily installed via pip
:
pip install bodge
Or if you have an NVIDIA GPU and want to use that for computations (note that this requires you to install CUDA support on your system first):
pip install bodge[cuda]
Some functions in this package then accept an argument cuda=True
to enable
GPU acceleration of the numerical calculations.
Bodge should be quite easy to use if all you want is a real-space lattice
Hamiltonian with superconductivity. For instance, consider a
from bodge import *
lattice = CubicLattice((100, 100, 1))
system = Hamiltonian(lattice)
t = 1
μ = -3 * t
m = 0.05 * t
Δs = 0.10 * t
with system as (H, Δ):
for i in lattice.sites():
H[i, i] = -μ * σ0 -m * σ3
Δ[i, i] = -Δs * jσ2
for i, j in lattice.bonds():
H[i, j] = -t * σ0
If you are familiar with tight-binding models, you might notice that this is
intentionally very close to how one might write the corresponding equations with
pen and paper. It is similarly easy to model more complex systems: you can
e.g. easily add p-wave or d-wave superconductivity, magnetism, altermagnetism,
antiferromagnetism, spin-orbit coupling, etc. The lattice site indices are
implemented as tuples i = (x_i, y_i, z_i)
, so that you can easily use the
lattice coordinates to design inhomogeneous materials via e.g. if
-tests.
The syntax used to construct the Hamiltonian is designed to look like array
operations, but this is just a friendly interface; under the hood, some "magic"
is required to efficiently translate what you see above into sparse matrix
operations, while enforcing particle-hole and Hermitian symmetries. Once you're
done with the construction, you can call system.matrix()
to extract the
Hamiltonian matrix itself (in dense or sparse form), or use methods such as
system.diagonalize()
and system.free_energy()
to get derived properties.
Formally, the Hamiltonian operator that corresponds to the constructed matrix is
where
It is precisely these H[i, j]
and ∆[i, j]
. After
the matrix construction completes, you obtain a
For more information on usage, please see the full documentation.
After cloning the Git repository on a Unix-like system, you can run:
make install
This will create a virtual environment in a subfolder called venv
, and then
install Bodge into that virtual environment. If you prefer to use a newer Python
version (recommended), first install this via your package manager of choice.
For example:
brew install python@3.11 # MacOS with HomeBrew
sudo apt install python3.11-full # Ubuntu GNU/Linux
Afterwards, mention what Python version to use when installing Bodge:
make install PYTHON=python3.11
After running make install
, you can run the unit tests as follows:
make test
This is generally useful both right after installation (to ensure that
everything works), as well as after modifying the code (to check that
everything still works as expected). Run make
without command-line
arguments to see how to see how proceed further after that; this
should provide information on how to e.g. run scripts that use the
Bodge package, or run the autoformatter after updating the code.
PRs are welcome! See the contribution guidelines for more information.
I wrote most of this code as a PostDoc in the research group of Prof. Jacob Linder at the Center for Quantum Spintronics, NTNU, Norway. I would like to thank Jacob for introducing me to the BdG formalism that is implemented in this package – and before that, to the theory superconductivity in general.