optmat.solid.udm#

Franta’s universal dispersion model (UDM) of a solid’s dielectric function.

The UDM builds the complex dielectric function from contributions whose imaginary parts are simple models of the joint density of states, each normalised to unit transition strength (its Thomas-Reiche-Kuhn integral), and whose real parts are their Kramers-Kronig transforms in closed form (Franta, Nečas, Ohlídal & Giglia, Proc. SPIE 9628, 96281U (2015), Eqs. (1)-(47); the curated record franta_2015b):

\[\varepsilon(E) = 1 + N_{vc}\,\varepsilon^0_{vc} + N_{vx}\,\varepsilon^0_{vx} + N_{ut}\,\varepsilon^0_{ut} + \sum_p N_{loc,p}\,\varepsilon^0_{loc,p} + \sum_p N_{ph,p}\,\varepsilon^0_{ph,p},\]

with the interband transitions (a symmetric term and excitonic terms, Eqs. 4-27), the higher-energy excitations of the valence electrons (Eqs. 28-31), the Urbach tail (Eqs. 32-40), and Gaussian-broadened peaks for localised states and phonons (Eqs. 41-47). Energies are photon energies in eV; the transition strengths N are in eV^2. The model is causal and passive by construction, and every term is a closed-form, piecewise-analytic function of E: it can be differentiated to any order away from the few band edges where its joint density of states has a kink.

The parameters come from Franta et al.’s newAD2 parameter files, whose values the source records hold as the terms of their formulas (TC-320). Two details of those files follow the authors’ program, which reproduces their published tables, rather than the paper (TC-321): the Urbach tail’s upper energy, and the wavenumber-to-energy conversion of the phonon terms.

First derivatives are exact (complex-step differentiation of the closed forms).

Module Attributes

UDM_WAVENUMBER_TO_EV

newAD2's conversion of a wavenumber in cm^-1 to a photon energy in eV.

Functions

from_file(path)

Build a model from a newAD2 parameter file.

from_parameters(attributes, values)

Build a model from a parameter file's attributes and values.

parse_attributes(line, where)

Return the attributes of a newAD2 parameter file's first line.

parse_parameters(text, where)

Read the text of a newAD2 UDM parameter file.

read_parameter_file(path)

Read a newAD2 UDM parameter file.

Classes

Term(kind, strength, shape[, lowest])

One contribution of Eq.

UniversalDispersionModel(terms)

A dielectric function in Franta et al.'s universal dispersion model.

class optmat.solid.udm.Term(kind, strength, shape, lowest=0.0)[source]#

Bases: object

One contribution of Eq. (1).

Attributes:
kindstr

“interband”, “exciton”, “higher”, “urbach” or “gaussian”.

strengthfloat

Its transition strength N, eV^2.

shapetuple of float

Its shape parameters, eV: (E_g, E_h); (E_g, E_h, E_c, B_c); (E_xi,); (E_u, E_g, E_h); or (centre, rms width).

lowestfloat

Its lowest characteristic energy, below which the real part is the moment series (0 for a Gaussian peak).

kind: str#
lowest: float = 0.0#
shape: tuple[float, ...]#
strength: float#
optmat.solid.udm.UDM_WAVENUMBER_TO_EV: Final = 0.0001239841905763867#

newAD2’s conversion of a wavenumber in cm^-1 to a photon energy in eV.

class optmat.solid.udm.UniversalDispersionModel(terms)[source]#

Bases: object

A dielectric function in Franta et al.’s universal dispersion model.

Build one from a newAD2 parameter file with from_file().

Attributes:
termstuple

The contributions, each with its kind, transition strength (eV^2) and shape parameters (eV).

EVALUATION_VERSION: ClassVar[int] = 1#
dpermittivity_denergy(energy)[source]#

Return d epsilon / dE, exact to rounding (complex-step differentiation).

Parameters:
energynumpy.ndarray

Photon energies, eV, > 0, away from the terms’ band edges.

Returns:
numpy.ndarray

The derivative, per eV.

permittivity(energy)[source]#

Return the complex dielectric function at photon energies.

Parameters:
energynumpy.ndarray

Photon energies, eV, > 0.

Returns:
numpy.ndarray

The permittivity epsilon_r + i epsilon_i, with epsilon_i >= 0 for absorption.

Examples

>>> from optmat.solid.models.formulas import published_models
>>> model = published_models()["franta_2016/udm_lithosil_q2"].udm
>>> f"{model.transition_strength():.1f}"
'1116.0'
>>> n = np.sqrt(model.permittivity(np.array([1.5498])))
>>> f"{n.real[0]:.5f}"
'1.45355'
terms: tuple[Term, ...]#
transition_strength()[source]#

Return the total transition strength, the sum of the terms’ N (eV^2).

Returns:
float

The integral of epsilon_i(E) E over E (Franta et al. 2015, Eq. 3).

optmat.solid.udm.from_file(path)[source]#

Build a model from a newAD2 parameter file.

Parameters:
pathpathlib.Path

The .par file.

Returns:
UniversalDispersionModel

The model.

optmat.solid.udm.from_parameters(attributes, values)[source]#

Build a model from a parameter file’s attributes and values.

Parameters:
attributestuple of str

The model’s attributes (he, ut, ex=n, loc=n, ph=n).

valuesmapping of str to float

The parameters, in newAD2’s names and units (eV, eV^2, cm^-1).

Returns:
UniversalDispersionModel

The model.

Raises:
DataError

If a parameter the attributes call for is missing.

optmat.solid.udm.parse_attributes(line, where)[source]#

Return the attributes of a newAD2 parameter file’s first line.

Parameters:
linestr

The line, such as he:ex=10:ut:ph=52.

wherestr

What the line belongs to, for the error message.

Returns:
tuple of str

The attributes.

Raises:
DataError

If an attribute is one this implementation does not support.

Examples

>>> parse_attributes("he:ex=10:ut:ph=52", "Lithosil Q2")
('he', 'ex=10', 'ut', 'ph=52')
optmat.solid.udm.parse_parameters(text, where)[source]#

Read the text of a newAD2 UDM parameter file.

Parameters:
textstr

The file’s text: a first line of attributes (he:ex=10:ut:ph=52), then name = value lines, then the site’s free-text description.

wherestr

What the text belongs to, for the error message.

Returns:
tuple

The attributes, and the parameters by name.

Examples

>>> attributes, values = parse_parameters("he:ut\nEg = 8.36\nEh = 39.6\n", "x")
>>> attributes, values["Eg"]
(('he', 'ut'), 8.36)
optmat.solid.udm.read_parameter_file(path)[source]#

Read a newAD2 UDM parameter file.

Parameters:
pathpathlib.Path

The .par file (parse_parameters()).

Returns:
tuple

The attributes, and the parameters by name.