diff --git a/src/Classic/AbsBeamline/VariableRFCavityFringeField.cpp b/src/Classic/AbsBeamline/VariableRFCavityFringeField.cpp index 2a1e8901d096acb3b23e12024857d77e2ebe37de..c6e461f9ca745af943becf3fa3025d32765edd11 100644 --- a/src/Classic/AbsBeamline/VariableRFCavityFringeField.cpp +++ b/src/Classic/AbsBeamline/VariableRFCavityFringeField.cpp @@ -116,24 +116,31 @@ bool VariableRFCavityFringeField::apply(const Vector_t &R, const Vector_t &P, co E = Vector_t(0., 0., 0.); B = Vector_t(0., 0., 0.); // even power of y + //std::cerr << "EVEN POWER OF Y maxOrder: " << maxOrder_m << std::endl; for (size_t n = 0; n <= maxOrder_m ; n += 2) { // power of y double fCoeff = 0.; size_t index = n/2; - for (size_t i = 0; i < f_m[index].size(); i += 2) { // derivative of f + //std::cerr << "Size i: " << index << " f_m[i]: " << f_m[index].size() + // << " endfield: " << endField.size() << std::endl; + for (size_t i = 0; i < f_m[index].size() && i < endField.size(); i += 2) { // derivative of f fCoeff += f_m[index][i]*endField[i]*omegaPower[n-i]; } E[2] += E_sin_t*y_power[n]*fCoeff; } // odd power of y + //std::cerr << "ODD POWER OF Y maxOrder: " << maxOrder_m << std::endl; for (size_t n = 1; n <= maxOrder_m; n += 2) { double gCoeff = 0.; double hCoeff = 0.; size_t index = (n-1)/2; - //std::cerr << "n: " << n << std::endl; - for (size_t j = 0; j < g_m[index].size(); ++j) { + //std::cerr << "Size i: " << index << " g_m[i]: " << g_m[index].size() << " endfield: " << endField.size() << std::endl; + for (size_t j = 0; j < g_m[index].size() && j < endField.size(); ++j) { + //std::cerr << "g_m " << j << " " << g_m[index][j] << std::endl; + //std::cerr << "endfield " << j << " " << endField[j] << std::endl; + //std::cerr << "omegaPower " << j << " " << omegaPower[n-j] << std::endl; gCoeff += g_m[index][j]*endField[j]*omegaPower[n-j]; } - for (size_t j = 0; j < h_m[index].size(); ++j) { + for (size_t j = 0; j < h_m[index].size() && j < endField.size(); ++j) { hCoeff += h_m[index][j]*endField[j]*omegaPower[n-j]; //std::cerr << "j: " << j << " " << hCoeff << " "; } diff --git a/src/Elements/OpalVariableRFCavityFringeField.cpp b/src/Elements/OpalVariableRFCavityFringeField.cpp index 893cc427007dda0b50995ef7b72f0c5608b65d79..dc170a1a02f4414badc233d54969fc0576244be0 100644 --- a/src/Elements/OpalVariableRFCavityFringeField.cpp +++ b/src/Elements/OpalVariableRFCavityFringeField.cpp @@ -163,7 +163,7 @@ void OpalVariableRFCavityFringeField::update() { double endLength = Attributes::getReal(itsAttr[END_LENGTH])*1e3; endfieldmodel::Tanh* tanh = new endfieldmodel::Tanh(centreLength/2., endLength, - (maxOrder+1)/2); + maxOrder+1); std::shared_ptr<endfieldmodel::EndFieldModel> end(tanh); cavity->setEndField(end); diff --git a/tests/classic_src/AbsBeamline/VariableRFCavityFringeFieldTest.cpp b/tests/classic_src/AbsBeamline/VariableRFCavityFringeFieldTest.cpp index dfe39613346052946e5f8f2306dca27f5714e1d0..c2e8268f1b6946a0b2c1c1d91b34e5e98b25a415 100644 --- a/tests/classic_src/AbsBeamline/VariableRFCavityFringeFieldTest.cpp +++ b/tests/classic_src/AbsBeamline/VariableRFCavityFringeFieldTest.cpp @@ -42,7 +42,7 @@ public: cav1 = VariableRFCavityFringeField("bob"); // centre, end, max_order shared = std::shared_ptr<endfieldmodel::EndFieldModel> - (new endfieldmodel::Tanh(250., 50., 10)); + (new endfieldmodel::Tanh(250., 50., 21)); cav1.setCavityCentre(0.500); cav1.setEndField(shared); PolynomialTimeDependence* time = @@ -314,7 +314,7 @@ TEST_F(VariableRFCavityFringeFieldTest, TestMaxwell) { std::cerr << "order B E max1 max2 maxwell3 maxwell4" << std::endl; R = Vector_t(0., 1., 750.); t = 0.125; - for (size_t i = 0; i < 8; ++i) { + for (size_t i = 0; i < 10; ++i) { cav2.setMaxOrder(i); cav2.apply(R, centroid, t, E, B); Vector_t result1 = testMaxwell3(cav2, R, t, 0.01, 0.0001); @@ -323,7 +323,7 @@ TEST_F(VariableRFCavityFringeFieldTest, TestMaxwell) { std::cerr << i << " ** " << B << " " << E << " " << div[0] << " " << div[1] << " " << result1 << " " << result2 << std::endl; - if (i > 0 and i < 5) { + if (i > 0) { EXPECT_LT(div[0], 1e-3); EXPECT_LT(div[1], 1e-3); EXPECT_LT(euclidean_norm(result1), 1e-3); @@ -331,3 +331,16 @@ TEST_F(VariableRFCavityFringeFieldTest, TestMaxwell) { } } } + +TEST_F(VariableRFCavityFringeFieldTest, TestOrder) { + Vector_t centroid(0., 0., 0.); + Vector_t B(0., 0., 0.); + Vector_t E(0., 0., 0.); + Vector_t R(0., 0., 500.); + double t = 0.; + for (size_t i = 0; i < 20; ++i) { + std::cerr << "Max Order " << i << std::endl; + cav2.setMaxOrder(i); + cav2.apply(R, centroid, t, E, B); + } +}