Source code for radtools.crystal.bravais_lattice.examples

# 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/>.

from math import cos, pi, sin

from radtools.constants import TORADIANS
from radtools.crystal.bravais_lattice.constructor import (
    BCC,
    BCT,
    CUB,
    FCC,
    HEX,
    MCL,
    MCLC,
    ORC,
    ORCC,
    ORCF,
    ORCI,
    RHL,
    TET,
    TRI,
)
from radtools.crystal.constants import BRAVAIS_LATTICE_VARIATIONS

__all__ = [
    "lattice_example",
]


[docs] def lattice_example( lattice_name: str = None, ): r""" Return an example of the lattice. Parameters ---------- lattice_name : str, optional Name of the lattice to be returned. For available names see documentation of each Bravais lattice class. Lowercased before usage. Returns ------- lattice : Lattice or list :py:class:`.Lattice` class is returned. If no math found a list with available examples is returned. """ correct_inputs = set(map(lambda x: x.lower(), BRAVAIS_LATTICE_VARIATIONS)).union( set( map( lambda x: x.translate(str.maketrans("", "", "12345ab")).lower(), BRAVAIS_LATTICE_VARIATIONS, ) ) ) if not isinstance(lattice_name, str) or lattice_name.lower() not in correct_inputs: message = ( f"There is no {lattice_name} Bravais lattice. Available examples are:\n" ) for name in BRAVAIS_LATTICE_VARIATIONS: message += f" * {name}\n" raise ValueError(message) lattice_name = lattice_name.lower() if lattice_name == "cub": return CUB(pi) elif lattice_name == "fcc": return FCC(pi) elif lattice_name == "bcc": return BCC(pi) elif lattice_name == "tet": return TET(pi, 1.5 * pi) elif lattice_name in ["bct1", "bct"]: return BCT(1.5 * pi, pi) elif lattice_name == "bct2": return BCT(pi, 1.5 * pi) elif lattice_name == "orc": return ORC(pi, 1.5 * pi, 2 * pi) elif lattice_name in ["orcf1", "orcf"]: return ORCF(0.7 * pi, 5 / 4 * pi, 5 / 3 * pi) elif lattice_name == "orcf2": return ORCF(1.2 * pi, 5 / 4 * pi, 5 / 3 * pi) elif lattice_name == "orcf3": return ORCF(pi, 5 / 4 * pi, 5 / 3 * pi) elif lattice_name == "orci": return ORCI(pi, 1.3 * pi, 1.7 * pi) elif lattice_name == "orcc": return ORCC(pi, 1.3 * pi, 1.7 * pi) elif lattice_name == "hex": return HEX(pi, 2 * pi) elif lattice_name in ["rhl1", "rhl"]: # If alpha = 60 it is effectively FCC! return RHL(pi, 70) elif lattice_name == "rhl2": return RHL(pi, 110) elif lattice_name == "mcl": return MCL(pi, 1.3 * pi, 1.6 * pi, alpha=75) elif lattice_name in ["mclc1", "mclc"]: return MCLC(pi, 1.4 * pi, 1.7 * pi, 80) elif lattice_name == "mclc2": return MCLC(1.4 * pi * sin(75 * TORADIANS), 1.4 * pi, 1.7 * pi, 75) elif lattice_name == "mclc3": b = pi x = 1.1 alpha = 78 ralpha = alpha * TORADIANS c = b * (x**2) / (x**2 - 1) * cos(ralpha) * 1.8 a = x * b * sin(ralpha) return MCLC(a, b, c, alpha) elif lattice_name == "mclc4": b = pi x = 1.2 alpha = 65 ralpha = alpha * TORADIANS c = b * (x**2) / (x**2 - 1) * cos(ralpha) a = x * b * sin(ralpha) return MCLC(a, b, c, alpha) elif lattice_name == "mclc5": b = pi x = 1.4 alpha = 53 ralpha = alpha * TORADIANS c = b * (x**2) / (x**2 - 1) * cos(ralpha) * 0.9 a = x * b * sin(ralpha) return MCLC(a, b, c, alpha) elif lattice_name in ["tri1a", "tri1", "tri", "tria"]: return TRI(1, 1.5, 2, 120, 110, 100, reciprocal=True) elif lattice_name in ["tri2a", "tri2"]: return TRI(1, 1.5, 2, 120, 110, 90, reciprocal=True) elif lattice_name in ["tri1b", "trib"]: return TRI(1, 1.5, 2, 60, 70, 80, reciprocal=True) elif lattice_name == "tri2b": return TRI(1, 1.5, 2, 60, 70, 90, reciprocal=True)