OPAL (Object Oriented Parallel Accelerator Library)  2024.1
OPAL
RingSection.h
Go to the documentation of this file.
1 //
2 // Class RingSection
3 // Defines the component placement handler in ring geometry.
4 //
5 // Copyright (c) 2012 - 2023, Chris Rogers, STFC Rutherford Appleton Laboratory, Didcot, UK
6 // All rights reserved
7 //
8 // This file is part of OPAL.
9 //
10 // OPAL is free software: you can redistribute it and/or modify
11 // it under the terms of the GNU General Public License as published by
12 // the Free Software Foundation, either version 3 of the License, or
13 // (at your option) any later version.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with OPAL. If not, see <https://www.gnu.org/licenses/>.
17 //
18 #ifndef RING_SECTION_H
19 #define RING_SECTION_H
20 
21 #include "AbsBeamline/Component.h"
22 
23 #include <cmath>
24 #include <vector>
25 
58 class RingSection {
59 
60 public:
63  RingSection();
64 
66  RingSection(const RingSection& sec);
67 
68  RingSection& operator=(const RingSection& sec);
69 
71  ~RingSection();
72 
79  bool isOnOrPastStartPlane(const Vector_t& pos) const;
80 
86  bool isPastEndPlane(const Vector_t& pos) const;
87 
102  bool getFieldValue(const Vector_t& pos, const Vector_t& centroid,
103  const double& t, Vector_t& E, Vector_t& B) const;
104 
116  std::vector<Vector_t> getVirtualBoundingBox() const;
117 
119  bool doesOverlap(double phiStart, double phiEnd) const;
120 
126 
131  inline Component* getComponent() const {return component_m;}
132 
134  inline void setStartPosition(Vector_t pos) {startPosition_m = pos;}
135 
137  inline Vector_t getStartPosition() const {return startPosition_m;}
138 
140  inline void setStartNormal(Vector_t orientation);
141 
143  inline Vector_t getStartNormal() const {return startOrientation_m;}
144 
146  inline void setEndPosition(Vector_t pos) {endPosition_m = pos;}
147 
149  inline Vector_t getEndPosition() const {return endPosition_m;}
150 
152  inline void setEndNormal(Vector_t orientation);
153 
155  inline Vector_t getEndNormal() const {return endOrientation_m;}
156 
158  inline void setComponentPosition(Vector_t position) {componentPosition_m = position;}
159 
162 
164  inline void setComponentOrientation(Vector_t orientation);
165 
168 
180  void handleOffset();
181 
182 private:
183  void rotate(Vector_t& vector) const;
184  void rotate_back(Vector_t& vector) const;
185  inline Vector_t& normalise(Vector_t& vector) const;
186  inline void rotateToTCoordinates(Vector_t& vec) const;
187  inline void rotateToCyclCoordinates(Vector_t& vec) const;
188 
190 
193 
196 
199 
201  double sin2_m;
202  double cos2_m;
203 };
204 
205 typedef std::vector<RingSection*> RingSectionList;
206 
208  componentOrientation_m = orientation;
210 }
211 
212 inline void RingSection::setStartNormal(Vector_t orientation) {
213  startOrientation_m = normalise(orientation);
214 }
215 
216 inline void RingSection::setEndNormal(Vector_t orientation) {
217  endOrientation_m = normalise(orientation);
218 }
219 
220 inline Vector_t& RingSection::normalise(Vector_t& orientation) const {
221  double magnitude = std::sqrt(orientation(0) * orientation(0) +
222  orientation(1) * orientation(1) +
223  orientation(2) * orientation(2));
224  if (magnitude > 0.) {
225  orientation /= magnitude;
226  }
227  return orientation;
228 }
229 
230 
232  vec = Vector_t(vec(1), vec(2), vec(0));
233 }
234 
236  vec = Vector_t(vec(2), vec(0), vec(1));
237 }
238 
239 #endif //RING_SECTION_H
void rotateToTCoordinates(Vector_t &vec) const
Definition: RingSection.h:231
Tps< T > sqrt(const Tps< T > &x)
Square root.
Definition: TpsMath.h:91
void rotate_back(Vector_t &vector) const
item[EANGLE] Entrance edge counterclockwise This enables to obtain skew at each point along the its radius is computed such that the reference trajectory always remains in the centre of the magnet In the body of the magnet the radius is set from the LENGTH and ANGLE attributes It is then continuously changed to be proportional to the dipole field on the reference trajectory while entering the end fields This attribute is only to be set TRUE for a non zero dipole component(Default:FALSE)\item[VARSTEP] The step size(meters) used in calculating the reference trajectory for VARRARDIUS
void setEndPosition(Vector_t pos)
Definition: RingSection.h:146
Vektor< double, 3 > Vector_t
Definition: Vektor.h:6
Vector_t & normalise(Vector_t &vector) const
Definition: RingSection.h:220
bool isPastEndPlane(const Vector_t &pos) const
Definition: RingSection.cpp:76
Vector_t getComponentPosition() const
Definition: RingSection.h:161
RingSection & operator=(const RingSection &sec)
Definition: RingSection.cpp:46
std::vector< Vector_t > getVirtualBoundingBox() const
void setComponentPosition(Vector_t position)
Definition: RingSection.h:158
bool isOnOrPastStartPlane(const Vector_t &pos) const
Definition: RingSection.cpp:63
double sin2_m
Definition: RingSection.h:201
void setEndNormal(Vector_t orientation)
Definition: RingSection.h:216
Vector_t getStartPosition() const
Definition: RingSection.h:137
bool getFieldValue(const Vector_t &pos, const Vector_t &centroid, const double &t, Vector_t &E, Vector_t &B) const
Definition: RingSection.cpp:88
void setStartNormal(Vector_t orientation)
Definition: RingSection.h:212
Vector_t getStartNormal() const
Definition: RingSection.h:143
std::vector< RingSection * > RingSectionList
Definition: RingSection.h:205
Component placement handler in ring geometry.
Definition: RingSection.h:58
Definition: Vec.h:21
void rotateToCyclCoordinates(Vector_t &vec) const
Definition: RingSection.h:235
void setComponentOrientation(Vector_t orientation)
Definition: RingSection.h:207
void handleOffset()
Vector_t startPosition_m
Definition: RingSection.h:194
Component * component_m
Definition: RingSection.h:189
Vector_t getEndNormal() const
Definition: RingSection.h:155
void rotate(Vector_t &vector) const
Component * getComponent() const
Definition: RingSection.h:131
double cos2_m
Definition: RingSection.h:202
void setStartPosition(Vector_t pos)
Definition: RingSection.h:134
bool doesOverlap(double phiStart, double phiEnd) const
Vector_t componentOrientation_m
Definition: RingSection.h:192
Vector_t startOrientation_m
Definition: RingSection.h:195
Vector_t getComponentOrientation() const
Definition: RingSection.h:167
Tps< T > sec(const Tps< T > &x)
Secant.
Definition: TpsMath.h:153
Vector_t componentPosition_m
Definition: RingSection.h:191
void updateComponentOrientation()
void setComponent(Component *component)
Definition: RingSection.h:125
Interface for a single beam element.
Definition: Component.h:50
Vector_t getEndPosition() const
Definition: RingSection.h:149
Vector_t endPosition_m
Definition: RingSection.h:197
Vector_t endOrientation_m
Definition: RingSection.h:198