Fresnel transmission from a depth-probe simulation

The Fresnel transmission T is the fraction of incident energy flux that enters the substrate. It satisfies 0 ≤ T ≤ 1.

T differs from the depth-probe field intensity |ψ|² returned by the default simulation. Standing waves can raise |ψ|² above 1, so |ψ|² ≠ T in general.

To obtain T from a depth-probe simulation:

  1. Observe the transmitted partial wave (ZDirection_Transmitted) at a point in the substrate, away from the film–substrate interface.
  2. Apply the wavevector correction T = (k_{z,\text{sub}} / k_{z,\text{vac}}) × |ψ|².

The script prints a single number,

0.1943568705571461

Cross-check: the same angle (0.64°) is just above the critical angle of the film (0.627°), so the specular simulation gives R = 0.806, and T = 1 − R = 0.194 agrees with the depth-probe result.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/usr/bin/env python3
"""
Fresnel transmittivity and reflectivity of a multilayer sample.

Uses DepthprobeSimulation.transmitted() and .reflected().
"""

import bornagain as ba
from bornagain import deg, nm

depth = 100 * nm


def get_sample():
    material_vac = ba.Vacuum()
    material_A = ba.RefractiveMaterial("A", 6e-5, 0)
    material_sub = ba.RefractiveMaterial("Substrate", 3e-05, 0)

    sample = ba.Sample()
    sample.addLayer(ba.Layer(material_vac))
    sample.addLayer(ba.Layer(material_A, depth))
    sample.addLayer(ba.Layer(material_sub))

    return sample


def simulate():
    alpha = 0.64 * deg
    scan = ba.AlphaScan(1, alpha, alpha)
    scan.setWavelength(0.3 * nm)

    z_axis = ba.EquiDivision("z", 1, 0, 0)
    simulation = ba.DepthprobeSimulation(scan, get_sample(), z_axis)

    T = simulation.transmitted().flat().valAt(0)
    R = simulation.reflected().flat().valAt(0)
    return T, R


if __name__ == '__main__':
    T, R = simulate()
    print(f'transmittivity: {T}')
    print(f'reflectivity:   {R}')
auto/Examples/varia/Transmission.py