-
Notifications
You must be signed in to change notification settings - Fork 5
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.
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
λ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(λ, θ)
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]
λ0 = 12000.0
sol = tmm_optics(beam, layers; λ0=λ0, pbgflag=true)
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()
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()
The refractive index profile
plot(RIprofile(), sol)
gui()
And the photonic dispersion
plot(PBGDispersion2Dalt(), sol.Bloch)
gui()