void ISoftCore::runEvent(const Particle& p1, const Particle& p2, const IntEvent& iEvent) const { ++Sim->eventCount; double d2 = (_diameter->getProperty(p1.getID()) + _diameter->getProperty(p2.getID())) * 0.5; d2 *= d2; double wd = (_wellDepth->getProperty(p1.getID()) + _wellDepth->getProperty(p2.getID())) * 0.5; switch (iEvent.getType()) { case WELL_IN: { PairEventData retVal(Sim->dynamics.getLiouvillean() .SphereWellEvent(iEvent, wd, d2)); if (retVal.getType() != BOUNCE) addToCaptureMap(p1, p2); //Now we're past the event, update the scheduler and plugins Sim->signalParticleUpdate(retVal); Sim->ptrScheduler->fullUpdate(p1, p2); BOOST_FOREACH(magnet::ClonePtr<OutputPlugin> & Ptr, Sim->outputPlugins) Ptr->eventUpdate(iEvent, retVal); break; } case WELL_OUT: { PairEventData retVal(Sim->dynamics.getLiouvillean() .SphereWellEvent(iEvent, -wd, d2)); if (retVal.getType() != BOUNCE) removeFromCaptureMap(p1, p2); Sim->signalParticleUpdate(retVal); //Now we're past the event, update the scheduler and plugins Sim->ptrScheduler->fullUpdate(p1, p2); BOOST_FOREACH(magnet::ClonePtr<OutputPlugin>& Ptr, Sim->outputPlugins) Ptr->eventUpdate(iEvent, retVal); break; } default: M_throw() << "Unknown collision type"; } }
void ISWSequence::runEvent(const Particle& p1, const Particle& p2, const IntEvent& iEvent) const { ++Sim->eventCount; double e = (_e->getProperty(p1.getID()) + _e->getProperty(p2.getID())) * 0.5; double d = (_diameter->getProperty(p1.getID()) + _diameter->getProperty(p2.getID())) * 0.5; double d2 = d * d; double l = (_lambda->getProperty(p1.getID()) + _lambda->getProperty(p2.getID())) * 0.5; double ld2 = d * l * d * l; switch (iEvent.getType()) { case CORE: { PairEventData retVal(Sim->dynamics.getLiouvillean().SmoothSpheresColl(iEvent, e, d2, CORE)); Sim->signalParticleUpdate(retVal); Sim->ptrScheduler->fullUpdate(p1, p2); BOOST_FOREACH(std::tr1::shared_ptr<OutputPlugin> & Ptr, Sim->outputPlugins) Ptr->eventUpdate(iEvent, retVal); break; } case WELL_IN: { PairEventData retVal(Sim->dynamics.getLiouvillean() .SphereWellEvent (iEvent, alphabet [sequence[p1.getID() % sequence.size()]] [sequence[p2.getID() % sequence.size()]] * _unitEnergy->getMaxValue(), ld2)); if (retVal.getType() != BOUNCE) addToCaptureMap(p1, p2); Sim->signalParticleUpdate(retVal); Sim->ptrScheduler->fullUpdate(p1, p2); BOOST_FOREACH(std::tr1::shared_ptr<OutputPlugin> & Ptr, Sim->outputPlugins) Ptr->eventUpdate(iEvent, retVal); break; } case WELL_OUT: { PairEventData retVal(Sim->dynamics.getLiouvillean() .SphereWellEvent (iEvent, -alphabet [sequence[p1.getID() % sequence.size()]] [sequence[p2.getID() % sequence.size()]] * _unitEnergy->getMaxValue(), ld2)); if (retVal.getType() != BOUNCE) removeFromCaptureMap(p1, p2); Sim->signalParticleUpdate(retVal); Sim->ptrScheduler->fullUpdate(p1, p2); BOOST_FOREACH(std::tr1::shared_ptr<OutputPlugin> & Ptr, Sim->outputPlugins) Ptr->eventUpdate(iEvent, retVal); break; } default: M_throw() << "Unknown collision type"; } }
void IDumbbells::runEvent(const Particle& p1, const Particle& p2, const IntEvent& iEvent) const { double d = (_diameter->getProperty(p1.getID()) + _diameter->getProperty(p2.getID())) * 0.5; double l = (_length->getProperty(p1.getID()) + _length->getProperty(p2.getID())) * 0.5; double e = (_e->getProperty(p1.getID()) + _e->getProperty(p2.getID())) * 0.5; switch (iEvent.getType()) { case CORE: { ++Sim->eventCount; //We have a line interaction! Run it PairEventData retval(Sim->dynamics.getLiouvillean() .runOffCenterSphereOffCenterSphereCollision (iEvent, e, l, d)); Sim->signalParticleUpdate(retval); Sim->ptrScheduler->fullUpdate(p1, p2); BOOST_FOREACH(std::tr1::shared_ptr<OutputPlugin> & Ptr, Sim->outputPlugins) Ptr->eventUpdate(iEvent, retval); break; } case WELL_IN: { addToCaptureMap(p1, p2); //Unfortunately we cannot be smart as this well event may have //been pushed into both particles update lists, therefore we //must do a full update Sim->ptrScheduler->fullUpdate(p1, p2); Sim->freestreamAcc += iEvent.getdt(); break; } case WELL_OUT: { removeFromCaptureMap(p1, p2); //Unfortunately we cannot be smart as this well event may have //been pushed into both particles update lists, therefore we //must do a full update Sim->ptrScheduler->fullUpdate(p1, p2); Sim->freestreamAcc += iEvent.getdt(); break; } default: M_throw() << "Unknown collision type"; } }
void ISquareWell::runEvent(Particle& p1, Particle& p2, const IntEvent& iEvent) const { ++Sim->eventCount; double d = (_diameter->getProperty(p1.getID()) + _diameter->getProperty(p2.getID())) * 0.5; double d2 = d * d; double e = (_e->getProperty(p1.getID()) + _e->getProperty(p2.getID())) * 0.5; double l = (_lambda->getProperty(p1.getID()) + _lambda->getProperty(p2.getID())) * 0.5; double ld2 = d * l * d * l; double wd = (_wellDepth->getProperty(p1.getID()) + _wellDepth->getProperty(p2.getID())) * 0.5; switch (iEvent.getType()) { case CORE: { PairEventData retVal(Sim->dynamics->SmoothSpheresColl(iEvent, e, d2, CORE)); Sim->signalParticleUpdate(retVal); Sim->ptrScheduler->fullUpdate(p1, p2); BOOST_FOREACH(shared_ptr<OutputPlugin> & Ptr, Sim->outputPlugins) Ptr->eventUpdate(iEvent, retVal); break; } case STEP_IN: { PairEventData retVal(Sim->dynamics->SphereWellEvent(iEvent, wd, ld2)); if (retVal.getType() != BOUNCE) addToCaptureMap(p1, p2); Sim->ptrScheduler->fullUpdate(p1, p2); Sim->signalParticleUpdate(retVal); BOOST_FOREACH(shared_ptr<OutputPlugin> & Ptr, Sim->outputPlugins) Ptr->eventUpdate(iEvent, retVal); break; } case STEP_OUT: { PairEventData retVal(Sim->dynamics->SphereWellEvent(iEvent, -wd, ld2)); if (retVal.getType() != BOUNCE) removeFromCaptureMap(p1, p2); Sim->signalParticleUpdate(retVal); Sim->ptrScheduler->fullUpdate(p1, p2); BOOST_FOREACH(shared_ptr<OutputPlugin> & Ptr, Sim->outputPlugins) Ptr->eventUpdate(iEvent, retVal); break; } default: M_throw() << "Unknown collision type"; } }