diff options
author | Jakob Odersky <jodersky@gmail.com> | 2011-05-24 14:25:00 +0000 |
---|---|---|
committer | Jakob Odersky <jodersky@gmail.com> | 2011-05-24 14:25:00 +0000 |
commit | 87500c3938c670f427780f3eefa3190281007e61 (patch) | |
tree | b968a21ca7471a38f9c1766da4d89420913c41fc /src/main | |
parent | 5ea0d2b2b2d71df3a91a7ece5d511fd0b39ff70a (diff) | |
download | vhc-87500c3938c670f427780f3eefa3190281007e61.tar.gz vhc-87500c3938c670f427780f3eefa3190281007e61.tar.bz2 vhc-87500c3938c670f427780f3eefa3190281007e61.zip |
Ajoute un modele de publisher/subscriber en vue des interactions entre particules.
Diffstat (limited to 'src/main')
-rw-r--r-- | src/main/Beam.cc | 32 | ||||
-rw-r--r-- | src/main/Beam.h | 15 | ||||
-rw-r--r-- | src/main/Bunch.cc | 3 | ||||
-rw-r--r-- | src/main/Bunch.h | 1 | ||||
-rw-r--r-- | src/main/CircularBeam.cc | 2 | ||||
-rw-r--r-- | src/main/InteractionDetector.cc | 21 | ||||
-rw-r--r-- | src/main/InteractionDetector.h | 21 | ||||
-rw-r--r-- | src/main/Makefile | 2 | ||||
-rw-r--r-- | src/main/events.cc | 27 | ||||
-rw-r--r-- | src/main/events.h | 96 |
10 files changed, 206 insertions, 14 deletions
diff --git a/src/main/Beam.cc b/src/main/Beam.cc index 97c2688..3650bd9 100644 --- a/src/main/Beam.cc +++ b/src/main/Beam.cc @@ -22,10 +22,29 @@ Beam::~Beam() { clear(); } +void Beam::add(Particle* particle) { + particles.push_back(particle); + Publisher<ParticleAddedEvent>::publish(ParticleAddedEvent(this, particle)); +} + +void Beam::remove(Particle* particle) { + Publisher<ParticleRemovedEvent>::publish(ParticleRemovedEvent(this, particle)); + delete particle; + particle = NULL; + particles.remove(particle); +} + +Beam::ParticleCollection::iterator Beam::erase(Beam::ParticleCollection::iterator i) { + Publisher<ParticleRemovedEvent>::publish(ParticleRemovedEvent(this, *i)); + delete *i; + *i = NULL; + return particles.erase(i); +} + void Beam::clear() { for (ParticleCollection::iterator i = particles.begin(); i != particles.end(); ++i) { - delete *i; - *i = NULL; + i = erase(i); + --i; } particles.clear(); } @@ -53,22 +72,19 @@ void Beam::updateParticles() { Particle& particle = **i; if (particle.getElement()->isAfter(particle)) { if (particle.getElement()->getNext() == NULL) { - delete *i; - i = particles.erase(i); + i = erase(i); --i; //cout << "Particle reached end of accelerator. Removed from simulation" << std::endl; } else particle.setElement(particle.getElement()->getNext()); } else if (particle.getElement()->isBefore(particle)) { if (particle.getElement()->getPrevious() == NULL) { - delete *i; - i = particles.erase(i); + i = erase(i); --i; //cout << "Particle reached beginning of accelerator. Removed from simulation" << std::endl; } else particle.setElement(particle.getElement()->getPrevious()); } else if (particle.getElement()->isBeside(particle)) { //std::cout << "Particle hit wall. Removed from simulation" << std::endl; - delete *i; - i = particles.erase(i); + i = erase(i); --i; } } diff --git a/src/main/Beam.h b/src/main/Beam.h index 7572908..f5998c9 100644 --- a/src/main/Beam.h +++ b/src/main/Beam.h @@ -11,11 +11,12 @@ #include "Cloneable.h" #include "Particle.h" #include "Vector3D.h" +#include "events.h" namespace vhc { /** Classe de base pour les faisceaux. */ -class Beam: public Cloneable { +class Beam: public Cloneable, public Publisher<ParticleAddedEvent>, public Publisher<ParticleRemovedEvent> { public: @@ -105,14 +106,24 @@ protected: /** Particule de reference. */ Particle referenceParticle; - /** (Macro-)Particules contenus dans ce faisceau. */ + /** Macroparticules contenus dans ce faisceau. */ ParticleCollection particles; /** Coefficient des macrosparticules. */ int lambda; + /** Quantite de particules contenus dans ce faisceau. */ int quantity; + /** Methode qui doit etre appelee par toute sous-classe pour ajouter une particule au faisceau. */ + void add(Particle* particle); + + /** Methode qui doit etre appelee par toute sous-classe pour supprimer une particule du faisceau. */ + void remove(Particle* particle); + + /** Methode qui doit etre appelee par toute sous-classe pour supprimer une particule du faisceau. */ + ParticleCollection::iterator erase(ParticleCollection::iterator i); + /** Retourne la moyenne de la distribution horizontale de la position des particules. * (<r^2> horizontal du complement) */ double getHR2() const; diff --git a/src/main/Bunch.cc b/src/main/Bunch.cc index e32de97..4a4844b 100644 --- a/src/main/Bunch.cc +++ b/src/main/Bunch.cc @@ -27,7 +27,6 @@ Bunch::~Bunch() { void Bunch::initializeParticles() { create(getLength()); - } void Bunch::create(double dt) { @@ -83,7 +82,7 @@ void Bunch::create(double dt) { particle->setCharge(getReferenceParticle().getCharge() * getLambda()); particle->translate(dp); - particles.push_back(particle); + add(particle); } } diff --git a/src/main/Bunch.h b/src/main/Bunch.h index 7794312..6489592 100644 --- a/src/main/Bunch.h +++ b/src/main/Bunch.h @@ -8,6 +8,7 @@ #ifndef BUNCH_H_ #define BUNCH_H_ +#include <string> #include "Beam.h" namespace vhc { diff --git a/src/main/CircularBeam.cc b/src/main/CircularBeam.cc index fefc3f9..d147c25 100644 --- a/src/main/CircularBeam.cc +++ b/src/main/CircularBeam.cc @@ -22,7 +22,7 @@ void CircularBeam::initializeParticles() { for (int i = 0; i < quantity / lambda; ++i) { - particles.push_back(new Particle( + add(new Particle( element->getEntryPosition(), referenceParticle.getMass() * lambda, referenceParticle.getCharge() * lambda, diff --git a/src/main/InteractionDetector.cc b/src/main/InteractionDetector.cc new file mode 100644 index 0000000..667c14f --- /dev/null +++ b/src/main/InteractionDetector.cc @@ -0,0 +1,21 @@ +/* + * InteractionDetector.cc + * + * Created on: May 24, 2011 + * Author: jakob + */ + +#include "InteractionDetector.h" + +namespace vhc { + +InteractionDetector::InteractionDetector() { + // TODO Auto-generated constructor stub + +} + +InteractionDetector::~InteractionDetector() { + // TODO Auto-generated destructor stub +} + +} diff --git a/src/main/InteractionDetector.h b/src/main/InteractionDetector.h new file mode 100644 index 0000000..f165a46 --- /dev/null +++ b/src/main/InteractionDetector.h @@ -0,0 +1,21 @@ +/* + * InteractionDetector.h + * + * Created on: May 24, 2011 + * Author: jakob + */ + +#ifndef INTERACTIONDETECTOR_H_ +#define INTERACTIONDETECTOR_H_ + +namespace vhc { + +class InteractionDetector { +public: + InteractionDetector(); + virtual ~InteractionDetector(); +}; + +} + +#endif /* INTERACTIONDETECTOR_H_ */ diff --git a/src/main/Makefile b/src/main/Makefile index 09ca21e..b9a0e5d 100644 --- a/src/main/Makefile +++ b/src/main/Makefile @@ -16,7 +16,7 @@ LOCALDIR = main LOCALOBJS = Vector3D.o Particle.o Printable.o Element.o CurvedElement.o StraightElement.o \ CompositeElement.o Dipole.o Quadrupole.o FODO.o ElementVisitor.o Cloneable.o \ Accelerator.o exceptions.o Stepper.o Beam.o SingleBeam.o CircularBeam.o \ - random.o Bunch.o + random.o Bunch.o events.o OBJS=$(addprefix $(BINDIR)/$(LOCALDIR)/,$(LOCALOBJS)) .PHONY = all checkdirs lib diff --git a/src/main/events.cc b/src/main/events.cc new file mode 100644 index 0000000..6a9805f --- /dev/null +++ b/src/main/events.cc @@ -0,0 +1,27 @@ +/* + * events.cc + * + * Created on: May 23, 2011 + * Author: jakob + */ + +#include "events.h" +#include <list> + +namespace vhc { + +Event::Event(void *const sender): sender(sender) {} +Event::~Event() {} +void *const Event::getSender() const {return sender;} + +ParticleEvent::ParticleEvent(void *const sender, Particle *const particle): Event(sender), particle(particle) {}; +ParticleEvent::~ParticleEvent() {}; +Particle *const ParticleEvent::getParticle() const {return particle;} + +ParticleAddedEvent::ParticleAddedEvent(void *const sender, Particle *const particle): ParticleEvent(sender, particle) {}; +ParticleAddedEvent::~ParticleAddedEvent() {}; + +ParticleRemovedEvent::ParticleRemovedEvent(void *const sender, Particle *const particle): ParticleEvent(sender, particle) {}; +ParticleRemovedEvent::~ParticleRemovedEvent() {}; + +} diff --git a/src/main/events.h b/src/main/events.h new file mode 100644 index 0000000..f9a6be3 --- /dev/null +++ b/src/main/events.h @@ -0,0 +1,96 @@ +/* + * events.h + * + * Created on: May 23, 2011 + * Author: jakob + */ + +#ifndef EVENTS_H_ +#define EVENTS_H_ + +#include <list> +#include <algorithm> +#include "Particle.h" + +namespace vhc { + +class Event { + +private: + void *const sender; + +public: + Event(void *const sender); + virtual ~Event(); + + void *const getSender() const; + +}; + +class ParticleEvent: public Event { +private: + Particle *const particle; +public: + + ParticleEvent(void *const sender, Particle *const particle); + virtual ~ParticleEvent(); + + Particle *const getParticle() const; + +}; + +class ParticleAddedEvent: public ParticleEvent { +public: + ParticleAddedEvent(void *const sender, Particle *const particle); + virtual ~ParticleAddedEvent(); +}; + +class ParticleRemovedEvent: public ParticleEvent { +public: + ParticleRemovedEvent(void *const sender, Particle *const particle); + virtual ~ParticleRemovedEvent(); +}; + +template<typename T> +class Listener { + +public: + + virtual void react(const T& event) = 0; + +}; + +template<typename T> +class Publisher { + +private: + + typedef std::list< Listener<T> * > ListenerCollection; + ListenerCollection listeners; + +protected: + + Publisher(): listeners(0) {}; + virtual ~Publisher() {}; + + void publish(const T& event) { + for (typename ListenerCollection::iterator i = listeners.begin(); i != listeners.end(); ++i) { + (**i).react(event); + } + } + +public: + + void subscribe(Listener<T>* listener) { + listeners.push_back(listener); + } + + void unsubscribe(Listener<T>* listener) { + listeners.remove(listener); + } + +}; + +} + +#endif /* EVENTS_H_ */ |