[MMTK] Orthogonality of normal modes
Ramon Crehuet
rcrehuet at gmail.com
Tue Apr 17 09:54:33 UTC 2012
Thanks Ralf and Konrad for the explanation,
Let me see if I got it right:
* 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.
* 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 *resulting eigenvectors are expressed also in
mass-weighted cartesian coordinates*. 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:
e'=1/sqrt(M)e
So in order to have the eigenvectors of K' in cartesian corrdinates one
should do something like (given m1 and m2 as vibrational modes):
m = m1.universe.masses().array
m1cart = np.ravel((m1.array) * np.sqrt(m[:, np.newaxis]))
m2cart = np.ravel((m2.array) * np.sqrt(m[:, np.newaxis]))
It is then true that m1cart.dot(m2cart)=0. and m1cart.dot(m1cart)=1.
(dotProduct no longer applies because these are numpy arrays, not
VibrationalMode objects)
I hope this is correct and I think it will help future readers of the list.
Cheers,
Ramon
2012/4/12 Konrad Hinsen <research at khinsen.fastmail.net>
> --On 12 avril 2012 13:13:04 +0200 Ramon Crehuet <rcrehuet at gmail.com>
> wrote:
>
> Hi,
>> I have performed a normal mode calculation (Calpha) and I am not sure I
>> understand how to scale the modes so that they are orthonormalized.
>>
>
> Which kind of mode do you use?
>
> EnergeticModes: the mode vectors are orthogonal to each other, i.e.
>
> modes[i].dotProduct(modes[j])
>
> is zero for i != j. For i==j, you get the thermal amplitude of the mode.
>
> VibrationalModes: the mode vectors are in unweighted Cartesian
> coordinates, meaning they are not orthogonal. However, you have
>
> modes[i].**massWeightedDotProduct(modes[**j])
>
> which should be zero for i == j.
>
> 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.
>
> Konrad.
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://starship.python.net/pipermail/mmtk/attachments/20120417/6ce8519b/attachment.html>
More information about the mmtk
mailing list