diff options
Diffstat (limited to 'src/main/Accelerator.h')
-rw-r--r-- | src/main/Accelerator.h | 43 |
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(); - +*/ }; } |