diff options
Diffstat (limited to 'src/main/Beam.h')
-rw-r--r-- | src/main/Beam.h | 116 |
1 files changed, 72 insertions, 44 deletions
diff --git a/src/main/Beam.h b/src/main/Beam.h index f03af97..70f9f86 100644 --- a/src/main/Beam.h +++ b/src/main/Beam.h @@ -14,52 +14,12 @@ namespace vhc { -class Beam { - -protected: - - /** Particule de reference. */ - Particle referenceParticle; - - /** Particules contenus dans ce faisceau. */ - std::list<Particle*> particles; - - /** Coefficient des macrosparticules. */ - int lambda; - - int quantity; - - /** 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; - - /** Initialise ce faisceau a partir de la particule de reference. Comme il s'agit d'une sorte de factory method (au sens vraiment large), - * la responsabilite de gestion des particules appartient a ce faisceau (et non a la sous-classe). */ - virtual void init(const Particle& referenceParticle, int quantity, int lambda) = 0; - +class Beam: public Cloneable { public: + typedef std::list<Particle*> ParticleCollection; + /** Cree un nouveau faisceaux. * <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! */ @@ -67,14 +27,34 @@ public: virtual ~Beam(); + + 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(); + + virtual void initializeParticles() = 0; + + 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. */ - const Particle& getReferenceParticle() const; + Particle& getReferenceParticle(); /** Retourne l'energie moyenne des particules dans ce faisceau. */ double getAverageEnergy() const; @@ -85,6 +65,15 @@ public: /** Retourne l'emmitance horizontale de ce faisceau. */ double getHorizontalEmittance() const; + void clear(); + + virtual Beam* clone() const = 0; + + + + + //------------------------------------------------------------------- + /** Retourne coefficient des ellipses de phases vertical. */ double getVerticalA11() const; @@ -103,6 +92,45 @@ public: /** Retourne coefficient des ellipses de phases horizontal. */ double getHorizontalA22() const; +protected: + + /** Particule de reference. */ + Particle referenceParticle; + + /** (Macro-)Particules contenus dans ce faisceau. */ + ParticleCollection particles; + + /** Coefficient des macrosparticules. */ + int lambda; + + int quantity; + + /** 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; + + + }; } |