How to move atom coordinates along a normal mode given the eigenvector?

I need to displace atoms along a complicated normal mode involving many atoms. I have the normal mode eigenvector, I just don't know how to turn the eigenvector into an algorithm to translate the actual points "along" the normal mode by a given distance for the normal coordinate. I can't find the answer anywhere. Even just a mathematical description of this task would be helpful. I can code from that. Basically, I need to know how programs like GaussView and WebMO show you the normal modes in motion given the eigenvectors - that algorithm.

• Most probably you have the normal mode expressed in Cartesian coordinates, where the orientation of the xyz axises is the orientation that the calculation software uses.
– Greg
Jan 13 at 2:08
• What do you mean by "complicated"? The problem is not that more complicated whether you have two atoms or more. In essence you are "adding vectors" to points (or translating points linearly along directions defined by vectors). Jan 13 at 8:34

This answer is primarily applicable to gas-phase molecules. I've never done this for periodic systems, so maybe someone can supplement with an answer for that context.

Presumably you have eigenvector of length $$3N$$ where $$N$$ is the number of atoms. Call this eigenvector $$\mathbf{v}$$. Typically we think of xyz cartesian coordinates as an $$N\times3$$ matrix, but if you just flatten this matrix into a vector, $$\mathbf{r}$$, where the elements are ordered as $$[x_1,y_1,z_1,x_2,y_2,z_2,\cdots]$$, then you just need to scale the eigenvector and add it to $$\mathbf{r}$$ to displace along that normal mode.

That is, $$\tag{1} \mathbf{r}_{disp}=\mathbf{r}+\lambda\mathbf{v}$$ where $$\lambda$$ is a constant you can choose. The actual values of $$\lambda$$ are generally chosen just to make the displacements easy to visualize. As noted in the comments, one could associate the maximum displacement with temperature and hence give some physical meaning to $$\lambda$$. Since thermal fluctuations are likely to be fairly small compared to zero-point fluctuations, this isn't that common (at least I haven't seen it). So, you should pick a range of $$\lambda$$ values which give a nice visualization of how the atoms move.

In python code (which probably won't run) this would look something like,

lam = np.linspace(-0.1,0.1,21)
r_disp = [r.flatten() + lam[i] * v for i in range(len(lam))]
r_disp = [r_disp[i].reshape(-1,3) for i in range(len(r_disp))]

You then want to write out each of the 21 geometries the above code generates and they should give a nice animation of what happens when moving along a particular mode.

• I mean, you can calculate the magnitude of a displacement along a particular normal mode at a particular temperature, so $\lambda$ isn't meaningless. Generally for visualization, people may increase the amplitude to make it easier to visualize, which is I think what you mean. Jan 14 at 19:13
• @GeoffHutchison Good point. I had not thought about the connection between $\lambda$ and temperature. I have only ever done what you suggest and use it just to make the displacements easier to see. Jan 14 at 20:52
• I edited to make my statement a bit less severe (and a bit more correct). Jan 14 at 20:58
• Presumably you are talking about molecules? I think it would be helpful to clarify this point, because this would not work in solids using periodic boundary conditions. Jan 14 at 21:55
• @jheindel thanks for clarifying! In solids the eigenvector needs to be multiplied by a complex exponential e^{iq*R} to get the correct atomic displacement patterns, where q is the phonon wave vector. After that, one can do what you've described. Jan 15 at 7:41