A numerical Python toolkit for parallel electromagnetic calculation of planar multilayer thin films at multi-wavelength and multi-angle
Project description
# TFSolver TFSolver is a Python toolkit used for efficiently performing electromagnetic calculations of planar isotropic and anisotropic multilayer thin films, including amplitude reflection and transmission coefficients, reflectance, transmittance, light polarization states, ellipsometric parameters, and Mueller matrix spectra. TFSolver is based on the 4×4 matrix method and implemented using PyTorch.
Features
-
Multi-sample support: It can simultaneously handle multiple multilayer samples, each with the same thin-film structure, but which can differ in material properties, material orientation and layer thickness.
-
Multi-wavelength support: It can analyze a set of wavelengths simultaneously, facilitating broadband optical studies.
-
Multi-angle support: It can process multiple incident angles at once for comprehensive angle analysis.
-
GPU-accelerated simulation
-
Supporting automatic differentiation for optimization
Installation
TFSolver package requires PyTorch, so it is recommended to install it first following official instructions.
Installation from pipy.org:
pip install
Installation from github.com:
pip install git+https://github.com/xiuguochen/tfsolver
Usage Guide
Description of the input parameters
The key input parameters required to use the TFSolver are described in detail below.
Ni: Specifies the complex refractive indices of the isotropic incident medium at the relevant wavelengths, with a shape of [w], where w is the number of wavelengths.
Nt: Defines the complex refractive indices of the isotropic exit medium at the relevant wavelengths, also with a shape of [w].
N: A tensor of shape [s, l, w, 3, 3] containing the complex refractive index tensors for each layer of each multilayer stack. Here, s is the number of the thin-film stacks, and l is the number of layers per stack. For example, N[i, j, k, :, :] represents the complex refractive index tensor of the (j+1)-th layer in the (i+1)-th stack at the (k+1)-th wavelength, noting that Python indexing starts at 0.
Euler_angles: Specifies the Euler angles for each layer, with a shape of [s, l, 3].
D: Defines the layer thickness for each film, in a shape of [s, l].
Theta: Represents the incident angles, with a shape of [a], where a is the number of incident angles.
wavelengths: Sets the wavelengths under study.
device: Controls the computational device (CPU or GPU) on which the code will run.
Jones_vector: Defines the Jones vector of the incident light wave, with a shape of [2].
mode: Determines the simulation conditions (reflection, transmission, or both).
Functions Overview
parallel_mm44calculates the amplitude reflection and transmission coefficients for a batch of multilayer thin-film samples at multiple incident angles and wavelengths. This function returns a dictionary, where each key corresponds to a tensor representing the amplitude reflection and transmission coefficients $r$ and $t$ of the multilayer thin-film stacks. For example, the key "r_sp" corresponds to the amplitude reflection coefficient $r_{sp}$, which represents reflected s-polarization generated by incident p-polarization when there is no incident s-polarization. Each coefficient is a tensor of datatype torch.cfloat with a shape of [s, a, w]. For example, r_sp[i, j, k] represents the amplitude reflection coefficient $r_{sp}$ for the (i+1)th multilayer thin film at the (j+1)th incident angle and the (k+1)th wavelength.
def parallel_mm44(N, Euler_angles, D, Ni, Nt, Theta, wavelenths, device):
…
return {'r_pp': r_pp, 'r_sp': r_sp, 'r_ss': r_ss, 'r_ps': r_ps, 't_pp': t_pp, 't_sp': t_sp, 't_ss': t_ss, 't_ps': t_ps}
calc_pol_statecalculates the Jones vector for the reflected or transmitted light from a batch of multilayer thin-film samples at multiple incident angles and wavelengths. The Jones vector describes the polarization state of the light. If the simulation mode is set to "r" (or "t"), this function will return the Jones vector for the reflected (or transmitted) light. If the simulation mode is set to "both", the function returns a dictionary where the keys "r" and "t" correspond to the Jones vectors for reflected and transmitted light, respectively. The returned tensors are of datatype torch.cfloat with a shape of [s, a, w, 2]. For example, in the case of reflection mode, Jv[i, j, k, :] represents the Jones vector of the reflected light for the (i+1)th multilayer thin film at the (j+1)th incident angle and the (k+1)th wavelength.
def calc_pol_state(N, Euler_angles, D, Ni, Nt, Theta, wavelenths, Jones_vector, device, mode):
…
if mode == 'r':
…
return Jv
elif mode == 't':
…
return Jv
elif mode == 'both':
…
return {'r': Jv_r, 't': Jv_t}
calc_intensitycalculates the reflectance and transmittance of a batch of multilayer thin-film samples at multiple incident angles and wavelengths. If the simulation mode is set to "r" (or "t"), the function will return the reflectance (or transmittance). If the simulation mode is set to "both", the function returns a dictionary where the keys "R", "Rp" and "Rs" correspond to the total reflectance, the ratio of reflected p-polarized light intensity to incident light intensity and the ratio of reflected s-polarized light intensity to incident light intensity, respectively. Each tensor in the dictionary is of datatype torch.cfloat with a shape of [s, a, w]. For example, Rp[i, j, k] represents the ratio of reflected p-polarized light intensity to incident light intensity for the the (i+1)th multilayer thin film at the (j+1)th incident angle and the (k+1)th wavelength.
def calc_intensity (N, Euler_angles, D, Ni, Nt, Theta, wavelenths, Jones_vector, device, mode):
…
if mode == 'r':
…
return {'R': Rp + Rs, 'Rp': Rp, 'Rs': Rs}
elif mode == 't':
…
return {'T': Tp + Ts, 'Tp': Tp, 'Ts': Ts}
elif mode == 'both':
…
return {'R': Rp + Rs, 'Rp': Rp, 'Rs': Rs, 'T': Tp + Ts, 'Tp': Tp, 'Ts': Ts}
calc_Ellips_paramcalculates the ellipsometric parameters (amplitude ratio and phase difference) for a batch of multilayer thin-film samples at multiple incident angles and wavelengths. If the simulation mode is set to "r" (or "t"), the function returns a dictionary, where each key corresponds to an ellipsometric parameter for the reflection (or transmission) mode. If the simulation mode is set to "both", the function returns a dictionary where the keys "r" and "t" correspond to the ellipsometric parameters in reflection and transmission mode, respectively. For example, the keys "Psi_ps" and "Delta_ps" correspond to the amplitude ratio and phase difference of the amplitude reflection coefficients $r_{ps}$ and $r_{ss}$, respectively. Each ellipsometric parameter is a tensor of datatype torch.cfloat with a shape of [s, a, w]. For example, Psi_ps[i, j, k] represents the amplitude ratio of $r_{ps}$ to $r_{ss}$ for the (i+1)th multilayer thin film at the (j+1)th incident angle and the (k+1)th wavelength.
def calc_Ellips_param (N, Euler_angles, D, Ni, Nt, Theta, wavelenths, device, mode):
…
if mode == 'r':
…
return {'Psi_pp': Psi_pp, 'Psi_ps': Psi_ps, 'Psi_sp': Psi_sp, 'Delta_pp': Delta_pp, 'Delta_ps': Delta_ps, 'Delta_sp': Delta_sp}
elif mode == 't':
…
return {'Psi_pp': Psi_pp, 'Psi_ps': Psi_ps, 'Psi_sp': Psi_sp, 'Delta_pp': Delta_pp, 'Delta_ps': Delta_ps, 'Delta_sp': Delta_sp}
elif mode == 'both':
…
return {'r’: {…}, ‘t’: {…}}
calc_Mueller_matrixcalculates the Mueller matrices for a batch of multilayer thin-film samples at multiple incident angles and wavelengths. If the simulation mode is set to "r" (or "t"), the function returns the Mueller matrices for the reflection (or transmission) mode. If the simulation mode is set to "both," the function returns a dictionary containing the Mueller matrices for both reflection and transmission modes under the keys "r" and "t". Each tensor has datatype torch.cfloat with a shape of [s, a, w, 4, 4]. For example, in reflection mode, MM[i, j, k, :, :] represents the Mueller matrix for the (i+1)th multilayer thin film at the (j+1)th incident angle and the (k+1)th wavelength.
def calc_Mueller_matrix (N, Euler_angles, D, Ni, Nt, Theta, wavelenths, device, mode):
…
if mode == 'r':
…
return MM
elif mode == 't':
…
return MM
elif mode == 'both':
…
return {'r’: MM_r, ‘t’: MM_t}
TFSolver Examples
-
Example 1: Calculation of reflectance for a two-layer structure absorber.
-
Example 2: Simulation of reflectance for a multilayer reflector.
-
Example 3: Calculation of Mueller Matrix spectra for an anisotropic material.
-
Example 4: Computational efficiency evaluation using a set of randomly generated thin films with a 10-layer structure.
-
Example 5: Gradient-based optimization of a three-layer thin film.
Citation
If you use the code from this repository for your projects, please cite
TFSolver: a numerical Python toolkit for parallel electromagnetic calculation of planar multilayer thin films at multi-wavelength and multi-angle.
Acknowledgements
This work was supported by National Natural Science Foundation of China (52441511, 62175075, 52130504).
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file tfsolver-1.0.tar.gz.
File metadata
- Download URL: tfsolver-1.0.tar.gz
- Upload date:
- Size: 12.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.0.1 CPython/3.9.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5c963918b498cc64a81d51000f83f0129d91623cf6db7e3bd828cd5a0625ca65
|
|
| MD5 |
c3849c45eacf3784f9796fcd0e7b68b0
|
|
| BLAKE2b-256 |
ff6372e72346355a140c482edc77009914f427c86e7d165dba29738e59777a7d
|