# Getting started

This tutorial will help you get started with `Peacock.jl`

for the first time.

We will install `Peacock.jl`

, and then use it to study an example photonic crystal from a book (Joannopoulos *et al* 2008) by plotting the band structure and visualising the modes of the crystal.

## Installation

Before using `Peacock.jl`

for the first time, you should install it using the built-in Julia package manager.

```
using Pkg
Pkg.add("Peacock")
```

After installation, the `Peacock.jl`

can be loaded in Julia.

`using Peacock`

For this tutorial, we'll also install and load `PyPlot`

to control our figures.

```
using Pkg
Pkg.add("PyPlot")
using PyPlot
```

## Defining the photonic crystal

In this section we will create a `Geometry`

that holds the shape, size, and materials of the crystal.

The crystal we will reproduce in this tutorial is taken from chapter 5 of Joannopoulos *et al* 2008. It consists of dielectric cylinders ($\epsilon_\mathrm{cyl}=8.9, \mu_\mathrm{cyl}=1$) in air ($\epsilon_\mathrm{air}=1, \mu_\mathrm{air}=1$). The cylinders are arranged on a square lattice with separation $a$, and each cylinder has a radius of $r=a/5$.

First, let's define the functions `epf(x,y)`

and `muf(x,y)`

, which return the permittivity and permeability of the unit cell at $(x,y)$, where $(0,0)$ is the center of the unit cell. We will work in units of length where the separation between cylinders is unity, $a=1$, such the radius of each cylinder is `0.2`

.

```
# Permittivity
function epf(x,y)
# equation of a circle with radius 0.2a
if x^2+y^2 <= 0.2^2
# dielectric inside the circle
return 8.9
else
# air outside the circle
return 1
end
end
# Permeability is unity everywhere
function muf(x,y)
return 1
end
```

Now we declare the lattice parameters. The cylinders are on a square lattice, so our lattice vectors are orthogonal and of equal length `a`

.

```
a1 = [1, 0] # first lattice vector
a2 = [0, 1] # second lattice vector
```

We must also give the resolution at which the geometry should be generated at.

```
d1 = 0.01 # resolution along first lattice vector
d2 = 0.01 # resolution along second lattice vector
```

A smaller value of `d1`

or `d1`

will result in a higher resolution grid.

Finally, we are ready to construct and visualise our `Geometry`

.

```
geometry = Geometry(epf, muf, a1, a2, d1, d2)
plot(geometry)
```

## Setting up the solver

In this section we will create a `Solver`

that approximates the geometry using a truncated Plane Wave Expansion (see further reading). The number of plane waves is determined by the cutoff. Increasing the cutoff will increase the accuracy of the solution, but low-contrast photonic crystals can be well approximated with a relatively small basis of plane waves.

```
fourier_space_cutoff = 7
solver = Solver(geometry, fourier_space_cutoff)
```

Plotting the `Solver`

lets you visualise how the `Geometry`

has been approximated.

`plot(solver)`

## Plotting the band structure

When light passes through a photonic crystal, the frequency of the wave, $\omega$, is related to its momentum, $\vec{k}$. It is common to plot the frequencies as a function of momentum, $\omega(\vec{k})$, to produce a "band diagram" (see Joannopolous *et al* 2008).

First, we must define the corners of a path through the Brillouin zone. We can use `BrillouinZoneCoordinate`

to attach a label to our coordinates, so that our band diagram plots nicely.

```
G = BrillouinZoneCoordinate( 0, 0, "Γ")
X = BrillouinZoneCoordinate(1/2, 0, "X")
M = BrillouinZoneCoordinate(1/2, 1/2, "M")
ks = [G,X,M,G]
```

Now we can call `plot_band_diagram(solvers, ks, polarisation)`

to produce our diagram. If we provide the `dk`

keyword argument, the path will be sampled so that the spacing between $k$-points is `dk`

or smaller. The crystal behaves differently depending on the polarisation of light, so we plot the transverse electric (TE) polarised bands in red and the transverse magnetic (TM) polarised bands in blue.

```
figure(figsize=(4,3))
plot_band_diagram(solver, ks, TE, color="red",
bands=1:4, dk=0.1, frequency_scale=1/2pi)
plot_band_diagram(solver, ks, TM, color="blue",
bands=1:4, dk=0.1, frequency_scale=1/2pi)
ylim(0,0.8)
```

This reproduces figure 2 of chapter 5 of Joannopoulos *et al* 2008.

## Plotting a mode

Often it is useful to visualise the electric and magnetic fields in the crystal. Here we show how to solve and plot the modes of a photonic crystal at a particular $k$-point.

First, we call `solve`

, which returns an array of `Mode`

s.

`modes = solve(solver, X, TM)`

A `Mode`

can be visualised using `plot(mode)`

. By default the full Bloch wave is plotted - set `bloch_phase=false`

to plot the cell-periodic part of Bloch mode.

```
plot(modes[2], bloch_phase=true)
plot(modes[2], bloch_phase=false)
```

The out of plane field component is plotted - for TE and TM polarisations this will be the magnetic and electric fields, respectively. The titles of the figures are set automatically using the `label`

of the `Mode`

.

This reproduces figure 3 of chapter 5 of Joannopoulos *et al* 2008. Note that `Peacock.jl`

doesn't fix the phase of the solutions and your results may differ by a random phase.

## Further reading

Plane Wave Expansion Method

- Rumpf, Raymond. "Design and optimization of nano-optical elements by coupling fabrication to optical behavior." (2006)
- Rumpf, Raymond. "Computational Electromagnetics lecture course." Available online.

Photonic crystals

- Joannopoulos, John D.,
*et al*. "Photonic crystals: molding the flow of light. 2008."*Princeton Univ Press*. Available online.