FEDRA emulsion software from the OPERA Collaboration
Functions.hh File Reference
#include <cmath>
#include "Expression.hh"
Include dependency graph for Functions.hh:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  meta_dot< I >
 
struct  meta_dot< 0 >
 
struct  meta_mag< I >
 
struct  meta_mag< 0 >
 

Functions

template<class A , class B , class T >
SVector< T, 3 > cross (const Expr< A, T, 3 > &lhs, const Expr< B, T, 3 > &rhs)
 
template<class A , class T >
SVector< T, 3 > cross (const Expr< A, T, 3 > &lhs, const SVector< T, 3 > &rhs)
 
template<class T , class A >
SVector< T, 3 > cross (const SVector< T, 3 > &lhs, const Expr< A, T, 3 > &rhs)
 
template<class T >
SVector< T, 3 > cross (const SVector< T, 3 > &lhs, const SVector< T, 3 > &rhs)
 
template<class A , class B , class T , unsigned int D>
dot (const Expr< A, T, D > &lhs, const Expr< B, T, D > &rhs)
 
template<class A , class T , unsigned int D>
dot (const Expr< A, T, D > &lhs, const SVector< T, D > &rhs)
 
template<class A , class T , unsigned int D>
dot (const SVector< T, D > &lhs, const Expr< A, T, D > &rhs)
 
template<class T , unsigned int D>
dot (const SVector< T, D > &lhs, const SVector< T, D > &rhs)
 
template<class A , class T >
Lmag (const Expr< A, T, 4 > &rhs)
 
template<class T >
Lmag (const SVector< T, 4 > &rhs)
 
template<class A , class T >
Lmag2 (const Expr< A, T, 4 > &rhs)
 
template<class T >
Lmag2 (const SVector< T, 4 > &rhs)
 
template<class A , class T , unsigned int D>
mag (const Expr< A, T, D > &rhs)
 
template<class T , unsigned int D>
mag (const SVector< T, D > &rhs)
 
template<class A , class T , unsigned int D>
mag2 (const Expr< A, T, D > &rhs)
 
template<class T , unsigned int D>
mag2 (const SVector< T, D > &rhs)
 
template<class T >
const T maximum (const T &lhs, const T &rhs)
 
template<class T >
const T minimum (const T &lhs, const T &rhs)
 
template<class T >
int round (const T &x)
 
template<class T >
const int sign (const T &x)
 
template<class T >
const T square (const T &x)
 
template<class A , class T , unsigned int D>
SVector< T, D > unit (const Expr< A, T, D > &rhs)
 
template<class T , unsigned int D>
SVector< T, D > unit (const SVector< T, D > &rhs)
 

Function Documentation

◆ cross() [1/4]

template<class A , class B , class T >
SVector< T, 3 > cross ( const Expr< A, T, 3 > &  lhs,
const Expr< B, T, 3 > &  rhs 
)
inline
322 {
323 return SVector<T,3>(lhs.apply(1)*rhs.apply(2) -
324 lhs.apply(2)*rhs.apply(1),
325 lhs.apply(2)*rhs.apply(0) -
326 lhs.apply(0)*rhs.apply(2),
327 lhs.apply(0)*rhs.apply(1) -
328 lhs.apply(1)*rhs.apply(0));
329}
T apply(unsigned int i) const
Definition: Expression.hh:55
Definition: SVector.hh:51

◆ cross() [2/4]

template<class A , class T >
SVector< T, 3 > cross ( const Expr< A, T, 3 > &  lhs,
const SVector< T, 3 > &  rhs 
)
inline
296 {
297 return SVector<T,3>(lhs.apply(1)*rhs.apply(2) -
298 lhs.apply(2)*rhs.apply(1),
299 lhs.apply(2)*rhs.apply(0) -
300 lhs.apply(0)*rhs.apply(2),
301 lhs.apply(0)*rhs.apply(1) -
302 lhs.apply(1)*rhs.apply(0));
303}
T apply(unsigned int i) const
access the parse tree

◆ cross() [3/4]

template<class T , class A >
SVector< T, 3 > cross ( const SVector< T, 3 > &  lhs,
const Expr< A, T, 3 > &  rhs 
)
inline
309 {
310 return SVector<T,3>(lhs.apply(1)*rhs.apply(2) -
311 lhs.apply(2)*rhs.apply(1),
312 lhs.apply(2)*rhs.apply(0) -
313 lhs.apply(0)*rhs.apply(2),
314 lhs.apply(0)*rhs.apply(1) -
315 lhs.apply(1)*rhs.apply(0));
316}

◆ cross() [4/4]

template<class T >
SVector< T, 3 > cross ( const SVector< T, 3 > &  lhs,
const SVector< T, 3 > &  rhs 
)
inline

cross. Cross product of two 3-dim vectors: $\vec{c} = \vec{a}\times\vec{b}$.

Author
T. Glebe
283 {
284 return SVector<T,3>(lhs.apply(1)*rhs.apply(2) -
285 lhs.apply(2)*rhs.apply(1),
286 lhs.apply(2)*rhs.apply(0) -
287 lhs.apply(0)*rhs.apply(2),
288 lhs.apply(0)*rhs.apply(1) -
289 lhs.apply(1)*rhs.apply(0));
290}

◆ dot() [1/4]

template<class A , class B , class T , unsigned int D>
T dot ( const Expr< A, T, D > &  lhs,
const Expr< B, T, D > &  rhs 
)
inline
157 {
158 return meta_dot<D-1>::f(rhs,lhs, T());
159}
static T f(const A &lhs, const B &rhs, const T &x)
Definition: Functions.hh:105

◆ dot() [2/4]

template<class A , class T , unsigned int D>
T dot ( const Expr< A, T, D > &  lhs,
const SVector< T, D > &  rhs 
)
inline
148 {
149 return meta_dot<D-1>::f(lhs,rhs, T());
150}

◆ dot() [3/4]

template<class A , class T , unsigned int D>
T dot ( const SVector< T, D > &  lhs,
const Expr< A, T, D > &  rhs 
)
inline
140 {
141 return meta_dot<D-1>::f(lhs,rhs, T());
142}

◆ dot() [4/4]

template<class T , unsigned int D>
T dot ( const SVector< T, D > &  lhs,
const SVector< T, D > &  rhs 
)
inline

dot. Template to compute $\vec{a}\cdot\vec{b} = \sum_i a_i\cdot b_i$.

Author
T. Glebe
132 {
133 return meta_dot<D-1>::f(lhs,rhs, T());
134}

◆ Lmag() [1/2]

template<class A , class T >
T Lmag ( const Expr< A, T, 4 > &  rhs)
inline
269 {
270 return sqrt(Lmag2(rhs));
271}
T Lmag2(const SVector< T, 4 > &rhs)
Definition: Functions.hh:238

◆ Lmag() [2/2]

template<class T >
T Lmag ( const SVector< T, 4 > &  rhs)
inline

Lmag. Length of a vector Lorentz-Vector: $|\vec{v}| = \sqrt{v_0^2 - v_1^2 - v_2^2 -v_3^2}$.

Author
T. Glebe
261 {
262 return sqrt(Lmag2(rhs));
263}

◆ Lmag2() [1/2]

template<class A , class T >
T Lmag2 ( const Expr< A, T, 4 > &  rhs)
inline
246 {
247 return square(rhs.apply(0))
248 - square(rhs.apply(1)) - square(rhs.apply(2)) - square(rhs.apply(3));
249}
const T square(const T &x)
Definition: Functions.hh:46

◆ Lmag2() [2/2]

template<class T >
T Lmag2 ( const SVector< T, 4 > &  rhs)
inline

Lmag2. Template to compute $|\vec{v}|^2 = v_0^2 - v_1^2 - v_2^2 -v_3^2$.

Author
T. Glebe
238 {
239 return square(rhs[0]) - square(rhs[1]) - square(rhs[2]) - square(rhs[3]);
240}

◆ mag() [1/2]

template<class A , class T , unsigned int D>
T mag ( const Expr< A, T, D > &  rhs)
inline
224 {
225 return sqrt(mag2(rhs));
226}
T mag2(const SVector< T, D > &rhs)
Definition: Functions.hh:195

◆ mag() [2/2]

template<class T , unsigned int D>
T mag ( const SVector< T, D > &  rhs)
inline

mag. Length of a vector: $|\vec{v}| = \sqrt{\sum_iv_i^2}$.

Author
T. Glebe
216 {
217 return sqrt(mag2(rhs));
218}

◆ mag2() [1/2]

template<class A , class T , unsigned int D>
T mag2 ( const Expr< A, T, D > &  rhs)
inline
203 {
204 return meta_mag<D-1>::f(rhs, T());
205}
static T f(const A &rhs, const T &x)
Definition: Functions.hh:168

◆ mag2() [2/2]

template<class T , unsigned int D>
T mag2 ( const SVector< T, D > &  rhs)
inline

mag2. Template to compute $|\vec{v}|^2 = \sum_iv_i^2$.

Author
T. Glebe
195 {
196 return meta_mag<D-1>::f(rhs, T());
197}

◆ maximum()

template<class T >
const T maximum ( const T &  lhs,
const T &  rhs 
)
inline

maximum. Template to compute $\max(i,j)$

Author
T. Glebe
57 {
58 return (lhs > rhs) ? lhs : rhs;
59}

◆ minimum()

template<class T >
const T minimum ( const T &  lhs,
const T &  rhs 
)
inline

minimum. Template to compute $\min(i,j)$

Author
T. Glebe
70 {
71 return (lhs < rhs) ? lhs : rhs;
72}

◆ round()

template<class T >
int round ( const T &  x)
inline

round. Template to compute nearest integer value.

Author
T. Glebe
83 {
84 return (x-static_cast<int>(x) < 0.5) ? static_cast<int>(x) : static_cast<int>(x+1);
85}

◆ sign()

template<class T >
const int sign ( const T &  x)
inline

sign. Template to compute the sign of a number $\textrm{sgn}(i)$.

Author
T. Glebe
97{ return (x==0)? 0 : (x<0)? -1 : 1; }

◆ square()

template<class T >
const T square ( const T &  x)
inline

square. Template to compute $x\cdot x$

Author
T. Glebe
46{ return x*x; }

◆ unit() [1/2]

template<class A , class T , unsigned int D>
SVector< T, D > unit ( const Expr< A, T, D > &  rhs)
inline
349 {
350 return SVector<T,D>(rhs).unit();
351}
SVector< T, D > & unit()
transform vector into a vector of lenght 1

◆ unit() [2/2]

template<class T , unsigned int D>
SVector< T, D > unit ( const SVector< T, D > &  rhs)
inline

unit. Return a vector of unit lenght: $\vec{e}_v = \vec{v}/|\vec{v}|$.

Author
T. Glebe
341 {
342 return SVector<T,D>(rhs).unit();
343}