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 StaticArraysCore.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)
Pᴳ = deepcopy(Pᴳ)
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)"))