OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
RingSection.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2012-2014, Chris Rogers
3  * All rights reserved.
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  * 1. Redistributions of source code must retain the above copyright notice,
7  * this list of conditions and the following disclaimer.
8  * 2. Redistributions in binary form must reproduce the above copyright notice,
9  * this list of conditions and the following disclaimer in the documentation
10  * and/or other materials provided with the distribution.
11  * 3. Neither the name of STFC nor the names of its contributors may be used to
12  * endorse or promote products derived from this software without specific
13  * prior written permission.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25  * POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 #ifndef RING_SECTION_H
29 #define RING_SECTION_H
30 
31 #include <vector>
32 
33 #include "AbsBeamline/Component.h"
34 
67 class RingSection {
68  public:
71  RingSection();
72 
74  RingSection(const RingSection& sec);
75 
76  RingSection& operator=(const RingSection& sec);
77 
79  ~RingSection();
80 
87  bool isOnOrPastStartPlane(const Vector_t& pos) const;
88 
94  bool isPastEndPlane(const Vector_t& pos) const;
95 
110  bool getFieldValue(const Vector_t& pos, const Vector_t& centroid,
111  const double& t, Vector_t& E, Vector_t& B) const;
112 
124  std::vector<Vector_t> getVirtualBoundingBox() const;
125 
127  bool doesOverlap(double phiStart, double phiEnd) const;
128 
133  inline void setComponent(Component* component) {component_m = component;}
134 
139  inline Component* getComponent() const {return component_m;}
140 
142  inline void setStartPosition(Vector_t pos) {startPosition_m = pos;}
143 
145  inline Vector_t getStartPosition() const {return startPosition_m;}
146 
148  inline void setStartNormal(Vector_t orientation);
149 
151  inline Vector_t getStartNormal() const {return startOrientation_m;}
152 
154  inline void setEndPosition(Vector_t pos) {endPosition_m = pos;}
155 
157  inline Vector_t getEndPosition() const {return endPosition_m;}
158 
160  inline void setEndNormal(Vector_t orientation);
161 
163  inline Vector_t getEndNormal() const {return endOrientation_m;}
164 
166  inline void setComponentPosition(Vector_t position) {componentPosition_m = position;}
167 
170 
172  inline void setComponentOrientation(Vector_t orientation);
173 
176  private:
177  void rotate(Vector_t& vector) const;
178  void rotate_back(Vector_t& vector) const;
179  inline Vector_t& normalise(Vector_t& vector) const;
180  inline void rotateToTCoordinates(Vector_t& vec) const;
181  inline void rotateToCyclCoordinates(Vector_t& vec) const;
182 
184 
187 
190 
193 
195  double sin2_m;
196  double cos2_m;
197 };
198 
199 typedef std::vector<RingSection*> RingSectionList;
200 
202  componentOrientation_m = orientation;
204 }
205 
206 inline void RingSection::setStartNormal(Vector_t orientation) {
207  startOrientation_m = normalise(orientation);
208 }
209 
210 inline void RingSection::setEndNormal(Vector_t orientation) {
211  endOrientation_m = normalise(orientation);
212 }
213 
214 inline Vector_t& RingSection::normalise(Vector_t& orientation) const {
215  double magnitude = sqrt(orientation(0)*orientation(0)+
216  orientation(1)*orientation(1)+
217  orientation(2)*orientation(2));
218  if (magnitude > 0.)
219  orientation /= magnitude;
220  return orientation;
221 }
222 
223 
225  vec = Vector_t(vec(1), vec(2), vec(0));
226 }
227 
229  vec = Vector_t(vec(2), vec(0), vec(1));
230 }
231 
232 #endif //RING_SECTION_H
Vector_t getComponentOrientation() const
Definition: RingSection.h:175
void setStartNormal(Vector_t orientation)
Definition: RingSection.h:206
void rotateToCyclCoordinates(Vector_t &vec) const
Definition: RingSection.h:228
Vector_t startPosition_m
Definition: RingSection.h:188
double cos2_m
Definition: RingSection.h:196
void setComponentPosition(Vector_t position)
Definition: RingSection.h:166
void setEndNormal(Vector_t orientation)
Definition: RingSection.h:210
Component * component_m
Definition: RingSection.h:183
RingSection & operator=(const RingSection &sec)
Definition: RingSection.cpp:54
void rotate_back(Vector_t &vector) const
Component * getComponent() const
Definition: RingSection.h:139
void rotate(Vector_t &vector) const
Tps< T > sec(const Tps< T > &x)
Secant.
Definition: TpsMath.h:153
void setComponentOrientation(Vector_t orientation)
Definition: RingSection.h:201
void setComponent(Component *component)
Definition: RingSection.h:133
void setStartPosition(Vector_t pos)
Definition: RingSection.h:142
Vector_t componentOrientation_m
Definition: RingSection.h:186
bool doesOverlap(double phiStart, double phiEnd) const
bool getFieldValue(const Vector_t &pos, const Vector_t &centroid, const double &t, Vector_t &E, Vector_t &B) const
Definition: RingSection.cpp:95
std::vector< Vector_t > getVirtualBoundingBox() const
Vector_t getStartNormal() const
Definition: RingSection.h:151
void updateComponentOrientation()
bool isPastEndPlane(const Vector_t &pos) const
Definition: RingSection.cpp:83
Vector_t getEndPosition() const
Definition: RingSection.h:157
Vector_t getComponentPosition() const
Definition: RingSection.h:169
std::vector< RingSection * > RingSectionList
Definition: RingSection.h:199
Component placement handler in ring geometry.
Definition: RingSection.h:67
Vektor< double, 3 > Vector_t
Definition: Vektor.h:6
Tps< T > sqrt(const Tps< T > &x)
Square root.
Definition: TpsMath.h:91
Definition: Vec.h:21
Vector_t endOrientation_m
Definition: RingSection.h:192
bool isOnOrPastStartPlane(const Vector_t &pos) const
Definition: RingSection.cpp:70
void setEndPosition(Vector_t pos)
Definition: RingSection.h:154
Vector_t & normalise(Vector_t &vector) const
Definition: RingSection.h:214
Vector_t getStartPosition() const
Definition: RingSection.h:145
Vector_t componentPosition_m
Definition: RingSection.h:185
void rotateToTCoordinates(Vector_t &vec) const
Definition: RingSection.h:224
Vector_t getEndNormal() const
Definition: RingSection.h:163
Interface for a single beam element.
Definition: Component.h:51
Vector_t endPosition_m
Definition: RingSection.h:191
Vector_t startOrientation_m
Definition: RingSection.h:189
double sin2_m
Definition: RingSection.h:195