summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Odersky <jodersky@gmail.com>2011-05-24 14:25:00 +0000
committerJakob Odersky <jodersky@gmail.com>2011-05-24 14:25:00 +0000
commit87500c3938c670f427780f3eefa3190281007e61 (patch)
treeb968a21ca7471a38f9c1766da4d89420913c41fc
parent5ea0d2b2b2d71df3a91a7ece5d511fd0b39ff70a (diff)
downloadvhc-87500c3938c670f427780f3eefa3190281007e61.tar.gz
vhc-87500c3938c670f427780f3eefa3190281007e61.tar.bz2
vhc-87500c3938c670f427780f3eefa3190281007e61.zip
Ajoute un modele de publisher/subscriber en vue des interactions entre particules.
-rw-r--r--src/gui/Main.cc23
-rw-r--r--src/main/Beam.cc32
-rw-r--r--src/main/Beam.h15
-rw-r--r--src/main/Bunch.cc3
-rw-r--r--src/main/Bunch.h1
-rw-r--r--src/main/CircularBeam.cc2
-rw-r--r--src/main/InteractionDetector.cc21
-rw-r--r--src/main/InteractionDetector.h21
-rw-r--r--src/main/Makefile2
-rw-r--r--src/main/events.cc27
-rw-r--r--src/main/events.h96
11 files changed, 226 insertions, 17 deletions
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 <vector>
#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<ParticleAddedEvent>, public Listener<ParticleRemovedEvent> {
+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<ParticleAddedEvent>::subscribe(foo);
+ bch.Publisher<ParticleRemovedEvent>::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<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_ */