--- trunk/OOPSE/libmdtools/Molecule.cpp 2003/03/31 21:50:59 438 +++ trunk/OOPSE/libmdtools/Molecule.cpp 2004/04/12 20:32:20 1097 @@ -1,4 +1,4 @@ -#include +#include #include "Molecule.hpp" @@ -12,6 +12,7 @@ Molecule::Molecule( void ){ myBonds = NULL; myBends = NULL; myTorsions = NULL; + myRigidBodies = NULL; } @@ -40,10 +41,12 @@ Molecule::~Molecule( void ){ delete[] myTorsions; } - if( myExcludes != NULL ){ - for(i=0; iupdateAtoms(); + } + for(i=0; icalc_forces(); } @@ -80,6 +87,9 @@ void Molecule::calcForces( void ){ for(i=0; icalc_forces(); } + + // Rigid Body forces and torques are done after the fortran force loop + } @@ -118,4 +128,122 @@ void Molecule::printMe( void ){ for(i=0; iprintMe(); } + } + +void Molecule::moveCOM(double delta[3]){ + double aPos[3]; + int i, j; + + for(i=0; igetPos( aPos ); + + for (j=0; j< 3; j++) + aPos[j] += delta[j]; + + myAtoms[i]->setPos( aPos ); + } + } + + for(i=0; igetPos( aPos ); + + for (j=0; j< 3; j++) + aPos[j] += delta[j]; + + myRigidBodies[i]->setPos( aPos ); + } + } +} + +void Molecule::atoms2rigidBodies( void ) { + int i; + for (i = 0; i < nRigidBodies; i++) { + if (myRigidBodies[i] != NULL) { + myRigidBodies[i]->calcForcesAndTorques(); + } + } +} + +void Molecule::getCOM( double COM[3] ) { + + double mass, mtot; + double aPos[3]; + int i, j; + + for (j=0; j<3; j++) + COM[j] = 0.0; + + mtot = 0.0; + + for (i=0; i < nAtoms; i++) { + if (myAtoms[i] != NULL) { + + mass = myAtoms[i]->getMass(); + mtot += mass; + + myAtoms[i]->getPos( aPos ); + + for( j = 0; j < 3; j++) + COM[j] += aPos[j] * mass; + + } + } + + for (j = 0; j < 3; j++) + COM[j] /= mtot; +} + +double Molecule::getCOMvel( double COMvel[3] ) { + + double mass, mtot; + double aVel[3]; + int i, j; + + + for (j=0; j<3; j++) + COMvel[j] = 0.0; + + mtot = 0.0; + + for (i=0; i < nAtoms; i++) { + if (myAtoms[i] != NULL) { + + mass = myAtoms[i]->getMass(); + mtot += mass; + + myAtoms[i]->getVel(aVel); + + for (j=0; j<3; j++) + COMvel[j] += aVel[j]*mass; + + } + } + + for (j=0; j<3; j++) + COMvel[j] /= mtot; + + return mtot; + +} + +double Molecule::getTotalMass() +{ + int natoms; + Atom** atoms; + double totalMass; + + natoms = getNAtoms(); + atoms = getMyAtoms(); + totalMass = 0; + for(int i =0; i < natoms; i++){ + totalMass += atoms[i]->getMass(); + } + + return totalMass; +}