ExpHP / rsp2

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

Acoustic mode detection is too harsh (rotating nanotubes, noninteracting planes...) #48

Open ExpHP opened 6 years ago

ExpHP commented 6 years ago

There can be acoustic modes which do not have a value near 1 for the property that rsp2 defines as "acousticness". This makes the eigenmode-directed relaxation algorithm very angry.

Not sure how to detect such modes. It's probably easier to just make eigenmode-directed relaxation optional.

colin-daniels commented 6 years ago

It's pretty hard to tell how exactly you classify the modes as acoustic in eigenvector-classify, but it'd definitely be nice to still have the eigenmode-directed relaxation if possible (even if it's just for the modes that rsp2 knows how to deal with).

ExpHP commented 6 years ago

Oops eigenvector-classify isn't supposed to exist any more (the source file appears to have been left behind by accident; I've deleted it now.). The implementation in that crate was completely bass ackwards, and you would never believe that this is what it was computing:

Here is the current implementation, and an even plainer visual:

let evec_hat = normalize([x1 y1 z1 x2 y2 z2 x3 y3 z3 ... xN yN zN])
let    x_hat = normalize([ 1  0  0  1  0  0  1  0  0 ...  1  0  0])
let    y_hat = normalize([ 0  1  0  0  1  0  0  1  0 ...  0  1  0])
let    z_hat = normalize([ 0  0  1  0  0  1  0  0  1 ...  0  0  1])

let acousticness = (evec_hat . x_hat)**2
                 + (evec_hat . y_hat)**2
                 + (evec_hat . z_hat)**2

eigenvector-classify implemented it in terms of a more general function that also described "layer-acousticness"; i.e. the probability dotted with the 3L modes (for L layers) where one layer moves uniformly. That is now computed here much more plainly, in terms of acousticness.

(never mind the complexity hiding within Partition, which is used there to split the eigenvector into layers)

ExpHP commented 6 years ago

I have an idea for rotational modes:

One of the following:

The second one feels to me like it will be most reliable.

Ehhhhh scratch that. A mode not at the equilibrium point will also have forces pointing the same way in either direction. More accurately, perhaps, we should consider the differences between the forces at those points and the forces in the current structure.


Edit (05-15-2019):

The above has been implemented in rsp2 since forever and it basically never, ever works.