NAME

Physics::Ellipsometry::VASE::Dispersion - Optical dispersion models for spectroscopic ellipsometry

SYNOPSIS

use PDL;
use Physics::Ellipsometry::VASE::Dispersion qw(
    cauchy_nk sellmeier_nk tauc_lorentz_nk drude_nk genosc_nk
    drude_lorentz_nk forouhi_bloomer_nk cody_lorentz_nk
    critical_point_nk gaussian_nk bspline_nk
);

my $lambda = sequence(500) * 2 + 300;   # 300-1298 nm

# Transparent dielectric (SiO2-like)
my ($n, $k) = cauchy_nk($lambda, 1.45, 0.003, 0.0);

# Semiconductor with band gap (Ta2O5-like)
my ($n2, $k2) = tauc_lorentz_nk($lambda, 100, 4.0, 1.0, 3.5, 1.0);

# Metal with interband transitions (Au-like)
my ($n3, $k3) = drude_lorentz_nk($lambda, 6.9, 9.03, 0.053,
    [ [1.3, 2.68, 0.51], [1.0, 3.87, 1.12] ]);

# Crystalline semiconductor (Si critical points)
my ($n4, $k4) = critical_point_nk($lambda, [
    { C=>6, E=>3.38, Gamma=>0.08, phi=>-1.2, mu=>0 },
], 1.0);

DESCRIPTION

Implements the standard parametric dispersion models used in spectroscopic ellipsometry to describe the wavelength-dependent complex refractive index N = n + ik of thin films and substrates.

The complex refractive index relates to the dielectric function through

N = sqrt(epsilon)    where epsilon = epsilon_1 + i*epsilon_2

The real part n (refractive index) governs the phase velocity of light in the material. The imaginary part k (extinction coefficient) describes optical absorption; k=0 for a perfectly transparent material.

All functions accept wavelength in nanometres and return a pair of PDL piddles ($n, $k).

Note: Functions are called directly (not via closures) to avoid PDL::NiceSlice source filter conflicts with the $ref->() syntax.

FUNCTIONS

cauchy_nk

my ($n, $k) = cauchy_nk($lambda_nm, $A, $B, $C,
                        k_amp => $k_amp, k_exp => $k_exp);

The Cauchy model is an empirical dispersion formula suitable for transparent or weakly absorbing dielectrics in the visible and near-IR. The refractive index is expressed as a power series in inverse wavelength-squared:

n(lambda) = A + B/lambda^2 + C/lambda^4

where lambda is in micrometres. Parameters B and C are in units of um^2 and um^4, respectively.

When k_amp is set, an Urbach absorption tail is added:

k(lambda) = k_amp * exp( k_exp * (1/lambda - 1/0.4) )

modelling the exponential increase in absorption near the band edge. If k_amp is zero (the default) the material is treated as fully transparent (k = 0).

Typical use: SiO2, Al2O3, MgF2, polymer films.

# SiO2 in the visible
my ($n, $k) = cauchy_nk($lambda, 1.45, 0.003, 0.0);

# Polymer with weak UV absorption tail
my ($n, $k) = cauchy_nk($lambda, 1.50, 0.005, 0.0,
                        k_amp => 0.01, k_exp => 2.0);

sellmeier_nk

my ($n, $k) = sellmeier_nk($lambda_nm, \@B_terms, \@C_terms);

The Sellmeier equation is derived from a classical harmonic-oscillator model of the dielectric response. Each resonance contributes a term to the squared refractive index:

n^2(lambda) = 1 + sum_i  B_i * lambda^2 / (lambda^2 - C_i)

where lambda is in micrometres. C_i values (um^2) locate the resonance wavelengths (lambda_i = sqrt(C_i)), and B_i values are the oscillator strengths. The model is valid away from the resonances and does not predict absorption (k = 0).

Typical use: Optical glasses (BK7, fused silica), crystals (CaF2, sapphire), infrared windows.

# BK7 glass (Schott catalogue coefficients)
my ($n, $k) = sellmeier_nk($lambda,
    [1.0396, 0.2318, 1.0105],     # B terms
    [0.00600, 0.02002, 103.56],   # C terms (um^2)
);

tauc_lorentz_nk

my ($n, $k) = tauc_lorentz_nk($lambda_nm, $A, $E0, $Gamma, $Eg,
                               $eps_inf);

The Tauc-Lorentz model (Jellison & Modine, Appl. Phys. Lett. 69, 371, 1996) is widely used for amorphous semiconductors and dielectrics. It combines the Tauc joint density of states with a Lorentz oscillator to give the imaginary dielectric function:

epsilon_2(E) = [ A * E0 * Gamma * (E - Eg)^2 ]
               / [ (E^2 - E0^2)^2 + Gamma^2 * E^2 ] / E
               for E > Eg;   0 otherwise

The real part epsilon_1 is obtained through a numerical Kramers-Kronig integration to ensure the model is physically self-consistent (causal).

Parameters:

$A - oscillator amplitude (eV)
$E0 - peak transition energy (eV)
$Gamma - oscillator broadening (eV)
$Eg - optical band gap energy (eV); epsilon_2 = 0 below this energy
$eps_inf - high-frequency dielectric constant (accounts for higher-energy transitions)

Typical use: Ta2O5, SiNx, TiO2, a-Si, amorphous oxides.

# Ta2O5 thin film
my ($n, $k) = tauc_lorentz_nk($lambda, 100, 4.5, 1.2, 3.8, 1.0);

# Amorphous silicon
my ($n, $k) = tauc_lorentz_nk($lambda, 200, 3.4, 2.5, 1.2, 1.0);

drude_nk

my ($n, $k) = drude_nk($lambda_nm, $eps_inf, $omega_p, $gamma);

The Drude free-electron model describes optical properties of metals and heavily doped semiconductors. Free carriers produce a dielectric response:

epsilon(E) = eps_inf - omega_p^2 / (E^2 + i * E * gamma)

where omega_p is the plasma frequency (eV) and gamma is the carrier scattering rate (eV). Below the plasma frequency the real part of epsilon goes negative, producing the high reflectivity characteristic of metals.

Typical use: Au, Ag, Al, Cu, ITO, doped ZnO.

# Gold (simplified)
my ($n, $k) = drude_nk($lambda, 1.0, 9.0, 0.07);

# ITO (transparent conductor)
my ($n, $k) = drude_nk($lambda, 3.8, 1.5, 0.12);

genosc_nk

my ($n, $k) = genosc_nk($lambda_nm, \@oscillators, $eps_inf);

The general oscillator (GenOsc) model sums multiple Lorentz oscillators to build an arbitrary dielectric function:

epsilon(E) = eps_inf + sum_i  A_i * E0_i^2
                              / (E0_i^2 - E^2 - i * Gamma_i * E)

Each oscillator is specified as [A, E0, Gamma] (amplitude, centre energy in eV, broadening in eV). This is the most flexible built-in model and can approximate complex band structures with multiple absorption features.

Typical use: Compound semiconductors, organic films, metamaterials, any material with multiple absorption bands.

# Two-oscillator model for a compound semiconductor
my ($n, $k) = genosc_nk($lambda,
    [ [80, 3.5, 0.5], [40, 5.0, 1.0] ],   # oscillators
    1.5,                                     # eps_inf
);

ENERGY-WAVELENGTH CONVERSION

Several models (Tauc-Lorentz, Drude, GenOsc) work internally in photon energy. The conversion used is:

E (eV) = 1239.842 / lambda (nm)

Parameters for these models (E0, Eg, Gamma, omega_p) are in eV, while the input wavelength and returned n, k are in nm.

drude_lorentz_nk

my ($n, $k) = drude_lorentz_nk($lambda_nm, $eps_inf, $omega_p,
                                $gamma_d, $oscillators);

The Drude-Lorentz hybrid combines free-carrier (Drude) response with bound-electron (Lorentz) interband transitions. The dielectric function is:

epsilon(E) = eps_inf - omega_p^2/(E^2 + i*E*Gamma_d)
             + sum_j A_j*E0_j^2 / (E0_j^2 - E^2 - i*Gamma_j*E)

The first term describes metallic free carriers (plasma frequency omega_p, damping gamma_d). The oscillator terms model interband absorption peaks.

Parameters:

$eps_inf - high-frequency dielectric constant (default 1.0)
$omega_p - plasma frequency [eV] (default 9.0)
$gamma_d - Drude damping rate [eV] (default 0.05)
$oscillators - arrayref of [A, E0, Gamma] for interband peaks

Typical use: Noble metals (Au, Ag, Cu), transparent conducting oxides (ITO, ZnO:Al), transition metals.

# Gold: Drude + 2 interband transitions
my ($n, $k) = drude_lorentz_nk($lambda,
    6.9,              # eps_inf
    9.03,             # omega_p [eV]
    0.053,            # Drude damping [eV]
    [ [1.3, 2.68, 0.51],     # L1 interband
      [1.0, 3.87, 1.12] ],   # L2 interband
);

# ITO (transparent conductor)
my ($n, $k) = drude_lorentz_nk($lambda,
    3.8, 1.8, 0.12,          # lower omega_p than pure metal
    [ [0.5, 4.2, 0.8] ],     # UV absorption
);

forouhi_bloomer_nk

my ($n, $k) = forouhi_bloomer_nk($lambda_nm, \%params);

The Forouhi-Bloomer model (1986, 1988) provides an analytic form for both k(E) and n(E) in amorphous semiconductors and dielectrics. Unlike Tauc-Lorentz, the refractive index is derived analytically from Kramers-Kronig without numerical integration:

k(E) = A*(E - Eg)^2 / (E^2 - B*E + C)    for E > Eg
n(E) = n_inf + (B0*E + C0) / (E^2 - B*E + C)

where B0 and C0 are derived analytically from A, B, C, and Eg.

Parameters (as hashref):

A - absorption strength (default 0.5)
B - peak energy parameter [eV] (default 6.0)
C - peak width parameter [eV^2] (default 10.0); must satisfy 4C > B^2
Eg - optical bandgap [eV] (default 1.5)
n_inf - refractive index at infinite energy (default 1.5)

Typical use: a-Si:H, a-SiN, a-SiO2, amorphous carbon.

# Amorphous silicon
my ($n, $k) = forouhi_bloomer_nk($lambda, {
    A => 0.76, B => 7.53, C => 14.6,
    Eg => 1.12, n_inf => 2.03,
});

cody_lorentz_nk

my ($n, $k) = cody_lorentz_nk($lambda_nm,
    A => $A, E0 => $E0, Gamma => $Gamma,
    Eg => $Eg, Ep => $Ep, Eu => $Eu,
    eps_inf => $eps_inf);

The Cody-Lorentz model (Ferlauto et al., 2002) extends the Tauc-Lorentz model with two improvements:

1. Replaces the Tauc absorption onset with the Cody form, which better describes the near-gap absorption in amorphous materials.
2. Adds an exponential Urbach tail below the band edge to model disorder-induced sub-gap absorption.

The imaginary dielectric function:

eps2(E) = G*L(E) * (E-Eg)^2 / ((E-Eg)^2 + Ep^2)   for E > Et
eps2(E) = eps2(Et) * exp((E - Et)/Eu)                for Eg < E <= Et

where Et = Eg + Ep is the transition energy, G = A*E0*Gamma, and L(E) is the Lorentz oscillator.

Parameters:

A - amplitude [eV] (default 100)
E0 - resonance energy [eV] (default 4.0)
Gamma - broadening [eV] (default 1.0)
Eg - Cody optical gap [eV] (default 1.5)
Ep - transition energy width [eV] (default 1.0)
Eu - Urbach energy [eV] (default 0.05)
eps_inf - high-frequency offset (default 1.0)

Typical use: a-Si:H, amorphous chalcogenides (GeSbTe), polymer films.

# a-Si:H with Urbach tail
my ($n, $k) = cody_lorentz_nk($lambda,
    A => 200, E0 => 3.6, Gamma => 2.5,
    Eg => 1.7, Ep => 0.8, Eu => 0.05,
    eps_inf => 1.0,
);

critical_point_nk

my ($n, $k) = critical_point_nk($lambda_nm, \@critical_points, $eps_inf);

The Critical Point model (Adachi, 1987; Kim et al., 1992) describes the dielectric function of crystalline semiconductors near van Hove singularities (critical points in the joint density of states):

epsilon(E) = eps_inf + sum_j C_j*exp(i*phi_j)*(E - E_j + i*Gamma_j)^(-mu_j)

The exponent mu determines the type of critical point:

mu = 0.5 - 3D M0 (band edge, e.g., E0 of GaAs)
mu = -0.5 - 3D M1 (saddle point)
mu = 0 - 2D (logarithmic singularity, e.g., E1 of Si)

Parameters:

Each critical point is a hashref with keys:

C - amplitude
E - critical point energy [eV]
Gamma - broadening [eV]
phi - phase angle [radians]
mu - exponent (0.5, -0.5, or 0)

Typical use: c-Si, GaAs, InP, Ge, III-V semiconductors.

# Crystalline silicon (E1, E2 critical points)
my ($n, $k) = critical_point_nk($lambda, [
    { C => 6.0,  E => 3.38, Gamma => 0.08, phi => -1.2, mu => 0 },    # E1
    { C => 3.0,  E => 3.62, Gamma => 0.12, phi => -0.8, mu => 0 },    # E1'
    { C => 20.0, E => 4.27, Gamma => 0.05, phi => -0.3, mu => 0.5 },  # E2
], 1.0);

gaussian_nk

my ($n, $k) = gaussian_nk($lambda_nm, \@oscillators, $eps_inf);

Gaussian oscillators model absorption peaks with a Gaussian line shape instead of the Lorentzian used in genosc_nk. Gaussian profiles provide better fits for inhomogeneously broadened transitions (e.g., amorphous materials, organic films):

eps2(E) = sum_j A_j * [ exp(-((E-E0j)/sigma_j)^2)
                      - exp(-((E+E0j)/sigma_j)^2) ]

where sigma_j = Gamma_j / (2*sqrt(ln 2)) is the standard deviation (Gamma_j is the FWHM). eps1 is obtained by numerical Kramers-Kronig transformation.

Parameters:

$oscillators - arrayref of [A, E0, Gamma] triplets
$eps_inf - high-frequency dielectric constant (default 1.0)

Typical use: Organic semiconductors, polymers, dye films, biological thin films, inhomogeneously broadened systems.

# Organic semiconductor with two absorption bands
my ($n, $k) = gaussian_nk($lambda, [
    [3.0, 2.8, 0.4],    # HOMO-LUMO transition
    [1.5, 4.5, 0.8],    # higher excited state
], 2.5);

bspline_nk

my ($n, $k) = bspline_nk($lambda_nm, \@knots, \@coeffs, $eps_inf);

B-spline parameterization provides a model-free (non-parametric) description of the imaginary dielectric function eps2(E) using cubic B-spline basis functions. The real part eps1(E) is derived from numerical Kramers-Kronig to ensure causality.

This approach is useful when:

- No physical model adequately describes the material
- You need maximum flexibility for exploratory fitting
- The material has complex spectral features (multiple overlapping peaks)

Parameters:

$knots - arrayref of energy knot positions [eV] (must be sorted)
$coeffs - arrayref of B-spline coefficients (non-negative for physical eps2)
$eps_inf - eps1 offset (default 1.0)

Typical use: Unknown materials, complex alloys, metamaterials.

# 7 knots spanning 1-6 eV with an absorption peak near 4 eV
my ($n, $k) = bspline_nk($lambda,
    [1.0, 2.0, 3.0, 4.0, 5.0, 5.5, 6.0],   # knots
    [0.0, 0.1, 0.5, 2.0, 1.0, 0.3, 0.0],   # coefficients
    2.0,                                      # eps_inf
);

SEE ALSO

Physics::Ellipsometry::VASE, Physics::Ellipsometry::VASE::TMM, Physics::Ellipsometry::VASE::Materials

G.E. Jellison and F.A. Modine, "Parameterization of the optical functions of amorphous materials in the interband region", Appl. Phys. Lett. 69, 371 (1996).

H. Fujiwara, Spectroscopic Ellipsometry: Principles and Applications, John Wiley & Sons, 2007, Chapters 5-6.