55 "CavityAutophaser::getPhaseAtMaxEnergy()",
"given element is not a cavity");
63 double originalPhase = element->
getPhasem();
65 double optimizedPhase = 0.0;
66 double finalEnergy = 0.0;
67 double newPhase = 0.0;
74 element->
setPhasem(optimizedPhase + originalPhase);
77 originalPhase += optimizedPhase;
86 ss << std::setw(2) << std::left << c;
88 *ippl::Info << level1 <<
"\n* ************* " << std::left << std::setw(68) << std::setfill(
'*')
89 << ss.str() << std::setfill(
' ') << endl;
92 double AstraPhase = 0.0;
95 if (amplitude < 0.0) {
96 amplitude = -amplitude;
102 if (amplitude == 0.0 && designEnergy <= 0.0) {
104 "CavityAutophaser::getPhaseAtMaxEnergy()",
105 "neither amplitude or design energy given to cavity " + element->
getName());
108 if (designEnergy > 0.0) {
109 const double length =
itsCavity_m->getElementLength();
112 "CavityAutophaser::getPhaseAtMaxEnergy()",
113 "length of cavity " + element->
getName() +
" is zero");
122 while (count < 1000) {
126 optimizedPhase = status.first;
127 finalEnergy = status.second;
129 if (std::abs(designEnergy - finalEnergy) < 1e-7)
break;
131 amplitude *= std::abs(designEnergy / finalEnergy);
133 initialPhase = optimizedPhase;
141 optimizedPhase = status.first;
142 finalEnergy = status.second;
151 opal->setMaxPhase(
itsCavity_m->getName(), newPhase);
155 if (!opal->isOptimizerRun()) {
157 {opal->getAuxiliaryOutputDirectory(),
itsCavity_m->getName() +
"_AP.dat"});
158 std::ofstream out(fname);
159 track(t + tErr, dt, newPhase, &out);
162 track(t + tErr, dt, newPhase,
nullptr);
165 *ippl::Info << level1 << std::fixed << std::setprecision(4) <<
itsCavity_m->getName()
167 <<
"corresp. in Astra = " << AstraPhase *
Units::rad2deg <<
" [deg],\n"
168 <<
"E = " << finalEnergy <<
" [MeV], "
170 <<
"Ez_0 = " << amplitude <<
" [MV/m]"
178 finalEnergy = status.second;
185 *ippl::Info << level1 <<
">>>>>> APVETO >>>>>> " << endl;
187 *ippl::Info << level1 << std::fixed << std::setprecision(4) <<
itsCavity_m->getName()
189 <<
"corresp. in Astra = " << AstraPhase *
Units::rad2deg <<
" [deg],\n"
190 <<
"E = " << finalEnergy <<
" [MeV], "
192 <<
"Ez_0 = " << amplitude <<
" [MV/m]"
197 *ippl::Info << level1 <<
" <<<<<< APVETO <<<<<< " << endl;
200 optimizedPhase = originalPhase;
202 *ippl::Info << level1 <<
"* " << std::right << std::setw(83) << std::setfill(
'*') <<
"*\n"
203 << std::setfill(
' ') << endl;
205 return optimizedPhase;
227 double initialPhase,
double t,
double dt) {
229 double originalPhase = element->
getPhasem();
234 double E =
track(t, dt, phase);
235 std::pair<double, double> status(originalPhase, E);
239 double Phimax = initialPhase;
240 double phi = initialPhase;
245 double E =
track(t, dt, phi);
253 E =
track(t, dt, phi);
265 E =
track(t, dt, phi);
269 for (
int rl = 0; rl < numRefinements; ++rl) {
271 phi = initialPhase - dphi;
272 E =
track(t, dt, phi);
277 phi = initialPhase + dphi;
278 E =
track(t, dt, phi);
286 E =
track(t, dt, Phimax + originalPhase);
287 std::pair<double, double> status(Phimax, E);
virtual std::pair< double, double > trackOnAxisParticle(const double &p0, const double &t0, const double &dt, const double &q, const double &mass, std::ofstream *out=nullptr)