OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
Hamiltonian.h
Go to the documentation of this file.
1 #ifndef HAMILTONIAN_H
2 #define HAMILTONIAN_H
3 
4 /*
5  * setHamiltonian.cpp
6  *
7  * Created on: Jul 24, 2018
8  * Author: ganz_p
9  */
10 
14 #define PSdim 6
15 
16 #include <functional>
17 
18 
20 {
21 
22 public:
24 
25  explicit Hamiltonian(int truncOrder);
26 
44  Hamiltonian::series_t drift(const double& gamma0);
45 
53  Hamiltonian::series_t rbend(double& beta0,
54  double& gamma0,
55  double& q,
56  double& h,
57  double& K0);
58 
74  Hamiltonian::series_t sbend(const double& gamma0,
75  const double& h,
76  const double& k0);
77 
93  Hamiltonian::series_t bendFringe(double& beta0,
94  double& gamma0,
95  double& h,
96  double& k0,
97  series_t& ax,
98  series_t& az);
99 
100 
116  Hamiltonian::series_t quadrupole(const double& gamma0,
117  const double& q,
118  const double& k1);
119 
120 
130  Hamiltonian::series_t fringeField(const double& phi,
131  const double& k0);
132 
133 private:
139  double getBeta_m(const double& gamma);
140 
141 private:
142  int truncOrder_m;
143 
144 };
145 
146 
147 // /**Hamiltonian for Space Charges
148 // * \f[ K = \frac{3 q I \lambda}{20 \sqrt{5} \pi \epsilon_0 m c^3 \beta^2 \gamma^3} , \;
149 // * H_{sc} = -\frac{1}{2} K_x x^2
150 // * -\frac{1}{2} K_y y^2
151 // * -\frac{1}{2} K_z z^2 \gamma^2\f]
152 // */
153 // void spaceCharge(series_t& H,
154 // PartBunchBase<double, 3>* bunch)
155 // {
156 // //Derived form Distribution/SigmaGenerator.cpp
157 // // convert m from MeV/c^2 to eV*s^{2}/m^{2}
158 //
159 // double m = bunch->getM() / (Physics::c * Physics::c);
160 //
161 // // formula (57)
162 // double gamma = bunch->get_gamma();
163 // double beta = std::sqrt( 1. - 1/( gamma*gamma ) );
164 //
165 // double gamma2=gamma * gamma;
166 //
167 // double freq = itsBeam_m->getFrequency() * 1e6; // [freq] = Hz (form MHz)
168 // double I = itsBeam_m->getCurrent(); // [I] = A
169 // double q = bunch->getQ(); // [q] = e
170 //
171 // #ifdef PHIL_WRITE
172 // std::ofstream dAngle;
173 // dAngle.open("dipoleAngle.txt", std::ios::app);
174 // #endif
175 //
176 // dAngle << "Freq:" << freq << std::endl;
177 // dAngle << "I: " << I << std::endl;
178 // dAngle << "SigmaMatirx" << bunch->getSigmaMatrix() << std::endl;
179 // dAngle << "mass" << bunch->getM()<< std::endl;
180 // dAngle << "charge" << q << std::endl;
181 //
182 // //TODO check formula for lambda
183 // double lam = Physics::c / freq; // wavelength, [lam] = m
184 // double K3 = 3.0 * I * q * lam / (20.0 * std::sqrt(5.0) * Physics::pi * Physics::epsilon_0 * m *
185 // Physics::c * Physics::c * Physics::c * beta * beta * gamma * gamma2); // [K3] = m
186 // dAngle << "K3: " << K3 << std::endl;
187 // dAngle << "K3: " << lam << std::endl;
188 // dAngle << "gamma: " << gamma << std::endl;
189 // dAngle << "beta: " << beta << std::endl;
190 // // formula (30), (31)
191 // fMatrix_t sigmMatrix = bunch->getSigmaMatrix();
192 //
193 // double sx = std::sqrt(std::fabs(sigmMatrix(0,0))); //[sx] = m
194 // double sy = std::sqrt(std::fabs(sigmMatrix(2,2))); //[sy] = m
195 // double sz = std::sqrt(std::fabs(sigmMatrix(4,4))); //[sz] = m
196 //
197 // dAngle << "sx: " << sx << std::endl;
198 // dAngle << "sz: " << sz << std::endl;
199 // double tmp = sx * sy; // [tmp] = m^{2}
200 //
201 // double f = std::sqrt(tmp) / (3.0 * gamma * sz); // [f] = 1
202 // double kxy = K3 * std::fabs(1.0 - f) / ((sx + sy) * sz); // [kxy] = 1/m
203 //
204 // dAngle << "f: " << f << std::endl;
205 // dAngle << "kxy: " << kxy << std::endl;
206 // double Kx = kxy / sx; //[Kx] = 1/m^{2}
207 // double Ky = kxy / sy; //[Ky] = 1/m^{2}
208 // double Kz = K3 * f / (tmp * sz); //[Kz] = 1/m^{2}
209 //
210 // // Change units for application on [m], [p/p0] and [E/p0-1/b0]
211 // // (these units are for [mm], [mrad] and [promille])
212 // // according Hinterberger - Physik der Teilcherbeschleuniger Eq.4.8
213 //
214 // double mm2m = 1e3;
215 // double mrad2pnorm= 1e3; // for small angles (tan(a) ~ a)
216 // double promille2delta = 1/(10 * bunch->getInitialBeta()); // [E/p0-1/b0] = [1/b0 * (E0 - E)/E0]
217 //
218 //
219 // H = ( -0.5 * Kx * x * x
220 // -0.5 * Ky * y * y ) * mm2m / mrad2pnorm
221 // - (0.5 * Kz * z * z * gamma2) * promille2delta ;
222 // }
223 
224 
225 #endif
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)
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
Hamiltonian::series_t sbend(const double &gamma0, const double &h, const double &k0)
Definition: Hamiltonian.cpp:55
Hamiltonian(int truncOrder)
Definition: Hamiltonian.cpp:3
FTps< double, 6 > series_t
Definition: Hamiltonian.h:23
Truncated power series in N variables of type T.
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)