Raman spectroscopy

GPAW offers two ways of calculating Raman intensities. One can use the ASE Raman utility together with the GPAW LRTDDFT module as shown in the Resonant Raman tutorial (Resonant-)Raman spectra of gas-phase water.

GPAW also implements Raman spectroscopy for zone-center phonons of extended systems using the electron-phonon coupling (see Electron-Phonon Coupling Theory and Electron-phonon coupling) within 3rd order perturbation theory Taghizadeh et a. [1] , which is discussed here. This method is currently only implementated for the LCAO mode.

The Stokes Raman intensity can be written as

\[I(\omega) = I_0 \sum_\nu \frac{n_\nu+1}{\omega_\nu} \vert \sum_{\alpha, \beta} u_{in}^\alpha R_{\alpha \beta}^\nu u_{out}^\beta \vert^2 \delta(\omega-\omega_\nu)\]

where \(\nu\) denotes phonon modes and \(\alpha\), \(\beta\) denote polarisations of the incoming and outgoing laser light. The Raman tensor \(R_{\alpha \beta}^\nu\) has six terms and is given by Ref. [1] Eq. (10)

\[\begin{split}R_{\alpha \beta}^\nu \equiv \sum_{ijmn \mathbf{k}} \left[ \frac{p_{ij}^\alpha (g_{jm}^\nu \delta_{in} - g_{ni}^\nu \delta_{jm})p_{mn}^\beta}{(\hbar \omega_{in}-\varepsilon_{ji})(\hbar \omega_{out}-\varepsilon_{mn})} + \frac{p_{ij}^\alpha (p_{jm}^\beta \delta_{in} - p_{ni}^\beta \delta_{jm})g_{mn}^\nu}{(\hbar \omega_{in}-\varepsilon_{ji})(\hbar \omega_{\nu}-\varepsilon_{mn})} + \\ \frac{p_{ij}^\beta (g_{jm}^\nu \delta_{in} - g_{ni}^\nu \delta_{jm})p_{mn}^\alpha}{(-\hbar \omega_{out}-\varepsilon_{ji})(-\hbar \omega_{in}-\varepsilon_{mn})} + \frac{p_{ij}^\beta (p_{jm}^\alpha \delta_{in} - p_{ni}^\alpha \delta_{jm})g_{mn}^\nu}{(-\hbar \omega_{out}-\varepsilon_{ji})(\hbar \omega_{\nu}-\varepsilon_{mn})} + \\ \frac{g_{ij}^\nu (p_{jm}^\alpha \delta_{in} - p_{ni}^\alpha \delta_{jm})p_{mn}^\beta}{(-\hbar \omega_{\nu}-\varepsilon_{ji})(\hbar \omega_{out}-\varepsilon_{mn})} + \frac{g_{ij}^\nu (p_{jm}^\beta \delta_{in} - p_{ni}^\beta \delta_{jm})p_{mn}^\alpha}{(-\hbar \omega_{\nu}-\varepsilon_{ji})(-\hbar \omega_{in}-\varepsilon_{mn})} \right] f_i(1-f_j)f_n(1-f_m)\end{split}\]

The first term is considered to be the resonant term of the expression, the other terms represent different time orderings of the interaction in the Feynman diagrams.

To compute the Raman intensity we need these ingredients: The momentum matrix elements \(p_{ij}^\alpha=\langle i \mathbf{k} | \hat p^\alpha| j \mathbf{k} \rangle\), the electron-phonon matrix \(g_{ij}^\nu = \langle i \mathbf{k} \vert \partial_{\nu{q=0}} V^{KS} \vert j \mathbf{k} \rangle\) in the optical limit \(\mathbf{q}=0\) and of course knowledge of the electronic states and phonon modes throughout the Brillouin zone. For these calculations we can employ in the get_momentum_transitions() method, the GPAW electron-phonon module Electron-phonon coupling and the ASE phonon module, respectively.

It is required to calculate all properties for the full Brillouin zone using \(symmetry=off\). By default the routine saves a file called mom_skvnm.npy containing the momentum matrix. This can be deactivated using the savetofile switch. The matrix is always the return value of get_momentum_transitions().

Energy changes for phonons and potential changes for electron-phonon couplings are both computed using a finite displacement technique. Both quantities can be obtained simultaenously. In principle the phonon modes can be obtained in any fashion, which yields an ASE phonon object though. For small systems the finite displacement method has the disadvantage of leading to an interaction of a displaced atom with its periodic images. This can lead to large errors especially in the electron-phonon matrix. This can be avoided by using a sufficiently large supercell for the finite displacement simulations.

If phonon and effective potential are calculated simultaenously, results are saved in the same cache files with default name \(elph\).

Some more details are elaborated in the related tutorial Raman spectroscopy for extended systems.

References

Code

class gpaw.elph.ResonantRamanCalculator(calc, wph_w, momname='mom_skvnm.npy', elphname='gsqklnn.npy', raman_name='Rlab')[source]

Resonant Raman Matrix calculator

Parameters:
  • calc (GPAW) – GPAW calculator object.

  • w_ph (str, np.ndarray) – Zone centre phonon frequencies in eV

  • momname (str) – Name of momentum file

  • elphname (str) – Name of electron-phonon file

  • raman_name (str) – Name of Rlab file cache. Default ‘Rlab’

calculate(w_in, d_i, d_o, gamma_l=0.1, limit_sum=False)[source]

Calculate resonant Raman matrix

Parameters:
  • w_in (float) – Laser frequency in eV

  • d_i (int) – Incoming polarization

  • d_o (int) – Outgoing polarization

  • gamma_l (float) – Line broadening in eV, (0.1eV=806rcm)

  • limit_sum (bool) – Limit sum to occupied valence/unoccupied conduction states Use for debugging and testing. Don’t use in production

calculate_raman_tensor(w_in, gamma_l=0.1)[source]

Calculate whole Raman tensor

Parameters:
  • w_in (float) – Laser frequency in eV

  • gamma_l (float) – Line broadening in eV, (0.1eV=806rcm)

classmethod resonant_term(f_vc, E_vc, mom_dnn, elph_lnn, nc, nv, w_in, wph_w)[source]

Resonant term of the Raman tensor

class gpaw.elph.RamanData(raman_name='Rlab', gridspacing=1.0)[source]

Raman Spectroscopy data.

Parameters:
  • raman_name (str) – Name of Rlab file cache. Default ‘Rlab’

  • gridspacing (float) – grid spacing in cm^-1, default 1 rcm

calculate_raman_intensity(d_i, d_o, T=300, sigma=5.0)[source]

Calculates Raman intensities from Raman tensor.

Returns bare \(|R|^2\) and and Bose occupation weighted values

Parameters:
  • d_i (int) – Incoming polarization

  • d_o (int) – Outgoing polarization

  • T (float) – Temperature in Kelvin

  • sigma (float) – Gaussian line width in rcm, default 5rcm

calculate_raman_spectrum(entries, T=300, sigma=5.0)[source]

Calculates Raman intensities from Raman tensor.

Returns Raman shift in eV, bare \(|R|^2\) and Bose occupation weighted \(|R|^2\) values

Parameters:
  • entries (str, list) – Sting or list of strings with desired polarisaitons For example: [“xx”, “yy”, “xy”, “yx”]

  • T (float) – Temperature in Kelvin

  • sigma (float) – Gaussian line width in rcm, default 5rcm

classmethod plot_raman(figname, grid_w, spectra_nw, labels_n=None, relative=False)[source]

Plots a given Raman spectrum.

Parameters:
  • figname (str) – Filename for figure.

  • grid_w – Frequency grid of spectrum in eV

  • spectra_nw (np.ndarray) – Raman spectra to plot

  • labels_n (list) – Labels for the legend

  • relative (bool) – If true, normalize each spectrum to 1 Default is False

gpaw.lcao.dipoletransition.get_momentum_transitions(wfs, savetofile=True)[source]

Finds the momentum matrix elements: <nk|p|mk> = k delta_nm - i <nk|nabla|mk>

Parameters:
  • wfs – LCAO WaveFunctions object

  • savetofile (bool) – Determines whether matrix is written to the file mom_skvnm.npy (default=True)