qml.qchem.localize_normal_modes

localize_normal_modes(freqs, vecs, bins=[2600])[source]

Computes spatially localized vibrational normal modes.

The vibrational normal modes are localized using a localizing unitary following the procedure described in J. Chem. Phys. 141, 104105 (2014). The localizing unitary \(U\) is defined in terms of the normal and local coordinates, \(q\) and \(\tilde{q}\), respectively as:

\[\tilde{q} = \sum_{j=1}^M U_{ij} q_j,\]

where \(M\) is the number of modes. The normal modes can be separately localized, to prevent mixing between specific groups of normal modes, by defining frequency ranges in bins. For instance, bins = [2600] allows to separately localize modes that have frequencies above and below \(2600\) reciprocal centimetre (\(\text{cm}^{-1}\)). Similarly, bins = [1300, 2600] allows to separately localize modes in three groups that have frequencies below \(1300\), between \(1300-2600\) and above \(2600\).

Parameters:
  • freqs (TensorLike[float]) – normal mode frequencies in reciprocal centimetre (\(\text{cm}^{-1}\)).

  • vecs (TensorLike[float]) – displacement vectors of the normal modes

  • bins (List[float]) – grid of frequencies for grouping normal modes. Default is [2600].

Returns:

A tuple containing the following:
  • TensorLike[float] : localized frequencies in reciprocal centimetre (\(\text{cm}^{-1}\)).

  • List[TensorLike[float]] : localized displacement vectors

  • TensorLike[float] : localization matrix describing the relationship between the original and the localized modes

Return type:

tuple

Example

>>> freqs = np.array([1326.66001461, 2297.26736859, 2299.65032901])
>>> vectors = np.array([[[ 5.71518696e-18, -4.55642350e-01,  5.20920552e-01],
...                      [ 1.13167924e-17,  4.55642350e-01,  5.20920552e-01],
...                      [-1.23163569e-17,  5.09494945e-12, -3.27565762e-02]],
...                     [[-4.53008817e-17,  4.90364125e-01,  4.90363894e-01],
...                      [-1.98591028e-16,  4.90361513e-01, -4.90361744e-01],
...                      [-2.78235498e-18, -3.08350419e-02, -6.75886679e-08]],
...                     [[ 5.75393451e-17,  5.37047963e-01,  4.41957355e-01],
...                      [ 6.53049347e-17, -5.37050348e-01,  4.41959740e-01],
...                      [-5.49709883e-17,  7.49851221e-08, -2.77912798e-02]]])
>>> freqs_loc, vecs_loc, uloc = qml.qchem.localize_normal_modes(freqs, vectors)
>>> freqs_loc
array([1332.62013257, 2296.73453455, 2296.73460655])