Triclinic (TRI)#

Pearson symbol: aP

Constructor: TRI()

It is defined by six parameters: \(a\), \(b\), \(c\) and \(\alpha\), \(\beta\), \(\gamma\). with primitive and conventional lattice:

\[\begin{split}\begin{matrix} \boldsymbol{a}_1 = (a, 0, 0)\\ \boldsymbol{a}_2 = (b\cos\gamma, b\sin\gamma, 0)\\ \boldsymbol{a}_3 = (c\cos\beta, \dfrac{c(\cos\alpha - \cos\beta\cos\gamma)}{\sin\gamma}, \dfrac{c}{\sin\gamma}\sqrt{\sin^2\gamma - \cos^2\alpha - \cos^2\beta + 2\cos\alpha\cos\beta\cos\gamma}) \end{matrix}\end{split}\]

Cell standardization#

Standardization is performed based on the reciprocal cell.

One of the conditions have to be met:

  • All reciprocal cell angles (\(k_{\alpha}\), \(k_{\beta}\), \(k_{\gamma}\)) are \(> 90^{\circ}\) and \(k_{\gamma} = \min(k_{\alpha}, k_{\beta}, k_{\gamma})\).

  • All reciprocal cell angles (\(k_{\alpha}\), \(k_{\beta}\), \(k_{\gamma}\)) are \(< 90^{\circ}\) and \(k_{\gamma} = \max(k_{\alpha}, k_{\beta}, k_{\gamma})\).

  • \(k_{\gamma} = 90^{\circ}\) and other two angles are \(> 90^{\circ}\).

  • \(k_{\gamma} = 90^{\circ}\) and other two angles are \(< 90^{\circ}\).

If these conditions are not satisfied, then the lattice is transformed to the standard form:

Last two cases#

First we check for the last two cases:

  • If \(k_{\alpha} = 90^{\circ}\)
    \[(\boldsymbol{b}_1, \boldsymbol{b}_2, \boldsymbol{b}_3) \rightarrow (\boldsymbol{b}_2, \boldsymbol{b}_3, \boldsymbol{b}_1)\]
  • If \(k_{\beta} = 90^{\circ}\)
    \[(\boldsymbol{b}_1, \boldsymbol{b}_2, \boldsymbol{b}_3) \rightarrow (\boldsymbol{b}_3, \boldsymbol{b}_1, \boldsymbol{b}_2)\]

If one of the last two conditions were met, then now we have \(k_{\gamma} = 90^{\circ}\). We need to choose appropriate values for the remaining two angles:

  • If \(k_{\alpha} > 90^{\circ}\) and \(k_{\beta} < 90^{\circ}\) or \(k_{\alpha} < 90^{\circ}\) and \(k_{\beta} > 90^{\circ}\):
    \[(\boldsymbol{b}_1, \boldsymbol{b}_2, \boldsymbol{b}_3) \rightarrow (\boldsymbol{b}_2, -\boldsymbol{b}_1, \boldsymbol{b}_3)\]

First two cases#

If none of the last two conditions were met, then we check for the first two. First we ensure that all angles are \(> 90^{\circ}\) or \(< 90^{\circ}\):

  • If \(k_{\alpha} > 90^{\circ}\) and \(k_{\beta} > 90^{\circ}\) and \(k_{\gamma} < 90^{\circ}\):
    \[(\boldsymbol{b}_1, \boldsymbol{b}_2, \boldsymbol{b}_3) \rightarrow (-\boldsymbol{b}_1, -\boldsymbol{b}_2, \boldsymbol{b}_3)\]
  • If \(k_{\alpha} > 90^{\circ}\) and \(k_{\beta} < 90^{\circ}\) and \(k_{\gamma} > 90^{\circ}\):
    \[(\boldsymbol{b}_1, \boldsymbol{b}_2, \boldsymbol{b}_3) \rightarrow (-\boldsymbol{b}_1, \boldsymbol{b}_2, -\boldsymbol{b}_3)\]
  • If \(k_{\alpha} > 90^{\circ}\) and \(k_{\beta} < 90^{\circ}\) and \(k_{\gamma} < 90^{\circ}\):
    \[(\boldsymbol{b}_1, \boldsymbol{b}_2, \boldsymbol{b}_3) \rightarrow (\boldsymbol{b}_1, -\boldsymbol{b}_2, -\boldsymbol{b}_3)\]
  • If \(k_{\alpha} < 90^{\circ}\) and \(k_{\beta} > 90^{\circ}\) and \(k_{\gamma} > 90^{\circ}\):
    \[(\boldsymbol{b}_1, \boldsymbol{b}_2, \boldsymbol{b}_3) \rightarrow (\boldsymbol{b}_1, -\boldsymbol{b}_2, -\boldsymbol{b}_3)\]
  • If \(k_{\alpha} < 90^{\circ}\) and \(k_{\beta} > 90^{\circ}\) and \(k_{\gamma} < 90^{\circ}\):
    \[(\boldsymbol{b}_1, \boldsymbol{b}_2, \boldsymbol{b}_3) \rightarrow (-\boldsymbol{b}_1, \boldsymbol{b}_2, -\boldsymbol{b}_3)\]
  • If \(k_{\alpha} < 90^{\circ}\) and \(k_{\beta} < 90^{\circ}\) and \(k_{\gamma} > 90^{\circ}\):
    \[(\boldsymbol{b}_1, \boldsymbol{b}_2, \boldsymbol{b}_3) \rightarrow (-\boldsymbol{b}_1, -\boldsymbol{b}_2, \boldsymbol{b}_3)\]

As the last step we reorder the reciprocal vectors:

Reordering if all angles are \(> 90^{\circ}\):

  • If \(k_{\alpha} = min(k_{\alpha}, k_{\beta}, k_{\gamma})\), then:
    \[(\boldsymbol{b}_1, \boldsymbol{b}_2, \boldsymbol{b}_3) \rightarrow (\boldsymbol{b}_2, \boldsymbol{b}_3, \boldsymbol{b}_1)\]
  • If \(k_{\beta} = min(k_{\alpha}, k_{\beta}, k_{\gamma})\), then:
    \[(\boldsymbol{b}_1, \boldsymbol{b}_2, \boldsymbol{b}_3) \rightarrow (\boldsymbol{b}_3, \boldsymbol{b}_1, \boldsymbol{b}_2)\]

Reordering if all angles are \(< 90^{\circ}\):

  • If \(k_{\alpha} = max(k_{\alpha}, k_{\beta}, k_{\gamma})\), then:
    \[(\boldsymbol{b}_1, \boldsymbol{b}_2, \boldsymbol{b}_3) \rightarrow (\boldsymbol{b}_2, \boldsymbol{b}_3, \boldsymbol{b}_1)\]
  • If \(k_{\beta} = max(k_{\alpha}, k_{\beta}, k_{\gamma})\), then:
    \[(\boldsymbol{b}_1, \boldsymbol{b}_2, \boldsymbol{b}_3) \rightarrow (\boldsymbol{b}_3, \boldsymbol{b}_1, \boldsymbol{b}_2)\]

K-path#

TRI1a#

\(\mathrm{X-\Gamma-Y\vert L-\Gamma-Z\vert N-\Gamma-M\vert R-\Gamma}\)

Point

\(\times\boldsymbol{b}_1\)

\(\times\boldsymbol{b}_2\)

\(\times\boldsymbol{b}_3\)

\(\mathrm{\Gamma}\)

\(0\)

\(0\)

\(0\)

\(\mathrm{L}\)

\(1/2\)

\(1/2\)

\(0\)

\(\mathrm{M}\)

\(0\)

\(1/2\)

\(1/2\)

\(\mathrm{N}\)

\(1/2\)

\(0\)

\(1/2\)

\(\mathrm{R}\)

\(1/2\)

\(1/2\)

\(1/2\)

\(\mathrm{X}\)

\(1/2\)

\(0\)

\(0\)

\(\mathrm{Y}\)

\(0\)

\(1/2\)

\(0\)

\(\mathrm{Z}\)

\(0\)

\(0\)

\(1/2\)

TRI2a#

\(\mathrm{X-\Gamma-Y\vert L-\Gamma-Z\vert N-\Gamma-M\vert R-\Gamma}\)

Point

\(\times\boldsymbol{b}_1\)

\(\times\boldsymbol{b}_2\)

\(\times\boldsymbol{b}_3\)

\(\mathrm{\Gamma}\)

\(0\)

\(0\)

\(0\)

\(\mathrm{L}\)

\(1/2\)

\(1/2\)

\(0\)

\(\mathrm{M}\)

\(0\)

\(1/2\)

\(1/2\)

\(\mathrm{N}\)

\(1/2\)

\(0\)

\(1/2\)

\(\mathrm{R}\)

\(1/2\)

\(1/2\)

\(1/2\)

\(\mathrm{X}\)

\(1/2\)

\(0\)

\(0\)

\(\mathrm{Y}\)

\(0\)

\(1/2\)

\(0\)

\(\mathrm{Z}\)

\(0\)

\(0\)

\(1/2\)

TRI1b#

\(\mathrm{X-\Gamma-Y\vert L-\Gamma-Z\vert N-\Gamma-M\vert R-\Gamma}\)

Point

\(\times\boldsymbol{b}_1\)

\(\times\boldsymbol{b}_2\)

\(\times\boldsymbol{b}_3\)

\(\mathrm{\Gamma}\)

\(0\)

\(0\)

\(0\)

\(\mathrm{L}\)

\(1/2\)

\(-1/2\)

\(0\)

\(\mathrm{M}\)

\(0\)

\(0\)

\(1/2\)

\(\mathrm{N}\)

\(-1/2\)

\(-1/2\)

\(1/2\)

\(\mathrm{R}\)

\(0\)

\(-1/2\)

\(1/2\)

\(\mathrm{X}\)

\(0\)

\(-1/2\)

\(0\)

\(\mathrm{Y}\)

\(1/2\)

\(0\)

\(0\)

\(\mathrm{Z}\)

\(-1/2\)

\(0\)

\(1/2\)

TRI2b#

\(\mathrm{X-\Gamma-Y\vert L-\Gamma-Z\vert N-\Gamma-M\vert R-\Gamma}\)

Point

\(\times\boldsymbol{b}_1\)

\(\times\boldsymbol{b}_2\)

\(\times\boldsymbol{b}_3\)

\(\mathrm{\Gamma}\)

\(0\)

\(0\)

\(0\)

\(\mathrm{L}\)

\(1/2\)

\(-1/2\)

\(0\)

\(\mathrm{M}\)

\(0\)

\(0\)

\(1/2\)

\(\mathrm{N}\)

\(-1/2\)

\(-1/2\)

\(1/2\)

\(\mathrm{R}\)

\(0\)

\(-1/2\)

\(1/2\)

\(\mathrm{X}\)

\(0\)

\(-1/2\)

\(0\)

\(\mathrm{Y}\)

\(1/2\)

\(0\)

\(0\)

\(\mathrm{Z}\)

\(-1/2\)

\(0\)

\(1/2\)

Variations#

There are four variations of triclinic lattice.

TRI1a#

\(k_{\alpha} > 90^{\circ}, k_{\beta} > 90^{\circ}, k_{\gamma} > 90^{\circ}, k_{\gamma} = \min(k_{\alpha}, k_{\beta}, k_{\gamma})\)

TRI2a#

\(k_{\alpha} > 90^{\circ}, k_{\beta} > 90^{\circ}, k_{\gamma} = 90^{\circ}\)

TRI1b#

\(k_{\alpha} < 90^{\circ}, k_{\beta} < 90^{\circ}, k_{\gamma} < 90^{\circ}, k_{\gamma} = \max(k_{\alpha}, k_{\beta}, k_{\gamma})\)

TRI2b#

\(k_{\alpha} < 90^{\circ}, k_{\beta} < 90^{\circ}, k_{\gamma} = 90^{\circ}\)

In definition of the examples we cheated and defined them through reciprocal lattice parameters.

Examples#

TRI1a#

Brillouin zone and default kpath#

# RAD-tools - Sandbox (mainly condense matter plotting).
# Copyright (C) 2022-2024  Andrey Rybakov
#
# e-mail: anry@uv.es, web: rad-tools.org
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <https://www.gnu.org/licenses/>.

import radtools as rad

l = rad.lattice_example("TRI1a")
backend = rad.PlotlyBackend()
backend.plot(l, kind="brillouin-kpath")
# Save an image:
backend.save("tri1a_brillouin.png")
# Interactive plot:
backend.show()

Primitive and conventional cell#

# RAD-tools - Sandbox (mainly condense matter plotting).
# Copyright (C) 2022-2024  Andrey Rybakov
#
# e-mail: anry@uv.es, web: rad-tools.org
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <https://www.gnu.org/licenses/>.

import radtools as rad

l = rad.lattice_example("TRI1a")
backend = rad.PlotlyBackend()
backend.plot(l, kind="primitive")
# Save an image:
backend.save("tri1a_real.png")
# Interactive plot:
backend.show()

Wigner-Seitz cell#

# RAD-tools - Sandbox (mainly condense matter plotting).
# Copyright (C) 2022-2024  Andrey Rybakov
#
# e-mail: anry@uv.es, web: rad-tools.org
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <https://www.gnu.org/licenses/>.

import radtools as rad

l = rad.lattice_example("TRI1a")
backend = rad.PlotlyBackend()
backend.plot(l, kind="wigner-seitz")
# Save an image:
backend.save("tri1a_wigner-seitz.png")
# Interactive plot:
backend.show()

TRI2a#

Brillouin zone and default kpath#

# RAD-tools - Sandbox (mainly condense matter plotting).
# Copyright (C) 2022-2024  Andrey Rybakov
#
# e-mail: anry@uv.es, web: rad-tools.org
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <https://www.gnu.org/licenses/>.

import radtools as rad

l = rad.lattice_example("TRI2a")
backend = rad.PlotlyBackend()
backend.plot(l, kind="brillouin-kpath")
# Save an image:
backend.save("tri2a_brillouin.png")
# Interactive plot:
backend.show()

Primitive and conventional cell#

# RAD-tools - Sandbox (mainly condense matter plotting).
# Copyright (C) 2022-2024  Andrey Rybakov
#
# e-mail: anry@uv.es, web: rad-tools.org
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <https://www.gnu.org/licenses/>.

import radtools as rad

l = rad.lattice_example("TRI2a")
backend = rad.PlotlyBackend()
backend.plot(l, kind="primitive")
# Save an image:
backend.save("tri2a_real.png")
# Interactive plot:
backend.show()

Wigner-Seitz cell#

# RAD-tools - Sandbox (mainly condense matter plotting).
# Copyright (C) 2022-2024  Andrey Rybakov
#
# e-mail: anry@uv.es, web: rad-tools.org
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <https://www.gnu.org/licenses/>.

import radtools as rad

l = rad.lattice_example("TRI2a")
backend = rad.PlotlyBackend()
backend.plot(l, kind="wigner-seitz")
# Save an image:
backend.save("tri2a_wigner-seitz.png")
# Interactive plot:
backend.show()

TRI1b#

Brillouin zone and default kpath#

# RAD-tools - Sandbox (mainly condense matter plotting).
# Copyright (C) 2022-2024  Andrey Rybakov
#
# e-mail: anry@uv.es, web: rad-tools.org
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <https://www.gnu.org/licenses/>.

import radtools as rad

l = rad.lattice_example("TRI1b")
backend = rad.PlotlyBackend()
backend.plot(l, kind="brillouin-kpath")
# Save an image:
backend.save("tri1b_brillouin.png")
# Interactive plot:
backend.show()

Primitive and conventional cell#

# RAD-tools - Sandbox (mainly condense matter plotting).
# Copyright (C) 2022-2024  Andrey Rybakov
#
# e-mail: anry@uv.es, web: rad-tools.org
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <https://www.gnu.org/licenses/>.

import radtools as rad

l = rad.lattice_example("TRI1b")
backend = rad.PlotlyBackend()
backend.plot(l, kind="primitive")
# Save an image:
backend.save("tri1b_real.png")
# Interactive plot:
backend.show()

Wigner-Seitz cell#

# RAD-tools - Sandbox (mainly condense matter plotting).
# Copyright (C) 2022-2024  Andrey Rybakov
#
# e-mail: anry@uv.es, web: rad-tools.org
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <https://www.gnu.org/licenses/>.

import radtools as rad

l = rad.lattice_example("TRI1b")
backend = rad.PlotlyBackend()
backend.plot(l, kind="wigner-seitz")
# Save an image:
backend.save("tri1b_wigner-seitz.png")
# Interactive plot:
backend.show()

TRI2b#

Brillouin zone and default kpath#

# RAD-tools - Sandbox (mainly condense matter plotting).
# Copyright (C) 2022-2024  Andrey Rybakov
#
# e-mail: anry@uv.es, web: rad-tools.org
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <https://www.gnu.org/licenses/>.

import radtools as rad

l = rad.lattice_example("TRI2b")
backend = rad.PlotlyBackend()
backend.plot(l, kind="brillouin-kpath")
# Save an image:
backend.save("tri2b_brillouin.png")
# Interactive plot:
backend.show()

Primitive and conventional cell#

# RAD-tools - Sandbox (mainly condense matter plotting).
# Copyright (C) 2022-2024  Andrey Rybakov
#
# e-mail: anry@uv.es, web: rad-tools.org
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <https://www.gnu.org/licenses/>.

import radtools as rad

l = rad.lattice_example("TRI2b")
backend = rad.PlotlyBackend()
backend.plot(l, kind="primitive")
# Save an image:
backend.save("tri2b_real.png")
# Interactive plot:
backend.show()

Wigner-Seitz cell#

# RAD-tools - Sandbox (mainly condense matter plotting).
# Copyright (C) 2022-2024  Andrey Rybakov
#
# e-mail: anry@uv.es, web: rad-tools.org
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <https://www.gnu.org/licenses/>.

import radtools as rad

l = rad.lattice_example("TRI2b")
backend = rad.PlotlyBackend()
backend.plot(l, kind="wigner-seitz")
# Save an image:
backend.save("tri2b_wigner-seitz.png")
# Interactive plot:
backend.show()