Brillouin zones and polyhedra¶
BrillouinZone
¶
BrillouinZone(lattice: Lattice, use_primitive: bool = True, search_length: int = 1, time_reversal_symmetry: bool = False, wedge_search: bool = True, divide_primitive: bool = True, *, warn_near_symmetry: bool = True)
BrillouinZone(lattice: Lattice, approx_config: ApproxConfig, use_primitive: bool = True, search_length: int = 1, time_reversal_symmetry: bool = False, wedge_search: bool = True, divide_primitive: bool = True, *, warn_near_symmetry: bool = True)
BrillouinZone(lattice: Lattice, use_primitive: bool = True, search_length: int = 1, time_reversal_symmetry: bool = False, wedge_search: bool = True, divide_primitive: bool = True, *, warn_near_symmetry: bool = True)
Construct and hold a first Brillouin zone and, optionally and by default, an irreducible Brillouin zone.
The region closer to a given lattice point than to any other is the
Wigner-Seitz cell of that lattice. The same construction is one possible
first Brillouin zone of a reciprocal lattice and is used within brille.
For example, a two-dimensional hexagonal lattice has a first Brillouin
zone which is a hexagon:
.. tikz:: :libs: calc
\begin{tikzpicture}[scale=5,dot/.style = {fill,radius=0.02},
latpt/.style = {color=gray!50!white, fill},]
\coordinate (astar) at (1,0);
\coordinate (bstar) at (0.5,0.8660254037844386);
\clip ($-0.1*(bstar)$) rectangle ($3*(astar)+2.1*(bstar)$);
%
\coordinate (C1) at ($0.3333*(astar)+0.3333*(bstar)$);
\coordinate (C2) at ($-0.3333*(astar)+0.6667*(bstar)$);
\coordinate (C3) at ($-0.6667*(astar)+0.3333*(bstar)$);
\coordinate (C4) at ($-0.3333*(astar)-0.3333*(bstar)$);
\coordinate (C5) at ($0.3333*(astar)-0.6667*(bstar)$);
\coordinate (C6) at ($0.6667*(astar)-0.3333*(bstar)$);
%
\foreach \h in {-1,...,6}{
\foreach \k in {-1,...,3}{
\draw[latpt] ($\h*(astar) + \k*(bstar)$) circle[dot];
\draw[color=yellow!75!black,dotted] ($\h*(astar)+\k*(bstar)$) +(C1)
-- +(C2) -- +(C3) -- +(C4) -- +(C5) -- +(C6) -- cycle;
}}
%
\coordinate (G) at ($(astar)+(bstar)$);
\draw[color=yellow!75!black, line width=1mm] (G) +(C1) -- +(C2) -- +(C3) -- +(C4) -- +(C5) -- +(C6) -- cycle;
\end{tikzpicture}
Since all physical properties of a crystal must have the same periodicity as its lattice, the powerful feature of the first Brillouin zone is that it encompasses a region of reciprocal space which must fully represent all of reciprocal space.
Most crystals contain rotational or rotoinversion symmetries in addition to the translational ones which give rise to the first Brillouin zone. These symmetries are the pointgroup of the lattice and enforce that the properties of the crystal also have the same symmetry. The first Brillouin zone, therefore, typically contains redundant information.
An irreducible Brillouin zone is a subsection of the first Brillouin zone which contains the minimal part required to have only unique crystal properties. This class can find an irreducible Brillouin zone for any crystal lattice. In the example of the hexagonal lattice there are six equivalent irreducible Brillouin zones one of which is:
.. tikz:: :libs: calc
\begin{tikzpicture}[scale=5,dot/.style = {fill,radius=0.02},
latpt/.style = {color=gray!50!white, fill},]
\coordinate (astar) at (1,0);
\coordinate (bstar) at (0.5,0.8660254037844386);
\clip ($-0.1*(bstar)$) rectangle ($3*(astar)+2.1*(bstar)$);
%
\coordinate (C1) at ($0.3333*(astar)+0.3333*(bstar)$);
\coordinate (C2) at ($-0.3333*(astar)+0.6667*(bstar)$);
\coordinate (C3) at ($-0.6667*(astar)+0.3333*(bstar)$);
\coordinate (C4) at ($-0.3333*(astar)-0.3333*(bstar)$);
\coordinate (C5) at ($0.3333*(astar)-0.6667*(bstar)$);
\coordinate (C6) at ($0.6667*(astar)-0.3333*(bstar)$);
%
\foreach \h in {-1,...,6}{
\foreach \k in {-1,...,3}{
\draw[latpt] ($\h*(astar) + \k*(bstar)$) circle[dot];
\draw[color=yellow!75!black,dotted] ($\h*(astar)+\k*(bstar)$) +(C1)
-- +(C2) -- +(C3) -- +(C4) -- +(C5) -- +(C6) -- cycle;
}}
%
\coordinate (G) at ($(astar)+(bstar)$);
\draw[color=yellow!75!black,line width=1mm] (G) -- +(C4) -- +(C5) -- cycle;
\end{tikzpicture}
Parameters:
-
lattice(Lattice) –The reciprocal space lattice for which a Brillouin zone will be found
-
use_primitive(bool, default:True) –If the provided
brille._brille.Reciprocallattice is a conventional Bravais lattice, this parameter controls whether the equivalent primitive Bravais lattice should be used to find the first Brillouin zone. This isTrueby default and should only be modified for testing purposes. -
search_length(int, default:1) –The Wigner-Seitz construction of the first Brillouin zone finds the volume of space closer to a chosen reciprocal lattice point than any other reciprocal lattice point. This is accomplished by successively dividing the space by planes halfway between the chosen point and a subset of all other planes. The subset used is controlled by
search_lengthand is every unique \((\pm s_i\,0\,0)\), \((0\,\pm s_j\,0)\), \((0\,0\,\pm s_k)\), \((\pm s_i\,\pm s_j\,0)\), \((\pm s_i\,0\,\pm s_k)\), \((0\,\pm s_j\,\pm s_k)\), \((\pm s_i\,\pm s_j\,\pm s_k)\) for \(1 \le s_\alpha \le\)search_length. If the reciprocal lattice is primitive then the defaultsearch_lengthof1should always give the correct first Brillouin zone. For extra assurance that the correct first Brillouin zone is found, the procedure is internally repeated withsearch_lengthincremented by one and an error is raised if the two constructed polyhedra have different volumes. -
time_reversal_symmetry(bool, default:False) –Controls whether time reversal symmetry should be added to pointgroups lacking space inversion. This affects the found irreducible Brillouin zone for such systems. To avoid inadvertently adding time reversal symmetry when it is not appropriate, this is
Falseby default. Time reversal holds for non-magnetic systems. It is anti-unitary: phonon eigenvectors (RotatesLike.Gamma) at a time-reversed point \(-R\mathbf{q}\) are the complex conjugates of those at \(R\mathbf{q}\), so no inversion symmetry of the crystal is needed. -
wedge_search(bool, default:True) –Controls whether an irreducible Brillouin zone should be found. With this set to
Falsethe returnedbrille._brille.BrillouinZonewill only contain the first Brillouin zone. IfTruethe pointgroup symmetry operations will be used to identify an irreducible Brillouin zone as well. If the provided lattice's parameters do not match the symmetry of the pointgroup (e.g., a lattice which should be tetragonal like \(I4/mmm\) but constructed with \(\gamma=120^\circ\)) the algorithm will fail to find an appropriate irreducible Brillouin zone and an error will be raised. (Set toTrueby default). -
warn_near_symmetry(bool, default:True) –Keyword only. Whether to warn, with a
brille.NearSymmetryWarning, when the lattice is within 1e-4 of a lattice with more symmetry operations (e.g., rhombohedral but nearly cubic). Such a zone has faces or edges much smaller than itself, which make meshes slow and poorly shaped. The zone is not changed. (Set toTrueby default).
Methods:
-
from_file–Load an object from an HDF5 file
-
ir_moveinto–Find points equivalent to those provided within the irreducible Brillouin zone.
-
ir_moveinto_wedge–Find points equivalent to those provided within the irreducible wedge.
-
isinside–Determine whether each of the provided reciprocal lattice points is located
-
lattice_symmetry_counts–The number of symmetry operations of the lattice itself, exactly and nearly
-
moveinto–Find points equivalent to those provided within the first Brillouin zone.
-
to_file–Save the object to an HDF5 file
Attributes:
-
faces_per_vertex(list[list[int]]) –Return the first Brillouin zone face indices for each unique face corner
-
half_edge_points(ndarray[float64]) –Return the first Brillouin zone face edge centres in rlu
-
half_edge_points_invA(ndarray[float64]) –Return the first Brillouin zone face edge centres in inverse ångstrom
-
ir_faces_per_vertex(list[list[int]]) –Return the irreducible Brillouin zone face index per unique face corner
-
ir_normals(ndarray[float64]) –Return the irreducible Brillouin zone face normals in rlu
-
ir_normals_invA(ndarray[float64]) –Return the irreducible Brillouin zone face normals in inverse ångstrom
-
ir_normals_primitive(ndarray[float64]) –Return the irreducible Brillouin zone face normals in primitive-lattice rlu
-
ir_points(ndarray[float64]) –Return the irreducible Brillouin zone face centres in rlu
-
ir_points_invA(ndarray[float64]) –Return the irreducible Brillouin zone face centres in inverse ångstrom
-
ir_points_primitive(ndarray[float64]) –Return the irreducible Brillouin zone face centres in primitive-lattice rlu
-
ir_polyhedron(LPolyhedron) –Returns the irreducible Brillouin zone
brille._brille.Polyhedron -
ir_polyhedron_generated(LPolyhedron) –Returns the found irreducible Brillouin zone
brille._brille.Polyhedron -
ir_vertices(ndarray[float64]) –Return the irreducible Brillouin zone unique face corners in rlu
-
ir_vertices_invA(ndarray[float64]) –Return the irreducible Brillouin zone unique face corners in inverse ångstrom
-
ir_vertices_per_face(list[list[int]]) –Return the irreducible Brillouin zone unique face corners per face
-
ir_vertices_primitive(ndarray[float64]) –Return the irreducible Brillouin zone unique face corners in primitive-lattice rlu
-
lattice(Lattice) –Returns the defining
brille._brille.Latticelattice -
normals(ndarray[float64]) –Return the first Brillouin zone face normals in rlu
-
normals_invA(ndarray[float64]) –Return the first Brillouin zone face normals in inverse ångstrom
-
normals_primitive(ndarray[float64]) –Return the first Brillouin zone face normals in primitive-lattice rlu
-
points(ndarray[float64]) –Return the first Brillouin zone face centres in rlu
-
points_invA(ndarray[float64]) –Return the first Brillouin zone face centres in inverse ångstrom
-
points_primitive(ndarray[float64]) –Return the first Brillouin zone face centres in primitive-lattice rlu
-
polyhedron(LPolyhedron) –Returns the first Brillouin zone
brille._brille.Polyhedron -
vertices(ndarray[float64]) –Return the first Brillouin zone unique face corners in rlu
-
vertices_invA(ndarray[float64]) –Return the first Brillouin zone unique face corners in inverse ångstrom
-
vertices_per_face(list[list[int]]) –Return the first Brillouin zone face corner indices for each face
-
vertices_primitive(ndarray[float64]) –Return the first Brillouin zone unique face corners in primitive-lattice rlu
-
wedge_normals(ndarray[float64]) –Return the normals of the irreducible wedge rlu
-
wedge_normals_invA(ndarray[float64]) –Return the normals of the irreducible wedge inverse ångstrom
-
wedge_normals_primitive(ndarray[float64]) –Return the normals of the irreducible wedge primitive-lattice rlu
faces_per_vertex
property
¶
faces_per_vertex: list[list[int]]
Return the first Brillouin zone face indices for each unique face corner
half_edge_points
property
¶
half_edge_points: ndarray[float64]
Return the first Brillouin zone face edge centres in rlu
half_edge_points_invA
property
¶
half_edge_points_invA: ndarray[float64]
Return the first Brillouin zone face edge centres in inverse ångstrom
ir_faces_per_vertex
property
¶
ir_faces_per_vertex: list[list[int]]
Return the irreducible Brillouin zone face index per unique face corner
ir_normals
property
¶
ir_normals: ndarray[float64]
Return the irreducible Brillouin zone face normals in rlu
ir_normals_invA
property
¶
ir_normals_invA: ndarray[float64]
Return the irreducible Brillouin zone face normals in inverse ångstrom
ir_normals_primitive
property
¶
ir_normals_primitive: ndarray[float64]
Return the irreducible Brillouin zone face normals in primitive-lattice rlu
ir_points
property
¶
ir_points: ndarray[float64]
Return the irreducible Brillouin zone face centres in rlu
ir_points_invA
property
¶
ir_points_invA: ndarray[float64]
Return the irreducible Brillouin zone face centres in inverse ångstrom
ir_points_primitive
property
¶
ir_points_primitive: ndarray[float64]
Return the irreducible Brillouin zone face centres in primitive-lattice rlu
ir_polyhedron
property
¶
ir_polyhedron: LPolyhedron
Returns the irreducible Brillouin zone brille._brille.Polyhedron
Returns:
-
[`brille._brille.Polyhedron`][brille._brille.Polyhedron]–If no irreducible Brillouin zone was requested at construction, the returned polyhedron is that of the first Brillouin zone instead.
ir_polyhedron_generated
property
¶
ir_polyhedron_generated: LPolyhedron
Returns the found irreducible Brillouin zone brille._brille.Polyhedron
If the lattice pointgroup does not contain the space inversion operator the internally held 'irreducible' polyhedron is only half of the real irreducible polyhedron. This method gives access to the polyhedron found by the algorithm before being doubled for output.
ir_vertices
property
¶
ir_vertices: ndarray[float64]
Return the irreducible Brillouin zone unique face corners in rlu
ir_vertices_invA
property
¶
ir_vertices_invA: ndarray[float64]
Return the irreducible Brillouin zone unique face corners in inverse ångstrom
ir_vertices_per_face
property
¶
ir_vertices_per_face: list[list[int]]
Return the irreducible Brillouin zone unique face corners per face
ir_vertices_primitive
property
¶
ir_vertices_primitive: ndarray[float64]
Return the irreducible Brillouin zone unique face corners in primitive-lattice rlu
normals_invA
property
¶
normals_invA: ndarray[float64]
Return the first Brillouin zone face normals in inverse ångstrom
normals_primitive
property
¶
normals_primitive: ndarray[float64]
Return the first Brillouin zone face normals in primitive-lattice rlu
points_invA
property
¶
points_invA: ndarray[float64]
Return the first Brillouin zone face centres in inverse ångstrom
points_primitive
property
¶
points_primitive: ndarray[float64]
Return the first Brillouin zone face centres in primitive-lattice rlu
polyhedron
property
¶
polyhedron: LPolyhedron
Returns the first Brillouin zone brille._brille.Polyhedron
vertices
property
¶
vertices: ndarray[float64]
Return the first Brillouin zone unique face corners in rlu
vertices_invA
property
¶
vertices_invA: ndarray[float64]
Return the first Brillouin zone unique face corners in inverse ångstrom
vertices_per_face
property
¶
vertices_per_face: list[list[int]]
Return the first Brillouin zone face corner indices for each face
vertices_primitive
property
¶
vertices_primitive: ndarray[float64]
Return the first Brillouin zone unique face corners in primitive-lattice rlu
wedge_normals
property
¶
wedge_normals: ndarray[float64]
Return the normals of the irreducible wedge rlu
wedge_normals_invA
property
¶
wedge_normals_invA: ndarray[float64]
Return the normals of the irreducible wedge inverse ångstrom
wedge_normals_primitive
property
¶
wedge_normals_primitive: ndarray[float64]
Return the normals of the irreducible wedge primitive-lattice rlu
from_file
staticmethod
¶
from_file(filename: str, entry: str = 'BrillouinZone') -> BrillouinZone
ir_moveinto
¶
ir_moveinto(Q: ndarray[float64], threads: int = 0) -> tuple
Find points equivalent to those provided within the irreducible Brillouin zone.
The BrillouinZone object defines a volume of reciprocal space which contains an irreducible part of the full reciprocal-space. This method will find points equivalent under the operations of the lattice which fall within this irreducible volume.
Parameters:
-
Q([`numpy.ndarray`][numpy.ndarray]) –A 2 dimensional array of three-vectors (
Q.shape[1]==3) expressed in units of the reciprocal lattice. -
threads(integer, default:0) –The number of parallel threads that should be used. If this value is less than one, the
BRILLE_NUM_THREADSenvironment variable sets the number, or one thread per logical core is used if it is not set.
Returns:
-
Qir([`numpy.ndarray`][numpy.ndarray]) –The array of equivalent irreducible \(\mathbf{q}_\text{ir}\) points for all \(\mathbf{Q}\);
-
tau([`numpy.ndarray`][numpy.ndarray]) –the closest reciprocal lattice vector, \(\boldsymbol{\tau}\), to each \(\mathbf{Q}\);
-
R([`numpy.ndarray`][numpy.ndarray]) –the pointgroup symmetry operation \(R\)
-
Rinv([`numpy.ndarray`][numpy.ndarray]) –the inverse point group symmetry operation which obey \(\mathbf{Q} = R^{-1} \mathbf{q}_\text{ir} + \boldsymbol{\tau}\).
ir_moveinto_wedge
¶
ir_moveinto_wedge(Q: ndarray[float64], threads: int = 0) -> tuple
Find points equivalent to those provided within the irreducible wedge.
The BrillouinZone object defines a wedge of reciprocal space which contains an irreducible part of the full-space 4π steradian solid angle. This method will find points equivalent under the pointgroup operations of the lattice which fall within this irreducible solid angle and maintain their absolute magnitude.
Parameters:
-
Q([`numpy.ndarray`][numpy.ndarray]) –A 2 dimensional array of three-vectors (
Q.shape[1]==3) expressed in units of the reciprocal lattice. -
threads(integer, optional (default 0), default:0) –The number of parallel threads that should be used. If this value is less than one, the
BRILLE_NUM_THREADSenvironment variable sets the number, or one thread per logical core is used if it is not set.
Returns:
-
[`numpy.ndarray`][numpy.ndarray], [`numpy.ndarray`][numpy.ndarray]–The array of equivalent in-wedge \(\mathbf{Q}_\text{ir}\) points for all \(\mathbf{Q}\), and the pointgroup operation fulfilling \(\mathbf{Q}_\text{ir} = R \mathbf{Q}\).
isinside
¶
isinside(points: ndarray[float64]) -> list[bool]
Determine whether each of the provided reciprocal lattice points is located within the first Brillouin zone
Parameters:
-
points([`numpy.ndarray`][numpy.ndarray]) –A 2 dimensional array of three-vectors (
points.shape[1]==3) expressed in units of the reciprocal lattice.
Returns:
-
[`numpy.ndarray`][numpy.ndarray]–One dimensional logical array with
Trueindicating 'inside'
lattice_symmetry_counts
¶
lattice_symmetry_counts(exact: float = 1e-10, near: float = 0.0001) -> tuple[int, int]
The number of symmetry operations of the lattice itself, exactly and nearly
Counts the lattice's own symmetries (its holohedry, not the crystal's
symmetry) within exact and within near, relative to the lattice metric.
Returns:
moveinto
¶
moveinto(Q: ndarray[float64], threads: int = 0) -> tuple
Find points equivalent to those provided within the first Brillouin zone.
Parameters:
-
Q([`numpy.ndarray`][numpy.ndarray]) –A 2 dimensional array of three-vectors (
Q.shape[1]==3) expressed in units of the reciprocal lattice. -
threads(integer, default:0) –The number of parallel threads that should be used. If this value is less than one, the
BRILLE_NUM_THREADSenvironment variable sets the number, or one thread per logical core is used if it is not set.
Returns:
-
[`numpy.ndarray`][numpy.ndarray], [`numpy.ndarray`][numpy.ndarray]–The floating point array of equivalent reduced \(\mathbf{q}\) points for all \(\mathbf{Q}\), and an integer array filled with \(\boldsymbol{\tau} = \mathbf{Q}-\mathbf{q}\).
to_file
¶
to_file(filename: str, entry: str = 'BrillouinZone', flags: str = 'ac') -> bool
Save the object to an HDF5 file
Parameters:
-
filename(str) –The full path specification for the file to write into
-
entry(str, default:'BrillouinZone') –The group path, e.g., "my/cool/bz", where to write inside the file, with a default equal to BrillouinZone name
-
flags(str, default:'ac') –The HDF5 permissions to use when opening the file. Default 'a' writes to an existing file -- if
entryexists in the file it is overwritten.
Note
Possible flags are:
flags |
meaning | HDF equivalent |
|---|---|---|
| 'r' | read | H5F_ACC_RDONLY |
| 'x' | write, error if exists | H5F_ACC_EXCL |
| 'a' | write, append to file | H5F_ACC_RDWR |
| 'c' | write, error if exists | H5F_ACC_CREAT |
| 't' | write, replace existing | H5F_ACC_TRUNC |
Returns:
-
bool–Indication of writing success.
NearSymmetryWarning
¶
Bases: UserWarning
The lattice is close to one with more symmetry, so its Brillouin zone has features much smaller than itself.
Polyhedron
¶
Polyhedron(vertices: ndarray[float64])
Polyhedron(vertices: ndarray[float64], faces: list[list[int]])
Polyhedron(vertices: ndarray[float64])