<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FFFFFF">
<pre>Hi

sorry but this is not ok
The mistake in your writing are these two:
>e'=1/sqrt(M)e   this is wrong as shown below
in
>m1cart = np.ravel((m1.array) * np.sqrt(m[:, np.newaxis]))
m1 is already in cartesian coordinates (unweighted)
for Energetic Modes you are right (weight =1)
for Vibrational modes not


I try to explain:
I use ' for time derivative  (see text books or one of Konrads papers)

M*r''=-K*r     (1)       as the equation of motion with force and mass 
                         matrix K and M

r= A*exp(-i*w*t)      is assumed as a solution to transform the double 
                      time derivative to
r''=-w**2*A*exp(-i*w*t)=-w**2*r

(1) ->  M*w^2*r=K*r

This look like an eigenequation    K^*e^=lam*e^   with eigenvalue lam 
and eigenvector e^
We get this if we divide by M, but this is wrong because we deal with 
vectors and matrices and not with scalars.

So we use
a :   M=sqrt(M)*sqrt(M) and
b:     1=sqrt(M)**-1 * sqrt(M)
in (1)
->     a                              b
  sqrt(M)*sqrt(M) * w^2*r=K* sqrt(M)**-1*sqrt(M)  *r    (2)

now we multiply both sides with sqrt(M)**-1 from left side 
and take w**2 in front

  w**2 * sqrt(M) *r=sqrt(M)**-1*K* sqrt(M)**-1 * sqrt(M)  *r

with the new mass weighted coordinates
  r^ = sqrt(M) *r
and mass weighted  force matrix   
  K^ = sqrt(M)**-1*K* sqrt(M)**-1

  w**2 * r^=K^ * r^        (3)    from (2) is reached

This is solved and gives the mass weighted eigenvectors r^_i for 
eigenvalue w**2_i
which are orthogonal 
  r^_i * r^_j=delta_ij = 1 for i=j ; else 0
in the normal dotProduct *

r^_i * r^_j=delta_ij     transformed to unweighted coordinates is

        ->   a
r_i * sqrt(M)*sqrt(M) * r_j=delta_ij

r_i _M*_ r_j=delta_ij      (4)  with _M*_=*M* as massWeightedDotProduct
                                for unweighted coordinates

this does not conclude  r_i * r_j=delta_ij

Now the modes of MMTK are the unweighted space coordinates r_i of a mode 
in amplitude determined by the temperature. For T=0 normalized to 1 as 
Konrad pointed out.
This is also true for Frictional modes with a different weight or 
Energetic with weight=1.
Orthogonal eigenvectors can be accessed as modes.rawMode(i) and tested 
for orthogonality

To test for orthogonality you can use also as in (4)
r_i.massWeightedDotProduct(r_j)
or as Konrad wrote it modes[i].massWeightedDotProduct(modes[j])

Perhaps this helps

Best Ralf

</pre>
<pre class="moz-signature" cols="72">Viele Grüsse
and best wishes

Ralf Biehl


-- 

Dr. Ralf Biehl
Jülich Centre for Neutron Science (JCNS-1) &
Institute for Complex Systems (ICS-1)
Forschungszentrum Jülich
52425 Jülich
Germany

Tel.:   +49-(0)2461-61-4685
Fax:    +49-(0)2461-61-2610
Email:  <a class="moz-txt-link-abbreviated" href="mailto:ra.biehl@fz-juelich.de">ra.biehl@fz-juelich.de</a>
Web:    <a class="moz-txt-link-freetext" href="http://www.fz-juelich.de/iff/d_ins">http://www.fz-juelich.de/iff/d_ins</a></pre>
<br>
On 17.04.2012 11:54, Ramon Crehuet wrote:
<blockquote type="cite">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].massWeightedDotProduct(modes[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>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset> <br>
<pre>_______________________________________________
mmtk maillist  -  <a class="moz-txt-link-abbreviated" href="mailto:mmtk@starship.python.net">mmtk@starship.python.net</a>
<a class="moz-txt-link-freetext" href="http://starship.python.net/mailman/listinfo/mmtk">http://starship.python.net/mailman/listinfo/mmtk</a>
</pre>
</blockquote>
<br>
<font face="Arial" color="Black" size="1"><br>
------------------------------------------------------------------------------------------------<br>
------------------------------------------------------------------------------------------------<br>
Forschungszentrum Juelich GmbH<br>
52425 Juelich<br>
Sitz der Gesellschaft: Juelich<br>
Eingetragen im Handelsregister des Amtsgerichts Dueren Nr. HR B 3498<br>
Vorsitzender des Aufsichtsrats: MinDir Dr. Karl Eugen Huthmacher<br>
Geschaeftsfuehrung: Prof. Dr. Achim Bachem (Vorsitzender),<br>
Karsten Beneke (stellv. Vorsitzender), Prof. Dr.-Ing. Harald Bolt,<br>
Prof. Dr. Sebastian M. Schmidt<br>
------------------------------------------------------------------------------------------------<br>
------------------------------------------------------------------------------------------------<br>
<br>
Kennen Sie schon unsere app? http://www.fz-juelich.de/app<br>
</font>
</body>
</html>