Skip to content

Example: Omnidirectional mirror

Leandro Acquaroli edited this page Nov 27, 2019 · 3 revisions

We explore a design of multilayer stack that permits omnidirectional reflectivity for all polarisations of incident light over a wide selectable range of frequencies was used in fabricating an all-dielectric omnidirectional reflector. This example was taken from Science 282, 1679 (1998).

The complete code can be found here.

Load modules

using Plots, LaTeXStrings
pyplot()
using ThinFilmsTools

We define a function for the index of refraction of the substrate, taking the data from here. It may differ from that of the article.

function nacl(x::Float64)
    x /= 1000.0
    n = sqrt(complex(1.0 + 0.00055+0.19800/(1.0 - (0.050/x)^2) + 0.48398/(1.0 - (0.100/x)^2) + 0.38696/(1.0 - (0.128/x)^2) + 0.25998/(1.0 - (0.158/x)^2) + 0.08796/(1.0 - (40.50/x)^2) + 3.17064/(1.0 - (60.98/x)^2) + 0.30038/(1.0 - (120.34/x)^2)))
    return n
end

Define beam

λi = 4900 # intial wavelength [nm]
λf = 25000 # final wavelength [nm]
λ = LinRange(λi, λf, 2000) # wavelength range [nm]
θi = 0
θf = 80
θ = LinRange(θi, θf, θf-θi+1) # angle of incidence [degrees]
beam = PlaneWave(λ, θ)

Build up layers

l0 = LayerTMMO(RIdb.air(beam.λ))
l1 = LayerTMMO(RIdb.dummy(beam.λ, 4.6, 0.); d=800.)
l2 = LayerTMMO(RIdb.dummy(beam.λ, 1.6, 0.); d=1650.)
l3 = LayerTMMO(nacl.(beam.λ)) # Notice the "." in nacl to use the array input
layers = [l0, l1, l2, l1, l2, l1, l2, l1, l2, l1, l3]

Reference wavelength

λ0 = 12000.0

Solve

sol = tmm_optics(beam, layers; λ0=λ0, pbgflag=true)

Optional examples to plot results

Let's first plot the spectra for 0, 45 and 80 degrees:

t45 = Utils.find_closest(sol.beam.θ, 45.0)
t80 = Utils.find_closest(sol.beam.θ, 80.0)

p1 = plot(Spectrum1D(),
          sol.Beam.λ, [sol.Spectra.Rp[:,1,:], sol.Spectra.Rs[:,1,:]],
          label=["p-wave" "s-wave"], yaxis=("Reflectance", (0., 1.)),
          xlims=(sol.beam.λ[1], sol.beam.λ[end]),
          title=(L"$\theta$ = 0 [$\degree$]"));
p2 = plot(Spectrum1D(),
          sol.beam.λ, [sol.Spectra.Rp[:,t45,:], sol.Spectra.Rs[:,t45,:]],
          label=["p-wave" "s-wave"], yaxis=("Reflectance", (0., 1.)),
          xlims=(sol.beam.λ[1], sol.beam.λ[end]),
          title=(L"$\theta$ = 45 [$\degree$]"));
p3 = plot(Spectrum1D(),
          sol.Beam.λ, [sol.Spectra.Rp[:,t80,:], sol.Spectra.Rs[:,t80,:]],
          label=["p-wave" "s-wave"], yaxis=("Reflectance", (0., 1.)),
          xlims=(sol.beam.λ[1], sol.beam.λ[end]),
          title=(L"$\theta$ = 80 [$\degree$]"));
plot(p1, p2, p3, layout=(3,1))
gui()

Example 7: OM

And now let's plot the reflectance for both polarization on the entire range of angles:

plot(Spectrum2D(),
     sol.beam.λ, sol.beam.θ, sol.Spectra.Rp,
     title=("p-wave Reflectance"))
gui()
plot(Spectrum2D(),
     sol.beam.λ, sol.beam.θ, sol.Spectra.Rs,
     title=("s-wave Reflectance"))
gui()

Example 7: OM

Example 7: OM

The refractive index profile

plot(RIprofile(), sol)
gui()

Example 7: OM

And the photonic dispersion

plot(PBGDispersion2Dalt(), sol.Bloch)
gui()

Example 7: OM

Clone this wiki locally