OPAL (Object Oriented Parallel Accelerator Library) 2024.2
OPAL
MultipoleTCurvedVarRadius Class Reference

#include <MultipoleTCurvedVarRadius.h>

Inheritance diagram for MultipoleTCurvedVarRadius:
Collaboration diagram for MultipoleTCurvedVarRadius:

Public Member Functions

 MultipoleTCurvedVarRadius (MultipoleT *element)
void initialise () override
BGeometryBasegetGeometry () override
const BGeometryBasegetGeometry () const override
void transformCoords (Vector_t &) override
void transformBField (Vector_t &, const Vector_t &) override
double getScaleFactor (double x, double s) override
double getFn (size_t n, double x, double s) override
void setMaxOrder (size_t orderZ, size_t orderX) override
Vector_t localCartesianToCurvilinear (const Vector_t &r)
Vector_t curvilinearToLocalCartesian (const Vector_t &r)
Vector_t localCartesianToOpalCartesian (const Vector_t &r) override
double reverseTransformResidual (const Vector_t &r, const Vector_t &target)
double localCartesianRotation () override
virtual double getBx (const Vector_t &R)
double getBz (const Vector_t &R)
virtual double getBs (const Vector_t &R)

Static Public Attributes

static constexpr size_t ReverseTransformMaxIterations = 1000
static constexpr double ReverseTransformTolerance = 1e-6
static constexpr double TangentStep = 1e-3

Protected Attributes

MultipoleTelement_m

Private Attributes

std::vector< polynomial::RecursionRelationTworecursion_m
VarRadiusGeometry varRadiusGeometry_m
Vector_t localCartesianEntryPoint_
double localCartesianRotation_ {}

Detailed Description


MultipoleTCurvedVarRadius defines a curved combined function magnet with
variable radius of curvature (up to arbitrary multipole component)
with fringe fields


Class category: AbsBeamline
$Author: Titus Dascalu, Martin Duy Tat, Chris Rogers


The field is obtained from the scalar potential

\[ V = f_0(x,s) z + f_1 (x,s) \frac{z^3}{3!} + f_2 (x,s) \frac{z^5}{5!} + ... \]


(x,z,s) -> Frenet-Serret local coordinates along the magnet
z -> vertical component
assume mid-plane symmetry
set field on mid-plane -> \( B_z = f_0(x,s) = T(x) \cdot S(s) \)
T(x) -> transverse profile; this is a polynomial describing the field expansion on the mid-plane inside the magnet (not in the fringe field); 1st term is the dipole strength, 2nd term is the quadrupole gradient * x, etc.
-> when setting the magnet, one gives the multipole coefficients of this polynomial (i.e. dipole strength,
quadrupole gradient, etc.)

----------— example --------------------------------------------—
Setting a combined function magnet with dipole, quadrupole and sextupole components:
\( T(x) = B_0 + B_1 \cdot x + B_2 \cdot x^2 \)
user gives \( B_0, B_1, B_2 \)
----------— example end ----------------------------------------—

S(s) -> fringe field
recursion -> \( f_n (x,s) = (-1)^n \cdot \sum_{i=0}^{n} C_n^i \cdot T^{(2i)} \cdot S^{(2n-2i)} \)
for curved magnets the above recursion is more complicated
\( C_n^i \) -> binomial coeff; \( T^{(n)} \) -> n-th derivative


Definition at line 85 of file MultipoleTCurvedVarRadius.h.

Constructor & Destructor Documentation

◆ MultipoleTCurvedVarRadius()

MultipoleTCurvedVarRadius::MultipoleTCurvedVarRadius ( MultipoleT * element)
explicit

Constructor

Definition at line 34 of file MultipoleTCurvedVarRadius.cpp.

References MultipoleTBase::MultipoleTBase(), and varRadiusGeometry_m.

Here is the call graph for this function:

Member Function Documentation

◆ curvilinearToLocalCartesian()

Vector_t MultipoleTCurvedVarRadius::curvilinearToLocalCartesian ( const Vector_t & r)

Definition at line 164 of file MultipoleTCurvedVarRadius.cpp.

References ReverseTransformMaxIterations, reverseTransformResidual(), and ReverseTransformTolerance.

Referenced by initialise().

Here is the call graph for this function:

◆ getBs()

double MultipoleTBase::getBs ( const Vector_t & R)
virtualinherited

Returns the component of the field along the central axis
Returns zero far outside fringe field \( Bs = sum_n z^(2n+1) / (2n+1)! \partial_s f_n / h_s \)

Reimplemented in MultipoleTStraight.

Definition at line 60 of file MultipoleTBase.cpp.

References element_m, and getScaleFactor().

Here is the call graph for this function:

◆ getBx()

double MultipoleTBase::getBx ( const Vector_t & R)
virtualinherited

Returns the radial component of the field
Returns zero far outside fringe field \( Bx = sum_n z^(2n+1) / (2n+1)! * \partial_x f_n \)

Reimplemented in MultipoleTStraight.

Definition at line 48 of file MultipoleTBase.cpp.

References element_m.

◆ getBz()

double MultipoleTBase::getBz ( const Vector_t & R)
inherited

Returns the vertical field component
Returns zero far outside fringe field \( Bz = sum_n f_n * z^(2n) / (2n)! \)

Definition at line 37 of file MultipoleTBase.cpp.

References element_m, and getFn().

Here is the call graph for this function:

◆ getFn()

double MultipoleTCurvedVarRadius::getFn ( size_t n,
double x,
double s )
overridevirtual

Calculate fn(x, s) by expanding the differential operator (from Laplacian and scalar potential) in terms of polynomials

Parameters
n-> nth derivative
x-> Coordinate x
s-> Coordinate s

Implements MultipoleTBase.

Definition at line 128 of file MultipoleTCurvedVarRadius.cpp.

References MultipoleTBase::element_m, and recursion_m.

◆ getGeometry() [1/2]

const BGeometryBase & MultipoleTCurvedVarRadius::getGeometry ( ) const
inlineoverridevirtual

Return the cell geometry

Implements MultipoleTBase.

Definition at line 94 of file MultipoleTCurvedVarRadius.h.

References varRadiusGeometry_m.

◆ getGeometry() [2/2]

BGeometryBase & MultipoleTCurvedVarRadius::getGeometry ( )
inlineoverridevirtual

Return the cell geometry

Implements MultipoleTBase.

Definition at line 92 of file MultipoleTCurvedVarRadius.h.

References varRadiusGeometry_m.

◆ getScaleFactor()

double MultipoleTCurvedVarRadius::getScaleFactor ( double x,
double s )
overridevirtual

Returns the scale factor \( h_s = 1\)

Parameters
x-> Coordinate x
s-> Coordinate s

Implements MultipoleTBase.

Definition at line 118 of file MultipoleTCurvedVarRadius.cpp.

References MultipoleTBase::element_m.

◆ initialise()

void MultipoleTCurvedVarRadius::initialise ( )
overridevirtual

Initialise the element

Implements MultipoleTBase.

Definition at line 39 of file MultipoleTCurvedVarRadius.cpp.

References atan2(), curvilinearToLocalCartesian(), MultipoleTBase::element_m, localCartesianEntryPoint_, localCartesianRotation_, setMaxOrder(), TangentStep, and varRadiusGeometry_m.

Here is the call graph for this function:

◆ localCartesianRotation()

double MultipoleTCurvedVarRadius::localCartesianRotation ( )
inlineoverridevirtual

Reimplemented from MultipoleTBase.

Definition at line 124 of file MultipoleTCurvedVarRadius.h.

References localCartesianRotation_.

◆ localCartesianToCurvilinear()

Vector_t MultipoleTCurvedVarRadius::localCartesianToCurvilinear ( const Vector_t & r)

Definition at line 87 of file MultipoleTCurvedVarRadius.cpp.

References MultipoleTBase::element_m, and coordinatetransform::CoordinateTransform::getTransformation().

Referenced by reverseTransformResidual(), and transformCoords().

Here is the call graph for this function:

◆ localCartesianToOpalCartesian()

Vector_t MultipoleTCurvedVarRadius::localCartesianToOpalCartesian ( const Vector_t & r)
overridevirtual

Implements MultipoleTBase.

Definition at line 75 of file MultipoleTCurvedVarRadius.cpp.

References cos(), localCartesianEntryPoint_, localCartesianRotation_, and sin().

Here is the call graph for this function:

◆ reverseTransformResidual()

double MultipoleTCurvedVarRadius::reverseTransformResidual ( const Vector_t & r,
const Vector_t & target )

Definition at line 153 of file MultipoleTCurvedVarRadius.cpp.

References c, localCartesianToCurvilinear(), and sqrt().

Referenced by curvilinearToLocalCartesian().

Here is the call graph for this function:

◆ setMaxOrder()

void MultipoleTCurvedVarRadius::setMaxOrder ( size_t orderZ,
size_t orderX )
overridevirtual

Set the number of terms used in calculation of field components
Maximum power of z in Bz is 2 * maxOrder_m

Parameters
order-> Number of terms in expansion in z

Reimplemented from MultipoleTBase.

Definition at line 107 of file MultipoleTCurvedVarRadius.cpp.

References MultipoleTBase::element_m, recursion_m, polynomial::RecursionRelationTwo::resizeX(), and polynomial::RecursionRelationTwo::truncate().

Referenced by initialise().

Here is the call graph for this function:

◆ transformBField()

void MultipoleTCurvedVarRadius::transformBField ( Vector_t & B,
const Vector_t & R )
overridevirtual

Transform B-field from Frenet-Serret coordinates to lab coordinates

Implements MultipoleTBase.

Definition at line 95 of file MultipoleTCurvedVarRadius.cpp.

References cos(), cosh(), MultipoleTBase::element_m, log(), sin(), and tanh().

Here is the call graph for this function:

◆ transformCoords()

void MultipoleTCurvedVarRadius::transformCoords ( Vector_t & R)
overridevirtual

Transform to Frenet-Serret coordinates for sector magnets

Implements MultipoleTBase.

Definition at line 62 of file MultipoleTCurvedVarRadius.cpp.

References cos(), localCartesianEntryPoint_, localCartesianRotation_, localCartesianToCurvilinear(), and sin().

Here is the call graph for this function:

Member Data Documentation

◆ element_m

◆ localCartesianEntryPoint_

Vector_t MultipoleTCurvedVarRadius::localCartesianEntryPoint_
private

◆ localCartesianRotation_

double MultipoleTCurvedVarRadius::localCartesianRotation_ {}
private

◆ recursion_m

std::vector<polynomial::RecursionRelationTwo> MultipoleTCurvedVarRadius::recursion_m
private

Objects for storing differential operator acting on Fn

Definition at line 128 of file MultipoleTCurvedVarRadius.h.

Referenced by getFn(), and setMaxOrder().

◆ ReverseTransformMaxIterations

size_t MultipoleTCurvedVarRadius::ReverseTransformMaxIterations = 1000
staticconstexpr

Definition at line 121 of file MultipoleTCurvedVarRadius.h.

Referenced by curvilinearToLocalCartesian().

◆ ReverseTransformTolerance

double MultipoleTCurvedVarRadius::ReverseTransformTolerance = 1e-6
staticconstexpr

Definition at line 122 of file MultipoleTCurvedVarRadius.h.

Referenced by curvilinearToLocalCartesian().

◆ TangentStep

double MultipoleTCurvedVarRadius::TangentStep = 1e-3
staticconstexpr

Definition at line 123 of file MultipoleTCurvedVarRadius.h.

Referenced by initialise().

◆ varRadiusGeometry_m

VarRadiusGeometry MultipoleTCurvedVarRadius::varRadiusGeometry_m
private

Geometry

Definition at line 130 of file MultipoleTCurvedVarRadius.h.

Referenced by getGeometry(), getGeometry(), initialise(), and MultipoleTCurvedVarRadius().


The documentation for this class was generated from the following files: