File: raman.rst

package info (click to toggle)
python-ase 3.26.0-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 15,484 kB
  • sloc: python: 148,112; xml: 2,728; makefile: 110; javascript: 47
file content (146 lines) | stat: -rw-r--r-- 4,653 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
Resonant and non-resonant Raman spectra
=======================================

.. note::
   Raman spectra can also be obtained via :mod:`~ase.calculators.siesta` calculator.

Raman spectra can be calculated in various approximations [1]_.
While the examples below are using GPAW_ explicitly,
the modules are intended to work with other calculators also.
The strategy is to calculate vibrational properties first and
obtain the spectra from these later.

---------------------------------
1. Finite difference calculations
---------------------------------

1a. Forces and excitations
--------------------------

The basis for all spectra are finite difference calculations
for forces and excited states of our system.
These can be performed using the
:class:`~ase.vibrations.resonant_raman.ResonantRamanCalculator`.

.. autoclass:: ase.vibrations.resonant_raman.ResonantRamanCalculator


1b. More accurate forces
------------------------

It is possible to do a vibrational also with a more accurate calculator
(or more accurate settings for the forces) using
the :class:`~ase.vibrations.Vibrations` or  :class:`~ase.vibrations.Infrared`
modules.

In the example of molecular hydrogen with GPAW_ this is

.. literalinclude:: H2_ir.py

This produces a calculation with rather accurate forces in order
to get the Hessian and thus the vibrational frequencies as well
as Eigenstates correctly.

In the next step we perform a finite difference optical calculation
with less accuracy,
where the optical spectra are evaluated using TDDFT

.. literalinclude:: H2_optical.py
		    

1c. Overlaps
------------

Albrecht B+C terms need wave function overlaps between equilibrium and
displaced structures. These are assumed to be
calculated in the form

.. math::

  o_{ij} = \int d\vec{r} \; \phi_i^{{\rm disp},*}(\vec{r})
  \phi_j^{{\rm eq}}(\vec{r})
   
where `\phi_j^{{\rm eq}}` is an orbital at equilibrium position
and `\phi_i^{\rm disp}` is an orbital at displaced position.

The ``H2MorseExcitedStatesCalculator`` has a function ``overlap()`` for this.
We therfore write data including the overlap as

.. literalinclude:: H2Morse_calc_overlap.py

In GPAW this is implemented in ``Overlap``
(approximated by pseudo-wavefunction overlaps) and can be triggered
in ``ResonantRamanCalculator`` by


.. literalinclude:: H2_optical_overlap.py


2. Analysis of the results
--------------------------

We assume that the steps above were performed and are able to analyse the
results in different approximations.

Placzek
```````

The most popular form is the Placzeck approximation that is present in
two implementations. The simplest is the direct evaluation from
derivatives of the frequency dependent polarizability::

  from ase.calculators.h2morse import (H2Morse,
                                       H2MorseExcitedStates)
  from ase.vibrations.placzek import Placzek

  photonenergy = 7.5  # eV
  pz = Placzek(H2Morse(), H2MorseExcitedStates)
  pz.summary(photonenergy)


The second implementation evaluates the derivatives differently, allowing
for more analysis::

  import pylab as plt
  from ase.calculators.h2morse import (H2Morse,
                                       H2MorseExcitedStates)
  from ase.vibrations.placzek import Profeta
  
  photonenergy = 7.5  # eV
  pr = Profeta(H2Morse(), H2MorseExcitedStates, approximation='Placzek')
  x, y = pr.get_spectrum(photonenergy, start=4000, end=5000, type='Lorentzian')
  plt.plot(x, y)
  plt.show()

Both implementations should lead to the same spectrum.

``Profeta`` splits the spectra in two contributions that can be accessed as
``approximation='P-P'`` and ``approximation='Profeta'``, respectively.
Their sum should give ``approximation='Placzek'``.
See more details in [1]_.

Albrecht
````````

The more accurate Albrecht approximations partly need overlaps
to be present. We therefore have to invoke the ``Albrecht`` object as::

  from ase.calculators.h2morse import (H2Morse,
                                       H2MorseExcitedStates)
  from ase.vibrations.albrecht import Albrecht
  
  photonenergy = 7.5  # eV
  al = Albrecht(H2Morse(), H2MorseExcitedStates, approximation='Albrecht', overlap=True)
  x, y = al.get_spectrum(photonenergy, start=4000, end=5000, type='Lorentzian')

``Albrecht`` splits the spectra in two contributions that can be accessed as
``approximation='Albrecht A'`` and ``approximation='Albrecht BC'``,
respectively.
Their sum should give ``approximation='Albrecht'``.
See more details in [1]_.

  
.. _GPAW: https://gpaw.readthedocs.io/
  
.. [1] :doi:`Ab-initio wave-length dependent Raman spectra: Placzek approximation and beyond <10.1021/acs.jctc.9b00584>`