summaryrefslogtreecommitdiff
path: root/src/main/Accelerator.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/Accelerator.h')
-rw-r--r--src/main/Accelerator.h43
1 files changed, 33 insertions, 10 deletions
diff --git a/src/main/Accelerator.h b/src/main/Accelerator.h
index a8d1562..3275a1e 100644
--- a/src/main/Accelerator.h
+++ b/src/main/Accelerator.h
@@ -9,6 +9,7 @@
#define ACCELERATOR_H_
#include <iostream>
#include <vector>
+#include <limits>
#include "exceptions.h"
#include "Vector3D.h"
#include "Particle.h"
@@ -29,9 +30,13 @@ private :
protected:
- /** Attributs d'un accélérateur : une collection d'éléments, et une de particules. */
- std::vector< Element* > elementCollec;
- std::vector< Particle* > particleCollec;
+ /*Attributs d'un accélérateur : une collection d'éléments, et une de particules. */
+
+ /** Collection d'elements contenus dans cet accelerateur. */
+ std::vector< Element * > elementCollec;
+
+ /** Collection de particules contenus danc cet accelerateur. */
+ std::vector< Particle *> particleCollec;
public:
@@ -44,28 +49,45 @@ public:
virtual ~Accelerator() {clear();}
/** Retourne un pointeur sur un élément de l'accélérateur.*/
- Element* getElement(int rank) const { return elementCollec[rank]; }
+ Element *const getElement(int rank) const { return elementCollec[rank];}
/* Retourne un pointeur sur une particule de l'accélérateur.*/
- Particle* getParticle(int rank) const { return particleCollec[rank];}
+ Particle *const getParticle(int rank) const { return particleCollec[rank];}
/** Retourne une représentation en chaîne de caractères de cet accélérateur. */
virtual std::string toString() const;
/** Copie un élément dans l'accélérateur. */
- Element* add(const Element& element) {
+ Element *const add(const Element& element) {
Element* e = element.clone();
elementCollec.push_back(e);
return e;
}
/** Copie une particule dans l'accélérateur. */
- Particle* add(const Particle& particle){
+ Particle *const add(const Particle& particle){
Particle* p = particle.clone();
particleCollec.push_back(p);
return p;
}
+ void close() {
+ for (int i = 0; i < elementCollec.size(); ++i) {
+ //element i
+ Element* current = elementCollec[i];
+
+ //element i+1
+ Element* next = elementCollec[(i+1) % elementCollec.size()];
+
+ // est-ce que les elements se suivent?
+ if (Vector3D::ae(current->getExitPosition(), next->getEntryPosition())) {
+ current->setNext(next);
+ next->setPrevious(current);
+ } else throw UnsupportedOperationException("Cannot close accelerator. Two succeeding elements are not physically connected! (not close enough)");
+ }
+
+ }
+
/** Efface tous les éléments et les particules. */
void clear() {
for (unsigned int i = 0; i < particleCollec.size(); ++i) {
@@ -119,8 +141,8 @@ public:
particle.setPosition(particle.getPosition() + particle.getVelocity() * dt);
particle.setForce(Vector3D::Null);
- if (particle.getElement()->hasHit(particle)) std::cout << "Particle hit wall!" << std::endl;
- if (particle.getElement()->isPast(particle)) { // si la particule est passee, qui sait si elle est dans l'element suivant?
+ if (particle.getElement()->isBeside(particle)) std::cout << "Particle hit wall!" << std::endl;
+ if (particle.getElement()->isAfter(particle)) { // si la particule est passee, qui sait si elle est dans l'element suivant?
if (!particle.getElement()->isConnected()) throw Exception("Element in accelerator not connected.");
else particle.setElement(particle.getElement()->getNext());
}
@@ -128,12 +150,13 @@ public:
}
+ /*
void* stepMonteCarlo();
void* stepDeterministBackUp();
void* stepDeterminist();
-
+*/
};
}