OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
Hamiltonian.cpp
Go to the documentation of this file.
1 #include "Hamiltonian.h"
2 
3 Hamiltonian::Hamiltonian(int truncOrder) : truncOrder_m(truncOrder)
4 {
5 
6  series_t::setGlobalTruncOrder(truncOrder+1);
7 
14 }
15 
17 {
18  double beta0 = this->getBeta_m(gamma0);
19 
20  return ( delta / beta0 )
21  - sqrt((1./ beta0 + delta ) *(1./ beta0 + delta )
22  - ( px*px )
23  - ( py*py )
24  - 1./( beta0 * beta0 * gamma0 * gamma0 ),truncOrder_m+1);
25 }
26 
27 
29  double& gamma0,
30  double& q,
31  double& h,
32  double& k0)
33 {
34 
35 
36 
37  return ( delta / beta0 )
38  - (sqrt ((1./ beta0 + delta) *(1./ beta0 + delta)
39  - ( px*px )
40  - ( py*py )
41  - 1./( beta0*beta0 * gamma0*gamma0 ),truncOrder_m+1
42  ))
43  - (h * x)
44  * (sqrt ((1./ beta0 + delta) *(1./ beta0 + delta)
45  - ( px*px )
46  - ( py*py )
47  - 1./( beta0*beta0 * gamma0*gamma0 ),truncOrder_m
48  ))
49  + k0 * x * (1. + 0.5 * h* x);
50 
51 
52 }
53 
54 
56  const double& h,
57  const double& K0)
58 {
59  double beta0 = this->getBeta_m(gamma0);
60 
61  return ( delta / beta0 )
62  - (sqrt ((1./ beta0 + delta) *(1./ beta0 + delta)
63  - ( px*px )
64  - ( py*py )
65  - 1./( beta0*beta0 * gamma0*gamma0 ),(truncOrder_m+1)
66  ))
67  - (h * x)
68  * (sqrt ((1./ beta0 + delta) *(1./ beta0 + delta)
69  - ( px*px )
70  - ( py*py )
71  - 1./( beta0*beta0 * gamma0*gamma0 ),truncOrder_m
72  ))
73  + K0 * x * (1. + 0.5 * h* x);
74 }
75 
76 
78  double& beta0,
79  double& gamma0,
80  double& h,
81  double& k0,
82  series_t& ax,
83  series_t& az)
84 {
85  if (truncOrder_m == 2){
86  return ( delta / beta0 )
87  - sqrt((1./ beta0 + delta ) *(1./ beta0 + delta )
88  - ( px*px)
89  - ( py*py )
90  - 1./( beta0 * beta0 * gamma0 * gamma0 ),truncOrder_m+1
91  ) - az;
92  }else{
93  return ( delta / beta0 )
94  - sqrt((1./ beta0 + delta ) *(1./ beta0 + delta )
95  - ( px*px - 2.0*px*ax - ax*ax)
96  - ( py*py )
97  - 1./( beta0 * beta0 * gamma0 * gamma0 ),truncOrder_m+1
98  ) - az;
99  }
100  //std::cout << H << std::endl;
101  //std::cout << H.getMaxOrder() << std::endl;
102  /*H=( delta / beta0 )
103  - (sqrt ((1./ beta0 + delta) *(1./ beta0 + delta)
104  - ( px - ax )*( px - ax )
105  - ( py*py )
106  - 1./( beta0*beta0 * gamma0*gamma0 ),(truncOrder_m+1)))
107  - (h * x)
108  * (sqrt ((1./ beta0 + delta) *(1./ beta0 + delta)
109  - ( px - ax )*( px - ax )
110  - ( py*py )
111  - 1./( beta0*beta0 * gamma0*gamma0 ), truncOrder_m))
112  + h * x * az;*/
113 }
114 
115 
117  const double& q,
118  const double& k1)
119 {
120  double beta0 = this->getBeta_m(gamma0);
121 
122  return ( delta / beta0 )
123  - sqrt ((1./ beta0 + delta ) *(1./ beta0 + delta)
124  - ( px*px )
125  - ( py*py )
126  - 1./( beta0*beta0 * gamma0*gamma0 ),truncOrder_m+1
127  )
128  + 0.5 * k1 * (x*x - y*y);
129 }
130 
131 
133  const double& k0)
134 {
135  if ( truncOrder_m > 1 ) {
136  //TODO higher order thin lens approximation
137  }
138  // else
139 
140  double angle = phi;
141  if ( k0 < 0.0 )
142  angle = -phi;
143  return -0.5 * (x * x - y * y) * k0 * std::tan(angle);
144 }
145 
146 
147 double Hamiltonian::getBeta_m(const double& gamma) {
148  return std::sqrt(1.0 - 1.0 / (gamma * gamma) );
149 }
series_t y
Definition: Hamiltonian.h:29
series_t delta
Definition: Hamiltonian.h:32
series_t x
Definition: Hamiltonian.h:27
Hamiltonian::series_t fringeField(const double &phi, const double &k0)
Tps< T > tan(const Tps< T > &x)
Tangent.
Definition: TpsMath.h:147
Hamiltonian::series_t drift(const double &gamma0)
Definition: Hamiltonian.cpp:16
Hamiltonian::series_t bendFringe(double &beta0, double &gamma0, double &h, double &k0, series_t &ax, series_t &az)
Definition: Hamiltonian.cpp:77
series_t z
Definition: Hamiltonian.h:31
series_t py
Definition: Hamiltonian.h:30
series_t px
Definition: Hamiltonian.h:28
Tps< T > sqrt(const Tps< T > &x)
Square root.
Definition: TpsMath.h:91
Hamiltonian::series_t sbend(const double &gamma0, const double &h, const double &k0)
Definition: Hamiltonian.cpp:55
Hamiltonian(int truncOrder)
Definition: Hamiltonian.cpp:3
static void setGlobalTruncOrder(int order)
Set the global truncation order.
static FTps makeVariable(int var)
Make variable.
Hamiltonian::series_t rbend(double &beta0, double &gamma0, double &q, double &h, double &K0)
Definition: Hamiltonian.cpp:28
Hamiltonian::series_t quadrupole(const double &gamma0, const double &q, const double &k1)