ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/SHAPES/RigidBody.cpp
(Generate patch)

Comparing trunk/SHAPES/RigidBody.cpp (file contents):
Revision 1276 by chrisfen, Thu Jun 17 21:27:38 2004 UTC vs.
Revision 1282 by chrisfen, Mon Jun 21 15:10:29 2004 UTC

# Line 1 | Line 1
1   #include <math.h>
2 + #include <iostream>
3   #include "RigidBody.hpp"
4   #include "VDWAtom.hpp"
5   #include "MatVec3.h"
# Line 173 | Line 174 | void RigidBody::calcRefCoords( ) {
174  
175   void RigidBody::calcRefCoords( ) {
176  
177 <  int i, j, it, n_linear_coords;
177 >  int i, j, it, n_linear_coords, pAxis, maxAxis, midAxis;
178    double mtmp;
179    vec3 apos;
180    double refCOM[3];
181    vec3 ptmp;
182    double Itmp[3][3];
183 +  double pAxisMat[3][3], pAxisRotMat[3][3];
184    double evals[3];
185    double r, r2, len;
186 <
186 >  double iMat[3][3];
187 >  double test[3];
188 >  
189    // First, find the center of mass:
190    
191    mass = 0.0;
# Line 193 | Line 197 | void RigidBody::calcRefCoords( ) {
197      mass += mtmp;
198  
199      apos = refCoords[i];
196    
200      for(j = 0; j < 3; j++) {
201        refCOM[j] += apos[j]*mtmp;    
202      }    
# Line 257 | Line 260 | void RigidBody::calcRefCoords( ) {
260    if (n_linear_coords > 1) {
261            printf(
262                 "RigidBody error.\n"
263 <               "\tOOPSE found more than one axis in this rigid body with a vanishing \n"
263 >               "\tSHAPES found more than one axis in this rigid body with a vanishing \n"
264                 "\tmoment of inertia.  This can happen in one of three ways:\n"
265                 "\t 1) Only one atom was specified, or \n"
266                 "\t 2) All atoms were specified at the same location, or\n"
# Line 266 | Line 269 | void RigidBody::calcRefCoords( ) {
269                 );
270                 exit(-1);    
271    }
272 <  
272 >
273    // renormalize column vectors:
274    
275    for (i=0; i < 3; i++) {
# Line 279 | Line 282 | void RigidBody::calcRefCoords( ) {
282        sU[i][j] /= len;
283      }
284    }
285 +  
286 +  //sort and reorder the moment axes
287 +
288 +  // The only problem below is for molecules like C60 with 3 nearly identical
289 +  // non-zero moments of inertia.  In this case it doesn't really matter which is
290 +  // the principal axis, so they get assigned nearly randomly depending on the
291 +  // floating point comparison between eigenvalues
292 +  if (! is_linear) {
293 +    pAxis = 0;
294 +    maxAxis = 0;
295 +  
296 +    for (i = 0; i < 3; i++) {
297 +      if (evals[i] < evals[pAxis]) pAxis = i;
298 +      if (evals[i] > evals[maxAxis]) maxAxis = i;
299 +    }
300 +  
301 +    midAxis = 0;
302 +    for (i=0; i < 3; i++) {
303 +      if (pAxis != i && maxAxis != i) midAxis = i;
304 +    }
305 +  } else {
306 +    pAxis = linear_axis;
307 +    // linear molecules have one zero moment of inertia and two identical
308 +    // moments of inertia.  In this case, it doesn't matter which is chosen
309 +    // as mid and which is max, so just permute from the pAxis:
310 +    midAxis = (pAxis + 1)%3;
311 +    maxAxis = (pAxis + 2)%3;
312 +  }
313 +      
314 +  //let z be the smallest and x be the largest eigenvalue axes
315 +  for (i=0; i<3; i++){
316 +    pAxisMat[i][2] = sU[i][pAxis];
317 +    pAxisMat[i][1] = sU[i][midAxis];
318 +    pAxisMat[i][0] = sU[i][maxAxis];
319 +  }
320 +    
321 +  //calculate the proper rotation matrix
322 +  transposeMat3(pAxisMat, pAxisRotMat);
323 +  
324 +  
325 +  for (i=0; i<myAtoms.size(); i++){
326 +    apos = refCoords[i];
327 +    printf("%f\t%f\t%f\n",apos[0],apos[1],apos[2]);
328 +  }
329 +    
330 +  //rotate the rigid body to the principle axis frame
331 +  for (i = 0; i < myAtoms.size(); i++) {
332 +    matVecMul3(pAxisRotMat, refCoords[i].vec, refCoords[i].vec);
333 +    myAtoms[i]->setPos(refCoords[i].vec);
334 +  }
335 +  
336 +  for (i=0; i<myAtoms.size(); i++){
337 +    apos = refCoords[i];
338 +    printf("%f\t%f\t%f\n",apos[0],apos[1],apos[2]);
339 +  }
340 +  
341 +  identityMat3(iMat);
342 +  setA(iMat);
343   }
344  
345   void RigidBody::doEulerToRotMat(double euler[3], double myA[3][3] ){
# Line 473 | Line 534 | void RigidBody::getAtomRefCoor(double pos[3], int inde
534    pos[2] = ref[2];
535    
536   }
537 +
538 + double RigidBody::getAtomRpar(int index){
539 +  
540 +  return myAtoms[index]->getRpar();
541 +  
542 + }
543 +
544 + double RigidBody::getAtomEps(int index){
545 +  
546 +  return myAtoms[index]->getEps();
547 +  
548 + }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines