Class BrillouinZone¶
Defined in File bz.hpp
Class Documentation¶
-
class
brille::BrillouinZone¶ An object to hold information about the first Brillouin zone of a Reciprocal lattice.
The BrillouinZone object is created from a Reciprocal lattice and if that lattice is not a primitive type the object contains the primitive lattice as well. By looking for intersections between three (primitive) reciprocal planes, the class object identifies the minimal subset of vertices that define the first Brillouin zone as well as keeping track of the planes which contributed to each vertex and the plane reciprocal vectors themselves.
Public Functions
-
BrillouinZone(const Reciprocal &lat, const bool toprim = true, const int extent = 1, const bool tr = false, const bool wedge_search = true)¶ - Parameters
lat: A Reciprocal latticetoprim: A flag to indicate if the primtive lattice should be usedextent: An integer to control how-far the vertex-finding algorithm should search in τ-index. The default indicates that (̄1̄1̄1), (̄1̄10), (̄1̄11), (̄10̄1), …, (111) are included.
-
void
check_if_mirroring_needed(void)¶
-
bool
check_ir_polyhedron(void)¶
-
bool
wedge_explicit(void)¶
-
const Reciprocal
get_lattice() const¶ Returns the lattice passed in at construction.
-
const Reciprocal
get_primitive_lattice() const¶ Returns the lattice actually used to find the Brillouin zone vertices, which may be a primitive lattice depending on the flag at creation
-
size_t
vertices_count() const¶ Returns the number of vertices defining the first Brillouin zone.
-
size_t
faces_count() const¶ Returns the number of reciprocal lattice points defining the first Brillouin zone.
-
template<typename ...
A>
voidset_polyhedron(const LQVec<double> &v, const LQVec<double> &p, A... args)¶ Set the first Brillouin zone polyhedron from its vertices, central facet plane points, and either the three intersecting planes which gave each vertex or all intersecting planes which give each vertex as well as all vertices which form a corner of each facet plane polygon.
- Parameters
vertices: All vertices in the polyhedronpoints: All (τ/2) plane points which define the facets of the polyhedron[optional]: fpv A std::vector<std::vector<int>> with all facet-plane indices for each vertex[optional]: vpf A std::vector<std::vector<int>> with all vertex indices for each facet-plane
-
template<typename ...
A>
voidset_ir_polyhedron(const LQVec<double> &v, const LQVec<double> &p, const LQVec<double> &n, A... args)¶ Set the irreducible first Brillouin zone polyhedron from its vertices, facet plane points, facet plane normals, and, optionally, all intersecting planes which give each vertex as well as all vertices which form a corner of each facet plane polygon.
- Parameters
vertices: All vertices in the polyhedronpoints: A point on each of the planes which define the facets of the polyhedronnormals: The normal direction which, along with the on-plane-point, defines each facet plane[optional]: fpv A std::vector<std::vector<int>> with all facet-plane indices for each vertex[optional]: vpf A std::vector<std::vector<int>> with all vertex indices for each facet-plane
-
bool
set_ir_vertices(const LQVec<double> &v)¶ Set the irreducible first Brillouin zone polyhedron from its vertices. Since no facet information is provided via this method, a convex hull of the provided points is calculated and used as the irreducible polyhedron. Additionally the volume and symmetry of the calculated polyhedron is checked against the first Brillouin zone using the pointgroup symmetry operations.
- Return
A bool indicating if the found convex hull polyhedron is the expected volume and has the expected symmetry.
- Parameters
vertices: All vertices in the irreducible polyhedron
-
Polyhedron
get_polyhedron(void) const¶ Returns the first Brillouin zone polyhedron.
-
LQVec<double>
get_vertices(void) const¶ Returns the vertices of the first Brillouin zone polyhedron expressed as conventional unit cell vectors.
-
LQVec<double>
get_points(void) const¶ Returns the on-plane points (τ/2) of the first Brillouin zone polyhedron expressed as conventional unit cell vectors.
-
LQVec<double>
get_normals(void) const¶ Returns the normals ( ̂τ ) of the first Brillouin zone polyhedron expressed as conventional unit cell vectors.
-
LQVec<double>
get_half_edges(void) const¶ Returns the half-edge points of the first Brillouin zone polyhedron expressed as conventional unit cell vectors.
-
LQVec<double>
get_primitive_vertices(void) const¶ Returns the vertices of the first Brillouin zone polyhedron expressed as primitive unit cell vectors.
-
LQVec<double>
get_primitive_points(void) const¶ Returns the on-plane points (τ/2) of the first Brillouin zone polyhedron expressed as primitive unit cell vectors.
-
LQVec<double>
get_primitive_normals(void) const¶ Returns the normals ( ̂τ ) of the first Brillouin zone polyhedron expressed as primitive unit cell vectors.
-
std::vector<std::vector<int>>
get_faces_per_vertex(void) const¶ Returns the
pointsandnormalsindices for each vertex of the first Brillouin zone polyhedron.
-
std::vector<std::vector<int>>
get_vertices_per_face(void) const¶ Returns the vertex indices for each facet of the first Brillouin zone polyhedron.
-
Polyhedron
get_ir_polyhedron(const bool true_ir = true) const¶ Returns the irreducible first Brillouin zone polyhedron.
-
LQVec<double>
get_ir_vertices(void) const¶ Returns the vertices of the irreducible first Brillouin zone polyhedron expressed as conventional unit cell vectors.
-
LQVec<double>
get_ir_points(void) const¶ Returns the on-plane points of the irreducible first Brillouin zone polyhedron expressed as conventional unit cell vectors.
-
LQVec<double>
get_ir_normals(void) const¶ Returns the normals of the irreducible first Brillouin zone polyhedron expressed as conventional unit cell vectors.
-
LQVec<double>
get_ir_primitive_vertices(void) const¶ Returns the vertices of the irreducible first Brillouin zone polyhedron expressed as primitive unit cell vectors.
-
LQVec<double>
get_ir_primitive_points(void) const¶ Returns the on-plane points of the irreducible first Brillouin zone polyhedron expressed as primitive unit cell vectors.
-
LQVec<double>
get_ir_primitive_normals(void) const¶ Returns the normals of the irreducible first Brillouin zone polyhedron expressed as primitive unit cell vectors.
-
std::vector<std::vector<int>>
get_ir_faces_per_vertex(void) const¶ Returns the
pointsandnormalsindices for each vertex of the irreducible first Brillouin zone polyhedron.
-
std::vector<std::vector<int>>
get_ir_vertices_per_face(void) const¶ Returns the vertex indices for each facet of the irreducible first Brillouin zone polyhedron.
-
void
print() const¶ Print a representation of the object to std::cout.
-
void
wedge_search(const bool prefer_basis_vectors = true, const bool parallel_ok = true)¶ Using the pointgroup symmetry opperations of the conventional unit cell, this method defines an irreducible section of reciprocal space. The irreducible section bounds a solid angle N and consequently the full reciprocal space is 4π/N larger than the irreducible wedge. As the selected irreducible section is related by symmetry to the rest of reciprocal space there are (at least) 4π/N - 1 equivalent other choices for the irreducible wedge.
-
bool
wedge_brute_force(bool special_2_folds = true, bool special_mirrors = true, bool sort_by_length = true, bool sort_one_sym = true)¶
-
void
wedge_triclinic(void)¶
-
void
irreducible_vertex_search()¶ With the first Brillouin zone and an irreducible section of reciprocal space already identified, this method finds all intersections of combinations of three planes (nBz,nIr) = {(0,3), (1,2), (2,1), and (3,0)} where nBz are the number of intersecting first Brillouin zone facet planes and nIr are the number of intersecting irreducible reciprocal space wedge planes. Once all combinations of intersection points are found, those within the first Brillouin zone and the irreducible reciprocal space wedge define the irreducible first Brillouin zone.
- Note
the (3,0) intersection points are the first Brillouin zone vertices and the (0,3) intersection points are all identically ⃗0.
-
void
voro_search(const int extent = 1)¶ Search for the vertices defining the first Brillouin zone.
Search through all combinations of three planes from
extent*(̄1̄1̄1) toextent*(111) for three-plane intersection points, these are all the vertices of a Brillouin zone. Sort through the intersection points to find the subset that are closer to the origin than any of the non-intersection-defining planes, these are vertices of the first Brillouin zone but may not be unique. So determine a unique subset and record their locations, contributing intersecting-planes, and all planes which contribute to one or more vertex in the object.
-
bool
isprimitive(void) const¶ Return true if the lattice used to find the vertices is not the same as the one passed at construction, and is therefore primitive.
-
template<class
T>
std::vector<bool>isinside(const LQVec<T> &p) const¶ Determine whether points are inside of the first Brillouin zone.
- Return
A std::vector<bool> with each element indicating if the associated Q point is inside of the Brillouin zone.
- Parameters
p: A reference to a LQVec list of Q points to be checked
-
template<class
T>
std::vector<bool>isinside_wedge(const LQVec<T> &p, const bool constructing = false) const¶ Determine whither points are inside the irreducible reciprocal space wedge.
- Return
An std::vector<bool> with each element indicating if the associated Q point is inside our irreducible reciprocal space.
- Parameters
p: A reference to a LQVec list of Q points to be checked
-
bool
moveinto(const LQVec<double> &Q, LQVec<double> &q, LQVec<int> &tau, const int threads = 0) const¶ Find q and τ such that Q=q+τ and τ is a reciprocal lattice vector.
- Parameters
[in] Q: A reference to LQVec list of Q points[out] q: The reduced reciprocal lattice vectors[out] tau: The reciprocal lattice zone centres
-
bool
ir_moveinto(const LQVec<double> &Q, LQVec<double> &q, LQVec<int> &tau, std::vector<size_t> &Ridx, std::vector<size_t> &invRidx, const int threads = 0) const¶ Find q, τ, and R∈G such that Q = Rᵀq + τ, where τ is a reciprocal lattice vector and R is a pointgroup symmetry operation of the conventional unit cell pointgroup, G.
- Note
R and invR index the PointSymmetry object accessible via BrillouinZone::get_pointgroup_symmetry();
- Parameters
[in] Q: a refernce to a LQVec list of Q points[out] q: The irreducible reduced reciprocal lattice vectors[out] τ: The conventional reciprocal lattice zone centres[out] R: The pointgroup operation index for R[out] invR: The pointgroup operation index for R⁻¹[in] nthreads: An optional number of OpenMP threads to use
-
bool
ir_moveinto_wedge(const LQVec<double> &Q, LQVec<double> &q, std::vector<std::array<int, 9>> &R, const int threads = 0) const¶ Find q and R∈G such that Q = Rᵀq such that q ∈ the irreducible wedge.
-
PointSymmetry
get_pointgroup_symmetry() const¶ Get the PointSymmetry object used by this BrillouinZone object internally.
-
int
add_time_reversal() const¶ Accessor for whether the BrillouinZone was constructed with additional time reversal symmetry.
-