Wigner–Seitz cells

Unit cells

The Wigner–Seitz cell associated with an arbitrary lattice basis can be generated via wignerseitz. For example, to generate the unit cell of a (primitive) lattice with Bravais type cF, we might write:

using Brillouin

Rs = [[0.0, 0.5, 0.5], [0.5, 0.0, 0.5], [0.5, 0.5, 0.0]]
cᴿ = wignerseitz(Rs)
Cell{3} (12 faces, 14 vertices):
  verts: [0.25, -0.75, 0.25]
         [-0.5, -0.5, 0.5]
         [-0.75, 0.25, 0.25]
         [0.75, -0.25, -0.25]
         [-0.25, -0.25, -0.25]
         [0.25, 0.25, -0.75]
         [-0.5, 0.5, -0.5]
         [0.5, -0.5, -0.5]
         [-0.25, -0.25, 0.75]
         [0.5, -0.5, 0.5]
         [-0.25, 0.75, -0.25]
         [0.25, 0.25, 0.25]
         [0.5, 0.5, -0.5]
         [-0.5, 0.5, 0.5]
  faces: [3, 7, 5, 2]
         [6, 8, 5, 7]
         [7, 3, 14, 11]
         [11, 13, 6, 7]
         [14, 3, 2, 9]
         [1, 2, 5, 8]
         [1, 10, 9, 2]
         [13, 11, 14, 12]
         [14, 9, 10, 12]
         [4, 8, 6, 13]
         [4, 10, 1, 8]
         [13, 12, 10, 4]
  basis: [0.0, 0.5, 0.5]
         [0.5, 0.0, 0.5]
         [0.5, 0.5, 0.0]

Note that the coordinates of the Wigner-Seitz cell vertices are referred to the basis Rs; to convert to Cartesian space, see cartesianize and cartesianize! (in-place).

We can plot the generated cells using e.g. PlotlyJS.jl via plot(cᴿ) (or, alternatively, via a 3D-capable backend of Makie.jl):

using PlotlyJS
Pᴿ = plot(cᴿ)

Brillouin zones

To generate Brillouin zones, we simply give the corresponding reciprocal lattice Gs:

Gs = 2π.*[[-1.0, 1.0, 1.0], [1.0, -1.0, 1.0], [1.0, 1.0, -1.0]] # reciprocal basis of `Rs`
cᴳ = wignerseitz(Gs)
Pᴳ = plot(cᴳ)

Two dimensions

wignerseitz and plot(::Cell) works in two dimensions as well. As an example, we can illustrate the Wigner–Seitz unit cell of graphene (which has a hexagonal "hp" Bravais type):

using Brillouin, PlotlyJS

Rs = [[1.0, 0.0], [-0.5, √3/2]]
cᴿ = wignerseitz(Rs)
Pᴿ = plot(cᴿ)

and its associated Brillouin zone:

Gs = 2π.*[[1.0, 1/√3], [0.0, 2/√3]]
cᴳ = wignerseitz(Gs)
Pᴳ = plot(cᴳ)

Reducing points to the interior of Wigner-Seitz cell

Points can be reduced to their equivalent image in the Wigner-Seitz cell via reduce_to_wignerseitz. The resulting point has the least possible norm of all equivalent images.

As an example, consider the reduction of a point v initially outside the 2D Brillouin zone defined earlier:

v = [0.8, 0.2]
v′ = reduce_to_wignerseitz(v, Gs)
2-element StaticArrays.SVector{2, Float64} with indices SOneTo(2):
 -0.19999999999999996
  0.19999999999999996

We can visualize the reduction by adding the points to the previous plot of the Brillouin zone:

vᶜ = cartesianize(v, Gs)
v′ᶜ = cartesianize(v′, Gs)

addtraces!(Pᴳ, scatter(x=vᶜ[1:1],  y=vᶜ[2:2],  hovertext="v (unreduced)"))
addtraces!(Pᴳ, scatter(x=v′ᶜ[1:1], y=v′ᶜ[2:2], hovertext="v′ (reduced)"))