/* * Evaluate Rosenbluth weight, and add to accumulator. */ void McChemicalPotential::sample(long iStep) { if (isAtInterval(iStep)) { Species* speciesPtr; Molecule* molPtr; Molecule::BondIterator bondIter; Atom* endPtr; double w; double rosenbluth = 1; double de; double e = 0; speciesPtr = &(simulation().species(speciesId_)); // Pop a new molecule off the species reservoir molPtr = &(speciesPtr->reservoir().pop()); system().addMolecule(*molPtr); // Loop over molecule growth trials for (int i = 0; i < nMoleculeTrial_; i++) { // Pick a random position for the first atom endPtr = &molPtr->atom(0); boundary().randomPosition(random(), endPtr->position()); e = system().pairPotential().atomEnergy(*endPtr); rosenbluth = boltzmann(e); system().pairPotential().addAtom(*endPtr); for (molPtr->begin(bondIter); bondIter.notEnd(); ++bondIter) { addEndAtom(&(bondIter->atom(1)), &(bondIter->atom(0)), bondIter->typeId(), w, de); e += de; rosenbluth *= w; system().pairPotential().addAtom(bondIter->atom(1)); } rosenbluth = rosenbluth / pow(nTrial_,molPtr->nAtom()-1); accumulator_.sample(rosenbluth, outputFile_); system().pairPotential().deleteAtom(*endPtr); for (molPtr->begin(bondIter); bondIter.notEnd(); ++bondIter) { system().pairPotential().deleteAtom(bondIter->atom(1)); } } // Return additional molecule to reservoir system().removeMolecule(*molPtr); speciesPtr->reservoir().push(*molPtr); } }
void HoomdMove::addBonds() { // Loop over bonds and initialize them int iSpec; System::MoleculeIterator molIter; Molecule::BondIterator bondIter; for (iSpec=0; iSpec < simulation().nSpecies(); ++iSpec) { for (system().begin(iSpec, molIter); molIter.notEnd(); ++molIter) { for (molIter->begin(bondIter); bondIter.notEnd(); ++bondIter) { ::Bond bond(bondIter->typeId(), bondIter->atom(0).id(), bondIter->atom(1).id()); bondDataSPtr_->addBond(bond); } } } }