summaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorJakob Odersky <jodersky@gmail.com>2011-03-28 17:36:20 +0000
committerJakob Odersky <jodersky@gmail.com>2011-03-28 17:36:20 +0000
commit2763b7872cbd0295efd7153f1100b04fca42e0ed (patch)
tree3a1f6e9adeca2d32b2530fed7318e267835b0a31 /src/main
parent3e3ba28bbe391350405b4bc2d8bdd3488e56897f (diff)
downloadvhc-2763b7872cbd0295efd7153f1100b04fca42e0ed.tar.gz
vhc-2763b7872cbd0295efd7153f1100b04fca42e0ed.tar.bz2
vhc-2763b7872cbd0295efd7153f1100b04fca42e0ed.zip
*Suppression de `MagneticElement' et `ElectricElement', les valeurs de B et E en fonction de la position sont definis dans `Element' et prennent comme valeur par defaut le vecteur nul.
*Creation du dipole.
Diffstat (limited to 'src/main')
-rw-r--r--src/main/CurvedElement.cc4
-rw-r--r--src/main/CurvedElement.h13
-rw-r--r--src/main/Dipole.cc21
-rw-r--r--src/main/Dipole.h71
-rw-r--r--src/main/ElectricElement.cc14
-rw-r--r--src/main/ElectricElement.h30
-rw-r--r--src/main/Element.h30
-rw-r--r--src/main/MagneticElement.cc14
-rw-r--r--src/main/MagneticElement.h29
-rw-r--r--src/main/Makefile8
-rw-r--r--src/main/StraightElement.h19
11 files changed, 123 insertions, 130 deletions
diff --git a/src/main/CurvedElement.cc b/src/main/CurvedElement.cc
index 1abfcbf..05b501f 100644
--- a/src/main/CurvedElement.cc
+++ b/src/main/CurvedElement.cc
@@ -29,10 +29,10 @@ CurvedElement::CurvedElement(const Vector3D& entry, const Vector3D& exit, double
//pas possible que le rayon de courbure soit plus petit la moitie
//de la distance entre les points d'entree et de sortie
- if (1.0 / k < (exit - entry).norm() / 2) throw IllegalArgumentException("Invalid curvature radius.");
+ if (fabs(1.0 / k) < (exit - entry).norm() / 2) throw IllegalArgumentException("Invalid curvature radius.");
Vector3D midpoint = (getEntryPosition() + getExitPosition())/ 2;
- curvatureCenter = midpoint + sqrt(1.0 - (k * k) / 4 * getDiagonal().normSquare()) * (getDiagonal().unit().cross(Vector3D::k));
+ curvatureCenter = midpoint + 1 / k * sqrt(1.0 - (k * k) / 4 * getDiagonal().normSquare()) * (getDiagonal().unit().cross(Vector3D::k));
}
diff --git a/src/main/CurvedElement.h b/src/main/CurvedElement.h
index 1f3e6c6..e65bcc5 100644
--- a/src/main/CurvedElement.h
+++ b/src/main/CurvedElement.h
@@ -15,12 +15,10 @@
namespace vhc {
-
/** Represente un element courbe. En plus de posseder les proprietes generales d'un element,
* un element courbe a de plus une courbure et un centre de courbure.
* ==> TODO ajouter explication de la courbure
* Le centre de courbure est calcule avec la courbure et les positions des faces d'entree et de sortie d'un element. */
-
class CurvedElement: public Element {
protected:
@@ -33,8 +31,6 @@ protected:
public:
-
- /** Constructeur d'un élément courbe. */
/** Constructeur d'elements courbes.
* @param entry position de la face d'entree
* @param exit position de face de sortie
@@ -43,23 +39,20 @@ public:
* @param next pointeur sur l'element suivant */
CurvedElement(const Vector3D& entry, const Vector3D& exit, double sectionRadius, double curvature, Element* next = NULL);
- /** Retourne un booléen indiquant la présence à l'intérieur de l'élément de la particule. */
- virtual CurvedElement* copy() const {return new CurvedElement(*this);}
+
+ virtual ~CurvedElement() {};
+ //virtual CurvedElement* copy() const {return new CurvedElement(*this);}
virtual bool isOutside(const Particle& particle) const {
Vector3D x(particle.getPosition() - entryPosition);
return (x - Vector3D(x.getX(), x.getY(), 0).unit() / fabs(curvature)).norm() > sectionRadius;
}
- /** Retourne un booléen indiquant le passage au prochain élément de la particule. */
virtual bool isPast(const Particle& particle) const {
Vector3D out = (entryPosition - curvatureCenter).cross(exitPosition - curvatureCenter).cross(entryPosition - curvatureCenter);
return (particle.getPosition() - exitPosition).dot(out) > 0;
}
- /** Retourne une chaîne de caractères de cet élément courbe. */
- virtual std::string toString () const;
-
double getCurvature() const {return curvature;}
Vector3D getCurvatureCenter() const {return curvatureCenter;}
diff --git a/src/main/Dipole.cc b/src/main/Dipole.cc
new file mode 100644
index 0000000..9fc85bb
--- /dev/null
+++ b/src/main/Dipole.cc
@@ -0,0 +1,21 @@
+/*
+ * Dipole.cc
+ *
+ * Created on: Mar 28, 2011
+ * Author: jakob
+ */
+
+#include "Dipole.h"
+
+namespace vhc {
+
+/*Dipole::Dipole() {
+ // TODO Auto-generated constructor stub
+
+}
+
+Dipole::~Dipole() {
+ // TODO Auto-generated destructor stub
+}*/
+
+}
diff --git a/src/main/Dipole.h b/src/main/Dipole.h
new file mode 100644
index 0000000..357d209
--- /dev/null
+++ b/src/main/Dipole.h
@@ -0,0 +1,71 @@
+/*
+ * Dipole.h
+ *
+ * Created on: Mar 28, 2011
+ * Author: jakob
+ */
+
+#ifndef DIPOLE_H_
+#define DIPOLE_H_
+
+#include <string>
+#include <sstream>
+#include "CurvedElement.h"
+#include "Vector3D.h"
+
+namespace vhc {
+
+/** Represente un dipole avec un champ magnetique constant. */
+class Dipole: public CurvedElement {
+
+private:
+
+ /** Champ magnetique du dipole. */
+ Vector3D _magneticField;
+
+public:
+
+ /** Cree un nouveau dipole.
+ * @param entry position d'entree
+ * @param exit position de sortie
+ * @param sectionRadius rayon de la chambre a vide
+ * @param curvature courbure (inverse du rayon de courbure)
+ * @param magneticField champ magnetique du dipole
+ * @param next pointeur sur l'element prochain
+ * @see vhc::Element*/
+ Dipole(const Vector3D& entry, const Vector3D& exit, double sectionRadius, double curvature, const Vector3D& magneticField = Vector3D::Null, Element* next = NULL):
+ CurvedElement(entry, exit, sectionRadius, curvature, next),
+ _magneticField(magneticField) {};
+
+ virtual ~Dipole() {};
+
+ /** Retourne le champ magnetique a l'interieur de ce dipole. */
+ Vector3D getMagneticField() const {
+ return _magneticField;
+ }
+
+ /** Modifie le champ magnetique de ce dipole.
+ * Ceci correspondrait en realite a une correction du champ a l'aide d'electroaimants. */
+ void setMagneticField(const Vector3D& field) {
+ _magneticField = field;
+ }
+
+ virtual Vector3D magneticFieldAt(const Vector3D& position) const {
+ return _magneticField;
+ }
+
+ virtual std::string getType() const {return "Dipole";}
+ virtual std::string toString() const {
+ std::stringstream s;
+ s << CurvedElement::toString() << "\n";
+ s << "\tB: " << getMagneticField();
+ s << "\t|B|: " << getMagneticField().norm();
+ return s.str();
+ }
+
+
+};
+
+}
+
+#endif /* DIPOLE_H_ */
diff --git a/src/main/ElectricElement.cc b/src/main/ElectricElement.cc
deleted file mode 100644
index 32056b5..0000000
--- a/src/main/ElectricElement.cc
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * ElectricElement.cc
- *
- * Created on: Mar 24, 2011
- * Author: jakob
- */
-
-#include "ElectricElement.h"
-
-namespace vhc {
-
-
-
-}
diff --git a/src/main/ElectricElement.h b/src/main/ElectricElement.h
deleted file mode 100644
index 9a8e5bf..0000000
--- a/src/main/ElectricElement.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * ElectricElement.h
- *
- * Created on: Mar 24, 2011
- * Author: jakob
- */
-
-#ifndef ELECTRICELEMENT_H_
-#define ELECTRICELEMENT_H_
-
-#include "Vector3D.h"
-#include "Element.h"
-
-namespace vhc {
-
-class ElectricElement: public Element {
-
-public:
-
- virtual ~ElectricElement();
-
- virtual Vector3D electricField(const Vector3D& position) const = 0;
-
- virtual std::string getType() const {return "Electric Element";}
-
-};
-
-}
-
-#endif /* ELECTRICELEMENT_H_ */
diff --git a/src/main/Element.h b/src/main/Element.h
index eb122e3..6840eda 100644
--- a/src/main/Element.h
+++ b/src/main/Element.h
@@ -16,8 +16,7 @@
namespace vhc {
-// TODO destructeur virtuel!!!
-/** Classe abstraite représentant un élément d'un accelerateur. */
+/** Classe abstraite representant un element d'un accelerateur. */
class Element: public Printable {
private:
@@ -46,7 +45,7 @@ protected:
double fieldIntensity;
Vector3D magneticField
- /** Direction du champ magnétique, invariant dans l'espace.
+ * Direction du champ magnétique, invariant dans l'espace.
Vector3D fieldDirection;
*/
@@ -63,17 +62,28 @@ public:
sectionRadius(sectionRadius),
next(next) {};
+ virtual ~Element() {};
+
/** Copie l'element sur le heap et renvoye un pointeur sur la copie.
* ATTENTION: La delocation de memoire est sous la responsabilite de l'appelant. */
- virtual Element* copy() const = 0;
+ //virtual Element* copy() const = 0;
/** Determine si la particule donnee a heurte le bord de cet element. */
-
virtual bool isOutside(const Particle& particle) const = 0;
/** Determine si la particule donnee a passe cet element. */
virtual bool isPast(const Particle& particle) const = 0;
+ /** Retourne le champ magnetique, a l'interieur de cet element a la position donnee. */
+ virtual Vector3D magneticFieldAt(const Vector3D& position) const {
+ return Vector3D::Null;
+ }
+
+ /** Retourne le champ electrique, a l'interieur de cet element a la position donnee. */
+ virtual Vector3D electricFieldAt(const Vector3D& position) const {
+ return Vector3D::Null;
+ }
+
/** Retourne la diagonale, c'est-a-dire le vecteur de la position d'entree
* a la position de sortie. */
Vector3D getDiagonal() const {return exitPosition - entryPosition;}
@@ -99,15 +109,17 @@ public:
/** Retourne un pointeur l'element suivant. NULL s'il n'existe pas. */
Element* getNext() const {return next;}
- /** Assigne un pointeur sur l'élément suivant. */
+ /** Assigne un pointeur sur l'element suivant. */
void setNext(Element* n) {next = n;}
- /** Retourne une représentation en chaîne de caractères de cet élément. */
- virtual std::string toString() const = 0;
-
+ /** Retourne vrai si cet element est connecte a un element suivant, faux sinon. */
bool isConnected() const {return next != NULL;}
+ /** Retourne une representation en chaine du type de cet element, i.e. du nom de la classe.
+ * Cette methode est utilisee principalement pour changer le comportement de <code>toString()</code>
+ * dans des implementations concretes. */
virtual std::string getType() const {return "Element";}
+
virtual std::string toString() const {
std::stringstream s;
s << getType() << ":\n";
diff --git a/src/main/MagneticElement.cc b/src/main/MagneticElement.cc
deleted file mode 100644
index 65f3f0a..0000000
--- a/src/main/MagneticElement.cc
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * MagneticElement.cc
- *
- * Created on: Mar 23, 2011
- * Author: jakob
- */
-
-#include "MagneticElement.h"
-
-namespace vhc {
-
-
-
-}
diff --git a/src/main/MagneticElement.h b/src/main/MagneticElement.h
deleted file mode 100644
index 159b0c6..0000000
--- a/src/main/MagneticElement.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * MagneticElement.h
- *
- * Created on: Mar 23, 2011
- * Author: jakob
- */
-
-#ifndef MAGNETICELEMENT_H_
-#define MAGNETICELEMENT_H_
-
-#include "Element.h"
-#include "Vector3D.h"
-
-namespace vhc {
-
-class MagneticElement: public Element {
-
-public:
-
- virtual ~MagneticElement();
-
- virtual Vector3D magneticField(const Vector3D& position) const = 0;
-
- virtual std::string getType() const {return "Magnetic Element";}
-};
-
-}
-
-#endif /* MAGNETICELEMENT_H_ */
diff --git a/src/main/Makefile b/src/main/Makefile
index 9c99d37..20fefb6 100644
--- a/src/main/Makefile
+++ b/src/main/Makefile
@@ -13,12 +13,10 @@ LOCALDIR = main
# ==> Ajouter ici les objets à compiler
# Si un objet nécessite une compilation non-standard (i.e. pas de règle du style Foo.o : Foo.cc Foo.h), rajouter
# cette règle.
-
-LOCALOBJS = Vector3D.o Particle.o Printable.o Element.o CurvedElement.o StraightElement.o MagneticElement.o \
- CompositeElement.o ElectricElement.o Accelerator.o
-
+LOCALOBJS = Vector3D.o Particle.o Printable.o Element.o CurvedElement.o StraightElement.o \
+ CompositeElement.o Dipole.o
OBJS=$(addprefix $(BINDIR)/$(LOCALDIR)/,$(LOCALOBJS))
-.PHONY = lib
+.PHONY = all checkdirs lib
all: checkdirs lib
diff --git a/src/main/StraightElement.h b/src/main/StraightElement.h
index cf769be..d9eb5e0 100644
--- a/src/main/StraightElement.h
+++ b/src/main/StraightElement.h
@@ -23,21 +23,9 @@ public:
Element(entry, exit, sectionRadius, next)
{};
- // TODO avec cette mauvaise méthode, tous les éléments pointent vers l'origine...
- /** Constructeur d'une section, où l'on donne une position d'entrée et une longueur. */
- StraightElement(const Vector3D& entry, double l, double sectionRadius,const Vector3D& exit=Vector3D::Null, Element* next = NULL):
- Element(entry, exit, sectionRadius, next)
- { this->setLength(l); };
-
- /* Affecte un longueur à la section droite, à partir de la position d'entrée. */
- void setLength (double l) {
- setExitPosition( entryPosition + ( l * (~(exitPosition - entryPosition))));
- }
-
- //TODO ! why can't you access protected variables, i.e. entryPosition won't work?!
-
- virtual StraightElement* copy() const {return new StraightElement(*this);}
+ virtual ~StraightElement() {};
+ //virtual StraightElement* copy() const {return new StraightElement(*this);}
virtual bool isOutside(const Particle& particle) const {
Vector3D a(particle.getPosition() - entryPosition);
@@ -50,9 +38,6 @@ public:
return getDiagonal().dot(v) > getDiagonal().dot(getDiagonal());
}
- /* Retourne une chaîne de caractères de cet élément droit. */
- virtual std::string toString () const;
-
virtual std::string getType() const {return "Straight Element";}
virtual std::string toString() const {
std::stringstream s;