Skip to content

Latest commit

 

History

History
158 lines (99 loc) · 7.31 KB

index.rst

File metadata and controls

158 lines (99 loc) · 7.31 KB

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.

You can install this tool with with pip:

pip install kdotp-symmetry

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.

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.

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.

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.

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