Triclinic (TRI)#
Pearson symbol: aP
Constructor: TRI()
It is defined by six parameters: \(a\), \(b\), \(c\) and \(\alpha\), \(\beta\), \(\gamma\). with primitive and conventional cell:
with
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#
# Wulfric - Crystal, Lattice, Atoms, K-path.
# Copyright (C) 2023-2024 Andrey Rybakov
#
# e-mail: anry@uv.es, web: adrybakov.com
#
# 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 wulfric as wulf
l = wulf.lattice_example("{name}")
# Standardization is explicit since 0.3
l.standardize()
backend = wulf.PlotlyBackend()
backend.plot(l, kind="brillouin-kpath")
# Save an image:
backend.save("tri1a_brillouin.png")
# Interactive plot:
backend.show()
Primitive and conventional cell#
# Wulfric - Crystal, Lattice, Atoms, K-path.
# Copyright (C) 2023-2024 Andrey Rybakov
#
# e-mail: anry@uv.es, web: adrybakov.com
#
# 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 wulfric as wulf
l = wulf.lattice_example("{name}")
# Standardization is explicit since 0.3
l.standardize()
backend = wulf.PlotlyBackend()
backend.plot(l, kind="primitive")
# Save an image:
backend.save("tri1a_real.png")
# Interactive plot:
backend.show()
Wigner-Seitz cell#
# Wulfric - Crystal, Lattice, Atoms, K-path.
# Copyright (C) 2023-2024 Andrey Rybakov
#
# e-mail: anry@uv.es, web: adrybakov.com
#
# 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 wulfric as wulf
l = wulf.lattice_example("{name}")
# Standardization is explicit since 0.3
l.standardize()
backend = wulf.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#
# Wulfric - Crystal, Lattice, Atoms, K-path.
# Copyright (C) 2023-2024 Andrey Rybakov
#
# e-mail: anry@uv.es, web: adrybakov.com
#
# 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 wulfric as wulf
l = wulf.lattice_example("{name}")
# Standardization is explicit since 0.3
l.standardize()
backend = wulf.PlotlyBackend()
backend.plot(l, kind="brillouin-kpath")
# Save an image:
backend.save("tri2a_brillouin.png")
# Interactive plot:
backend.show()
Primitive and conventional cell#
# Wulfric - Crystal, Lattice, Atoms, K-path.
# Copyright (C) 2023-2024 Andrey Rybakov
#
# e-mail: anry@uv.es, web: adrybakov.com
#
# 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 wulfric as wulf
l = wulf.lattice_example("{name}")
# Standardization is explicit since 0.3
l.standardize()
backend = wulf.PlotlyBackend()
backend.plot(l, kind="primitive")
# Save an image:
backend.save("tri2a_real.png")
# Interactive plot:
backend.show()
Wigner-Seitz cell#
# Wulfric - Crystal, Lattice, Atoms, K-path.
# Copyright (C) 2023-2024 Andrey Rybakov
#
# e-mail: anry@uv.es, web: adrybakov.com
#
# 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 wulfric as wulf
l = wulf.lattice_example("{name}")
# Standardization is explicit since 0.3
l.standardize()
backend = wulf.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#
# Wulfric - Crystal, Lattice, Atoms, K-path.
# Copyright (C) 2023-2024 Andrey Rybakov
#
# e-mail: anry@uv.es, web: adrybakov.com
#
# 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 wulfric as wulf
l = wulf.lattice_example("{name}")
# Standardization is explicit since 0.3
l.standardize()
backend = wulf.PlotlyBackend()
backend.plot(l, kind="brillouin-kpath")
# Save an image:
backend.save("tri1b_brillouin.png")
# Interactive plot:
backend.show()
Primitive and conventional cell#
# Wulfric - Crystal, Lattice, Atoms, K-path.
# Copyright (C) 2023-2024 Andrey Rybakov
#
# e-mail: anry@uv.es, web: adrybakov.com
#
# 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 wulfric as wulf
l = wulf.lattice_example("{name}")
# Standardization is explicit since 0.3
l.standardize()
backend = wulf.PlotlyBackend()
backend.plot(l, kind="primitive")
# Save an image:
backend.save("tri1b_real.png")
# Interactive plot:
backend.show()
Wigner-Seitz cell#
# Wulfric - Crystal, Lattice, Atoms, K-path.
# Copyright (C) 2023-2024 Andrey Rybakov
#
# e-mail: anry@uv.es, web: adrybakov.com
#
# 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 wulfric as wulf
l = wulf.lattice_example("{name}")
# Standardization is explicit since 0.3
l.standardize()
backend = wulf.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#
# Wulfric - Crystal, Lattice, Atoms, K-path.
# Copyright (C) 2023-2024 Andrey Rybakov
#
# e-mail: anry@uv.es, web: adrybakov.com
#
# 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 wulfric as wulf
l = wulf.lattice_example("{name}")
# Standardization is explicit since 0.3
l.standardize()
backend = wulf.PlotlyBackend()
backend.plot(l, kind="brillouin-kpath")
# Save an image:
backend.save("tri2b_brillouin.png")
# Interactive plot:
backend.show()
Primitive and conventional cell#
# Wulfric - Crystal, Lattice, Atoms, K-path.
# Copyright (C) 2023-2024 Andrey Rybakov
#
# e-mail: anry@uv.es, web: adrybakov.com
#
# 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 wulfric as wulf
l = wulf.lattice_example("{name}")
# Standardization is explicit since 0.3
l.standardize()
backend = wulf.PlotlyBackend()
backend.plot(l, kind="primitive")
# Save an image:
backend.save("tri2b_real.png")
# Interactive plot:
backend.show()
Wigner-Seitz cell#
# Wulfric - Crystal, Lattice, Atoms, K-path.
# Copyright (C) 2023-2024 Andrey Rybakov
#
# e-mail: anry@uv.es, web: adrybakov.com
#
# 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 wulfric as wulf
l = wulf.lattice_example("{name}")
# Standardization is explicit since 0.3
l.standardize()
backend = wulf.PlotlyBackend()
backend.plot(l, kind="wigner-seitz")
# Save an image:
backend.save("tri2b_wigner-seitz.png")
# Interactive plot:
backend.show()
Cell standardization#
Triclinic cell is unique, as standardization is performed based on the reciprocal primitive cell. As all transformations involved are described by orthonormal matrices, the reciprocal and real-space cells are transformed in a simplified manner (Note: \(\boldsymbol{S}^T = \boldsymbol{S}^{-1}\)):
One of the four conditions have to be met:
\(k_{\gamma} = 90^{\circ}\) and other two angles are \(> 90^{\circ}\).
\(k_{\gamma} = 90^{\circ}\) and other two angles are \(< 90^{\circ}\).
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})\).
The standardization matrix is constructed in two steps
Step 1#
In this step we ensure either of the two conditions: all angles are \(\le 90^{\circ}\) or all angles are \(\ge 90^{\circ}\).
If \(k_{\alpha} \ge \frac{\pi}{2}\) and \(k_{\beta} \ge \frac{\pi}{2}\) and \(k_{\gamma} \ge \frac{\pi}{2}\) or \(k_{\alpha} \le \frac{\pi}{2}\) and \(k_{\beta} \le \frac{\pi}{2}\) and \(k_{\gamma} \le \frac{\pi}{2}\) (i.e \(\boldsymbol{b}_2\cdot\boldsymbol{b}_3 \le 0\) and \(\boldsymbol{b}_1\cdot\boldsymbol{b}_3 \le 0\) and \(\boldsymbol{b}_1\cdot\boldsymbol{b}_2 \le 0\) or \(\boldsymbol{b}_2\cdot\boldsymbol{b}_3 \ge 0\) and \(\boldsymbol{b}_1\cdot\boldsymbol{b}_3 \ge 0\) and \(\boldsymbol{b}_1\cdot\boldsymbol{b}_2 \ge 0\), then
\[(\boldsymbol{b}_1^1, \boldsymbol{b}_2^1, \boldsymbol{b}_3^1) = (\boldsymbol{b}_1, \boldsymbol{b}_2, \boldsymbol{b}_3)\]and
\[\begin{split}\boldsymbol{S}_1 = \boldsymbol{S}_1^{-1} = \boldsymbol{S}_1^T = \begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{pmatrix}\end{split}\]If \(k_{\alpha} \ge \frac{\pi}{2}\) and \(k_{\beta} \ge \frac{\pi}{2}\) and \(k_{\gamma} \le \frac{\pi}{2}\) or \(k_{\alpha} \le \frac{\pi}{2}\) and \(k_{\beta} \le \frac{\pi}{2}\) and \(k_{\gamma} \ge \frac{\pi}{2}\) (i.e \(\boldsymbol{b}_2\cdot\boldsymbol{b}_3 \le 0\) and \(\boldsymbol{b}_1\cdot\boldsymbol{b}_3 \le 0\) and \(\boldsymbol{b}_1\cdot\boldsymbol{b}_2 \ge 0\) or \(\boldsymbol{b}_2\cdot\boldsymbol{b}_3 \ge 0\) and \(\boldsymbol{b}_1\cdot\boldsymbol{b}_3 \ge 0\) and \(\boldsymbol{b}_1\cdot\boldsymbol{b}_2 \le 0\), then
\[(\boldsymbol{b}_1^1, \boldsymbol{b}_2^1, \boldsymbol{b}_3^1) = (-\boldsymbol{b}_1, -\boldsymbol{b}_2, \boldsymbol{b}_3)\]and
\[\begin{split}\boldsymbol{S}_1 = \boldsymbol{S}_1^{-1} = \boldsymbol{S}_1^T = \begin{pmatrix} -1 & 0 & 0 \\ 0 & -1 & 0 \\ 0 & 0 & 1 \end{pmatrix}\end{split}\]If \(k_{\alpha} \ge \frac{\pi}{2}\) and \(k_{\beta} \le \frac{\pi}{2}\) and \(k_{\gamma} \ge \frac{\pi}{2}\) or \(k_{\alpha} \le \frac{\pi}{2}\) and \(k_{\beta} \ge \frac{\pi}{2}\) and \(k_{\gamma} \le \frac{\pi}{2}\) (i.e \(\boldsymbol{b}_2\cdot\boldsymbol{b}_3 \le 0\) and \(\boldsymbol{b}_1\cdot\boldsymbol{b}_3 \ge 0\) and \(\boldsymbol{b}_1\cdot\boldsymbol{b}_2 \le 0\) or \(\boldsymbol{b}_2\cdot\boldsymbol{b}_3 \ge 0\) and \(\boldsymbol{b}_1\cdot\boldsymbol{b}_3 \le 0\) and \(\boldsymbol{b}_1\cdot\boldsymbol{b}_2 \ge 0\), then
\[(\boldsymbol{b}_1^1, \boldsymbol{b}_2^1, \boldsymbol{b}_3^1) = (-\boldsymbol{b}_1, \boldsymbol{b}_2, -\boldsymbol{b}_3)\]and
\[\begin{split}\boldsymbol{S}_1 = \boldsymbol{S}_1^{-1} = \boldsymbol{S}_1^T = \begin{pmatrix} -1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & -1 \end{pmatrix}\end{split}\]If \(k_{\alpha} \le \frac{\pi}{2}\) and \(k_{\beta} \ge \frac{\pi}{2}\) and \(k_{\gamma} \ge \frac{\pi}{2}\) or \(k_{\alpha} \ge \frac{\pi}{2}\) and \(k_{\beta} \le \frac{\pi}{2}\) and \(k_{\gamma} \le \frac{\pi}{2}\) (i.e \(\boldsymbol{b}_2\cdot\boldsymbol{b}_3 \ge 0\) and \(\boldsymbol{b}_1\cdot\boldsymbol{b}_3 \le 0\) and \(\boldsymbol{b}_1\cdot\boldsymbol{b}_2 \le 0\) or \(\boldsymbol{b}_2\cdot\boldsymbol{b}_3 \le 0\) and \(\boldsymbol{b}_1\cdot\boldsymbol{b}_3 \ge 0\) and \(\boldsymbol{b}_1\cdot\boldsymbol{b}_2 \ge 0\), then
\[(\boldsymbol{b}_1^1, \boldsymbol{b}_2^1, \boldsymbol{b}_3^1) = (\boldsymbol{b}_1, -\boldsymbol{b}_2, -\boldsymbol{b}_3)\]and
\[\begin{split}\boldsymbol{S}_1 = \boldsymbol{S}_1^{-1} = \boldsymbol{S}_1^T = \begin{pmatrix} 1 & 0 & 0 \\ 0 & -1 & 0 \\ 0 & 0 & -1 \end{pmatrix}\end{split}\]
Step 2#
At this step we ensure that \(k_{\gamma}\) is an appropriate extremum.
If \(k_{\gamma} = min(k_{\alpha}, k_{\beta}, k_{\gamma})\) and \(k_{\gamma} \ge \frac{\pi}{2}\) or \(k_{\gamma} = max(k_{\alpha}, k_{\beta}, k_{\gamma})\) and \(k_{\gamma} \le \frac{\pi}{2}\) (i.e. \(k_{\gamma} = min(k_{\alpha}, k_{\beta}, k_{\gamma})\) and \(\boldsymbol{b}_1\cdot\boldsymbol{b}_2 \le 0\) or \(k_{\gamma} = max(k_{\alpha}, k_{\beta}, k_{\gamma})\) and \(\boldsymbol{b}_1\cdot\boldsymbol{b}_2 \ge 0\), then
\[(\boldsymbol{b}_1^s, \boldsymbol{b}_2^s, \boldsymbol{b}_3^s) = (\boldsymbol{b}_1^1, \boldsymbol{b}_2^1, \boldsymbol{b}_3^1)\]and
\[\begin{split}\boldsymbol{S}_2 = \boldsymbol{S}_2^{-1} = \boldsymbol{S}_2^T = \begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{pmatrix}\end{split}\]If \(k_{\beta} = min(k_{\alpha}, k_{\beta}, k_{\gamma})\) and \(k_{\beta} \ge \frac{\pi}{2}\) or \(k_{\beta} = max(k_{\alpha}, k_{\beta}, k_{\gamma})\) and \(k_{\beta} \le \frac{\pi}{2}\) (i.e. \(k_{\beta} = min(k_{\alpha}, k_{\beta}, k_{\gamma})\) and \(\boldsymbol{b}_1\cdot\boldsymbol{b}_3 \le 0\) or \(k_{\beta} = max(k_{\alpha}, k_{\beta}, k_{\gamma})\) and \(\boldsymbol{b}_1\cdot\boldsymbol{b}_3 \ge 0\), then
\[(\boldsymbol{b}_1^s, \boldsymbol{b}_2^s, \boldsymbol{b}_3^s) = (\boldsymbol{b}_3^1, \boldsymbol{b}_1^1, \boldsymbol{b}_2^1)\]and
\[\begin{split}\boldsymbol{S}_2 = \begin{pmatrix} 0 & 0 & 1 \\ 1 & 0 & 0 \\ 0 & 1 & 0 \end{pmatrix} \qquad \boldsymbol{S}_2^{-1} = \boldsymbol{S}_2^T = \begin{pmatrix} 0 & 1 & 0 \\ 0 & 0 & 1 \\ 1 & 0 & 0 \end{pmatrix}\end{split}\]If \(k_{\alpha} = min(k_{\alpha}, k_{\beta}, k_{\gamma})\) and \(k_{\alpha} \ge \frac{\pi}{2}\) or \(k_{\alpha} = max(k_{\alpha}, k_{\beta}, k_{\gamma})\) and \(k_{\alpha} \le \frac{\pi}{2}\) (i.e. \(k_{\alpha} = min(k_{\alpha}, k_{\beta}, k_{\gamma})\) and \(\boldsymbol{b}_2\cdot\boldsymbol{b}_3 \le 0\) or \(k_{\alpha} = max(k_{\alpha}, k_{\beta}, k_{\gamma})\) and \(\boldsymbol{b}_2\cdot\boldsymbol{b}_3 \ge 0\), then
\[(\boldsymbol{b}_1^s, \boldsymbol{b}_2^s, \boldsymbol{b}_3^s) = (\boldsymbol{b}_2^1, \boldsymbol{b}_3^1, \boldsymbol{b}_1^1)\]and
\[\begin{split}\boldsymbol{S}_2 = \begin{pmatrix} 0 & 1 & 0 \\ 0 & 0 & 1 \\ 1 & 0 & 0 \end{pmatrix} \qquad \boldsymbol{S}_2^{-1} = \boldsymbol{S}_2^T = \begin{pmatrix} 0 & 0 & 1 \\ 1 & 0 & 0 \\ 0 & 1 & 0 \end{pmatrix}\end{split}\]