Skip to content
Permalink
develop
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time

kdotp-symmetry

This is a tool to calculate the general form of a \mathbf{k}\cdot\mathbf{p} Hamiltonian under a given symmetry constraint.

Please cite:

  • Identifying Topological Semimetals, D. Gresch, PhD Thesis.

Usage

Installation

You can install this tool with with pip:

pip install kdotp-symmetry

Example: TaAs2

Its usage is best explained with an example -- I'll pick a four-band Hamiltonian for TaAs2. If you're interested in the physics of this particular example, it comes from a paper of ours where we also used this \mathbf{k}\cdot\mathbf{p} model. As for now, all we will need to know about the material is its symmetry, and the relevant representations for the given bands.

The symmetry group of the material is C2 / m (space group 12), which means it has rotation C_{2y}, parity P, mirror M_y and time-reversal symmetry \mathcal{T}. For the analysis of the Hamiltonian we only need a generating set of the group, so we can pick C_{2y}, P and \mathcal{T}. In the particular basis we chose for this analysis, the real-space matrices for these symmetries are as follows:

C_{2y} =& ~\begin{pmatrix} 0&1&0 \\ 1&0&0 \\ 0&0&-1 \end{pmatrix}\\
P =& ~-\mathbb{1}_{3\times 3}\\
\mathcal{T} =& ~\mathbb{1}_{3\times 3}

The corresponding representations are

C_{2y} =& ~\begin{pmatrix} i&0&0&0 \\ 0&-i&0&0 \\ 0&0&i&0 \\ 0&0&0&-i \end{pmatrix} \\
P =& ~\begin{pmatrix} 1&0&0&0 \\ 0&1&0&0 \\ 0&0&-1&0 \\ 0&0&0&-1 \end{pmatrix} \\
\mathcal{T} =& ~\begin{pmatrix} 0&-1&0&0 \\ 1&0&0&0 \\ 0&0&0&-1 \\ 0&0&1&0 \end{pmatrix} ~\hat{K},

where \hat{K} is complex conjugation.

Creating the symmetry operations

In order to run the code, we must first specify the symmetries as described above. To do this, we use the :py:class:`symmetry_representation.SymmetryOperation` class, which has three attributes:

  • rotation_matrix: The matrix describing the symmetry operation in real space coordinates.
  • repr_matrix: The matrix U of the symmetry representation.
  • repr_has_cc: A boolean flag which determines whether the representation is given by U alone, or if it contains a complex conjugation (i.e., the representation is given by U\hat{K}).

A more detailed description can be found on the symmetry_representation documentation .

The following code creates the symmetries described above:

Note

Since this tools performs symbolic operations, it uses the :py:mod:`sympy` module under the hood. To make sure that there are no rounding errors, I strongly recommend using :py:mod:`sympy` classes such as :py:mod:`sympy.Matrix <sympy.matrices>` or :py:class:`sympy.Rational <sympy.core.numbers.Rational>` for all input.

Getting the basis for the symmetrized Hamiltonian

The basis of the symmetrized Hamiltonian can be constructed with the :func:`.symmetric_hamiltonian` function. Besides the symmetries, it needs two inputs expr_basis and repr_basis.

The first, expr_basis, is a basis of the functions of \mathbf{k} that are considered, as a list of :py:mod:`sympy` expressions. To simply use powers of k_x, k_y, k_z, you can use the :func:`.monomial_basis` helper function. With this function, you can create the monomial basis for a given set of degrees. For example, to get a constant term and second degree terms as follows:

>>> import kdotp_symmetry as kp
>>> kp.monomial_basis(0, 2)
[1, kx**2, kx*ky, kx*kz, ky**2, ky*kz, kz**2]

The second, required input variable is repr_basis, which must be a basis of the hermitian matrices, with the same size as the symmetry representation. The basis must be orthogonal with respect to the Frobenius product. Again you can use a helper function, :func:`.hermitian_basis`, giving the size as an argument:

>>> import kdotp_symmetry as kp
>>> kp.hermitian_basis(2)
[Matrix([
[1, 0],
[0, 0]]), Matrix([
[0, 0],
[0, 1]]), Matrix([
[0, 1],
[1, 0]]), Matrix([
[0, -I],
[I,  0]])]

Finally, you can use the :func:`.symmetric_hamiltonian` function to get the result. The complete code for the TaAs2 example can be found :ref:`here <example_taas2>`.

The :ref:`reference<reference>` gives you an overview of the available functions and classes.

Formalism

Finally, let me give a more formal description of the problem. Let G be the symmetry group that the Hamiltonian should respect, with a unitary representation D(g), g \in G. This imposes the symmetry constraint

\mathcal{H}(\mathbf{k}) = D(g) \mathcal{H}(g^{-1} \mathbf{k}) D(g^{-1}), \forall g \in G

on the \mathbf{k} \cdot \mathbf{p} Hamiltonian. In the following, we will define a vector space containing \mathcal{H}, and see how the symmetry constraint restricts the Hamiltonian to a certain subspace.

We want to consider only a certain form of \mathbf{k} - dependence for the Hamiltonian, for example up to second order. So let V \subset \mathcal{F}(\mathbb{R}^3, \mathbb{R}) be the vector space which contains these functions of \mathbf{k}. We require that V is closed under

\hat{F}_g: f \longmapsto \tilde{f}_g \\
\tilde{f}(\mathbf{k}) = f(g^{-1}\mathbf{k}).

for all g \in G. That is,

\forall g \in G, f \in V: \hat{F}_g(f) \in V.

\hat{F}_g is a linear operator on V.

Let W be the vector space of hermitian N \times N matrices.

\hat{G}_g: ~&W & \longrightarrow W\\
& A & \longmapsto D(g)A D(g^{-1})

is a linear operator on W. It is unitary under the Frobenius inner product.

Since the Hamiltonian is a hermitian matrix with \mathbf{k}-dependence as given by V, it follows that \mathcal{H} \in V\otimes W. The symmetry constraints mean that

\forall g \in G:~ \left(\hat{F}_g \otimes \hat{G}_g\right)(\mathcal{H}) = \mathcal{H},

and thus

\mathcal{H} \in \bigcap_{g\in G} \text{Eig}(\hat{F}_g \otimes \hat{G}_g , 1).

In conclusion, the problem of finding the general form of the Hamiltonian is equivalent to calculating this subspace.

Limitations

The dimension of the vector space V \otimes W on which the kdotp-symmetry code operates grows linearly with the number of functions of \mathbf{k}, and with the square of the dimension N of the Hamiltonian. Since parts of the algorithm (in particular finding the invariant subspace, and the intersection between invariant subspaces) scale cubically in this dimension of V \otimes W, the scaling of the entire algorithm is quite bad. In short, the kdotp-symmetry code can be applied only for relatively small Hamiltonian sizes and moderate number of functions of \mathbf{k}.

.. toctree::
    :hidden:
    :maxdepth: 2

    Usage and Formalism <self>
    example.rst
    reference.rst