Code indexing in gitaly is broken and leads to code not being visible to the user. We work on the issue with highest priority.

Skip to content
Snippets Groups Projects
Commit abbb2e71 authored by snuverink_j's avatar snuverink_j
Browse files

Merge branch '455-make-src-classic-solvers-greenwakefunction-testapply-a-unit-test' into 'master'

Resolve "Make `src/Classic/Solvers/GreenWakeFunction::testApply()` a unit test"

Closes #455

See merge request !272
parents 09ad73c2 8c4d946c
No related branches found
No related tags found
1 merge request!272Resolve "Make `src/Classic/Solvers/GreenWakeFunction::testApply()` a unit test"
......@@ -2,11 +2,6 @@
#include "Algorithms/PartBunchBase.h"
#include "Utilities/GeneralClassicException.h"
// :FIXME: do we need this tests?
#ifdef ENABLE_WAKE_TESTS
#include "Solvers/TestLambda.h" // used for tests
#endif
#include <fstream>
#include <string>
#include <vector>
......@@ -21,10 +16,7 @@ using namespace std;
//IFF: TEST
//#define ENABLE_WAKE_DEBUG
//#define ENABLE_WAKE_DUMP
//#define ENABLE_WAKE_TESTS
//#define ENABLE_WAKE_TESTS_FFT_OUT
//#define readWakeFromFile
//#define WakeFile "test.sdds"
/**
......@@ -110,10 +102,6 @@ pair<int, int> GreenWakeFunction::distrIndices(int vectLen) {
}
void GreenWakeFunction::apply(PartBunchBase<double, 3> *bunch) {
#ifdef ENABLE_WAKE_TESTS
// overwrite the line density
testApply(bunch);
#else
Vector_t rmin, rmax;
double charge = bunch->getChargePerParticle();
......@@ -236,51 +224,7 @@ void GreenWakeFunction::apply(PartBunchBase<double, 3> *bunch) {
f2.flush();
f2.close();
#endif
#endif //ENABLE_WAKE_TESTS
}
/**
* @brief Just a test function
*/
#ifdef ENABLE_WAKE_TESTS
void GreenWakeFunction::testApply(PartBunchBase<double, 3> *bunch) {
double spacing;
// determine K and charge
double charge = 0.8e-9; // nC
double K = 0.20536314319923724e-9; //K normalizes nC data in lambda.h?
spacing = 1e-6; //IFF: charge in testLambda.h in 1um spacings
NBin_m = 294;
std::vector<double> OutEnergy(NBin_m);
if(FftWField_m.empty()) {
FftWField_m.resize(2*NBin_m - 1);
CalcWakeFFT(spacing);
} else if(!constLength_m) {
CalcWakeFFT(spacing);
}
compEnergy(K, charge, testLambda, OutEnergy.data());
ofstream f2("OutEnergy.dat");
f2 << "# Energy of the Wake calculated in Opal\n"
<< "# Z0 = " << Z0_m << "\n"
<< "# radius = " << radius_m << "\n"
<< "# sigma = " << sigma_m << "\n"
<< "# acMode = " << acMode_m << "\n"
<< "# tau = " << tau_m << "\n"
<< "# direction = " << direction_m << "\n"
<< "# spacing = " << spacing_m << "\n"
<< "# Lbunch = " << NBin_m << "\n";
for(int i = 0; i < NBin_m; i++) {
f2 << i + 1 << " " << OutEnergy[i] << "\n";
}
f2.flush();
f2.close();
}
#else
void GreenWakeFunction::testApply(PartBunchBase<double, 3> *) {}
#endif
/**
* @brief just a Testfunction! Calculate the energy of the Wakefunction with the lambda
......@@ -421,23 +365,6 @@ void GreenWakeFunction::CalcWakeFFT(double spacing) {
const int lowIndex = myDist.first;
const int hiIndex = myDist.second;
#ifdef ENABLE_WAKE_TESTS
ofstream file;
if(Ippl::myNode() == 0) {
file.open("wake.dat");
file << "# Wake calculated in Opal" << "\n"
<< "# Z0 = " << Z0_m << "\n"
<< "# radius = " << radius_m << "\n"
<< "# sigma = " << sigma_m << "\n"
<< "# mode = " << acMode_m << "\n"
<< "# tau = " << tau_m << "\n"
<< "# direction = " << direction_m << "\n"
<< "# spacing = " << spacing << "\n"
<< "# Lbunch = " << NBin_m << "\n";
}
#endif
for(int i = 0; i < M; i ++) {
FftWField_m[i] = 0.0;
}
......@@ -464,17 +391,6 @@ void GreenWakeFunction::CalcWakeFFT(double spacing) {
*/
reduce(&(FftWField_m[0]), &(FftWField_m[0]) + NBin_m, &(FftWField_m[0]), OpAddAssign());
#ifdef ENABLE_WAKE_TESTS
if(Ippl::myNode() == 0) {
for(int i = 0; i < NBin_m; i++) {
file << i + 1 << " " << FftWField_m[i] << "\n";
}
file.flush();
file.close();
}
#endif
#ifdef ENABLE_WAKE_TESTS_FFT_OUT
std::vector<double> wf(2*NBin_m-1);
for(int i = 0; i < 2 * NBin_m - 1; ++ i) {
......
......@@ -12,13 +12,13 @@
#include <string>
#include <complex>
//#define USE_FFTW
#ifdef WITH_UNIT_TESTS
#include <gtest/gtest_prod.h>
#endif
enum { TRANSVERSAL, LONGITUDINAL };
typedef std::map<std::string, int> FilterOptions;
class SavitzkyGolayFilter;
class GreenWakeFunction: public WakeFunction {
public:
~GreenWakeFunction();
......@@ -44,6 +44,10 @@ public:
virtual const std::string getType() const;
private:
#ifdef WITH_UNIT_TESTS
FRIEND_TEST(GreenWakeFunctionTest, TestApply);
#endif
class Wake {
public:
......@@ -164,7 +168,6 @@ private:
std::vector<Filter *> filters_m;
void testApply(PartBunchBase<double, 3> *bunch);
void compEnergy(const double K, const double charge, const double *lambda, double *OutEnergy);
void compEnergy(const double K, const double charge, std::vector<double> lambda, double *OutEnergy);
void CalcWakeFFT(double spacing);
......
add_subdirectory (AbsBeamline)
add_subdirectory (Algorithms)
add_subdirectory (Utilities)
add_subdirectory (Fields)
add_subdirectory (Solvers)
add_subdirectory (Utilities)
set (TEST_SRCS_LOCAL ${TEST_SRCS_LOCAL} PARENT_SCOPE)
# vi: set et ts=4 sw=4 sts=4:
# Local Variables:
# mode: cmake
# cmake-tab-width: 4
# indent-tabs-mode: nil
# End:
# End:
\ No newline at end of file
set (_SRCS
GreenWakeFunctionTest.cpp
)
include_directories (
${CMAKE_CURRENT_SOURCE_DIR}
)
add_sources(${_SRCS})
# vi: set et ts=4 sw=4 sts=4:
# Local Variables:
# mode: cmake
# cmake-tab-width: 4
# indent-tabs-mode: nil
# End:
\ No newline at end of file
#include "gtest/gtest.h"
#include "opal_test_utilities/SilenceTest.h"
#include "Solvers/GreenWakeFunction.hh"
#include "TestLambda.h" // Profile of the bunch
#include <iostream>
TEST(GreenWakeFunctionTest, TestApply)
{
OpalTestUtilities::SilenceTest silencer;
// wake types with green wake function
std::vector<std::string> types = {"LONG-SHORT-RANGE", "TRANSV-SHORT-RANGE"};
std::vector<int> acmodes = {1, 2}; // 1: ac, 2: dc
std::vector<Filter *> filters;
// not sure if values are realistic, but couldn't find code example
double Z0 = 1e3;
int nbin = 100;
double radius = 0.1;
double sigma = 1;
double tau = 1;
bool const_length = true;
std::string fname = "";
std::vector<double> finalWakeValues = {1.61757e+10, 2.78525e+19};
std::vector<double> finalEnergyValues = {-0.00125303, -2.15739e+06};
std::vector<double> relativeErrorWake = {1e+6, 1e+15};
std::vector<double> relativeErrorEnergy = {1e-7, 1e+2};
for (int acmode : acmodes) {
GreenWakeFunction gwf("opal", nullptr, filters, nbin, Z0, radius, sigma, acmode, tau, 0, const_length, fname);
double spacing = 1e-6; //IFF: charge in testLambda.h in 1um spacings
// determine K and charge
double charge = 0.8e-9; // nC
double K = 0.20536314319923724e-9; //K normalizes nC data in lambda.h?
gwf.NBin_m = 294;
std::cout << "# Z0 = " << gwf.Z0_m << std::endl
<< "# radius = " << gwf.radius_m << std::endl
<< "# sigma = " << gwf.sigma_m << std::endl
<< "# acMode = " << gwf.acMode_m << std::endl
<< "# tau = " << gwf.tau_m << std::endl
<< "# direction = " << gwf.direction_m << std::endl
<< "# spacing = " << spacing << std::endl
<< "# Lbunch = " << gwf.NBin_m << std::endl;
if(gwf.FftWField_m.empty()) {
gwf.FftWField_m.resize(2*gwf.NBin_m - 1);
gwf.CalcWakeFFT(spacing);
} else if(!gwf.constLength_m) {
gwf.CalcWakeFFT(spacing);
}
std::cout << "# Wake calculated in Opal" << std::endl;
for(int i = 0; i < gwf.NBin_m; i++) {
std::cout << i + 1 << " " << gwf.FftWField_m[i] << std::endl;
}
std::vector<double> OutEnergy(gwf.NBin_m);
gwf.compEnergy(K, charge, testLambda, OutEnergy.data());
std::cout << "# Energy of the Wake calculated in Opal\n";
for(int i = 0; i < gwf.NBin_m; i++) {
std::cout << i + 1 << " " << OutEnergy[i] << std::endl;
}
EXPECT_NEAR(gwf.FftWField_m[gwf.NBin_m-1], finalWakeValues[acmode-1], relativeErrorWake[acmode-1]);
EXPECT_NEAR( OutEnergy[gwf.NBin_m-1], finalEnergyValues[acmode-1], relativeErrorEnergy[acmode-1]);
}
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment