64 endField_m = std::shared_ptr<endfieldmodel::EndFieldModel>();
89 double E_sin_t = E0 *
std::sin(omega * t + phi);
90 double B_cos_t = E0 *
std::cos(omega * t + phi);
94 for (
size_t i = 1; i < y_power.size(); ++i) {
95 y_power[i] = y_power[i-1] *
R[1];
99 std::vector<double> endField(
maxOrder_m/2+2, 0.);
100 for (
size_t i = 0; i < endField.size(); ++i) {
105 std::vector<double> omegaPower(
maxOrder_m+1, 1.);
106 for (
size_t i = 1; i < omegaPower.size(); ++i) {
107 omegaPower[i] = omegaPower[i-1] * omega;
116 for (
size_t i = 0; i <
f_m[index].size() && i < endField.size(); i += 2) {
117 fCoeff +=
f_m[index][i] * endField[i] * omegaPower[
n-i];
119 E[2] += E_sin_t * y_power[
n] * fCoeff;
125 size_t index = (
n-1)/2;
126 for (
size_t j = 0; j <
g_m[index].size() && j < endField.size(); ++j) {
127 gCoeff +=
g_m[index][j] * endField[j] * omegaPower[
n-j];
129 for (
size_t j = 0; j <
h_m[index].size() && j < endField.size(); ++j) {
130 hCoeff +=
h_m[index][j] * endField[j] * omegaPower[
n-j];
132 E[1] += E_sin_t * y_power[
n] * gCoeff;
133 B[0] += B_cos_t * y_power[
n] * hCoeff;
149 return apply(
R, P, t, E, B);
160 for (
size_t i = 0; i <
vec.size(); ++i) {
161 out << std::setw(3) << i;
162 for (
size_t j = 0; j <
vec[i].size(); ++j) {
163 out <<
" " << std::setw(14) <<
vec[i][j];
170 f_m = std::vector< std::vector<double> >();
171 g_m = std::vector< std::vector<double> >();
172 h_m = std::vector< std::vector<double> >();
173 f_m.push_back(std::vector<double>(1, 1.));
181 std::vector<double> f_n =
f_m.back();
182 std::vector<double> f_np2 = std::vector<double>(f_n.size()+2, 0.);
183 double n_const = 1./(
n+1.)/(
n+2.);
184 for (
size_t j = 0; j < f_n.size(); ++j) {
185 f_np2[j] -= f_n[j]*n_const/c_l/c_l;
187 for (
size_t j = 0; j < f_n.size(); ++j) {
188 f_np2[j+2] -= f_n[j]*n_const;
190 f_m.push_back(f_np2);
196 size_t f_index =
n/2;
197 std::vector<double> f_n =
f_m[f_index];
198 std::vector<double> g_np1 = std::vector<double>(f_n.size()+1, 0.);
199 std::vector<double> h_np1 = std::vector<double>(f_n.size(), 0.);
200 for (
size_t j = 0; j < f_n.size(); ++j) {
201 g_np1[j+1] = -1./(
n+1.)*f_n[j];
202 h_np1[j] = -1./c_l/c_l/(
n+1.)*f_n[j];
204 g_m.push_back(g_np1);
205 h_m.push_back(h_np1);
void printVector(std::ostream &out, std::vector< std::vector< double > > vec)
PartBunchBase< T, Dim >::ConstIterator end(PartBunchBase< T, Dim > const &bunch)
Tps< T > cos(const Tps< T > &x)
Cosine.
Tps< T > sin(const Tps< T > &x)
Sine.
PETE_TUTree< FnAbs, typename T::PETE_Expr_t > abs(const PETE_Expr< T > &l)
Inform & endl(Inform &inf)
constexpr double two_pi
The value of.
constexpr double c
The velocity of light in m/s.
ParticleAttrib< Vector_t > P
virtual void visitVariableRFCavity(const VariableRFCavity &)=0
Apply the algorithm to a variable RF cavity.
PartBunchBase< double, 3 > * RefPartBunch_m
Generates a field like E = a(t) * sin{2*pi * integral(f(tau),0,t) + q(t)} B = 0 where E0,...
std::shared_ptr< AbstractTimeDependence > frequencyTD_m
void initialise() const
Lookup the time dependencies and update.
std::shared_ptr< AbstractTimeDependence > amplitudeTD_m
std::shared_ptr< AbstractTimeDependence > phaseTD_m
VariableRFCavity & operator=(const VariableRFCavity &)
Assignment operator; performs deepcopy on time-dependence models.
Generates a field like Ey = E0*a(t)*y^{2n+1} g_n(z) sin{f(t)*t-q(t)} Ez = E0*a(t)*y^{2n} f_n(z) sin{f...
std::shared_ptr< endfieldmodel::EndFieldModel > endField_m
virtual ~VariableRFCavityFringeField()
Destructor does nothing.
std::vector< std::vector< double > > f_m
VariableRFCavityFringeField & operator=(const VariableRFCavityFringeField &)
Assignment operator; performs deepcopy on time-dependence models.
virtual bool apply(const size_t &i, const double &t, Vector_t &E, Vector_t &B) override
Calculate the field at the position of the i^th particle.
VariableRFCavityFringeField()
Default constructor.
std::vector< std::vector< double > > h_m
void initialiseCoefficients()
Set the coefficients for calculating the field expansion.
std::vector< std::vector< double > > g_m
void printCoefficients(std::ostream &out) const
Print the coefficients to ostream out.
virtual void accept(BeamlineVisitor &) const override
Apply visitor to RFCavity.
virtual ElementBase * clone() const override
Inheritable deepcopy method.
void initialise() const
Lookup the time dependencies and update.
virtual bool applyToReferenceParticle(const Vector_t &R, const Vector_t &P, const double &t, Vector_t &E, Vector_t &B) override
Calculate the field at a given position.
virtual void setEndField(std::shared_ptr< endfieldmodel::EndFieldModel > endField)
Set the endFieldModel.
Vektor< double, 3 > Vector_t