ExpHP / rsp2

phonons in rust
Apache License 2.0
2 stars 1 forks source link

Idea for rotational mode detection #96

Open ExpHP opened 5 years ago

ExpHP commented 5 years ago

1. Translate

First, the coords must be translated to place any vacuum separation at the cell borders, and then mapped into the unit cell, because the concept of rotational modes only exists in aperiodic systems.

2. Find a best fit rotation axis

Now imagine, if you will, that the atomic displacements of a phonon are linear velocities. If a mode is perfectly rotational, then there exists a point P and a vector omega such that

v_n = omega ⨯ (x_n - P)

for all site indices n. Of course, this does not uniquely determine P; for that, we simply choose the point on the axis of rotation that is closest to the origin:

P ∙ omega = 0

Altogether this gives you 3n + 1 residuals you can stick into any nonlinear least squares solver to solve for 6 independent variables. (P and omega)

A good initial guess for P is probably the cell center. Choose a random initial omega.

3. Construct the eigenmode and project

Determine the quality of the fit by constructing the pure rotational mode (use v_n as defined above, then mass reduce and normalize) and computing the overlap with the eigenvector.

If the overlap is close to the norm of the eigenvector, it's a good fit and the mode is rotational!

(If it's not close, then I wouldn't place too much stock in the precise value found for the overlap, because the other stuff in the eigenvector may have influenced the fit)