Base-centred monoclinic (MCLC)#

Pearson symbol: mS

Constructor: MCLC()

It is defined by four parameter: \(a\), \(b\), \(c\) and \(\alpha\) with conventional cell:

\[\begin{split}\begin{matrix} \boldsymbol{a}_1 &=& (a, &0, &0)\\ \boldsymbol{a}_2 &=& (0, &b, &0)\\ \boldsymbol{a}_3 &=& (0, &c\cos\alpha, &c\sin\alpha) \end{matrix}\end{split}\]

And primitive cell:

\[\begin{split}\begin{matrix} \boldsymbol{a}_1 &=& (a/2, &b/2, &0)\\ \boldsymbol{a}_2 &=& (-a/2, &b/2, &0)\\ \boldsymbol{a}_3 &=& (0, &c\cos\alpha, &c\sin\alpha) \end{matrix}\end{split}\]

with

\[\begin{split}\boldsymbol{C} = \dfrac{1}{2} \begin{pmatrix} 1 & -1 & 0 \\ 1 & 1 & 0 \\ 0 & 0 & 2 \end{pmatrix} \qquad \boldsymbol{C}^{-1} = \begin{pmatrix} 1 & 1 & 0 \\ -1 & 1 & 0 \\ 0 & 0 & 1 \end{pmatrix}\end{split}\]

Order of parameters: \(b \le c\), \(\alpha < 90^{\circ}\).

K-path#

MCLC1#

\(\mathrm{\Gamma-Y-F-L-I\vert I_1-Z-F_1\vert Y-X_1\vert X-\Gamma-N\vert M-\Gamma}\)

\[\begin{split}\begin{matrix} \zeta = \dfrac{2 - b\cos\alpha/c}{4\sin^2\alpha} & \eta = \dfrac{1}{2} + \dfrac{2\zeta c\cos\alpha}{b} \\ \psi = \dfrac{3}{4} - \dfrac{a^2}{4b^2\sin^2\alpha} & \phi = \psi + \dfrac{(3/4-\psi)b\cos\alpha}{c} \end{matrix}\end{split}\]

Point

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

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

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

\(\mathrm{\Gamma}\)

\(0\)

\(0\)

\(0\)

\(\mathrm{N}\)

\(1/2\)

\(0\)

\(0\)

\(\mathrm{N_1}\)

\(0\)

\(-1/2\)

\(0\)

\(\mathrm{F}\)

\(1-\zeta\)

\(1-\zeta\)

\(1-\eta\)

\(\mathrm{F_1}\)

\(\zeta\)

\(\zeta\)

\(\eta\)

\(\mathrm{F_2}\)

\(-\zeta\)

\(-\zeta\)

\(1-\eta\)

\(\mathrm{F_3}\)

\(1-\zeta\)

\(-\zeta\)

\(1-\eta\)

\(\mathrm{I}\)

\(\phi\)

\(1-\phi\)

\(1/2\)

\(\mathrm{I_1}\)

\(1-\phi\)

\(\phi-1\)

\(1/2\)

\(\mathrm{L}\)

\(1/2\)

\(1/2\)

\(1/2\)

\(\mathrm{M}\)

\(1/2\)

\(0\)

\(1/2\)

\(\mathrm{X}\)

\(1-\psi\)

\(\psi-1\)

\(0\)

\(\mathrm{X_1}\)

\(\psi\)

\(1-\psi\)

\(0\)

\(\mathrm{X_2}\)

\(\psi-1\)

\(-\psi\)

\(0\)

\(\mathrm{Y}\)

\(1/2\)

\(1/2\)

\(0\)

\(\mathrm{Y_1}\)

\(-1/2\)

\(-1/2\)

\(0\)

\(\mathrm{Z}\)

\(0\)

\(0\)

\(1/2\)

MCLC2#

\(\mathrm{\Gamma-Y-F-L-I\vert I_1-Z-F_1\vert N-\Gamma-M}\)

\[\begin{split}\begin{matrix} \zeta = \dfrac{2 - b\cos\alpha/c}{4\sin^2\alpha} & \eta = \dfrac{1}{2} + \dfrac{2\zeta c\cos\alpha}{b} \\ \psi = \dfrac{3}{4} - \dfrac{a^2}{4b^2\sin^2\alpha} & \phi = \psi + \dfrac{(3/4-\psi)b\cos\alpha}{c} \end{matrix}\end{split}\]

Point

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

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

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

\(\mathrm{\Gamma}\)

\(0\)

\(0\)

\(0\)

\(\mathrm{N}\)

\(1/2\)

\(0\)

\(0\)

\(\mathrm{N_1}\)

\(0\)

\(-1/2\)

\(0\)

\(\mathrm{F}\)

\(1-\zeta\)

\(1-\zeta\)

\(1-\eta\)

\(\mathrm{F_1}\)

\(\zeta\)

\(\zeta\)

\(\eta\)

\(\mathrm{F_2}\)

\(-\zeta\)

\(-\zeta\)

\(1-\eta\)

\(\mathrm{F_3}\)

\(1-\zeta\)

\(-\zeta\)

\(1-\eta\)

\(\mathrm{I}\)

\(\phi\)

\(1-\phi\)

\(1/2\)

\(\mathrm{I_1}\)

\(1-\phi\)

\(\phi-1\)

\(1/2\)

\(\mathrm{L}\)

\(1/2\)

\(1/2\)

\(1/2\)

\(\mathrm{M}\)

\(1/2\)

\(0\)

\(1/2\)

\(\mathrm{X}\)

\(1-\psi\)

\(\psi-1\)

\(0\)

\(\mathrm{X_1}\)

\(\psi\)

\(1-\psi\)

\(0\)

\(\mathrm{X_2}\)

\(\psi-1\)

\(-\psi\)

\(0\)

\(\mathrm{Y}\)

\(1/2\)

\(1/2\)

\(0\)

\(\mathrm{Y_1}\)

\(-1/2\)

\(-1/2\)

\(0\)

\(\mathrm{Z}\)

\(0\)

\(0\)

\(1/2\)

MCLC3#

\(\mathrm{\Gamma-Y-F-H-Z-I-F_1\vert H_1-Y_1-X-\Gamma-N\vert M-\Gamma}\)

\[\begin{split}\begin{matrix} \mu = \dfrac{1+b^2/a^2}{4} & \delta = \dfrac{bc\cos\alpha}{2a^2} & \zeta = \mu - \dfrac{1}{4} + \dfrac{1 - b\cos\alpha/c}{4\sin^2\alpha} \\ \eta = \dfrac{1}{2} + \dfrac{2\zeta c \cos\alpha}{b} & \phi = 1 + \zeta - 2\mu & \psi = \eta - 2\delta \end{matrix}\end{split}\]

Point

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

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

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

\(\mathrm{\Gamma}\)

\(0\)

\(0\)

\(0\)

\(\mathrm{F}\)

\(1-\phi\)

\(1-\phi\)

\(1-\psi\)

\(\mathrm{F_1}\)

\(\phi\)

\(\phi-1\)

\(\psi\)

\(\mathrm{F_2}\)

\(1-\phi\)

\(-\phi\)

\(1-\psi\)

\(\mathrm{H}\)

\(\zeta\)

\(\zeta\)

\(\eta\)

\(\mathrm{H_1}\)

\(1-\zeta\)

\(-\zeta\)

\(1-\eta\)

\(\mathrm{H_2}\)

\(-\zeta\)

\(-\zeta\)

\(1-\eta\)

\(\mathrm{I}\)

\(1/2\)

\(-1/2\)

\(1/2\)

\(\mathrm{M}\)

\(1/2\)

\(0\)

\(1/2\)

\(\mathrm{N}\)

\(1/2\)

\(0\)

\(0\)

\(\mathrm{N_1}\)

\(0\)

\(-1/2\)

\(0\)

\(\mathrm{X}\)

\(1/2\)

\(-1/2\)

\(0\)

\(\mathrm{Y}\)

\(\mu\)

\(\mu\)

\(\delta\)

\(\mathrm{Y_1}\)

\(1-\mu\)

\(-\mu\)

\(-\delta\)

\(\mathrm{Y_2}\)

\(-\mu\)

\(-\mu\)

\(-\delta\)

\(\mathrm{Y_3}\)

\(\mu\)

\(\mu-1\)

\(\delta\)

\(\mathrm{Z}\)

\(0\)

\(0\)

\(1/2\)

MCLC4#

\(\mathrm{\Gamma-Y-F-H-Z-I\vert H_1-Y_1-X-\Gamma-N\vert M-\Gamma}\)

\[\begin{split}\begin{matrix} \mu = \dfrac{1+b^2/a^2}{4} & \delta = \dfrac{bc\cos\alpha}{2a^2} & \zeta = \mu - \dfrac{1}{4} + \dfrac{1 - b\cos\alpha/c}{4\sin^2\alpha} \\ \eta = \dfrac{1}{2} + \dfrac{2\zeta c \cos\alpha}{b} & \phi = 1 + \zeta - 2\mu & \psi = \eta - 2\delta \end{matrix}\end{split}\]

Point

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

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

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

\(\mathrm{\Gamma}\)

\(0\)

\(0\)

\(0\)

\(\mathrm{F}\)

\(1-\phi\)

\(1-\phi\)

\(1-\psi\)

\(\mathrm{F_1}\)

\(\phi\)

\(\phi-1\)

\(\psi\)

\(\mathrm{F_2}\)

\(1-\phi\)

\(-\phi\)

\(1-\psi\)

\(\mathrm{H}\)

\(\zeta\)

\(\zeta\)

\(\eta\)

\(\mathrm{H_1}\)

\(1-\zeta\)

\(-\zeta\)

\(1-\eta\)

\(\mathrm{H_2}\)

\(-\zeta\)

\(-\zeta\)

\(1-\eta\)

\(\mathrm{I}\)

\(1/2\)

\(-1/2\)

\(1/2\)

\(\mathrm{M}\)

\(1/2\)

\(0\)

\(1/2\)

\(\mathrm{N}\)

\(1/2\)

\(0\)

\(0\)

\(\mathrm{N_1}\)

\(0\)

\(-1/2\)

\(0\)

\(\mathrm{X}\)

\(1/2\)

\(-1/2\)

\(0\)

\(\mathrm{Y}\)

\(\mu\)

\(\mu\)

\(\delta\)

\(\mathrm{Y_1}\)

\(1-\mu\)

\(-\mu\)

\(-\delta\)

\(\mathrm{Y_2}\)

\(-\mu\)

\(-\mu\)

\(-\delta\)

\(\mathrm{Y_3}\)

\(\mu\)

\(\mu-1\)

\(\delta\)

\(\mathrm{Z}\)

\(0\)

\(0\)

\(1/2\)

MCLC5#

\(\mathrm{\Gamma-Y-F-L-I\vert I_1-Z-H-F_1\vert H_1-Y_1-X-\Gamma-N\vert M-\Gamma}\)

\[\begin{split}\begin{matrix} \zeta = \dfrac{b^2}{4a^2} + \dfrac{1 - b\cos\alpha/c}{4\sin^2\alpha} & \eta = \dfrac{1}{2} + \dfrac{2\zeta c\cos\alpha}{b} \\ \mu = \dfrac{\eta}{2} + \dfrac{b^2}{4a^2} - \dfrac{bc\cos\alpha}{2a^2} & \nu = 2\mu - \zeta \\ \omega = \dfrac{(4\nu - 1 - b^2\sin^2\alpha/a^2)c}{2b\cos\alpha} & \delta = \dfrac{\zeta c \cos\alpha}{b} + \dfrac{\omega}{2} - \dfrac{1}{4} & \rho = 1 - \dfrac{\zeta a^2}{b^2} \end{matrix}\end{split}\]

Point

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

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

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

\(\mathrm{\Gamma}\)

\(0\)

\(0\)

\(0\)

\(\mathrm{F}\)

\(\nu\)

\(\nu\)

\(\omega\)

\(\mathrm{F_1}\)

\(1-\nu\)

\(-\nu\)

\(1-\omega\)

\(\mathrm{F_2}\)

\(\nu\)

\(\nu-1\)

\(\omega\)

\(\mathrm{H}\)

\(\zeta\)

\(\zeta\)

\(\eta\)

\(\mathrm{H_1}\)

\(1-\zeta\)

\(-\zeta\)

\(1-\eta\)

\(\mathrm{H_2}\)

\(-\zeta\)

\(-\zeta\)

\(1-\eta\)

\(\mathrm{I}\)

\(\rho\)

\(1-\rho\)

\(1/2\)

\(\mathrm{I_1}\)

\(1-\rho\)

\(\rho-1\)

\(1/2\)

\(\mathrm{L}\)

\(1/2\)

\(1/2\)

\(1/2\)

\(\mathrm{M}\)

\(1/2\)

\(0\)

\(1/2\)

\(\mathrm{N}\)

\(1/2\)

\(0\)

\(0\)

\(\mathrm{N_1}\)

\(0\)

\(-1/2\)

\(0\)

\(\mathrm{X}\)

\(1/2\)

\(-1/2\)

\(0\)

\(\mathrm{Y}\)

\(\mu\)

\(\mu\)

\(\delta\)

\(\mathrm{Y_1}\)

\(1-\mu\)

\(-\mu\)

\(-\delta\)

\(\mathrm{Y_2}\)

\(-\mu\)

\(-\mu\)

\(-\delta\)

\(\mathrm{Y_3}\)

\(\mu\)

\(\mu-1\)

\(\delta\)

\(\mathrm{Z}\)

\(0\)

\(0\)

\(1/2\)

Variations#

There are five variations for base-centered monoclinic lattice.

Reciprocal \(\gamma\) (\(k_{\gamma}\)) is defined by the equation (for primitive lattice):

\[\cos(k_{\gamma}) = \frac{a^2 - b^2\sin^2(\alpha)}{a^2 + b^2\sin^2(\alpha)}\]

For MCLC2 \(k_{\gamma} = 90\), therefore \(a = b \sin(\alpha)\). For MCLC1 we choose \(a < b \sin(\alpha)\) and for MCLC3, MCLC4 and MCLC5 we choose \(a > b \sin(\alpha)\).

For the variations 3-5 we define \(a = xb\sin(\alpha)\), where \(x > 1\).

Then the condition for MCLC4 gives:

\[c = \frac{x^2}{x^2 - 1}b\cos(\alpha)\]

Where \(\cos(\alpha) > 0\) (\(\alpha < 90^{\circ}\)), since \(x > 1\).

And the ordering condition \(b \le c\) gives:

\[\cos(\alpha) \ge \frac{x^2 - 1}{x^2}\]

For MCLC3 (MCLC5) we choose parameters in a same way as for MCLC4, but with \(c > \frac{x^2}{x^2 - 1}b\cos(\alpha)\) (\(c < \frac{x^2}{x^2 - 1}b\cos(\alpha)\))

MCLC1#

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

Predefined example: mclc1 with \(a = \pi\), \(b = 1.4\cdot\pi\), \(c = 1.7\cdot\pi\) and \(\alpha = 80^{\circ}\)

MCLC2#

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

Predefined example: mclc2 with \(a = 1.4\cdot\pi\cdot\sin(75^{\circ})\), \(b = 1.4\cdot\pi\), \(c = 1.7\cdot\pi\) and \(\alpha=75^{\circ}\)

MCLC3#

\(k_{\gamma} < 90^{\circ}, \dfrac{b\cos(\alpha)}{c} + \dfrac{b^2\sin(\alpha)^2}{a^2} < 1\)

Predefined example with \(b = \pi\), \(x = 1.1\), \(\alpha = 78^{\circ}\), which produce:

mclc4 with \(a = 1.1\cdot\sin(78)\cdot\pi\), \(b = \pi\), \(c = 1.8\cdot 121\cdot\cos(65)\cdot\pi/21\) and \(\alpha = 78^{\circ}\)

MCLC4#

\(k_{\gamma} < 90^{\circ}, \dfrac{b\cos(\alpha)}{c} + \dfrac{b^2\sin(\alpha)^2}{a^2} = 1\)

Predefined example with \(b = \pi\), \(x = 1.2\), \(\alpha = 65^{\circ}\), which produce:

mclc4 with \(a = 1.2\sin(65)\pi\), \(b = \pi\), \(c = 36\cos(65)\pi/11\) and \(\alpha = 65^{\circ}\)

MCLC5#

\(k_{\gamma} < 90^{\circ}, \dfrac{b\cos(\alpha)}{c} + \dfrac{b^2\sin(\alpha)^2}{a^2} > 1\)

Predefined example with \(b = \pi\), \(x = 1.4\), \(\alpha = 53^{\circ}\), which produce:

mclc5 with \(a = 1.4\cdot\sin(53)\cdot\pi\), \(b = \pi\), \(c = 0.9\cdot 11\cdot\cos(53)\cdot\pi/6\) and \(\alpha = 53^{\circ}\)

Examples#

MCLC1#

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("mclc1_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", label="primitive")
backend.plot(l, kind="conventional", label="conventional", color="black")
# Save an image:
backend.save("mclc1_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("mclc1_wigner-seitz.png")
# Interactive plot:
backend.show()

MCLC2#

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("mclc2_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", label="primitive")
backend.plot(l, kind="conventional", label="conventional", color="black")
# Save an image:
backend.save("mclc2_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("mclc2_wigner-seitz.png")
# Interactive plot:
backend.show()

MCLC3#

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("mclc3_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", label="primitive")
backend.plot(l, kind="conventional", label="conventional", color="black")
# Save an image:
backend.save("mclc3_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("mclc3_wigner-seitz.png")
# Interactive plot:
backend.show()

MCLC4#

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("mclc4_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", label="primitive")
backend.plot(l, kind="conventional", label="conventional", color="black")
# Save an image:
backend.save("mclc4_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("mclc4_wigner-seitz.png")
# Interactive plot:
backend.show()

MCLC5#

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("mclc5_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", label="primitive")
backend.plot(l, kind="conventional", label="conventional", color="black")
# Save an image:
backend.save("mclc5_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("mclc5_wigner-seitz.png")
# Interactive plot:
backend.show()

Cell standardization#

Standardization of the MCLC cell involves three steps and the second step had to be based on the conventional and not primitive cell. As a result the matrix \(\boldsymbol{S}\) is not orthonormal in a general case (direct consequence of the non-orthogonality of the matrix \(\boldsymbol{C}\)).

Step 1#

First step ensures that the first two lattice vectors of the primitive cell are orthogonal to each other. We use lattice vectors of the primitive cell.

  • If \(\vert \boldsymbol{a}_1\vert = \vert \boldsymbol{a}_2\vert \ne \vert \boldsymbol{a}_3\vert\), then

    \[(\boldsymbol{a}_1^1, \boldsymbol{a}_2^1, \boldsymbol{a}_3^1) = (\boldsymbol{a}_1, \boldsymbol{a}_2, \boldsymbol{a}_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 \(\vert \boldsymbol{a}_2 \vert = \vert \boldsymbol{a}_3 \vert \ne \vert \boldsymbol{a}_1 \vert\), then

    \[(\boldsymbol{a}_1^1, \boldsymbol{a}_2^1, \boldsymbol{a}_3^1) = (\boldsymbol{a}_2, \boldsymbol{a}_3, \boldsymbol{a}_1)\]

    and

    \[\begin{split}\boldsymbol{S}_1 = \begin{pmatrix} 0 & 1 & 0 \\ 0 & 0 & 1 \\ 1 & 0 & 0 \end{pmatrix} \qquad \boldsymbol{S}_1^{-1} = \boldsymbol{S}_1^T = \begin{pmatrix} 0 & 0 & 1 \\ 1 & 0 & 0 \\ 0 & 1 & 0 \end{pmatrix}\end{split}\]
  • If \(\vert \boldsymbol{a}_3 \vert = \vert \boldsymbol{a}_1 \vert \ne \vert \boldsymbol{a}_2 \vert\), then

    \[(\boldsymbol{a}_1^1, \boldsymbol{a}_2^1, \boldsymbol{a}_3^1) = (\boldsymbol{a}_3, \boldsymbol{a}_1, \boldsymbol{a}_2)\]

    and

    \[\begin{split}\boldsymbol{S}_1 = \begin{pmatrix} 0 & 0 & 1 \\ 1 & 0 & 0 \\ 0 & 1 & 0 \end{pmatrix} \qquad \boldsymbol{S}_1^{-1} = \boldsymbol{S}_1^T = \begin{pmatrix} 0 & 1 & 0 \\ 0 & 0 & 1 \\ 1 & 0 & 0 \end{pmatrix}\end{split}\]

Step 2#

Second step ensures the condition \(b \le c\). We use lattice vectors of the primitive cell.

Details

Length of the lattice vectors for the primitive cell are:

\[\begin{matrix} \vert \boldsymbol{a}_1 \vert = \dfrac{\sqrt{a^2 + b^2}}{2} & \vert \boldsymbol{a}_2 \vert = \dfrac{\sqrt{a^2 + b^2}}{2} & \vert \boldsymbol{a}_3 \vert = c \end{matrix}\]

angles between the lattice vectors for the primitive cell are:

\[\begin{matrix} \cos(\boldsymbol{a}_2\boldsymbol{a}_3) = \dfrac{2b}{\sqrt{a^2 + b^2}}\cos\alpha & \cos(\boldsymbol{a}_1\boldsymbol{a}_3) = \dfrac{2b}{\sqrt{a^2 + b^2}}\cos\alpha & \cos(\boldsymbol{a}_1\boldsymbol{a}_2) = \dfrac{b^2 - a^2}{b^2 + a^2} \end{matrix}\]

Therefore, no simple condition can be formulated for the primitive cell, that will be equivalent to the condition \(b \le c\) for the conventional cell. The actual condition is \(2\vert \boldsymbol{a}_1 \vert^2 (1 + \cos(\boldsymbol{a}_1\boldsymbol{a}_2)) \le \vert \boldsymbol{a}_3 \vert^2\). As a result, when this condition is not satisfied, simple reordering of vectors of the primitive cell will not be enough. The recipe, that we follow instead is to

  • Calculate conventional cell as

    \[(\boldsymbol{a}_1, \boldsymbol{a}_2, \boldsymbol{a}_3) = (\boldsymbol{a}_1^c, \boldsymbol{a}_2^c, \boldsymbol{a}_3^c) \boldsymbol{C}\]
  • Find a standardization matrix for the conventional cell

    \[(\boldsymbol{a}_1^c, \boldsymbol{a}_2^c, \boldsymbol{a}_3^c) = (\boldsymbol{a}_1^{cs}, \boldsymbol{a}_2^{cs}, \boldsymbol{a}_3^{cs}) \boldsymbol{S^c}\]
  • Calculate standardized primitive cell as

    \[(\boldsymbol{a}_1^s, \boldsymbol{a}_2^s, \boldsymbol{a}_3^s) = (\boldsymbol{a}_1^{cs}, \boldsymbol{a}_2^{cs}, \boldsymbol{a}_3^{cs}) \boldsymbol{C}\]

Then the standardization matrix for the primitive cell is

\[\boldsymbol{S} = \boldsymbol{C}^{-1} \boldsymbol{S^c} \boldsymbol{C}\]
  • If \(2\vert \boldsymbol{a}_1 \vert^2 (1 + \cos(\boldsymbol{a}_1\boldsymbol{a}_2)) \le \vert \boldsymbol{a}_3 \vert^2\), then

    \[(\boldsymbol{a}_1^2, \boldsymbol{a}_2^2, \boldsymbol{a}_3^2) = (\boldsymbol{a}_1^1, \boldsymbol{a}_2^1, \boldsymbol{a}_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 \(2\vert \boldsymbol{a}_1 \vert^2 (1 + \cos(\boldsymbol{a}_1\boldsymbol{a}_2)) > \vert \boldsymbol{a}_3 \vert^2\), then

    \[(\boldsymbol{a}_1^{c,2}, \boldsymbol{a}_2^{c,2}, \boldsymbol{a}_3^{c,2}) = (-\boldsymbol{a}_1^{c,1}, \boldsymbol{a}_3^{c,1}, \boldsymbol{a}_2^{c,1})\]
    \[\begin{split}\boldsymbol{S^s}_2 = (\boldsymbol{S^s}_2)^{-1} = \begin{pmatrix} -1 & 0 & 0 \\ 0 & 0 & 1 \\ 0 & 1 & 0 \end{pmatrix}\end{split}\]

    and

    \[\begin{split}\boldsymbol{S}_2 = \boldsymbol{S}_2^{-1} = \boldsymbol{C}^{-1} \boldsymbol{S^s}_2 \boldsymbol{C} = \begin{pmatrix} -0.5 & 0.5 & 1 \\ 0.5 & -0.5 & 1 \\ 0.5 & 0.5 & 0 \end{pmatrix}\end{split}\]

    Note

    \(\boldsymbol{S}_2^T \ne \boldsymbol{S}_2^{-1}\)

Step 3#

Last step ensures that \(\alpha < \frac{\pi}{2}\). Translated to the primitive cell, this condition reads as \(\boldsymbol{a}_2\boldsymbol{a}_3 > 0\). We use lattice vectors of the primitive cell.

  • If \(\alpha < \frac{\pi}{2}\) (i.e. \(\boldsymbol{a}_2\cdot\boldsymbol{a}_3 > 0\)), then

    \[(\boldsymbol{a}_1^s, \boldsymbol{a}_2^s, \boldsymbol{a}_3^s) = (\boldsymbol{a}_1^2, \boldsymbol{a}_2^2, \boldsymbol{a}_3^2)\]

    and

    \[\begin{split}\boldsymbol{S}_3 = \boldsymbol{S}_3^{-1} = \boldsymbol{S}_3^T = \begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{pmatrix}\end{split}\]
  • If \(\alpha > \frac{\pi}{2}\) (i.e. \(\boldsymbol{a}_2\cdot\boldsymbol{a}_3 < 0\)), then

    \[(\boldsymbol{a}_1^s, \boldsymbol{a}_2^s, \boldsymbol{a}_3^s) = (-\boldsymbol{a}_1^2, -\boldsymbol{a}_2^2, \boldsymbol{a}_3^2)\]

    and

    \[\begin{split}\boldsymbol{S}_3 = \boldsymbol{S}_3^{-1} = \boldsymbol{S}_3^T = \begin{pmatrix} -1 & 0 & 0 \\ 0 & -1 & 0 \\ 0 & 0 & 1 \end{pmatrix}\end{split}\]

Finally#

\[\boldsymbol{S} = \boldsymbol{S}_3 \boldsymbol{S}_2 \boldsymbol{S}_1 \qquad \boldsymbol{S}^{-1} = \boldsymbol{S}_1^{-1} \boldsymbol{S}_2^{-1} \boldsymbol{S}_3^{-1}\]