Celeritas  0.5.0-86+4a8eea4
Functions
ArrayUtils.hh File Reference

Math functions using celeritas::Array. More...

#include <cmath>
#include "corecel/Assert.hh"
#include "corecel/Types.hh"
#include "corecel/cont/Array.hh"
#include "Algorithms.hh"
#include "ArraySoftUnit.hh"
#include "SoftEqual.hh"
#include "detail/ArrayUtilsImpl.hh"

Functions

template<class T , size_type N>
CELER_FUNCTION void celeritas::axpy (T a, Array< T, N > const &x, Array< T, N > *y)
 Increment a vector by another vector multiplied by a scalar. More...
 
template<class T , size_type N>
CELER_FUNCTIONceleritas::dot_product (Array< T, N > const &x, Array< T, N > const &y)
 Dot product of two vectors. More...
 
template<class T >
CELER_FUNCTION Array< T, 3 > celeritas::cross_product (Array< T, 3 > const &x, Array< T, 3 > const &y)
 Cross product of two space vectors.
 
template<class T , size_type N>
CELER_FUNCTIONceleritas::norm (Array< T, N > const &v)
 Calculate the Euclidian (2) norm of a vector.
 
template<class T , size_type N>
CELER_FUNCTION Array< T, N > celeritas::make_unit_vector (Array< T, N > const &v)
 Construct a unit vector. More...
 
template<class T , size_type N>
CELER_FUNCTIONceleritas::distance (Array< T, N > const &x, Array< T, N > const &y)
 Calculate the Euclidian (2) distance between two points.
 
template<class T >
CELER_FUNCTION Array< T, 3 > celeritas::from_spherical (T costheta, T phi)
 Calculate a Cartesian vector from spherical coordinates. More...
 
template<class T >
CELER_FUNCTION Array< T, 3 > celeritas::rotate (Array< T, 3 > const &dir, Array< T, 3 > const &rot)
 Rotate the direction about the given Z-based scatter direction. More...
 

Detailed Description

Math functions using celeritas::Array.

Function Documentation

◆ axpy()

template<class T , size_type N>
CELER_FUNCTION void celeritas::axpy ( a,
Array< T, N > const &  x,
Array< T, N > *  y 
)
inline

Increment a vector by another vector multiplied by a scalar.

Note that this uses celeritas::fma which supports types other than floating point.

◆ dot_product()

template<class T , size_type N>
CELER_FUNCTION T celeritas::dot_product ( Array< T, N > const &  x,
Array< T, N > const &  y 
)
inline

Dot product of two vectors.

Note that this uses celeritas::fma which supports types other than floating point.

◆ from_spherical()

template<class T >
CELER_FUNCTION Array< T, 3 > celeritas::from_spherical ( costheta,
phi 
)
inline

Calculate a Cartesian vector from spherical coordinates.

Theta is the angle between the Z axis and the outgoing vector, and phi is the angle between the x axis and the projection of the vector onto the x-y plane.

◆ make_unit_vector()

template<class T , size_type N>
CELER_FUNCTION Array< T, N > celeritas::make_unit_vector ( Array< T, N > const &  v)
inline

Construct a unit vector.

Unit vectors have an Euclidian norm magnitude of 1.

◆ rotate()

template<class T >
CELER_FUNCTION Array< T, 3 > celeritas::rotate ( Array< T, 3 > const &  dir,
Array< T, 3 > const &  rot 
)
inline

Rotate the direction about the given Z-based scatter direction.

The equivalent to calling the Shift transport code's

void cartesian_vector_transform(
double costheta,
double phi,
Vector_View vector);

is the call

vector = rotate(from_spherical(costheta, phi), vector);
CELER_FUNCTION Array< T, 3 > from_spherical(T costheta, T phi)
Calculate a Cartesian vector from spherical coordinates.
Definition: ArrayUtils.hh:173
CELER_FUNCTION Array< T, 3 > rotate(Array< T, 3 > const &dir, Array< T, 3 > const &rot)
Rotate the direction about the given Z-based scatter direction.
Definition: ArrayUtils.hh:221

This code effectively decomposes the given rotation vector rot into two sequential transform matrices, one with an angle theta about the y axis and one about phi rotating around the z axis. These two angles are the spherical coordinate transform of the given rot cartesian direction vector.

There is some extra code in here to deal with loss of precision when the incident direction is along the z axis. As rot approaches z, the azimuthal angle phi must be calculated carefully from both the x and y components of the vector, not independently. If rot actually equals z then the azimuthal angle is completely indeterminate so we arbitrarily choose phi = 0.

This function is often used for calculating exiting scattering angles. In that case, dir is the exiting angle from the scattering calculation, and rot is the original direction of the particle. The direction vectors are defined as

\[ \Omega = \sin\theta\cos\phi\mathbf{i} + \sin\theta\sin\phi\mathbf{j} + \cos\theta\mathbf{k} \,. \]