summaryrefslogblamecommitdiff
path: root/src/main/Accelerator.h
blob: a8d1562c8055a6f469da448c1d26649635fc5206 (plain) (tree)
1
2
3
4
5
6
7
8
9








                            
                   
                 
                       





                     

                                                                                    
                                    


                                                     
                                                 

                                              
                                                          
 
          
 
                                                                                                 


                                                

       
                                                


                                 

           

                                         
                                                                        
                                                                           
 
                                                                        
                                                                             



                                                                                            
                                                        



                                              

         
                                                         



                                                

         

                                                            
                                                                          




                                                 
                                                                         



                                                
         
 
                                                                   



                                                            
                                                                   



                                                              
 
                                                                    
                              
 
                                                                 

                                                               





                                                                                                                                                                    
                                                                                                                           
 

                                          

                                                                                                         

                 

 



                                                                                                   





                                                                                                                                                  
                 
 
         
 




                                      
 




                           
/*
 * Accelerator.h
 *
 *  Created on: 22 mars 2011
 *      Author: christian
 */

#ifndef ACCELERATOR_H_
#define ACCELERATOR_H_
#include <iostream>
#include <vector>
#include "exceptions.h"
#include "Vector3D.h"
#include "Particle.h"
#include "Element.h"

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{
private :

	/** Constructeur de copie ne faisant rien. */
	Accelerator (Accelerator const& other) {}

	/** Opérateur '=' ne faisant rien. */
	void operator= (Accelerator const& other) const {}

protected:

	/** Attributs d'un accélérateur : une collection d'éléments, et une de particules. */
	std::vector< Element* > elementCollec;
	std::vector< Particle* > particleCollec;

public:

	/** Constructeur d'un accélérateur. */
	Accelerator ():
		elementCollec(0),
		particleCollec(0)
	{};

	virtual ~Accelerator() {clear();}

	/** Retourne un pointeur sur un élément de l'accélérateur.*/
	Element* 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];}

	/** 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* e = element.clone();
		elementCollec.push_back(e);
		return e;
	}

	/** Copie une particule dans l'accélérateur. */
	Particle* add(const Particle& particle){
		Particle* p = particle.clone();
		particleCollec.push_back(p);
		return p;
	}

	/** 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;
	}


	/** 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];

			std::cout << "element: " << (particle->getElement()->toString()) << "\n";

			std::cout << "B field at particle position: " << (particle->getElement()->magneticFieldAt(particle->getPosition())) << "\n";
			std::cout << "B field at entry position: " << (particle->getElement()->magneticFieldAt(particle->getElement()->getEntryPosition())) << "\n";

			std::cout << "real stuff\n";
			particle->applyMagneticForce(particle->getElement()->magneticFieldAt(particle->getPosition()), dt);

			std::cout.flush();

			Vector3D a = particle->getForce() / (particle->getGamma() * particle->getMass());
			particle->setVelocity(particle->getVelocity() + a * dt);
		}



		for (int i = 0; i < particleCollec.size(); ++i) {
			Particle& particle = *(particleCollec[i]);
			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()->isConnected()) throw Exception("Element in accelerator not connected.");
				else particle.setElement(particle.getElement()->getNext());
			}
		}

	}

	void* stepMonteCarlo();

	void* stepDeterministBackUp();

	void* stepDeterminist();

};

}

#endif /* ACCELERATOR_H_ */