double InterMolecularTorsions::compute( const unsigned& tindex, multicolvar::AtomValuePack& myatoms ) const { Vector v1, v2, dv1, dv2, dconn, conn = getSeparation( myatoms.getPosition(0), myatoms.getPosition(1) ); // Retrieve vectors std::vector<double> orient0( 5 ), orient1( 5 ); getInputData( 0, true, myatoms, orient0 ); getInputData( 1, true, myatoms, orient1 ); for(unsigned i=0; i<3; ++i) { v1[i]=orient0[2+i]; v2[i]=orient1[2+i]; } if( getBaseMultiColvar(0)->getNumberOfQuantities()<3 ) return 1.0; // Evaluate angle Torsion t; double angle = t.compute( v1, conn, v2, dv1, dconn, dv2 ); for(unsigned i=0; i<3; ++i) { orient0[i+2]=dv1[i]; orient1[i+2]=dv2[i]; } // And accumulate derivatives if( !doNotCalculateDerivatives() ) { MultiValue& myder0=getInputDerivatives( 0, true, myatoms ); mergeInputDerivatives( 1, 2, orient1.size(), 0, orient0, myder0, myatoms ); MultiValue& myder1=getInputDerivatives( 1, true, myatoms ); mergeInputDerivatives( 1, 2, orient0.size(), 1, orient1, myder1, myatoms ); addAtomDerivatives( 1, 0, -dconn, myatoms ); addAtomDerivatives( 1, 1, dconn, myatoms ); myatoms.addBoxDerivatives( 1, -extProduct( conn, dconn ) ); } return angle; }
double Molecule::getPotential() { //RigidBody* rb; Bond* bond; Bend* bend; Torsion* torsion; //std::vector<RigidBody*> rbIter; std::vector<Bond*> bondIter;; std::vector<Bend*> bendIter; std::vector<Torsion*> torsionIter; double potential = 0; //for (rb = beginRigidBody(rbIter); rb != NULL; rb = nextRigidBody(rbIter)) { // rb->updateAtoms(); //} for (bond = beginBond(bondIter); bond != NULL; bond = nextBond(bondIter)) { potential += bond->getPotential(); } for (bend = beginBend(bendIter); bend != NULL; bend = nextBend(bendIter)) { potential += bend->getPotential(); } for (torsion = beginTorsion(torsionIter); torsion != NULL; torsion = nextTorsion(torsionIter)) { potential += torsion->getPotential(); } return potential; }
void Molecule::calcForces() { RigidBody* rb; Bond* bond; Bend* bend; Torsion* torsion; std::vector<RigidBody*> rbIter; std::vector<Bond*> bondIter;; std::vector<Bend*> bendIter; std::vector<Torsion*> torsionIter; for (rb = beginRigidBody(rbIter); rb != NULL; rb = nextRigidBody(rbIter)) { rb->updateAtoms(); } for (bond = beginBond(bondIter); bond != NULL; bond = nextBond(bondIter)) { bond->calcForce(); } for (bend = beginBend(bendIter); bend != NULL; bend = nextBend(bendIter)) { bend->calcForce(); } for (torsion = beginTorsion(torsionIter); torsion != NULL; torsion = nextTorsion(torsionIter)) { torsion->calcForce(); } }
DistanceFinder::DistanceFinder(SimInfo* info) : info_(info) { nObjects_.push_back(info_->getNGlobalAtoms()+info_->getNGlobalRigidBodies()); nObjects_.push_back(info_->getNGlobalBonds()); nObjects_.push_back(info_->getNGlobalBends()); nObjects_.push_back(info_->getNGlobalTorsions()); nObjects_.push_back(info_->getNGlobalInversions()); stuntdoubles_.resize(nObjects_[STUNTDOUBLE]); bonds_.resize(nObjects_[BOND]); bends_.resize(nObjects_[BEND]); torsions_.resize(nObjects_[TORSION]); inversions_.resize(nObjects_[INVERSION]); SimInfo::MoleculeIterator mi; Molecule::AtomIterator ai; Molecule::RigidBodyIterator rbIter; Molecule::BondIterator bondIter; Molecule::BendIterator bendIter; Molecule::TorsionIterator torsionIter; Molecule::InversionIterator inversionIter; Molecule* mol; Atom* atom; RigidBody* rb; Bond* bond; Bend* bend; Torsion* torsion; Inversion* inversion; for (mol = info_->beginMolecule(mi); mol != NULL; mol = info_->nextMolecule(mi)) { for(atom = mol->beginAtom(ai); atom != NULL; atom = mol->nextAtom(ai)) { stuntdoubles_[atom->getGlobalIndex()] = atom; } for (rb = mol->beginRigidBody(rbIter); rb != NULL; rb = mol->nextRigidBody(rbIter)) { stuntdoubles_[rb->getGlobalIndex()] = rb; } for (bond = mol->beginBond(bondIter); bond != NULL; bond = mol->nextBond(bondIter)) { bonds_[bond->getGlobalIndex()] = bond; } for (bend = mol->beginBend(bendIter); bend != NULL; bend = mol->nextBend(bendIter)) { bends_[bend->getGlobalIndex()] = bend; } for (torsion = mol->beginTorsion(torsionIter); torsion != NULL; torsion = mol->nextTorsion(torsionIter)) { torsions_[torsion->getGlobalIndex()] = torsion; } for (inversion = mol->beginInversion(inversionIter); inversion != NULL; inversion = mol->nextInversion(inversionIter)) { inversions_[inversion->getGlobalIndex()] = inversion; } } }
void IndexFinder::init() { SimInfo::MoleculeIterator mi; Molecule::AtomIterator ai; Molecule::RigidBodyIterator rbIter; Molecule::BondIterator bondIter; Molecule::BendIterator bendIter; Molecule::TorsionIterator torsionIter; Molecule::InversionIterator inversionIter; Molecule* mol; Atom* atom; RigidBody* rb; Bond* bond; Bend* bend; Torsion* torsion; Inversion* inversion; for (mol = info_->beginMolecule(mi); mol != NULL; mol = info_->nextMolecule(mi)) { SelectionSet ss(nObjects_); ss.bitsets_[MOLECULE].setBitOn(mol->getGlobalIndex()); for(atom = mol->beginAtom(ai); atom != NULL; atom = mol->nextAtom(ai)) { ss.bitsets_[STUNTDOUBLE].setBitOn(atom->getGlobalIndex()); } for (rb = mol->beginRigidBody(rbIter); rb != NULL; rb = mol->nextRigidBody(rbIter)) { ss.bitsets_[STUNTDOUBLE].setBitOn(rb->getGlobalIndex()); } for (bond = mol->beginBond(bondIter); bond != NULL; bond = mol->nextBond(bondIter)) { ss.bitsets_[BOND].setBitOn(bond->getGlobalIndex()); } for (bend = mol->beginBend(bendIter); bend != NULL; bend = mol->nextBend(bendIter)) { ss.bitsets_[BEND].setBitOn(bend->getGlobalIndex()); } for (torsion = mol->beginTorsion(torsionIter); torsion != NULL; torsion = mol->nextTorsion(torsionIter)) { ss.bitsets_[TORSION].setBitOn(torsion->getGlobalIndex()); } for (inversion = mol->beginInversion(inversionIter); inversion != NULL; inversion = mol->nextInversion(inversionIter)) { ss.bitsets_[INVERSION].setBitOn(inversion->getGlobalIndex()); } selectionSets_[mol->getGlobalIndex()] = ss; } }