multilayer_efficiency#

optika.materials.multilayer_efficiency(wavelength, direction=1, n=1, layers=None, substrate=None)[source]#

Calculate the reflectivity and transmissivity of a multilayer film or coating using the method in Windt [1998].

Parameters:
  • wavelength (Quantity | AbstractScalar) – The wavelength of the incident light in vacuum.

  • direction (float | AbstractScalar) – The component of the incident light’s propagation direction in the ambient medium antiparallel to the surface normal. Default is to assume normal incidence.

  • n (float | AbstractScalar) – The complex index of refraction of the ambient medium.

  • layers (None | Sequence[AbstractLayer] | AbstractLayer) – A sequence of layers representing the multilayer stack. If None, then this function computes the reflectivity and transmissivity of the ambient medium and the substrate.

  • substrate (None | Layer) – A layer representing the substrate supporting the multilayer stack. The thickness of this layer is ignored. If None, then the substrate is assumed to be a vacuum.

Return type:

tuple[PolarizationVectorArray, PolarizationVectorArray]

Examples

Reproduce Example 2.3.1 in the IMD User’s Manual, the transmittance of a \(\text{Zr}\) filter.

import numpy as np
import matplotlib.pyplot as plt
import astropy.units as u
import named_arrays as na
import optika

# Define the wavelength of the incident light
wavelength = na.linspace(100, 150, axis="wavelength", num=501) * u.AA

# Define the Zr layer
layers = optika.materials.Layer(
    chemical="Zr",
    thickness=1500 * u.AA,
)

# Compute the reflectivity and the transmissivity of this multilayer
reflectivity, transmissivity = optika.materials.multilayer_efficiency(
    wavelength=wavelength,
    layers=layers,
)

# Plot the transmissivity as a function of wavelength.
fig, ax = plt.subplots()
na.plt.plot(
    wavelength,
    transmissivity.average,
    ax=ax,
    axis="wavelength",
    label="Zr",
);
ax.legend();
ax.set_xlabel(f"wavelength ({wavelength.unit:latex_inline})");
ax.set_ylabel("transmissivity");
../_images/optika.materials.multilayer_efficiency_0_0.png

Reproduce Example 2.3.2 in the IMD User’s Manual, the reflectivity of a \(\text{Si/Mo}\) multilayer stack with interfacial roughness.

# Define the wavelength of the incident light
wavelength = na.linspace(100, 150, axis="wavelength", num=501) * u.AA

# Period length of the multilayer sequence
d = 66.5 * u.AA

# Define the thickness to period ratios for each layer
thickness_ratio = 0.6

# Define the interface profile between successive layers
interface = optika.materials.profiles.ErfInterfaceProfile(7 * u.AA)

# Define the multilayer sequence
layers = optika.materials.PeriodicLayerSequence(
    [
        optika.materials.Layer(
            chemical="Si",
            thickness=thickness_ratio * d,
            interface=interface,
        ),
        optika.materials.Layer(
            chemical="Mo",
            thickness=(1 - thickness_ratio) * d,
            interface=interface,
        ),
    ],
    num_periods=60,
)

# Compute the reflectivity and transmissivity of this multilayer stack
reflectivity, transmissivity = optika.materials.multilayer_efficiency(
    wavelength=wavelength,
    layers=layers,
)

# Plot the reflectivity as a function of wavelength
fig, ax = plt.subplots()
na.plt.plot(
    wavelength,
    reflectivity.average,
    ax=ax,
    axis="wavelength",
    label=rf"Si/Mo $\times$ {layers.num_periods}",
);
ax.legend();
ax.set_xlabel(f"wavelength ({wavelength.unit:latex_inline})");
ax.set_ylabel("reflectivity");
../_images/optika.materials.multilayer_efficiency_1_1.png

Reproduce Figure 9a in Windt [1998], the reflectivity of a \(\text{Y/Al}\) multilayer stack as a function of wavelength and of the ratio of the \(\text{Y}\) thickness to the \(\text{Y + Al}\) thickness, \(\Gamma\).

# Period length of the multilayer sequence
d = 98 * u.AA

# wavelength of the incident light
wavelength = na.linspace(170, 210, num=101, axis="wavelength") * u.AA

# an array of thickness-to-period ratios for each layer
thickness_ratio = na.linspace(0.2, 0.6, axis="thickness_ratio", num=5)

# Define the multilayer sequence
layers = optika.materials.PeriodicLayerSequence(
    [
        optika.materials.Layer(
            chemical="Y",
            thickness=thickness_ratio * d,
        ),
        optika.materials.Layer(
            chemical="Al",
            thickness=(1 - thickness_ratio) * d,
        )
    ],
    num_periods=40,
)

# Define the substrate layer
substrate = optika.materials.Layer(
    chemical="Si",
)

# Compute the reflectivity and transmissivity of this multilayer stack
reflectivity, transmissivity = optika.materials.multilayer_efficiency(
    wavelength,
    layers=layers,
    substrate=substrate,
)

# Plot the reflectivity as a function of wavelength
fig, ax = plt.subplots()
na.plt.plot(
    wavelength,
    reflectivity.average,
    ax=ax,
    axis="wavelength",
    label=r"$\Gamma=" + thickness_ratio.astype(str).astype(object) + "$",
);
ax.legend();
ax.set_xlabel(f"wavelength ({wavelength.unit:latex_inline})");
ax.set_ylabel("reflectivity");
../_images/optika.materials.multilayer_efficiency_2_0.png

Notes

The reflectivity of a multilayer stack can be calculated using Equation 5.2-5 in Yeh [1988],

(1)#\[R_k = |r_k|^2,\]

and the transmissivity can be calculated using Equation 5.2-6,

(2)#\[T_k = \text{Re} \left( \frac{q_{kS}}{q_{k0}} \right) |t_k|^2,\]

where \(r_k\) and \(t_k\) are the system reflection and transmission coefficients calculated by multilayer_coefficients(), \(k = (s, p)\) is the polarization state,

\[q_{si} = n_i \cos \theta_i\]

and

\[q_{pi} = \frac{\cos \theta_i}{n_i}\]

are the \(z\) components of the wave’s momentum for an arbitrary layer \(i\), \(n_i\) is the index of refraction inside material \(i\), and \(\theta_i\) is the angle between the wave’s propagation direction and the vector normal to the interface inside material \(i\).

If we define the vectors

\[\begin{split}\vec{R} = \begin{pmatrix} R_s \\ R_p \end{pmatrix}\end{split}\]

and

\[\begin{split}\vec{T} = \begin{pmatrix} T_s \\ T_p \end{pmatrix},\end{split}\]

then the tuple \((\vec{R}, \vec{T})\) is the quantity returned by this function.