# 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′ (reduced)"))