--- trunk/src/primitives/RigidBody.cpp 2005/09/28 16:32:44 636 +++ trunk/src/primitives/RigidBody.cpp 2005/12/02 15:38:03 770 @@ -164,27 +164,25 @@ namespace oopse { } // Moment of Inertia calculation - Mat3x3d Itmp(0.0); - + Mat3x3d Itmp(0.0); for (std::size_t i = 0; i < atoms_.size(); i++) { + Mat3x3d IAtom(0.0); mtmp = atoms_[i]->getMass(); - Itmp -= outProduct(refCoords_[i], refCoords_[i]) * mtmp; + IAtom -= outProduct(refCoords_[i], refCoords_[i]) * mtmp; double r2 = refCoords_[i].lengthSquare(); - Itmp(0, 0) += mtmp * r2; - Itmp(1, 1) += mtmp * r2; - Itmp(2, 2) += mtmp * r2; - } + IAtom(0, 0) += mtmp * r2; + IAtom(1, 1) += mtmp * r2; + IAtom(2, 2) += mtmp * r2; + Itmp += IAtom; - //project the inertial moment of directional atoms into this rigid body - for (std::size_t i = 0; i < atoms_.size(); i++) { + //project the inertial moment of directional atoms into this rigid body if (atoms_[i]->isDirectional()) { - RectMatrix Iproject = refOrients_[i].transpose() * atoms_[i]->getI(); - Itmp(0, 0) += Iproject(0, 0); - Itmp(1, 1) += Iproject(1, 1); - Itmp(2, 2) += Iproject(2, 2); - } + Itmp += refOrients_[i].transpose() * atoms_[i]->getI() * refOrients_[i]; + } } + // std::cout << Itmp << std::endl; + //diagonalize Vector3d evals; Mat3x3d::diagonalize(Itmp, evals, sU_); @@ -485,7 +483,7 @@ namespace oopse { "RigidBody error.\n" "\tAtom %s does not have a position specified.\n" "\tThis means RigidBody cannot set up reference coordinates.\n", - ats->getType() ); + ats->getType().c_str() ); painCave.isFatal = 1; simError(); } @@ -505,7 +503,7 @@ namespace oopse { "RigidBody error.\n" "\tAtom %s does not have an orientation specified.\n" "\tThis means RigidBody cannot set up reference orientations.\n", - ats->getType() ); + ats->getType().c_str() ); painCave.isFatal = 1; simError(); }