summaryrefslogtreecommitdiff
path: root/src/main/Accelerator.h
diff options
context:
space:
mode:
authorJakob Odersky <jodersky@gmail.com>2011-05-01 14:07:41 +0000
committerJakob Odersky <jodersky@gmail.com>2011-05-01 14:07:41 +0000
commit2ade21c3d97189d26f9dc18e2e805a0b05a4eaaf (patch)
treede48758990e96b1fec8a6e097656bb0b59dfa4fc /src/main/Accelerator.h
parent9b765d14760bddc1caac167e938670031d70a864 (diff)
downloadvhc-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.h134
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;
};
}