Class BrillouinZone

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 lattice

  • toprim: A flag to indicate if the primtive lattice should be used

  • extent: 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.

void set_ir_wedge_normals(const LQVec<double> &x)
LQVec<double> get_ir_wedge_normals() const
LQVec<double> get_primitive_ir_wedge_normals() const
template<typename ...A>
void set_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 polyhedron

  • points: 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>
void set_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 polyhedron

  • points: A point on each of the planes which define the facets of the polyhedron

  • normals: 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 points and normals indices 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 points and normals indices 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) to extent*(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.