PAOFLOW.phonon.do_ir_raman#

Infrared (IR) and Raman spectra of zone-centre phonons (Stages 3 & 4).

Infrared (Stage 3)#

The infrared activity of a phonon mode is governed by the change in the macroscopic dipole moment it produces. For a mode \(\nu\) at the zone centre with (mass-weighted) eigenvector \(e_{\nu}\) the mode effective charge vector is

\[\bar{Z}_{\nu,\alpha} = \sum_{k,\beta} Z^{*}_{k,\alpha\beta}\, \frac{e_{\nu,k\beta}}{\sqrt{M_k}},\]

where \(Z^{*}_{k}\) is the Born effective charge tensor of atom \(k\) (units of the elementary charge), \(M_k\) its mass and \(\alpha,\beta\) Cartesian indices. The IR oscillator strength (intensity) of the mode is

\[I_{\nu} \propto \sum_{\alpha} |\bar{Z}_{\nu,\alpha}|^{2}.\]

The transverse-optical (TO) eigenvectors at exactly \(\Gamma\) are used; the non-analytical correction (LO-TO splitting) is irrelevant to the oscillator strengths, so only the Born charges, eigenvectors and masses are required. A Lorentzian broadening of each mode produces a continuous spectrum \(I(\omega) = \sum_{\nu} I_{\nu}\,L(\omega;\omega_{\nu},\gamma)\).

Raman (Stage 4)#

The (non-resonant, Placzek) Raman activity of a mode is governed by the derivative of the electronic dielectric/polarisability tensor with respect to the mode normal coordinate \(Q_{\nu}\). The atomic displacement pattern of mode \(\nu\) is \(u_{k\beta} = e_{\nu,k\beta}/\sqrt{M_k}\), so a finite, mass-weighted displacement of amplitude \(\delta\) along the eigenvector (+/-) and a central difference of the static dielectric tensor \(\varepsilon(\pm\delta)\) give the Raman tensor

\[R^{\nu}_{\alpha\beta} = \frac{\partial \varepsilon_{\alpha\beta}} {\partial Q_{\nu}} \approx \frac{\varepsilon_{\alpha\beta}(+\delta) - \varepsilon_{\alpha\beta}(-\delta)}{2\,\delta}.\]

The orientationally-averaged (powder) Stokes intensity follows from the two rotational invariants of the (symmetric) Raman tensor, the isotropic mean \(a = \tfrac{1}{3}\mathrm{Tr}\,R\) and the anisotropy \(\gamma^2\),

\[I_{\nu} \propto \frac{(\omega_L - \omega_{\nu})^4}{\omega_{\nu}} \,(n_{\nu}+1)\,(45\,a^2 + 7\,\gamma^2),\]

with \(n_{\nu}\) the Bose-Einstein occupation at temperature \(T\) and \(\omega_L\) the laser frequency. Acoustic modes are rigid translations and leave \(\varepsilon\) invariant, so they are Raman-silent by construction.

Functions#

mode_effective_charges(born, eigvecs, masses)

Mode effective charge vectors and IR oscillator strengths.

compute_ir_spectrum(data_controller[, born, ...])

Compute the infrared spectrum from Born charges and Gamma eigenvectors.

mode_displacement_vectors(eigvecs, masses, delta)

Cartesian displacement patterns of every mode for a finite step delta.

raman_invariants(tensor)

Rotational invariants (a, gamma2) of a Raman tensor.

raman_powder_activity(tensor)

Orientationally-averaged Raman activity 45 |a|^2 + 7 gamma2.

raman_tensors_from_epsilon(eps_plus, eps_minus, delta)

Finite-difference Raman tensors dε/dQ for every mode.

compute_raman_spectrum(data_controller, eps_plus, ...)

Compute the powder Raman spectrum from finite-difference dielectric data.

Module Contents#

PAOFLOW.phonon.do_ir_raman.mode_effective_charges(born, eigvecs, masses)[source]#

Mode effective charge vectors and IR oscillator strengths.

Parameters:
  • born (array_like) – Born effective charges (natom, 3, 3) with born[k, alpha, beta].

  • eigvecs (array_like) – Mass-weighted eigenvectors (3*natom, nmodes) (phonopy convention), where column v is the eigenvector of mode v and the component index is 3*k + beta.

  • masses (array_like) – Atomic masses (natom,).

Returns:

(mode_charges, intensities) with mode_charges of shape (nmodes, 3) (complex) and intensities (nmodes,) real, where intensities[v] = sum_alpha |mode_charges[v, alpha]|^2.

Return type:

tuple

PAOFLOW.phonon.do_ir_raman.compute_ir_spectrum(data_controller, born=None, dielectric=None, born_file=None, freq_min=None, freq_max=None, npoints=2000, gamma=4.0, units='cm-1', fname='phonon', write=True, intensity_tol=0.0001)[source]#

Compute the infrared spectrum from Born charges and Gamma eigenvectors.

Parameters:
  • born (array_like, optional) – Born effective charges (natom_prim, 3, 3) in units of the elementary charge. When omitted they are taken from born_file or from a previous compute_born_and_epsilon() / attach_nac() call (arry['born_charges']).

  • dielectric (array_like, optional) – High-frequency dielectric tensor (3, 3). Unused by the oscillator strengths; accepted for API symmetry and read alongside born_file.

  • born_file (str, optional) – Path to a phonopy BORN file providing the Born charges.

  • freq_min (float, optional) – Frequency-axis limits of the broadened spectrum (in units). Defaults span 0 to slightly above the highest mode.

  • freq_max (float, optional) – Frequency-axis limits of the broadened spectrum (in units). Defaults span 0 to slightly above the highest mode.

  • npoints (int) – Number of points on the broadened-spectrum frequency grid.

  • gamma (float) – Lorentzian full width at half maximum (in units).

  • units (str) – Frequency unit for all outputs: 'cm-1' (default) or 'THz'.

  • fname (str) – Output basename; writes <fname>_ir_modes.dat and <fname>_ir_spectrum.dat.

  • write (bool) – When True the two output files are written (rank 0 only).

  • intensity_tol (float) – Relative threshold (fraction of the maximum mode intensity) above which a mode is flagged IR-active.

Returns:

{'frequencies', 'intensities', 'mode_charges', 'spectrum', 'irreps', 'active'}.

Return type:

dict

PAOFLOW.phonon.do_ir_raman.mode_displacement_vectors(eigvecs, masses, delta)[source]#

Cartesian displacement patterns of every mode for a finite step delta.

The physical displacement of atom k for mode v is delta * e_{v,k} / sqrt(M_k) (mass-weighted eigenvector), so a unit step along the normal coordinate Q_v corresponds to delta = 1.

Parameters:
  • eigvecs (array_like) – Mass-weighted eigenvectors (3*natom, nmodes) (phonopy convention; column v is mode v, component index 3*k + beta).

  • masses (array_like) – Atomic masses (natom,).

  • delta (float) – Normal-coordinate step amplitude.

Returns:

Displacements (nmodes, natom, 3) (same length units as the cell).

Return type:

numpy.ndarray

PAOFLOW.phonon.do_ir_raman.raman_invariants(tensor)[source]#

Rotational invariants (a, gamma2) of a Raman tensor.

The Raman tensor R is characterised by its isotropic mean polarisability a = Tr(R)/3 and its anisotropy gamma2,

\[\gamma^2 = \tfrac{1}{2}\big[|R_{xx}-R_{yy}|^2 + |R_{yy}-R_{zz}|^2 + |R_{zz}-R_{xx}|^2\big] + 3\,(|R_{xy}|^2 + |R_{xz}|^2 + |R_{yz}|^2).\]

The squared magnitudes make the invariants valid for the complex Raman tensor of the resonance case as well; for a real (non-resonant) tensor they reduce to the usual real invariants. a is returned complex when the input is complex (its magnitude enters the activity), and real otherwise.

Parameters:

tensor (array_like) – A (3, 3) Raman tensor (symmetrised internally).

Returns:

(a, gamma2) with the (possibly complex) isotropic mean and the (real) anisotropy invariant.

Return type:

tuple

PAOFLOW.phonon.do_ir_raman.raman_powder_activity(tensor)[source]#

Orientationally-averaged Raman activity 45 |a|^2 + 7 gamma2.

PAOFLOW.phonon.do_ir_raman.raman_tensors_from_epsilon(eps_plus, eps_minus, delta)[source]#

Finite-difference Raman tensors dε/dQ for every mode.

Parameters:
  • eps_plus (array_like) – Dielectric tensors (nmodes, 3, 3) for the +delta and -delta displacements along each mode. Modes that were not displaced should carry identical +/- tensors (or zeros) and yield a null Raman tensor. May be real (non-resonant, static) or complex (resonance, evaluated at the laser frequency).

  • eps_minus (array_like) – Dielectric tensors (nmodes, 3, 3) for the +delta and -delta displacements along each mode. Modes that were not displaced should carry identical +/- tensors (or zeros) and yield a null Raman tensor. May be real (non-resonant, static) or complex (resonance, evaluated at the laser frequency).

  • delta (float) – Normal-coordinate step amplitude used to build the displacements.

Returns:

Raman tensors (nmodes, 3, 3) (symmetrised), complex when the input dielectric tensors are complex.

Return type:

numpy.ndarray

PAOFLOW.phonon.do_ir_raman.compute_raman_spectrum(data_controller, eps_plus, eps_minus, delta, computed=None, laser_nm=None, temperature=300.0, freq_min=None, freq_max=None, npoints=2000, gamma=4.0, units='cm-1', fname='phonon', write=True, intensity_tol=0.0001)[source]#

Compute the powder Raman spectrum from finite-difference dielectric data.

Parameters:
  • eps_plus (array_like) – Dielectric tensors (nmodes, 3, 3) harvested from the +delta / -delta displaced-cell do_epsilon runs. Real for the non-resonant (static) spectrum, or complex when evaluated at a laser frequency for the resonance spectrum.

  • eps_minus (array_like) – Dielectric tensors (nmodes, 3, 3) harvested from the +delta / -delta displaced-cell do_epsilon runs. Real for the non-resonant (static) spectrum, or complex when evaluated at a laser frequency for the resonance spectrum.

  • delta (float) – Normal-coordinate step amplitude used to displace the cells.

  • computed (array_like of bool, optional) – Mask (nmodes,) flagging the modes that were actually displaced and for which a Raman tensor is meaningful. Defaults to all modes.

  • laser_nm (float, optional) – Excitation wavelength in nm. When given, the (omega_L - omega_nu)^4 resonance prefactor is applied; otherwise it is omitted (set to 1).

  • temperature (float) – Temperature in K for the Bose (n+1) Stokes factor.

  • freq_min (see) – compute_ir_spectrum().

  • freq_max (see) – compute_ir_spectrum().

  • npoints (see) – compute_ir_spectrum().

  • gamma (see) – compute_ir_spectrum().

  • units (see) – compute_ir_spectrum().

  • fname (see) – compute_ir_spectrum().

  • write (see) – compute_ir_spectrum().

  • intensity_tol (float) – Relative threshold (fraction of the maximum activity) above which a mode is flagged Raman-active.

Returns:

{'frequencies', 'activities', 'intensities', 'tensors', 'invariants', 'spectrum', 'irreps', 'active'}.

Return type:

dict