summaryrefslogtreecommitdiff
path: root/src/main/Beam.h
blob: 1e71b15c0a4f44a33e69e15be6d445c3b39a12f7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/*
 * Beam.h
 *
 *  Created on: May 6, 2011
 *      Author: jakob
 */
#ifndef BEAM_H_
#define BEAM_H_

#include <list>
#include "Cloneable.h"
#include "Particle.h"
#include "Vector3D.h"
#include "events.h"

namespace vhc {

/** Classe de base pour les faisceaux. */
class Beam: public Cloneable, public Publisher<ParticleAddedEvent>, public Publisher<ParticleRemovedEvent> {

public:

	typedef std::list<Particle*> ParticleCollection;

	/** Cree un nouveau faisceau.
	 *  @param refererenceParticle particule de reference (son element ne joue pas de role)
	 *  @param quantity la quantite de particules a generer
	 *  @param lambda le facteur de macroparticules (il y aura lambda fois moins de particules dans le faisceau mais a charges et masses lambdas fois plus grands)
	 *  <b>ATTENTION:</b> un `Beam' est abstrait et n'initialise pas les particules a partir de la reference.
	 *  C'est au client de faire cela! */
	Beam(const Particle& referenceParticle, int quantity, int lambda);

	virtual ~Beam();

	/** Retourne tous les particules contenus dans ce faisceau. */
	ParticleCollection& getParticles();

	/** Met a jour les particules en leur attribuant l'element dans lequel ils sont contenus.
	 *  Contrairement a <code>Accelerator::initializeBeams()</code>, les elements consideres sont:
	 *  - l'element actuel de la particule
	 *  - l'element precedent
	 *  - l'element suivant
	 *  Si la particule se situe a cote de son element, elle est supprimee de l'accelerateur.
	 *  Attention: si la particule saute un element, elle est tout de meme consideree comme etant dans l'element suivant (ou precedent)! Ceci
	 *  peut survenir si un element est trop petit ou si la simulation est faite avec des pas de temps trop grands. */
	void updateParticles();

	/** Initialise les particules de ce faisceau.
	 *  Cette methode est appelee par la classe Accelerator. */
	virtual void initializeParticles() = 0;

	/** Simule ce faisceau pendant un pas de temps dt. */
	void step(double dt);

	/** Retourne la quantite de particules contenus dans ce faisceau. */
	int getQuantity() const;

	/** Retourne la quantite de macroparticules contenus dans ce faisceau. */
	int getSize() const;

	/** Retourne le coefficient des macroparticules. */
	int getLambda() const;

	/** Retourne la particule de reference. */
	Particle& getReferenceParticle();

	/** Retourne l'energie moyenne des particules dans ce faisceau. */
	double getAverageEnergy() const;

	/** Retourne l'emmitance verticale de ce faisceau. */
	double getVerticalEmittance() const;

	/** Retourne l'emmitance horizontale de ce faisceau. */
	double getHorizontalEmittance() const;

	/** Vide ce faisceau en supprimant tous les particules. */
	void clear();

	virtual Beam* clone() const = 0;

	//-------------------------------------------------------------------

	/** Retourne coefficient des ellipses de phases vertical. */
	virtual double getVerticalA11() const;

	/** Retourne coefficient des ellipses de phases vertical. */
	virtual double getVerticalA12() const;

	/** Retourne coefficient des ellipses de phases vertical. */
	virtual double getVerticalA22() const;

	/** Retourne coefficient des ellipses de phases horizontal. */
	virtual double getHorizontalA11() const;

	/** Retourne coefficient des ellipses de phases horizontal. */
	virtual double getHorizontalA12() const;

	/** Retourne coefficient des ellipses de phases horizontal. */
	virtual double getHorizontalA22() const;

protected:

	/** Particule de reference. */
	Particle referenceParticle;

	/** Macroparticules contenus dans ce faisceau. */
	ParticleCollection particles;

	/** Coefficient des macrosparticules. */
	int lambda;

	/** Quantite de particules contenus dans ce faisceau. */
	int quantity;

	/** Methode qui doit etre appelee par toute sous-classe pour ajouter une particule au faisceau.
	 *  Publie un <code>ParticleAddedEvent</code>. */
	void add(Particle* particle);

	/** Methode qui doit etre appelee par toute sous-classe pour supprimer une particule du faisceau.
	 *  Publie un <code>ParticleRemovedEvent</code>. */
	void remove(Particle* particle);

	/** Methode qui doit etre appelee par toute sous-classe pour supprimer une particule du faisceau.
	 *  Publie un <code>ParticleRemovedEvent</code>. */
	ParticleCollection::iterator erase(ParticleCollection::iterator i);

	/** Retourne la moyenne de la distribution horizontale de la position des particules.
	 *  (<r^2> horizontal du complement) */
	double getHR2() const;

	/** Retourne la moyenne de la distribution horizontale de la vitesse des particules.
	 *  (<v^2> horizontal du complement) */
	double getHV2() const;

	/** Retourne la moyenne de la distribution horizontale du produit de la position et de la vitesse des particules.
	 *  (<r*v>^2 horizontal du complement) */
	double getHRV2() const;

	/** Retourne la moyenne de la distribution verticale de la position des particules.
	 *  (<r^2> vertical du complement) */
	double getVR2() const;

	/** Retourne la moyenne de la distribution verticale de la vitesse des particules.
	 *  (<v^2> vertical du complement) */
	double getVV2() const;

	/** Retourne la moyenne de la distribution verticale du produit de la position et de la vitesse des particules.
	 *  (<r*v>^2 vertical du complement) */
	double getVRV2() const;

};

}

#endif /* BEAM_H_ */