61 throw OpalException(
"CavityAutophaser::getPhaseAtMaxEnergy()",
62 "given element is not a cavity");
70 double originalPhase = element->getPhasem();
72 double optimizedPhase = 0.0;
73 double finalEnergy = 0.0;
74 double newPhase = 0.0;
75 double amplitude = element->getAmplitudem();
76 double basePhase = std::fmod(element->getFrequencym() * (t + tErr),
Physics::two_pi);
77 double frequency = element->getFrequencym();
81 element->setPhasem(optimizedPhase + originalPhase);
82 element->setAutophaseVeto();
84 originalPhase += optimizedPhase;
93 ss << std::setw(2) << std::left << c;
96 << std::left << std::setw(68) << std::setfill(
'*') << ss.str()
97 << std::setfill(
' ') <<
endl);
100 double AstraPhase = 0.0;
101 double designEnergy = element->getDesignEnergy();
103 if (amplitude < 0.0) {
104 amplitude = -amplitude;
105 element->setAmplitudem(amplitude);
110 if (amplitude == 0.0 && designEnergy <= 0.0) {
111 throw OpalException(
"CavityAutophaser::getPhaseAtMaxEnergy()",
112 "neither amplitude or design energy given to cavity " + element->getName());
115 if (designEnergy > 0.0) {
116 const double length =
itsCavity_m->getElementLength();
118 throw OpalException(
"CavityAutophaser::getPhaseAtMaxEnergy()",
119 "length of cavity " + element->getName() +
" is zero");
122 amplitude = 2 * (designEnergy - initialEnergy) / (std::abs(
itsReference_m.
getQ()) * length);
124 element->setAmplitudem(amplitude);
127 while (count < 1000) {
131 optimizedPhase = status.first;
132 finalEnergy = status.second;
134 if (std::abs(designEnergy - finalEnergy) < 1e-7)
break;
136 amplitude *= std::abs(designEnergy / finalEnergy);
137 element->setAmplitudem(amplitude);
138 initialPhase = optimizedPhase;
145 optimizedPhase = status.first;
146 finalEnergy = status.second;
150 element->setPhasem(newPhase);
151 element->setAutophaseVeto();
155 opal->setMaxPhase(
itsCavity_m->getName(), newPhase);
159 if (!opal->isOptimizerRun()) {
161 opal->getAuxiliaryOutputDirectory(),
164 std::ofstream out(fname);
165 track(t + tErr, dt, newPhase, &out);
168 track(t + tErr, dt, newPhase,
nullptr);
173 <<
"corresp. in Astra = " << AstraPhase *
Units::rad2deg <<
" [deg],\n"
174 <<
"E = " << finalEnergy <<
" [MeV], " <<
"phi_nom = " << originalPhase *
Units::rad2deg <<
" [deg]\n"
175 <<
"Ez_0 = " << amplitude <<
" [MV/m]" <<
"\n"
181 finalEnergy = status.second;
191 <<
"corresp. in Astra = " << AstraPhase *
Units::rad2deg <<
" [deg],\n"
192 <<
"E = " << finalEnergy <<
" [MeV], " <<
"phi_nom = " << originalPhase *
Units::rad2deg <<
" [deg]\n"
193 <<
"Ez_0 = " << amplitude <<
" [MV/m]" <<
"\n"
199 optimizedPhase = originalPhase;
201 INFOMSG(
level1 <<
"* " << std::right << std::setw(83) << std::setfill(
'*') <<
"*\n"
202 << std::setfill(
' ') <<
endl);
204 return optimizedPhase;
231 double originalPhase = element->
getPhasem();
236 double E =
track(t, dt, phase);
237 std::pair<double, double> status(originalPhase, E);
241 double Phimax = initialPhase;
242 double phi = initialPhase;
247 double E =
track(t, dt, phi);
255 E =
track(t, dt, phi);
267 E =
track(t, dt, phi);
271 for (
int rl = 0; rl < numRefinements; ++ rl) {
273 phi = initialPhase - dphi;
274 E =
track(t, dt, phi);
279 phi = initialPhase + dphi;
280 E =
track(t, dt, phi);
289 E =
track(t, dt, Phimax + originalPhase);
290 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)