RamanSpectrum

class RamanSpectrum(configuration, dynamical_matrix, susceptibility_derivatives, qpoint=None, phonon_modes=None, method=None, polarization_in=None, polarization_out=None, energies=None, broadening=None, number_of_angles=None, polarization_orthogonal=None, second_harmonics_generation_susceptibility=None)

Analysis class for calculating the Raman tensor and spectrum for a bulk configuration.

Parameters:
  • configuration (BulkConfiguration) – The configuration for which the vibrational modes should be calculated. If no calculator is attached to the configuration, the calculator from dynamical_matrix is used. Currently, configuration must be the same as the configuration from dynamical_matrix and is therefore not needed.
    Default: The configuration from dynamical_matrix

  • dynamical_matrix (DynamicalMatrix) – The DynamicalMatrix to calculate the phonon modes from.

  • susceptibility_derivatives (SusceptibilityDerivatives) – SusceptibilityDerivatives object.

  • qpoint (list of 3 floats) – fractional q-point where phonon modes used for Raman signals are evaluated, e.g. [0.0, 0.0, 0.0].
    Default: Gamma point, ‘G’=[0.0, 0.0, 0.0].

  • phonon_modes (list with positive ints | All) – The phonon modes to include.
    Default: All (All phonon modes are included).

  • method (PolarizationDependent | PolarizationAveraged.) – Keyword specifying if the results should be calculated with a light polarization dependent or averaged result. When method=PolarizationDependent, polarization_in must be provided, polarization_out can be given but is defaulted to the polarization_in value. When method=PolarizationAveraged, polarization_in/out is not used.
    Default: PolarizationDependent

  • polarization_in (list of 3 floats) – Incoming light polarization vector, e.g. [1.0, 0.0, 0.0]. The vector will be normalized internally.
    Default: [1, 0, 0]

  • polarization_out (list of 3 floats) – Scattered light polarization vector, e.g. [1.0, 0.0, 0.0]. The vector will be normalized internally. Only a single scattered light polarization vector will be calculated. This option is mutually exclusive to polarization_orthogonal and number_of_angles, which will results in multiple scattered light polarizations.

  • energies (PhysicalQuantity of type energy) – The energies where Raman spectrum is evaluated.
    Default: 1500 points from 0.0 to 10 percent above highest phonon frequency

  • broadening (PhysicalQuantity of type energy) – The broadening parameter used for the Raman spectrum.
    Default: 0.25 * meV  (~2 cm⁻1)

  • number_of_angles (integer) – Argument used for method=PolarizationDependent. If not None a polar spectrum will be generated with the scattered light polarization rotated between polarization_in and polarization_orthogonal (orthogonal polarization). This option is mutually exclusive to polarization_out.
    Default: None

  • polarization_orthogonal (list of 3 floats) – Argument used for method=PolarizationDependent. Light polarization vector used for polar spectrum that is orthogonal to polarization_in. Scattered light polarization will be rotated between polarization_in and polarization_orthogonal, g_s = cos(theta) * polarization_in + sin(theta) * polarization_orthogonal. The vector will be normalized internally.
    Default: None

  • second_harmonics_generation_susceptibility (SecondHarmonicsGenerationSusceptibility | None) – If given a correction from polar phonons will be included in the susceptibility derivatives. An optical_spectrum and born_effective_charge will be taken from the dynamical matrix argument including polar phonon splitting.
    Default: None, i.e. the polar phonon correction is not included.

broadening()
Returns:

The broadening parameter used for the Raman spectrum.

Return type:

PhysicalQuantity of type energy.

energies()
Returns:

The energies used for the spectrum.

Return type:

PhysicalQuantity of type energy.

intensities(angle_index=None)
Returns:

The Raman tensor for the phonon modes projected onto light polarizations. For several angles this gives the polar Raman spectrum for the phonon modes for a particular angle index. The shape is (N, M) where N is the number of angles angles and M is the number of phonon modes.

Return type:

ndarray with floats.

metatext()
Returns:

The metatext of the object or None if no metatext is present.

Return type:

str | None

method()
Returns:

The method used for the calculation. Either PolarizationDependent or PolarizationAveraged.

Return type:

NLFlag

nlprint(stream=None)

Print a string containing an ASCII table useful for plotting the AnalysisSpin object.

Parameters:

stream (python stream) – The stream the table should be written to.
Default: NLPrintLogger()

numberOfAngles()
Returns:

The number of angle degrees used for the polar Raman spectrum.

Return type:

one-dimensional ndarray with floats.

phononModes()

Query method for the phonon modes.

Returns:

The list of phonon mode indices used in the calculation.

Return type:

list of int.

phononWaveNumbers()
Returns:

The wave numbers used for the spectrum.

Return type:

PhysicalQuantity of type inverse length.

polarAngleList()
Returns:

The angle degrees used for the polar Raman spectrum.

Return type:

one-dimensional ndarray with floats | None

polarizationOrthogonal()
Returns:

The normalized polarization that scattered light is rotated to in polar spectrum.

Return type:

ndarray with 3 floats each.

polarizationsIn()
Returns:

Normalized incoming light polarization vector

Return type:

numpy.ndarray with 3 floats.

polarizationsOut()
Returns:

Normalized scattered light polarization vectors

Return type:

list of numpy.ndarray with 3 floats.

qpoint()
Returns:

The q-point for which the phonon modes and Raman signals are calculated.

Return type:

ndarray with 3 floats.

ramanSpectrum(angle_index=None)
Parameters:

angle_index (int) – The index of the scattered light, given in the list polarizationsOut().

Returns:

The raman_spectrum summed over phonon modes for a given angle index

Return type:

one-dimensional ndarray with floats.

ramanTensor()
Returns:

The Raman tensor for the phonon modes. The shape is (M, 3, 3) where M is the number of phonon modes.

Return type:

ndarray with floats.

setMetatext(metatext)

Set a given metatext string on the object.

Parameters:

metatext (str | None) – The metatext string that should be set. A value of “None” can be given to remove the current metatext.

susceptibilityDerivativesPolarCorrection()
Returns:

The correction to the susceptibility derivatives from polar phonons related to the second harmonics generation susceptibility, Born effective charges and optical spectrum. The two latter are obtained from the dynamical matrix with polar phonon splitting. It will only be nonzero if a second_harmonics_generation_susceptibility was provided as an input. The shape is (M, 3, 3) where M is the number of degrees of freedom.

Return type:

ndarray with floats.

uniqueString()

Return a unique string representing the state of the object.

waveNumberAxis()
Returns:

The wave numbers used for the spectrum.

Return type:

PhysicalQuantity of type inverse length.

Usage Examples

Calculate the RamanSpectrum for an incoming and scattered light polarization equal to [1, 0, 0].

raman_spectrum = RamanSpectrum(
  configuration,
  dynamical_matrix,
  susceptibility_derivatives,
  method=PolarizationDependent,
  polarization_in=[1, 0, 0],
  polarization_out=[1, 0, 0])

When giving polarization_orthogonal, a polar spectrum is generated for a number of out polarizations given by number_of_angles.

raman_spectrum = RamanSpectrum(
    configuration,
    dynamical_matrix,
    susceptibility_derivatives
    method=PolarizationDependent,
    polarization_in=[1, 0, 0],
    polarization_orthogonal=[0, 1, 0],
    number_of_angles=101)

When using method=PolarizationAveraged, the light polarization is averaged and not given as input.

raman_spectrum = RamanSpectrum(
    configuration,
    dynamical_matrix,
    susceptibility_derivatives
    method=PolarizationAveraged)

Notes

Raman spectroscopy is a powerful noninvasive technique for material characterization that uniquely extracts information about vibrational and chemical properties, inhomogeneities, strain, crystallinity, electron-phonon coupling and anharmonicities in a local environment. Hereby Raman spectroscopy has become one of the main tools for characterization of emerging materials. Below we give a brief introduction to the theory of light-matter scattering and outline the implementation of Raman scattering in QuantumATK.

Light scattering in materials

The classical description of light scattering is based on the polarization of a material in the presence of an electric field. The polarization is given by

\[P_{\alpha} = p_{\alpha} + \varepsilon_0 \chi_{\alpha \beta}^{(1)} E_{\beta} + \varepsilon_0 \chi_{\alpha \beta \gamma}^{(2)} E_{\beta} E_{\gamma} + ...\]

where \(p_{\alpha}\) is the permanent dipole moment, \(\alpha, \beta, \gamma\) are Cartesian directions and \(\chi\) is the dielectric susceptibility tensor. The electric field can be expressed as a vector \(\mathbf{E} = E_0 \mathbf{g} e^{i(\mathbf{k}_l \mathbf{r}-\omega_l t)}\) with \(\mathbf{g}\) giving the light polarization vector, which is orthogonal to the propagation direction, and \(\mathbf{k}_l, \omega_l\) giving the wavevector and angular frequency of the light, respectively. The linear response function \(\chi_{\alpha \beta}^{(1)}\) describes how light can be modulated elastically from infrared and Rayleigh scattering or inelastically from Raman scattering. The nonlinear response function \(\chi_{\alpha \beta \gamma}^{(2)}\) describes higher order phenomena such as second harmonic generation.

Phenomenological linear response

Focusing on the linear response in the electric field, assuming a time-dependent electric field of the form \(E_{\alpha}=E_{0\alpha} \cos(\omega_{l}t)\) and Taylor expanding to lowest order in the vibrational modulation of the polarization by a time-dependent normal mode vibration \(u_{\lambda}=u_{0\lambda} \cos(\omega_{\lambda}t)\), we have:

\[\begin{split}P_{\alpha} &\approx& p_{0 \alpha} + \sum_{\lambda} \left.\frac{\partial p_{0 \alpha}}{\partial u_{\lambda}}\right|_{u=0}u_{0\lambda} \cos(\omega_{\lambda}t)\\ &+& \varepsilon_0 \chi_{0 \alpha \beta}^{(1)} E_{0\beta} \cos(\omega_{l}t) + \sum_{\lambda} \left.\frac{\partial\chi_{\alpha \beta}^{(1)}}{\partial u_{\lambda}}\right|_{u=0}u_{0\lambda} \cos(\omega_{\lambda}t) E_{0\beta} \cos(\omega_{l}t)\end{split}\]

Here \(\lambda\) labels the phonon modes. The second term describes a dipole moment oscillating with the vibrational mode frequency. Vibrational modes for which the permanent dipole moment changes with displacement are called infrared active modes. The third term describes the Rayleigh scattering at the same frequency as the incident light. Finally the fourth term gives rise to Raman scattering. From the trigonometric identity \(2\cos(\omega_{l}t)\cos(\omega_{\lambda}t)=\cos((\omega_{l}-\omega_{\lambda})t)+\cos((\omega_{l}+\omega_{\lambda})t)\) we see that this light induced polarization is ‘Raman shifted’ by the phonon frequencies. If the susceptibility changes with a given vibration the mode is Raman active.

Raman signals - Polarization dependent method

In solids the Raman spectra depends on the polarization of the incoming and scattered light compared to the crystal directions. The nonresonant Raman power cross-section from one-phonon excitations is within the Placzek approximation given by [1][2]:

\[\frac{d\sigma(\omega)}{dV} = N_{cells} \frac{\omega_s}{c^4 V} |\mathbf{g}_s \cdot \mathbf{\alpha}(\lambda) \cdot \mathbf{g}_i^T|^2 \times \frac{\hbar}{2\omega_{\lambda}} \left(n_{\lambda} +1 \right) \delta(\omega-\omega_{\lambda})\]

where \(\omega_{s/i}\, (\mathbf{g}_{s/i})\) is the frequency (polarization vector) of the scattered/incoming light, \(N_{cells}\) is the the number of unit cells in the sample, V is the unit cell volume, \(n_{\lambda}\) is the Bose-Einstein occupation of phonon mode \(\lambda\). Energy conservation imposes \(\omega_{s} = \omega_{i} \mp \omega_{\lambda}\) for Stokes and anti-Stokes processes, respectively. We use the Kubo-Greenwood formula to calculate the \(3\times3\) susceptibility matrix, see OpticalSpectrum. The derivatives are calculated using the finite differences, see SusceptibilityDerivatives.

Raman Tensor

The Raman tensor is given by

\[\mathbf{\alpha}_{\alpha \beta}(\lambda) = V \left.\frac{\partial\chi_{\alpha \beta}^{(1)}}{\partial u_{\lambda}}\right|_{u=0} = V \sum_{\mu}\sum_{l} \frac{\partial \chi_{\alpha \beta} }{\partial x_l} e_l^{\lambda}/\sqrt{m_{\mu}}\]

where \(\mu\) is the atom index, \(m_{\mu}\) is the atom mass, \(e_l^{\lambda}\) is the phonon eigenvector of mode \(\lambda\) and the derivative is evaluated with finite-differences. The Raman tensor is a \(3\times3\) matrix for each phonon mode.

Raman Spectrum

We define the Raman spectrum as the broadened intensities obtained from the projected Raman tensor:

\[I^{Raman}_{\lambda} = |\mathbf{g}_s \cdot \mathbf{\alpha}(\lambda) \cdot \mathbf{g}_i^T|\]

This is a number/intensity for each phonon mode \(\lambda\) which can then be combined to a spectrum by using an artificial broadening \(\sigma\). Several broadening frameworks can be used, but we apply the Gaussians:

\[I(\omega) = \sum_{\lambda}I^{Raman}_{\lambda}\delta(\omega-\omega_{\lambda}) \approx \sum_{\lambda}I^{Raman}_{\lambda}\frac{\text{exp}\left(-(\omega-\omega_{\lambda})^{2}/2 \sigma^{2}\right)}{\sqrt{2 \pi} \sigma}\,.\]

Raman signals - Polarization averaged results

From above we have the polarization dependent expression for the Raman power cross-section. One can derive an expression for the polarization averaged power cross-section. This is useful for modeling of at least two cases: (i) the crystal orientation and light polarization is unknown or (ii) experiments are averaged over a (large) variation of crystal orientations. A typical example of the latter is for a collection of molecules in a liquid with arbitrary orientations. The polarization averaged expression is given by:

\[\frac{d\sigma(\omega)}{dV} = N_{cells} \frac{\omega_s}{c^4 V} \frac{I^{Raman}}{45} \frac{\hbar}{2\omega_{\lambda}} \left(n_{\lambda} +1 \right)\delta(\omega-\omega_{\lambda})\]

The polarization averaged Raman intensity is given by

\[I^{Raman}_{\lambda} = 45 \tilde{\alpha}_{\lambda}^{2} + 7 \tilde{\beta}_{\lambda}^{2}\]

where

\[\tilde{\alpha}_{\lambda} = \frac{1}{3}\left(\alpha_{xx}+\alpha_{yy}+\alpha_{zz}\right)\]

is the average polarization and

\[\begin{split}\tilde{\beta}_{\lambda}^2 &=& \frac{1}{2} [(\alpha_{xx}-\alpha_{yy})^2+(\alpha_{xx}-\alpha_{zz})^2+(\alpha_{yy}-\alpha_{zz})^2]\\ &+& 3 (\alpha_{xy}^2+\alpha_{xz}^2+\alpha_{xz}^2)\end{split}\]

is the anisotropy factor of the susceptibility tensor derivative.

Raman signals - Polar Raman spectrum

It is often interesting to see how the Raman intensities for each phonon mode changes with angle between the input and scattered light. This is actually also measurable if one has a polarizer in the Raman setup that can be rotated. We plot a polar Raman spectrum by rotating the scattered light polarization between the input polarization \(\mathbf{g}_i\) and an orthogonal polarization direction \(\mathbf{g}_{\perp}\). Specifically we rotate the scattered light polarization as

\[\mathbf{g}_s(\theta) = \cos(\theta) \mathbf{g}_{i} + \sin(\theta) \mathbf{g}_{\perp}\]

The projected Raman tensor

\[I^{Raman}_{\lambda}(\theta) = |\mathbf{g}_s(\theta) \cdot \mathbf{\alpha}(\lambda) \cdot \mathbf{g}_i^T(\theta)|\]

then gives the intensity spectrum as a function of polarization rotation angle.