--- trunk/OOPSE/libmdtools/Molecule.cpp 2003/03/27 21:07:14 428 +++ trunk/OOPSE/libmdtools/Molecule.cpp 2004/05/11 21:14:26 1158 @@ -1,7 +1,8 @@ -#include +#include #include "Molecule.hpp" +#include "simError.h" @@ -11,11 +12,8 @@ Molecule::Molecule( void ){ myBonds = NULL; myBends = NULL; myTorsions = NULL; - } - - Molecule::~Molecule( void ){ int i; @@ -39,35 +37,74 @@ Molecule::~Molecule( void ){ delete[] myTorsions; } - if( myExcludes != NULL ){ - for(i=0; i::iterator iterCutoff; + Atom* cutoffAtom; + vector::iterator iterAtom; + int atomIndex; + nAtoms = theInit.nAtoms; nMembers = nAtoms; nBonds = theInit.nBonds; nBends = theInit.nBends; nTorsions = theInit.nTorsions; - nExcludes = theInit.nExcludes; + nRigidBodies = theInit.nRigidBodies; nOriented = theInit.nOriented; + nCutoffGroups = theInit.nCutoffGroups; myAtoms = theInit.myAtoms; myBonds = theInit.myBonds; myBends = theInit.myBends; myTorsions = theInit.myTorsions; - myExcludes = theInit.myExcludes; - + myRigidBodies = theInit.myRigidBodies; + + myIntegrableObjects = theInit.myIntegrableObjects; + + for (int i = 0; i < myRigidBodies.size(); i++) + myRigidBodies[i]->calcRefCoords(); + + myCutoffGroups = theInit.myCutoffGroups; + + //creat a global index set of atoms which belong to cutoff group. + //it will be use to speed up the query whether an atom belongs to cutoff group or not + cutoffAtomSet.clear(); + + for(curCutoffGroup = beginCutoffGroup(iterCutoff); curCutoffGroup != NULL; + curCutoffGroup = nextCutoffGroup(iterCutoff)){ + + for(cutoffAtom = curCutoffGroup->beginAtom(iterAtom); cutoffAtom != NULL; + cutoffAtom = curCutoffGroup->nextAtom(iterAtom)){ +#ifdef IS_MPI + atomIndex = cutoffAtom->getGlobalIndex(); +#else + atomIndex = cutoffAtom->getIndex(); +#endif + cutoffAtomSet.insert(atomIndex); + }// end for(cutoffAtom) + }//end for(curCutoffGroup) + } void Molecule::calcForces( void ){ int i; + double com[3]; + for(i=0; iupdateAtoms(); + } + + //calculate the center of mass of the molecule + //getCOM(com); + //for(int i = 0; i < nAtoms; i ++) + // myAtoms[i]->setRc(com); + + for(i=0; icalc_forces(); } @@ -79,6 +116,9 @@ void Molecule::calcForces( void ){ for(i=0; icalc_forces(); } + + // Rigid Body forces and torques are done after the fortran force loop + } @@ -86,6 +126,10 @@ double Molecule::getPotential( void ){ int i; double myPot = 0.0; + + for(i=0; iupdateAtoms(); + } for(i=0; iget_potential(); @@ -101,3 +145,130 @@ double Molecule::getPotential( void ){ return myPot; } + +void Molecule::printMe( void ){ + + int i; + + for(i=0; iprintMe(); + } + + for(i=0; iprintMe(); + } + + 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]; + + myIntegrableObjects[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 < myRigidBodies.size(); i++) { + 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 < myIntegrableObjects.size(); i++) { + if (myIntegrableObjects[i] != NULL) { + + mass = myIntegrableObjects[i]->getMass(); + mtot += mass; + + myIntegrableObjects[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 < myIntegrableObjects.size(); i++) { + if (myIntegrableObjects[i] != NULL) { + + mass = myIntegrableObjects[i]->getMass(); + mtot += mass; + + myIntegrableObjects[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() +{ + + double totalMass; + + totalMass = 0; + for(int i =0; i < myIntegrableObjects.size(); i++){ + totalMass += myIntegrableObjects[i]->getMass(); + } + + return totalMass; +}