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:
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");
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");
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");
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.