diff options
author | Jakob Odersky <jodersky@gmail.com> | 2011-03-28 17:36:20 +0000 |
---|---|---|
committer | Jakob Odersky <jodersky@gmail.com> | 2011-03-28 17:36:20 +0000 |
commit | 2763b7872cbd0295efd7153f1100b04fca42e0ed (patch) | |
tree | 3a1f6e9adeca2d32b2530fed7318e267835b0a31 | |
parent | 3e3ba28bbe391350405b4bc2d8bdd3488e56897f (diff) | |
download | vhc-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.
-rw-r--r-- | Makefile | 5 | ||||
-rw-r--r-- | src/main/CurvedElement.cc | 4 | ||||
-rw-r--r-- | src/main/CurvedElement.h | 13 | ||||
-rw-r--r-- | src/main/Dipole.cc | 21 | ||||
-rw-r--r-- | src/main/Dipole.h | 71 | ||||
-rw-r--r-- | src/main/ElectricElement.cc | 14 | ||||
-rw-r--r-- | src/main/ElectricElement.h | 30 | ||||
-rw-r--r-- | src/main/Element.h | 30 | ||||
-rw-r--r-- | src/main/MagneticElement.cc | 14 | ||||
-rw-r--r-- | src/main/MagneticElement.h | 29 | ||||
-rw-r--r-- | src/main/Makefile | 8 | ||||
-rw-r--r-- | src/main/StraightElement.h | 19 | ||||
-rw-r--r-- | src/test/ElementTest.cc | 15 | ||||
-rw-r--r-- | src/test/Vector3DTest.cc | 2 |
14 files changed, 135 insertions, 140 deletions
@@ -9,7 +9,7 @@ # Choix du compilateur -CXX = g++ +export CXX = g++ # Repertoire de base export BASEDIR = $(abspath .) @@ -23,12 +23,15 @@ export BINDIR = $(BASEDIR)/bin # Partie commentée : choisissez les options que vous voulez avoir # en décommentant la/les lignes correspondantes # +# CXXFLAGS += -Wall # CXXFLAGS += -ansi -pedantic -Wall # pour les purs et durs # CXXFLAGS += -g # pour debugger # CXXFLAGS += -pg # pour profiler # LDFLAGS += -pg # pour profiler # CXXFLAGS += -O2 # pour optimiser la vitesse +export CXXFLAGS + .PHONY: all checkdirs build test-build doc test clean all: checkdirs build test-build doc test 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; diff --git a/src/test/ElementTest.cc b/src/test/ElementTest.cc index 67dc568..e4e82c9 100644 --- a/src/test/ElementTest.cc +++ b/src/test/ElementTest.cc @@ -7,9 +7,7 @@ #include <iostream> #include <assert.h> -#include "Element.h" -#include "CurvedElement.h" -#include "StraightElement.h" +#include "Dipole.h" #include "Vector3D.h" using namespace std; @@ -18,10 +16,10 @@ using namespace vhc; int main() { //test d'affichage - StraightElement* s = new StraightElement(Vector3D(0,0,0), Vector3D(1,2,0), 0.2); - cout << *s << endl; - delete s; s = NULL; - + Dipole* d = new Dipole(Vector3D(0,0,0), Vector3D(1,2,0), 0.2, 0.2, Vector3D::Null, NULL); + cout << *d << endl; + delete d; d = NULL; +/* CurvedElement* c = new CurvedElement(Vector3D(0,1,0), Vector3D(1,0,0), 0.2, 1); cout << *c << endl; delete c; c = NULL; @@ -30,12 +28,13 @@ int main() { bool caught = false; try { CurvedElement(Vector3D(0,0,0), Vector3D(1,0,0), 0.2, 1.0 / 0.4); + // ^ le rayon de courbure est trop petit } catch (Exception& e) { caught = true; }; assert(caught); - +*/ return 0; } diff --git a/src/test/Vector3DTest.cc b/src/test/Vector3DTest.cc index d494766..5e1fde9 100644 --- a/src/test/Vector3DTest.cc +++ b/src/test/Vector3DTest.cc @@ -34,7 +34,7 @@ int main() { bool caught = false; try { - ~Vector3D::Null; + Vector3D n = ~Vector3D::Null; } catch (UnsupportedOperationException& ex) { caught = true; }; |