Thanks Ralf and Konrad for the explanation,<br>Let me see if I got it right:<br><br>* EnergeticNormalModes diagonalizes the hessian matrix (K) , in cartesian coordinates. If temperature = None, eigenvectors are normalized, otherwise the norm is temperature-dependent. Therefore dotProduct directly tests for orthogonalisation.<br>
<br>
* VibrationalNormalModes (or default NormalModes) diagonalizes the mass-weighted hessian matrix : K' = 1/sqrt(M) K 1/sqrt(M))  where M are the masses of the atoms. The <i>resulting eigenvectors are expressed also in mass-weighted cartesian coordinates</i>. Therefore one needs to use the massWeighted versions of dotProduct and norm to work with them. In particular, a vector e' in mass-weighted coords is related to the cartesian vector e as:<br>

e'=1/sqrt(M)e <br><br>So in order to have the eigenvectors of K' in cartesian corrdinates one should do something like (given m1 and m2 as vibrational modes):<br>m = m1.universe.masses().array<br>m1cart = np.ravel((m1.array) * np.sqrt(m[:, np.newaxis]))<br>

m2cart = np.ravel((m2.array) * np.sqrt(m[:, np.newaxis]))<br>It is then true that m1cart.dot(m2cart)=0. and m1cart.dot(m1cart)=1.<br>(dotProduct no longer applies because these are numpy arrays, not VibrationalMode objects)<br>
I hope this is correct and I think it will help future readers of the list.<br>Cheers,<br>Ramon<br><br><br><br><div class="gmail_quote">2012/4/12 Konrad Hinsen <span dir="ltr"><<a href="mailto:research@khinsen.fastmail.net" target="_blank">research@khinsen.fastmail.net</a>></span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div>--On 12 avril 2012 13:13:04 +0200 Ramon Crehuet <<a href="mailto:rcrehuet@gmail.com" target="_blank">rcrehuet@gmail.com</a>> wrote:<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi,<br>
I have performed a normal mode calculation (Calpha) and I am not sure I<br>
understand how to scale the modes so that they are orthonormalized.<br>
</blockquote>
<br></div>
Which kind of mode do you use?<br>
<br>
EnergeticModes: the mode vectors are orthogonal to each other, i.e.<br>
<br>
  modes[i].dotProduct(modes[j])<br>
<br>
is zero for i != j. For i==j, you get the thermal amplitude of the mode.<br>
<br>
VibrationalModes: the mode vectors are in unweighted Cartesian coordinates, meaning they are not orthogonal. However, you have<br>
<br>
  modes[i].<u></u>massWeightedDotProduct(modes[<u></u>j])<br>
<br>
which should be zero for i == j.<br>
<br>
For both kinds of modes, you can specify temperature=None to skip scaling by the thermal fluctuation amplitudes. Then you should see the norms being equal to one.<span><font color="#888888"><br>
<br>
Konrad.<br>
<br>
</font></span></blockquote></div><br>