14 #include <Vc/Allocator> 43 #define VSUM(v) v.x() + v.y() 45 #define VSUM(v) v.X() + v.Y() 49 #elif DIM_3 // 3 Dimensions 63 #define VSUM(v) v.x() + v.y() + v.z() 65 #define VSUM(v) v.X() + v.Y() + v.Z() 68 #else // default is 4D 85 #define VSUM(v) v.x() + v.y() + v.z() 88 #define VSUM(v) v.X() + v.Y() + v.Z() 109 template<
class Vector>
126 void MathFunction_sin();
127 void MathFunction_exp();
128 void MathFunction_log();
129 void MathFunction_atan();
130 void MathFunction_atan2();
142 std::vector<Vector> vlist;
143 std::vector<Vector> vlist2;
144 std::vector<Double_type> scale;
145 std::vector <std::vector <double > > vcoords;
151 template <
class Vector,
class Vector_V,
int Size>
156 for (
int i = 0; i <
Size; ++i) {
157 vlist[i].GetCoordinates(coord);
158 for (
int j = 0; j < dim; ++j)
159 vcoord[j][i] = coord[j];
161 vret.SetCootdinates(vcoord);
179 template<
class Vector>
180 TestVector<Vector>::TestVector() :
196 for (
int i = 0; i<
N; ++i) {
203 coord[0] =
x; coord[1] =
y; coord[2] = z; coord[3] = t;
204 vcoords[i] = std::vector<double>(coord,coord+4);
217 coord[0] = x[j]; coord[1] = y[j]; coord[2] = z[j]; coord[3] = t[j];
218 vcoords[i*Vc::double_v::Size+j] = std::vector<double>(coord,coord+4);
223 vlist[i] = Vector( x, y );
225 vlist[i] = Vector( x, y, z);
227 vlist[i] = Vector( x, y, z, t);
232 std::cout <<
"test using " <<
typeid(vlist[0]).
name() << std::endl;
233 std::cout <<
"Vector used " << vlist[0] << std::endl;
234 std::cout <<
"Vector used " << vlist[1] << std::endl;
237 for (
int i = 0; i<
N; ++i) {
239 vlist2[i] = (i < N-1) ? vlist[i+1] : vlist[0];
246 Double_type y2 = (i< N-1) ? vlist[i+1].
Y() : vlist[0].Y();
247 Double_type z2 = (i< N-1) ? vlist[i+1].
Z() : vlist[0].Z();
248 Double_type t2 = (i< N-1) ? vlist[i+1].
E() : vlist[0].E();
260 j = Vc::double_v::Size-1;
265 vlist2[i] = Vector( x, y, z, t);
272 template<
class Vector>
273 void TestVector<Vector>::PrintResult(
Double_type s)
277 std::cout <<
"value " << s << std::endl << std::endl;
283 std::cout <<
"value " << s2 << std::endl << std::endl;
287 template<
class Vector>
288 void TestVector<Vector>::Read()
298 for (
int i = 0; i<
N; ++i) {
299 Vector v3 = vlist[i];
307 std::cout <<
"Time for read v3 :\t" << w.
RealTime() <<
"\t" << w.
CpuTime() << std::endl;
313 template<
class Vector>
321 for (
int i = 0; i<
N; ++i) {
322 Vector v3 = vlist[i] + vlist2[i];
330 std::cout <<
"Time for v3 = v1 + v2 :\t" << w.
RealTime() <<
"\t" << w.
CpuTime() << std::endl;
335 template<
class Vector>
336 void TestVector<Vector>::Add2()
345 for (
int i = 0; i<
N; ++i) {
354 std::cout <<
"Time for v2 += v1 :\t" << w.
RealTime() <<
"\t" << w.
CpuTime() << std::endl;
359 template<
class Vector>
360 void TestVector<Vector>::Sub()
367 for (
int i = 0; i<
N; ++i) {
368 Vector v3 = vlist[i] - vlist2[i];
373 std::cout <<
"Time for v3 = v1 - v2 :\t" << w.
RealTime() <<
"\t" << w.
CpuTime() << std::endl;
378 template<
class Vector>
379 void TestVector<Vector>::Sub2()
387 for (
int i = 0; i<
N; ++i) {
393 std::cout <<
"Time for v2 -= v1 :\t" << w.
RealTime() <<
"\t" << w.
CpuTime() << std::endl;
399 template<
class Vector>
400 void TestVector<Vector>::Scale()
407 for (
int i = 0; i<
N; ++i) {
408 Vector v3 = scale[i]*vlist[i];
413 std::cout <<
"Time for v2 = A * v1 :\t" << w.
RealTime() <<
"\t" << w.
CpuTime() << std::endl;
418 template<
class Vector>
419 void TestVector<Vector>::Scale2()
427 for (
int i = 0; i<
N; ++i) {
434 std::cout <<
"Time for v *= a :\t" << w.
RealTime() <<
"\t" << w.
CpuTime() << std::endl;
439 template<
class Vector>
440 void TestVector<Vector>::Divide()
447 for (
int i = 0; i<
N; ++i) {
448 Vector v3 = vlist[i]/scale[i];
453 std::cout <<
"Time for v2 = v1 / a :\t" << w.
RealTime() <<
"\t" << w.
CpuTime() << std::endl;
458 template<
class Vector>
459 void TestVector<Vector>::Divide2()
467 for (
int i = 0; i<
N; ++i) {
474 std::cout <<
"Time for v /= a :\t" << w.
RealTime() <<
"\t" << w.
CpuTime() << std::endl;
480 template<
class Vector>
481 void TestVector<Vector>::Operations()
491 const int n =
sqrt(
N)+0.5;
494 for (
int i = 0; i<
n; ++i) {
495 for (
int j = 0; j< i; ++j) {
509 const int nn =
sqrt(vcoords.size()) + 0.5;
510 int ncomb = nn*(nn-1)/2;
511 std::vector<double> vc1x(ncomb+4);
512 std::vector<double> vc2x(ncomb+4);
513 std::vector<double> vc1y(ncomb+4);
514 std::vector<double> vc2y(ncomb+4);
515 std::vector<double> vc1z(ncomb+4);
516 std::vector<double> vc2z(ncomb+4);
517 std::vector<double> vc1t(ncomb+4);
518 std::vector<double> vc2t(ncomb+4);
522 for (
int i = 0; i< nn; ++i) {
523 std::copy(vcoords[i].begin(), vcoords[i].end(),c1);
525 for (
int j = 0; j< i; ++j) {
526 std::copy(vcoords[j].begin(), vcoords[j].end(),c2);
540 Vector v1; Vector v2;
541 for (
int i = 0; i< ncomb2; ++i) {
549 v1.SetCoordinates( cv);
557 v2.SetCoordinates( cv2);
566 std::cout <<
"Time for Operation :\t" << w.
RealTime() <<
"\t" << w.
CpuTime() << std::endl;
573 template<
class Vector>
574 void TestVector<Vector>::Operations()
586 const int n =
sqrt(
N)+0.5;
589 const int nn =
sqrt(vcoords.size()) + 0.5;
590 int ncomb = nn*(nn-1)/2;
591 std::vector<double> vc1x(ncomb+4);
592 std::vector<double> vc2x(ncomb+4);
593 std::vector<double> vc1y(ncomb+4);
594 std::vector<double> vc2y(ncomb+4);
595 std::vector<double> vc1z(ncomb+4);
596 std::vector<double> vc2z(ncomb+4);
597 std::vector<double> vc1t(ncomb+4);
598 std::vector<double> vc2t(ncomb+4);
602 for (
int i = 0; i< nn; ++i) {
603 std::copy(vcoords[i].begin(), vcoords[i].end(),c1);
605 for (
int j = 0; j< i; ++j) {
606 std::copy(vcoords[j].begin(), vcoords[j].end(),c2);
623 for (
int i = 0; i<
n; ++i) {
624 for (
int j = 0; j< i; ++j) {
640 Vector v1; Vector v2;
641 for (
int i = 0; i< ncomb2; ++i) {
649 v1.SetCoordinates( cv);
657 v2.SetCoordinates( cv2);
672 std::cout <<
"Time for Operation :\t" << w.
RealTime() <<
"\t" << w.
CpuTime() << std::endl;
679 template<
class Vector>
680 void TestVector<Vector>::Boost()
689 for (
int i = 0; i<
N; ++i) {
697 std::cout <<
"Time for Boost :\t" << w.
RealTime() <<
"\t" << w.
CpuTime() << std::endl;
704 template<
class Vector>
705 void TestVector<Vector>::MathFunction_exp()
713 for (
int i = 0; i<
N; ++i) {
719 std::cout <<
"Time for Exp Function :\t" << w.
RealTime() <<
"\t" << w.
CpuTime() << std::endl;
726 template<
class Vector>
727 void TestVector<Vector>::MathFunction_log()
735 for (
int i = 0; i<
N; ++i) {
741 std::cout <<
"Time for Log Function :\t" << w.
RealTime() <<
"\t" << w.
CpuTime() << std::endl;
746 template<
class Vector>
747 void TestVector<Vector>::MathFunction_sin()
755 for (
int i = 0; i<
N; ++i) {
761 std::cout <<
"Time for Sin Function :\t" << w.
RealTime() <<
"\t" << w.
CpuTime() << std::endl;
766 template<
class Vector>
767 void TestVector<Vector>::MathFunction_atan()
775 for (
int i = 0; i<
N; ++i) {
781 std::cout <<
"Time for Atan Function :\t" << w.
RealTime() <<
"\t" << w.
CpuTime() << std::endl;
786 template<
class Vector>
787 void TestVector<Vector>::MathFunction_atan2()
795 for (
int i = 0; i<
N; ++i) {
801 std::cout <<
"Time for Atan2 Function :\t" << w.
RealTime() <<
"\t" << w.
CpuTime() << std::endl;
806 #ifdef HAS_VDT // use VDT 807 template<
class Vector>
808 void TestVector<Vector>::MathFunction()
818 for (
int i = 0; i<
N; ++i) {
823 vdt::fast_atanv(N,x,r);
824 for (
int i = 0; i<
N; ++i) {
831 std::cout <<
"Time for MathFUnction(VDT) :\t" << w.
RealTime() <<
"\t" << w.
CpuTime() << std::endl;
838 template<
class Vector>
839 void TestVector<Vector>::PrintSummary()
841 std::cout <<
"\nResults for " <<
typeid(vlist[0]).
name() << std::endl;
842 std::cout <<
" v3 = v1+v2" 858 for (
int i = 3; i < fTest; ++i) {
859 std::cout << std::setw(8) << fTime[i] <<
" ";
861 std::cout << std::endl << std::endl;
865 TestVector<VecType> t;
868 std::cout <<
"testing using Vc: Vc size is " <<
Vc::double_v::Size <<
" Looping on " <<
N <<
" vectors" << std::endl;
869 std::cout <<
"Implementation type: " <<
VC_IMPL << std::endl;
871 std::cout <<
"testing using standard double's. Looping on " <<
N <<
" vectors" << std::endl;
895 t.MathFunction_log();
896 t.MathFunction_exp();
897 t.MathFunction_sin();
898 t.MathFunction_atan();
899 t.MathFunction_atan2();
Class describing a generic LorentzVector in the 4D space-time, using the specified coordinate system ...
Double_t RealTime()
Stop the stopwatch (if it is running) and return the realtime (in seconds) passed between the start a...
void Add(THist< DIMENSION, PRECISIONA > &to, THist< DIMENSION, PRECISIONB > &from)
void Start(Bool_t reset=kTRUE)
Start the stopwatch.
Random number generator class based on the maximally quidistributed combined Tausworthe generator by ...
LVector boostX(const LVector &v, T beta)
Boost a generic Lorentz Vector class along the X direction with a factor beta The only requirement on...
Class describing a generic position vector (point) in 3 dimensions.
Double_t CpuTime()
Stop the stopwatch (if it is running) and return the cputime (in seconds) passed between the start an...
static const double x2[5]
static Vc_ALWAYS_INLINE Vector< T > abs(const Vector< T > &x)
Vector1::Scalar InvariantMass(const Vector1 &v1, const Vector2 &v2)
return the invariant mass of two LorentzVector The only requirement on the LorentzVector is that they...
void MakeVcVector(const Vector *vlist, Vector_V &vret)
VECTOR_NAMESPACE::double_v double_v
Class describing a generic position vector (point) in 2 dimensions.
static const double x1[5]
double atan2(double, double)
virtual Double_t Uniform(Double_t x1=1)
Returns a uniform deviate on the interval (0, x1).
ROOT::Math::XYZTVector VecType
std::complex< float_v > Z
Class describing a generic displacement vector in 2 dimensions.