fdtdx.CCPRPole#

class fdtdx.CCPRPole(*, pole=null, residue=null)[source]#

Bases: Pole

General complex-conjugate pole-residue (CCPR) pole.

A single conjugate pair contributes to the susceptibility (in the exp(-i omega t) convention, Laplace variable s = -i omega):

\[\chi_p(\omega) = \frac{r}{-i\omega - q} + \frac{r^*}{-i\omega - q^*}\]

with complex pole q and complex residue r. Summing the pair with its conjugate guarantees a real time-domain response. Combined over a common denominator this equals the unified 2nd-order form

\[\chi_p(\omega) = \frac{a - i\omega b}{\omega_0^2 - \omega^2 - i\gamma\omega}\]

with

\[\omega_0^2 = |q|^2, \quad \gamma = -2\,\mathrm{Re}(q), \quad a = -2\,\mathrm{Re}(r q^*), \quad b = 2\,\mathrm{Re}(r).\]

Lorentz and Drude poles are the special case b = 0 (purely imaginary residue). A non-zero b (= coupling_edot) is the extra degree of freedom that lets CCPR fit metals (gold, silver) and arbitrary vector-fitted permittivity data.

A stable, passive (lossy) medium requires Re(q) < 0 (so gamma > 0).

Both pole and residue are either scalars (isotropic) or per-axis 3-tuples (x, y, z) for diagonally anisotropic dispersion (e.g. a vector-fitted uniaxial material with a different (q, r) set per axis).

Quick Reference#

Attributes

Methods

Attributes#

CCPRPole.coupling_edot#

Coefficient b of the dE/dt driving term (rad/s).

Raises ValueError for per-axis poles; use coupling_edot_axes.

CCPRPole.coupling_edot_axes#
CCPRPole.coupling_sq#

Effective squared coupling frequency K (rad^2/s^2).

Raises ValueError for per-axis poles; use coupling_sq_axes.

CCPRPole.coupling_sq_axes#
CCPRPole.gamma#

Damping rate (rad/s).

Raises ValueError for per-axis poles; use gamma_axes.

CCPRPole.gamma_axes#
CCPRPole.is_isotropic#

Whether all pole parameters are identical on the three axes.

CCPRPole.omega_0#

Resonance angular frequency (rad/s). Zero for pure Drude poles.

Raises ValueError for per-axis poles; use omega_0_axes.

CCPRPole.omega_0_axes#
CCPRPole.pole: complex | tuple[complex, complex, complex]#

Complex pole q (rad/s). Re(q) < 0 for a stable, lossy medium. Scalar or per-axis 3-tuple.

CCPRPole.residue: complex | tuple[complex, complex, complex]#

Complex residue r (rad/s). Scalar or per-axis 3-tuple.

Methods#

CCPRPole.aset(attr_name, val, create_new_ok=False)#

Sets an attribute of this class. In contrast to the classical .at[].set(), this method updates the class attribute directly and does not only operate on jax pytree leaf nodes. Instead, replaces the full attribute with the new value.

The attribute can either be the attribute name of this class, or for nested classes it can also be the attribute name of a class, which itself is an attribute of this class. The syntax for this operation could look like this: “a->b->[0]->[‘name’]”. Here, the current class has an attribute a, which has an attribute b, which is a list, which we index at index 0, which is an element of type dictionary, which we index using the dictionary key ‘name’.

Note that dictionary keys cannot contain square brackets or single quotes (even if they are escaped).

Parameters:
  • attr_name (str) – Name of attribute to set

  • val (Any) – Value to set the attribute to

  • create_new_ok (bool, optional) – If false (default), throw an error if the attribute does not exist. If true, creates a new attribute if the attribute name does not exist yet.

Returns:

Updated instance with new attribute value

Return type:

Self

classmethod CCPRPole.from_critical_point(amplitude, phase, resonance_frequency, damping)[source]#

Build a CCPR pole from critical-point (modified-Lorentz) parameters.

The critical-point model term (exp(-i omega t) convention) is

\[\chi_p(\omega) = A\,\Omega\left[ \frac{e^{i\phi}}{\Omega - \omega - i\Gamma} + \frac{e^{-i\phi}}{\Omega + \omega + i\Gamma}\right],\]

which is the parameterization commonly reported for fitted metal permittivities. This maps to the complex pole/residue

\[q = -\Gamma - i\Omega, \qquad r = i\,A\,\Omega\,e^{i\phi}.\]
Parameters:
  • amplitude (float) – Dimensionless amplitude \(A\).

  • phase (float) – Phase \(\phi\) (radians).

  • resonance_frequency (float) – Resonance \(\Omega\) (rad/s).

  • damping (float) – Broadening \(\Gamma\) (rad/s), > 0 for loss.

Returns:

Equivalent pole with the (q, r) above.

Return type:

CCPRPole

CCPRPole.get_class_fields()#
Return type:

list[TreeClassField]

CCPRPole.get_public_fields()#
Return type:

list[TreeClassField]

If you find any errors in the documentation, please report them in the Github Issues!