diff options
author | Jakob Odersky <jodersky@gmail.com> | 2011-05-01 14:07:41 +0000 |
---|---|---|
committer | Jakob Odersky <jodersky@gmail.com> | 2011-05-01 14:07:41 +0000 |
commit | 2ade21c3d97189d26f9dc18e2e805a0b05a4eaaf (patch) | |
tree | de48758990e96b1fec8a6e097656bb0b59dfa4fc /src/main/Accelerator.h | |
parent | 9b765d14760bddc1caac167e938670031d70a864 (diff) | |
download | vhc-2ade21c3d97189d26f9dc18e2e805a0b05a4eaaf.tar.gz vhc-2ade21c3d97189d26f9dc18e2e805a0b05a4eaaf.tar.bz2 vhc-2ade21c3d97189d26f9dc18e2e805a0b05a4eaaf.zip |
Changements importants dans l'accelerateur. Nous travaillons maintenant avec une list au lieu d'un vector. Ceci pour pouvoir supprimer une particule a temps constant qui aurait heurte le bord d'un element. On ne peut donc plus acceder a un element quelconque de la liste mais il faut l'iterer!
Mais comme, de toutes facons, on ne fait que d'iterer sur une liste lors d'une simulation deterministe ceci convient. Peut-etre il faudra adapter cette conception pour une simulation monte-carlo.
Diffstat (limited to 'src/main/Accelerator.h')
-rw-r--r-- | src/main/Accelerator.h | 134 |
1 files changed, 18 insertions, 116 deletions
diff --git a/src/main/Accelerator.h b/src/main/Accelerator.h index deeaf69..d3c26e0 100644 --- a/src/main/Accelerator.h +++ b/src/main/Accelerator.h @@ -7,10 +7,7 @@ #ifndef ACCELERATOR_H_ #define ACCELERATOR_H_ -#include <iostream> -#include <vector> -#include <limits> -#include "exceptions.h" +#include <list> #include "Vector3D.h" #include "Particle.h" #include "Element.h" @@ -19,7 +16,7 @@ namespace vhc { /** Représente un accélérateur. Cette classe contient en particulier une méthode * qui fait évoluer les particules qu'elle contient. */ -class Accelerator: public Printable{ +class Accelerator: public Printable { private : /** Constructeur de copie ne faisant rien. */ @@ -30,13 +27,12 @@ private : protected: - /*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; + std::list< Element * > elementCollec; /** Collection de particules contenus danc cet accelerateur. */ - std::vector< Particle *> particleCollec; + std::list< Particle *> particleCollec; + public: @@ -48,125 +44,31 @@ public: virtual ~Accelerator() {clear();} - /** Retourne un pointeur sur un élément de l'accélérateur.*/ - Element *const getElement(int rank) const { return elementCollec[rank];} - - /* Retourne un pointeur sur une particule de l'accélérateur.*/ - 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 *const add(const Element& element) { - Element* e = element.clone(); - elementCollec.push_back(e); - return e; - } + Element& add(const Element& element); /** Copie une particule dans l'accélérateur. */ - Particle *const add(const Particle& particle){ - Particle* p = particle.clone(); - particleCollec.push_back(p); - return p; - } - - /** Ferme l'accelerateur. */ - 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)"); - } - - - //rajouter les particules dans leurs elements respectifs - for (int i = 0; i < particleCollec.size(); ++i) { + Particle& add(const Particle& particle); - for (int j = 0; j < elementCollec.size(); ++j) { + /** Retourne la liste d'elements contenus dans cet accelerateur. */ + const std::list<Element*> & getElements() const; - if (elementCollec[j]->contains(*particleCollec[i])) { - particleCollec[i]->setElement(elementCollec[j]); - break; - } - } + /** Retourne la liste des particules contenus dans cet accelerateur. */ + const std::list<Particle*> & getParticles() const; - //si une particule n'est pas contenue dans un element elle est supprimee - if (particleCollec[i]->getElement() == NULL) { - delete particleCollec[i]; - particleCollec[i] = particleCollec[particleCollec.size() - 1]; - particleCollec.pop_back(); - --i; - } - - } - - } + /** Ferme l'accelerateur. */ + void close(); /** Efface tous les éléments et les particules. */ - void clear() { - for (unsigned int i = 0; i < particleCollec.size(); ++i) { - delete particleCollec[i]; - particleCollec[i] = NULL; - } - particleCollec.clear(); - - for (unsigned int i = 0; i < elementCollec.size(); ++i) { - delete elementCollec[i]; - elementCollec[i] = NULL; - } - elementCollec.clear(); - } - - /** Retourne la liste des éléments de l'accélérateur.*/ - const std::vector< Element* >& getElements() const { - return elementCollec; - } - - /** Retourne la liste des particules de l'accélérateur.*/ - const std::vector< Particle* >& getParticles() const { - return particleCollec; - } + void clear(); + void updateParticles(); /** Fait évoluer l'accélérateur d'un laps de temps dt. */ - void step(double dt) { - - for (int i = 0; i < particleCollec.size(); ++i) { - Particle& particle = *particleCollec[i]; - - particle.applyMagneticForce(particle.getElement()->magneticFieldAt(particle.getPosition()), dt); - - Vector3D a = particle.getForce() / (particle.getGamma() * particle.getMass()); - particle.setVelocity(particle.getVelocity() + a * dt); - - particle.translate(particle.getVelocity() * dt); - particle.setForce(Vector3D::Null); + void step(double dt); - 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()); - } - } - - } - - /* - void* stepMonteCarlo(); - - void* stepDeterministBackUp(); - - void* stepDeterminist(); -*/ + /** Retourne une représentation en chaîne de caractères de cet accélérateur. */ + virtual std::string toString() const; }; } |