diff --git a/src/Classic/AbsBeamline/VariableRFCavityFringeField.cpp b/src/Classic/AbsBeamline/VariableRFCavityFringeField.cpp index c5c6712a10a5d8c7c0affa2a0663ba03a4789a94..a1791b6fe12de32acf8356592fe52fec8d483b0d 100644 --- a/src/Classic/AbsBeamline/VariableRFCavityFringeField.cpp +++ b/src/Classic/AbsBeamline/VariableRFCavityFringeField.cpp @@ -141,7 +141,7 @@ bool VariableRFCavityFringeField::apply(const Vector_t &R, const Vector_t &P, co B[0] += B_cos_t*y_power[n]*hCoeff; //std::cerr << "APPLY B " << n << " " << B[0] << " " << hCoeff << std::endl; } - B *= 1e4; //B natural units are kT; convert to kGauss + B *= 1e1; //B converted to kGauss return false; } @@ -191,10 +191,10 @@ void VariableRFCavityFringeField::initialiseCoefficients() { std::vector<double> f_np2 = std::vector<double>(f_n.size()+2, 0.); // f_{n+2} double n_const = 1./(n+1.)/(n+2.); for (size_t j = 0; j < f_n.size(); ++j) { - f_np2[j] += f_n[j]*n_const/c_l/c_l; + f_np2[j] -= f_n[j]*n_const/c_l/c_l; } for (size_t j = 0; j < f_n.size(); ++j) { - f_np2[j+2] += f_n[j]*n_const; + f_np2[j+2] -= f_n[j]*n_const; } f_m.push_back(f_np2); } @@ -225,8 +225,6 @@ void VariableRFCavityFringeField::printCoefficients(std::ostream& out) const { out << std::endl; } - - void VariableRFCavityFringeField::setEndField( std::shared_ptr<endfieldmodel::EndFieldModel> end) { endField_m = end; diff --git a/tests/classic_src/AbsBeamline/VariableRFCavityFringeFieldTest.cpp b/tests/classic_src/AbsBeamline/VariableRFCavityFringeFieldTest.cpp index b23f5c586f731f4565d6b8af2c60190cbbcf53f8..650b8fe674bf154d12b7db89cea93ac1c59eac65 100644 --- a/tests/classic_src/AbsBeamline/VariableRFCavityFringeFieldTest.cpp +++ b/tests/classic_src/AbsBeamline/VariableRFCavityFringeFieldTest.cpp @@ -39,8 +39,6 @@ class VariableRFCavityFringeFieldTest : public ::testing::Test { public: VariableRFCavityFringeFieldTest() { - // OpalTestUtilities::SilenceTest silencer; - cav1 = VariableRFCavityFringeField("bob"); // centre, end, max_order shared = std::shared_ptr<endfieldmodel::EndFieldModel> @@ -72,10 +70,10 @@ public: VariableRFCavityFringeField cav1; VariableRFCavityFringeField cav2; std::shared_ptr<endfieldmodel::EndFieldModel> shared; + OpalTestUtilities::SilenceTest silencer; }; TEST_F(VariableRFCavityFringeFieldTest, TestConstructor) { - OpalTestUtilities::SilenceTest silencer; VariableRFCavityFringeField cav("bob"); EXPECT_FLOAT_EQ(cav.getCavityCentre(), 0.); endfieldmodel::EndFieldModel* null = NULL; @@ -83,7 +81,6 @@ TEST_F(VariableRFCavityFringeFieldTest, TestConstructor) { } TEST_F(VariableRFCavityFringeFieldTest, TestSetGet) { - OpalTestUtilities::SilenceTest silencer; EXPECT_FLOAT_EQ(cav1.getCavityCentre(), 0.5); // mm EXPECT_FLOAT_EQ(cav1.getWidth(), 0.2); // metres EXPECT_EQ(&(*(cav1.getEndField())), &(*shared)); @@ -207,7 +204,7 @@ Vector_t testMaxwell4(VariableRFCavityFringeField& cav, Vector_t pos, double t, dBdx[1] - dBdy[0] ); double c_l = Physics::c*1e-6; // 3e8 m/s = 300 mm/ns - Vector_t result = dEdt - curlB*1e-4*c_l*c_l; + Vector_t result = dEdt - curlB*1e-1*c_l*c_l; if (verbose) { std::cerr << "dBdx " << dBdx*1e-3 << std::endl; @@ -236,7 +233,7 @@ Vector_t testMaxwell3(VariableRFCavityFringeField& cav, Vector_t pos, double t, dEdz[0] - dEdx[2], dEdx[1] - dEdy[0] ); - Vector_t result = dBdt*1e-4 - curlE; + Vector_t result = dBdt*1e-1 + curlE; if (verbose) { std::cerr << "maxwell3 at R: " << pos << " t: " << t << " with dx: " @@ -271,8 +268,10 @@ std::vector<double> testMaxwell1and2(VariableRFCavityFringeField& cav, Vector_t if (verbose) { std::cerr << "maxwell1+2 at R: " << pos << " t: " << t << " with dx: " << deltaPos << std::endl; - std::cerr << " dEidi " << dEdx[0] << " " << dEdy[1] << " " << dEdz[2] << std::endl; - std::cerr << " dBidi " << dBdx[0] << " " << dBdy[1] << " " << dBdz[2] << std::endl; + std::cerr << " dEidi " + << dEdx[0] << " " << dEdy[1] << " " << dEdz[2] << std::endl; + std::cerr << " dBidi " + << dBdx[0] << " " << dBdy[1] << " " << dBdz[2] << std::endl; std::cerr << " divE " << divE << std::endl; std::cerr << " divB " << divB << std::endl; } @@ -280,6 +279,28 @@ std::vector<double> testMaxwell1and2(VariableRFCavityFringeField& cav, Vector_t return result; } + +TEST_F(VariableRFCavityFringeFieldTest, TestField) { + Vector_t centroid(0., 0., 0.); + double t = 0.; + cav2.setMaxOrder(4); + std::cerr << "\nOff midplane, 45 degree phase, in fringe field" << std::endl; + std::cerr << "order B E max1 max2 maxwell3 maxwell4" << std::endl; + t = 0.125; + for (double s = 0; s < 1000.; s += 10.) { + Vector_t B0(0., 0., 0.); + Vector_t E0(0., 0., 0.); + Vector_t B10(0., 0., 0.); + Vector_t E10(0., 0., 0.); + Vector_t R(0., 0., 0.); + R = Vector_t(0., 0., s); + cav2.apply(R, centroid, t, E0, B0); + R = Vector_t(0., 10., s); + cav2.apply(R, centroid, t, E10, B10); + std::cerr << s << " " << E0 << " " << E10 << " " << B10 << std::endl; + } +} + TEST_F(VariableRFCavityFringeFieldTest, TestMaxwell) { //double pi = Physics::pi; Vector_t centroid(0., 0., 0.); @@ -291,14 +312,20 @@ 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 < 5; ++i) { + for (size_t i = 0; i < 8; ++i) { cav2.setMaxOrder(i); cav2.apply(R, centroid, t, E, B); Vector_t result1 = testMaxwell3(cav2, R, t, 0.01, 0.0001); Vector_t result2 = testMaxwell4(cav2, R, t, 0.01, 0.0001); std::vector<double> div = testMaxwell1and2(cav2, R, t, 0.01); - std::cerr << i << " ** " << B << " " << E << " " << div[0] << " " << div[1] << " " << result1 << " " << result2 << std::endl; + std::cerr << i << " ** " << B << " " << E << " " << div[0] << " " + << div[1] << " " << result1 << " " << result2 << std::endl; - + if (i > 0 and i < 5) { + EXPECT_LT(div[0], 1e-3); + EXPECT_LT(div[1], 1e-3); + EXPECT_LT(euclidean_norm(result1), 1e-3); + EXPECT_LT(euclidean_norm(result2), 1e-3); + } } } diff --git a/tests/opal_src/Elements/CMakeLists.txt b/tests/opal_src/Elements/CMakeLists.txt index 876719a6aff366d13da5c2bda40c2cc7e12106c5..33f0be8f4aaaa6bf79233619703f757ae250bdbd 100644 --- a/tests/opal_src/Elements/CMakeLists.txt +++ b/tests/opal_src/Elements/CMakeLists.txt @@ -2,6 +2,7 @@ set (_SRCS OpalOffsetTest.cpp OpalPolynomialTimeDependenceTest.cpp OpalVariableRFCavityTest.cpp + OpalVariableRFCavityFringeFieldTest.cpp ) include_directories ( diff --git a/tests/opal_src/Elements/OpalVariableRFCavityFringeFieldTest.cpp b/tests/opal_src/Elements/OpalVariableRFCavityFringeFieldTest.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ad37bef536f304e0703cab763f3049e3e4042978 --- /dev/null +++ b/tests/opal_src/Elements/OpalVariableRFCavityFringeFieldTest.cpp @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2014, Chris Rogers + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STFC nor the names of its contributors may be used to + * endorse or promote products derived from this software without specific + * prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "gtest/gtest.h" + +#include "Elements/OpalVariableRFCavityFringeField.h" + +#include "opal_test_utilities/SilenceTest.h" + +TEST(OpalVariableRFCavityFringeFieldTest, TestConstructorDestructor) { + OpalTestUtilities::SilenceTest silencer; + + OpalVariableRFCavityFringeField cav1; + EXPECT_EQ((&cav1)->getOpalName(), "VARIABLE_RF_CAVITY_FRINGE_FIELD"); + OpalVariableRFCavityFringeField cav2("name", &cav1); + EXPECT_EQ((&cav2)->getOpalName(), "name"); + OpalVariableRFCavityFringeField* cav3 = cav2.clone(); + EXPECT_EQ(cav3->getOpalName(), "name"); + OpalVariableRFCavityFringeField* cav4 = cav2.clone("other_name"); + EXPECT_EQ(cav4->getOpalName(), "other_name"); + + delete cav4; + delete cav3; +}