17#define BOOST_TEST_MODULE Test TPC O2TPCSpaceCharge3DCalc class
18#define BOOST_TEST_MAIN
19#define BOOST_TEST_DYN_LINK
20#include <boost/test/unit_test.hpp>
32static constexpr DataT TOLERANCE = 3;
33static constexpr DataT TOLERANCE2D = 8.5;
34static constexpr DataT ABSTOLERANCE = 0.01;
35static constexpr unsigned short NR = 65;
36static constexpr unsigned short NZ = 65;
37static constexpr unsigned short NPHI = 180;
38static constexpr unsigned short NR2D = 129;
39static constexpr unsigned short NZ2D = 129;
40static constexpr unsigned short NPHI2D = 1;
44template <
typename DataT>
52template <
typename DataT>
60template <
typename DataT>
66template <
typename DataT>
69 for (
size_t iPhi = 0; iPhi < density.
getNPhi(); ++iPhi) {
70 const DataT phi = getPhiVertex<DataT>(iPhi, grid);
71 for (
size_t iR = 0; iR < density.
getNR(); ++iR) {
72 const DataT radius = getRVertex<DataT>(iR, grid);
73 for (
size_t iZ = 0; iZ < density.
getNZ(); ++iZ) {
74 const DataT z = getZVertex<DataT>(iZ, grid);
75 density(iZ, iR, iPhi) = formulas.
evalDensity(
z, radius, phi);
81template <
typename DataT>
84 for (
size_t iPhi = 0; iPhi < potential.
getNPhi(); ++iPhi) {
85 const DataT phi = getPhiVertex<DataT>(iPhi, grid);
86 for (
size_t iR = 0; iR < potential.
getNR(); ++iR) {
87 const DataT radius = getRVertex<DataT>(iR, grid);
88 for (
size_t iZ = 0; iZ < potential.
getNZ(); ++iZ) {
89 const DataT z = getZVertex<DataT>(iZ, grid);
96template <
typename DataT>
99 for (
size_t iPhi = 0; iPhi < potential.
getNPhi(); ++iPhi) {
100 const DataT phi = getPhiVertex<DataT>(iPhi, grid);
101 for (
size_t iZ = 0; iZ < potential.
getNZ(); ++iZ) {
102 const DataT z = getZVertex<DataT>(iZ, grid);
104 const DataT radius = getRVertex<DataT>(iR, grid);
109 for (
size_t iPhi = 0; iPhi < potential.
getNPhi(); ++iPhi) {
110 const DataT phi = getPhiVertex<DataT>(iPhi, grid);
111 for (
size_t iZ = 0; iZ < potential.
getNZ(); ++iZ) {
112 const DataT z = getZVertex<DataT>(iZ, grid);
113 const size_t iR = potential.
getNR() - 1;
114 const DataT radius = getRVertex<DataT>(iR, grid);
119 for (
size_t iPhi = 0; iPhi < potential.
getNPhi(); ++iPhi) {
120 const DataT phi = getPhiVertex<DataT>(iPhi, grid);
121 for (
size_t iR = 0; iR < potential.
getNR(); ++iR) {
122 const DataT radius = getRVertex<DataT>(iR, grid);
124 const DataT z = getZVertex<DataT>(iZ, grid);
129 for (
size_t iPhi = 0; iPhi < potential.
getNPhi(); ++iPhi) {
130 const DataT phi = getPhiVertex<DataT>(iPhi, grid);
131 for (
size_t iR = 0; iR < potential.
getNR(); ++iR) {
132 const DataT radius = getRVertex<DataT>(iR, grid);
133 const size_t iZ = potential.
getNZ() - 1;
134 const DataT z = getZVertex<DataT>(iZ, grid);
140template <
typename DataT>
143 for (
size_t iPhi = 0; iPhi < numerical.
getNPhi(); ++iPhi) {
144 for (
size_t iR = 0; iR < numerical.
getNR(); ++iR) {
145 for (
size_t iZ = 0; iZ < numerical.
getNZ(); ++iZ) {
146 if (std::fabs(analytical(iZ, iR, iPhi)) < ABSTOLERANCE) {
147 BOOST_CHECK_SMALL(numerical(iZ, iR, iPhi) - analytical(iZ, iR, iPhi), ABSTOLERANCE);
149 BOOST_CHECK_CLOSE(numerical(iZ, iR, iPhi), analytical(iZ, iR, iPhi), TOLERANCE);
156template <
typename DataT>
159 for (
size_t iPhi = 0; iPhi < numerical.
getNPhi(); ++iPhi) {
160 for (
size_t iR = 0; iR < numerical.
getNR(); ++iR) {
161 for (
size_t iZ = 0; iZ < numerical.
getNZ(); ++iZ) {
162 if (std::fabs(analytical(iZ, iR, iPhi)) < ABSTOLERANCE) {
163 BOOST_CHECK_SMALL(numerical(iZ, iR, iPhi) - analytical(iZ, iR, iPhi), ABSTOLERANCE);
165 BOOST_CHECK_CLOSE(numerical(iZ, iR, iPhi), analytical(iZ, iR, iPhi), TOLERANCE2D);
172template <
typename DataT>
177 const o2::tpc::RegularGrid3D<DataT> grid3D{GridProp::ZMIN, GridProp::RMIN, GridProp::PHIMIN, GridProp::getGridSpacingZ(NZ), GridProp::getGridSpacingR(NR), GridProp::getGridSpacingPhi(NPHI),
params};
180 DataContainer potentialNumerical(NZ, NR, NPHI);
181 DataContainer potentialAnalytical(NZ, NR, NPHI);
182 DataContainer
charge(NZ, NR, NPHI);
186 setChargeDensityFromFormula<DataT>(analyticalFields, grid3D,
charge);
187 setPotentialBoundaryFromFormula<DataT>(analyticalFields, grid3D, potentialNumerical);
190 setPotentialFromFormula<DataT>(analyticalFields, grid3D, potentialAnalytical);
194 const int symmetry = 0;
198 testAlmostEqualArray<DataT>(potentialAnalytical, potentialNumerical);
201template <
typename DataT>
206 const o2::tpc::RegularGrid3D<DataT> grid3D{GridProp::ZMIN, GridProp::RMIN, GridProp::PHIMIN, GridProp::getGridSpacingZ(NZ2D), GridProp::getGridSpacingR(NR2D), GridProp::getGridSpacingPhi(NPHI2D),
params};
209 DataContainer potentialNumerical(NZ2D, NR2D, NPHI2D);
210 DataContainer potentialAnalytical(NZ2D, NR2D, NPHI2D);
211 DataContainer
charge(NZ2D, NR2D, NPHI2D);
215 setChargeDensityFromFormula<DataT>(analyticalFields, grid3D,
charge);
216 setPotentialBoundaryFromFormula<DataT>(analyticalFields, grid3D, potentialNumerical);
219 setPotentialFromFormula<DataT>(analyticalFields, grid3D, potentialAnalytical);
226 testAlmostEqualArray2D<DataT>(potentialAnalytical, potentialNumerical);
232 poissonSolver3D<DataT>();
238 poissonSolver3D<DataT>();
243 poissonSolver2D<DataT>();
This class provides a simple method to store values on a large 3-Dim grid with ROOT io functionality.
This class provides implementation of Poisson equation solver by MultiGrid Method Original version of...
This file provides all necesseray classes which are used during the calcution of the distortions and ...
DataT evalDensity(DataT z, DataT r, DataT phi) const
DataT evalPotential(DataT z, DataT r, DataT phi) const
void poissonSolver3D(DataContainer &matricesV, const DataContainer &matricesCharge, const int symmetry)
void poissonSolver2D(DataContainer &matricesV, const DataContainer &matricesCharge)
DataT getRVertex(const size_t vertexY) const
DataT getPhiVertex(const size_t vertexZ) const
DataT getZVertex(const size_t vertexX) const
GLenum const GLfloat * params
GLdouble GLdouble GLdouble z
BOOST_AUTO_TEST_CASE(ClusterHardware_test1)
void setChargeDensityFromFormula(const AnalyticalFields< DataT > &formulas, const o2::tpc::RegularGrid3D< DataT > &grid, o2::tpc::DataContainer3D< DataT > &density)
DataT getZVertex(const size_t indexZ, const o2::tpc::RegularGrid3D< DataT > &grid)
void testAlmostEqualArray(o2::tpc::DataContainer3D< DataT > &analytical, o2::tpc::DataContainer3D< DataT > &numerical)
DataT getRVertex(const size_t indexR, const o2::tpc::RegularGrid3D< DataT > &grid)
DataT getPhiVertex(const size_t indexPhi, const o2::tpc::RegularGrid3D< DataT > &grid)
void testAlmostEqualArray2D(o2::tpc::DataContainer3D< DataT > &analytical, o2::tpc::DataContainer3D< DataT > &numerical)
void setPotentialFromFormula(const AnalyticalFields< DataT > &formulas, const o2::tpc::RegularGrid3D< DataT > &grid, o2::tpc::DataContainer3D< DataT > &potential)
void setPotentialBoundaryFromFormula(const AnalyticalFields< DataT > &formulas, const o2::tpc::RegularGrid3D< DataT > &grid, o2::tpc::DataContainer3D< DataT > &potential)
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
unsigned short getNZ() const
unsigned short getNR() const
unsigned short getNPhi() const
static bool isFull3D
< Parameters choice for MultiGrid algorithm