From 87500c3938c670f427780f3eefa3190281007e61 Mon Sep 17 00:00:00 2001 From: Jakob Odersky Date: Tue, 24 May 2011 14:25:00 +0000 Subject: Ajoute un modele de publisher/subscriber en vue des interactions entre particules. --- src/gui/Main.cc | 23 ++++++++-- src/main/Beam.cc | 32 ++++++++++---- src/main/Beam.h | 15 ++++++- src/main/Bunch.cc | 3 +- src/main/Bunch.h | 1 + src/main/CircularBeam.cc | 2 +- src/main/InteractionDetector.cc | 21 +++++++++ src/main/InteractionDetector.h | 21 +++++++++ src/main/Makefile | 2 +- src/main/events.cc | 27 ++++++++++++ src/main/events.h | 96 +++++++++++++++++++++++++++++++++++++++++ 11 files changed, 226 insertions(+), 17 deletions(-) create mode 100644 src/main/InteractionDetector.cc create mode 100644 src/main/InteractionDetector.h create mode 100644 src/main/events.cc create mode 100644 src/main/events.h (limited to 'src') diff --git a/src/gui/Main.cc b/src/gui/Main.cc index a5adee9..4c2d62f 100644 --- a/src/gui/Main.cc +++ b/src/gui/Main.cc @@ -23,6 +23,7 @@ #include #include "CircularBeam.h" #include "Bunch.h" +#include "events.h" using namespace std; using namespace vhc; @@ -58,6 +59,18 @@ Element** FODO(Vector3D entry, Vector3D exit, double Rs, double L, double b) { return fodo; } +class Foo: public Listener, public Listener { +public: + virtual void react(const ParticleAddedEvent& event) { + cout << "+ Particle added!\n"; + } + + virtual void react(const ParticleRemovedEvent& event) { + cout << "- Particle removed!\n"; + } + +}; + Accelerator* standard() { /* * L'accélérateur est constitué des 20 éléments suivants : @@ -152,7 +165,12 @@ Une particule : double length = 300E-12 * constants::C; double stdDev = 0.1; acc->add(Bunch(p1, 500, 1, stdDev, length, emittance, A_12, A_22)); - acc->add(Bunch(ap1, 500, 1, stdDev, length, emittance, A_12, A_22)); + + Foo* foo = new Foo; + Bunch& bch = (Bunch&) acc->add(Bunch(ap1, 500, 1, stdDev, length, emittance, A_12, A_22)); + bch.Publisher::subscribe(foo); + bch.Publisher::subscribe(foo); + acc->close(); @@ -166,7 +184,6 @@ Une particule : return acc; } - int main(int argc, char *argv[]) { try { @@ -182,7 +199,7 @@ int main(int argc, char *argv[]) window.show(); - window.showFullScreen(); + // window.showFullScreen(); //app.setActiveWindow(&window); return app.exec(); 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::publish(ParticleAddedEvent(this, particle)); +} + +void Beam::remove(Particle* particle) { + Publisher::publish(ParticleRemovedEvent(this, particle)); + delete particle; + particle = NULL; + particles.remove(particle); +} + +Beam::ParticleCollection::iterator Beam::erase(Beam::ParticleCollection::iterator i) { + Publisher::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, public Publisher { 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. * ( 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 #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 + +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 +#include +#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 +class Listener { + +public: + + virtual void react(const T& event) = 0; + +}; + +template +class Publisher { + +private: + + typedef std::list< Listener * > 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* listener) { + listeners.push_back(listener); + } + + void unsubscribe(Listener* listener) { + listeners.remove(listener); + } + +}; + +} + +#endif /* EVENTS_H_ */ -- cgit v1.2.3