Polarization conversion#

Simulation of conversion efficiency of a geometric metasurface.

import matplotlib.pyplot as plt
import numpy as np

import nannos as nn

The unit cell is a rectangular Si structure on a SiO2 substrate as in [Yoon2021]. Circularly-polarized light of wavelength 635 nm is normally incident from the substrate to the structure

wl = 635  # wavelength
P = 350  # period
W = 100  # pillar width along x
L = 190  # pillar length along y
eps_Si = (3.87 + 0.02j) ** 2
eps_SiO2 = 1.4573**2
nh = 100

Define a function to initialize simulation

def simu(H, psi):
    lattice = nn.Lattice([[P, 0], [0, P]], discretization=2**9)
    sup = lattice.Layer("Superstrate", epsilon=eps_SiO2)
    sub = lattice.Layer("Substrate", epsilon=1)
    epsilon = lattice.ones()
    metaatom = lattice.rectangle((0.5 * P, 0.5 * P), (W, L))
    epsilon[metaatom] = eps_Si
    ms = lattice.Layer("Metasurface", thickness=H, epsilon=epsilon)
    pw = nn.PlaneWave(wavelength=wl, angles=(0, 0, psi))
    return nn.Simulation([sup, ms, sub], pw, nh=nh)

Since the layer eigenmodes do not change with thickness we compute them only once for the first iteration.

nb_thick = 100
thicknesses = np.linspace(200, 500, nb_thick)
conv_effs = np.zeros(nb_thick)

for ih, H in enumerate(thicknesses):
    # x-polarization
    if ih == 0:
        simx = simu(H, 0)
    else:
        simx.layers[1].thickness = H
        simx.reset("S")
    rxi, txi = simx.diffraction_efficiencies(orders=True, complex=True)
    txx = simx.get_order(txi[0], (0, 0))

    # y-polarization
    if ih == 0:
        simy = simu(H, 90)
    else:
        simy.layers[1].thickness = H
        # print(self.is_solved)
        simy.reset("S")
    ryi, tyi = simy.diffraction_efficiencies(orders=True, complex=True)
    tyy = simy.get_order(tyi[1], (0, 0))

    conv_effs[ih] = np.abs((tyy - txx) / 2) ** 2

Plot the efficiency

plot conversion eff

Plot the unit cell

p = simx.plot_structure()
p.show_axes()
p.show()
plot conversion eff
/builds/nannos/nannos.gitlab.io/nannos/nannos/plot.py:137: PyVistaFutureWarning: The default value of `algorithm` for the filter
`ImageData.extract_surface` will change in the future. It currently defaults to
`'dataset_surface'`, but will change to `None`. Explicitly set the `algorithm` keyword to
silence this warning.
  mesh = grid.extract_surface()
/builds/nannos/nannos.gitlab.io/nannos/nannos/plot.py:138: PyVistaDeprecationWarning: The default value of `inplace` for the filter `PolyData.transform` will change in the future. Previously it defaulted to `True`, but will change to `False`. Explicitly set `inplace` to `True` or `False` to silence this warning.
  mesh = mesh.transform(transform_matrix)
/builds/nannos/nannos.gitlab.io/nannos/nannos/plot.py:170: PyVistaDeprecationWarning: The default value of `inplace` for the filter `UnstructuredGrid.transform` will change in the future. Previously it defaulted to `True`, but will change to `False`. Explicitly set `inplace` to `True` or `False` to silence this warning.
  threshed = threshed.transform(transform_matrix)

Total running time of the script: (0 minutes 33.937 seconds)

Estimated memory usage: 844 MB

Gallery generated by Sphinx-Gallery