ryujin 2.1.1 revision 71cbe157f0746717db03d7e1e977da66a7d7bfb5
Loading...
Searching...
No Matches
Classes
SIMD

Classes

struct  ryujin::get_value_type< T >
 

Type traits and packed index handling

template<unsigned int length, typename Functor >
DEAL_II_ALWAYS_INLINE auto ryujin::generate_iterators (Functor f) -> std::array< auto, length >
 
template<typename T >
DEAL_II_ALWAYS_INLINE void ryujin::increment_iterators (T &iterators)
 

Transcendental and other mathematical operations

template<typename Number >
DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number ryujin::positive_part (const Number number)
 
template<typename Number >
DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number ryujin::negative_part (const Number number)
 
template<typename Number >
DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number ryujin::safe_division (const Number &numerator, const Number &denominator)
 
template<dealii::SIMDComparison predicate, typename Number >
DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number ryujin::compare_and_apply_mask (const Number &left, const Number &right, const Number &true_value, const Number &false_value)
 
template<dealii::SIMDComparison predicate, typename T , std::size_t width>
DEAL_II_ALWAYS_INLINE dealii::VectorizedArray< T, width > ryujin::compare_and_apply_mask (const dealii::VectorizedArray< T, width > &left, const dealii::VectorizedArray< T, width > &right, const dealii::VectorizedArray< T, width > &true_value, const dealii::VectorizedArray< T, width > &false_value)
 
template<int N, typename T >
DEAL_II_HOST_DEVICE_ALWAYS_INLINE T ryujin::fixed_power (const T x)
 
template<typename T >
DEAL_II_HOST_DEVICE T ryujin::pow (const T x, const T b)
 
template<typename T , std::size_t width>
dealii::VectorizedArray< T, width > ryujin::pow (const dealii::VectorizedArray< T, width > x, const T b)
 
template<typename T , std::size_t width>
dealii::VectorizedArray< T, width > ryujin::pow (const dealii::VectorizedArray< T, width > x, const dealii::VectorizedArray< T, width > b)
 
template<typename T >
DEAL_II_HOST_DEVICE T ryujin::fast_pow (const T x, const T b, const Bias bias=Bias::none)
 
template<typename T , std::size_t width>
dealii::VectorizedArray< T, width > ryujin::fast_pow (const dealii::VectorizedArray< T, width > x, const T b, const Bias bias=Bias::none)
 
template<typename T , std::size_t width>
dealii::VectorizedArray< T, width > ryujin::fast_pow (const dealii::VectorizedArray< T, width > x, const dealii::VectorizedArray< T, width > b, const Bias bias=Bias::none)
 

SIMD based access to vectors and arrays of vectors

template<typename T , typename V >
DEAL_II_ALWAYS_INLINE T ryujin::read_entry (const V &vector, unsigned int i)
 
template<typename T , typename T2 >
DEAL_II_ALWAYS_INLINE T ryujin::read_entry (const std::vector< T2 > &vector, unsigned int i)
 
template<typename T , typename V >
DEAL_II_ALWAYS_INLINE T ryujin::read_entry (const V &vector, const unsigned int *js)
 
template<typename T , typename T2 >
DEAL_II_ALWAYS_INLINE T ryujin::read_entry (const std::vector< T2 > &vector, const unsigned int *js)
 
template<typename T , typename V >
DEAL_II_ALWAYS_INLINE void ryujin::write_entry (V &vector, const T &values, unsigned int i)
 
template<typename T , typename T2 >
DEAL_II_ALWAYS_INLINE void ryujin::write_entry (std::vector< T2 > &vector, const T &values, unsigned int i)
 
template<int rank, int dim, std::size_t width, typename Number >
DEAL_II_ALWAYS_INLINE dealii::Tensor< rank, dim, Number > ryujin::serialize_tensor (const dealii::Tensor< rank, dim, dealii::VectorizedArray< Number, width > > &vectorized, const unsigned int k)
 
template<int rank, int dim, typename Number >
DEAL_II_ALWAYS_INLINE dealii::Tensor< rank, dim, Number > ryujin::serialize_tensor (const dealii::Tensor< rank, dim, Number > &serial, const unsigned int k)
 
template<int rank, int dim, std::size_t width, typename Number >
DEAL_II_ALWAYS_INLINE void ryujin::assign_serial_tensor (dealii::Tensor< rank, dim, dealii::VectorizedArray< Number, width > > &result, const dealii::Tensor< rank, dim, Number > &serial, const unsigned int k)
 
template<int rank, int dim, typename Number >
DEAL_II_ALWAYS_INLINE void ryujin::assign_serial_tensor (dealii::Tensor< rank, dim, Number > &result, const dealii::Tensor< rank, dim, Number > &serial, const unsigned int k)
 

Detailed Description

SIMD related functions and classes.

Function Documentation

◆ generate_iterators()

template<unsigned int length, typename Functor >
DEAL_II_ALWAYS_INLINE auto ryujin::generate_iterators ( Functor  f) -> std::array<auto, length>
inline

Given a callable object f(k), this function creates a std::array with elements initialized as follows:

{ f(0) , f(1) , ... , f(length - 1) }

We use this function to create an array of sparsity iterators that cannot be default initialized.

Definition at line 103 of file simd.h.

◆ increment_iterators()

template<typename T >
DEAL_II_ALWAYS_INLINE void ryujin::increment_iterators ( T &  iterators)
inline

Increment all iterators in an std::array simultaneously.

Definition at line 116 of file simd.h.

◆ positive_part()

template<typename Number >
DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number ryujin::positive_part ( const Number  number)

Return the positive part of a number.

Definition at line 134 of file simd.h.

Referenced by ryujin::EulerAEOS::NASGRiemannSolverView< Number, options, MemorySpace >::compute_gap(), ryujin::ShallowWater::WaveSpeedEstimatorView< dim, Number, MemorySpace >::compute_h_star(), ryujin::ShallowWater::WaveSpeedEstimatorView< dim, Number, MemorySpace >::compute_lambda(), ryujin::EulerAEOS::NASGRiemannSolverView< Number, options, MemorySpace >::compute_lambda_max(), ryujin::ShallowWater::HyperbolicSystemView< dim, Number, MemorySpace >::inverse_water_depth_mollified(), ryujin::ShallowWater::WaveSpeedEstimatorView< dim, Number, MemorySpace >::lambda1_minus(), ryujin::EulerAEOS::NASGRiemannSolverView< Number, options, MemorySpace >::lambda1_minus(), ryujin::ShallowWater::WaveSpeedEstimatorView< dim, Number, MemorySpace >::lambda3_plus(), ryujin::EulerAEOS::NASGRiemannSolverView< Number, options, MemorySpace >::lambda3_plus(), ryujin::Euler::LimiterView< dim, Number, MemorySpace >::limit(), ryujin::EulerAEOS::LimiterView< dim, Number, MemorySpace >::limit(), ryujin::EulerBarotropic::LimiterView< dim, Number, MemorySpace >::limit(), ryujin::ScalarConservation::LimiterView< dim, Number, MemorySpace >::limit(), ryujin::ShallowWater::LimiterView< dim, Number, MemorySpace >::limit(), ryujin::EulerAEOS::NASGRiemannSolverView< Number, options, MemorySpace >::p_star_failsafe(), ryujin::EulerAEOS::NASGRiemannSolverView< Number, options, MemorySpace >::p_star_interpolated(), ryujin::EulerAEOS::NASGRiemannSolverView< Number, options, MemorySpace >::p_star_RS_full(), ryujin::EulerAEOS::NASGRiemannSolverView< Number, options, MemorySpace >::p_star_single_gamma(), ryujin::EulerAEOS::NASGRiemannSolverView< Number, options, MemorySpace >::p_star_SS_full(), ryujin::EulerAEOS::NASGRiemannSolverView< Number, options, MemorySpace >::p_star_two_rarefaction(), ryujin::EulerAEOS::HyperbolicSystemView< dim, Number, MemorySpace >::surrogate_harten_entropy(), ryujin::EulerAEOS::HyperbolicSystemView< dim, Number, MemorySpace >::surrogate_pressure(), and ryujin::EulerAEOS::HyperbolicSystemView< dim, Number, MemorySpace >::surrogate_speed_of_sound().

◆ negative_part()

template<typename Number >
DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number ryujin::negative_part ( const Number  number)

◆ safe_division()

template<typename Number >
DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number ryujin::safe_division ( const Number &  numerator,
const Number &  denominator 
)

For various divisions we have a mathematical guarantee that the numerator and denominator are nonnegative and the limit (of zero numerator and denominator) must converge to zero. The following function takes care of rounding issues when computing such quotients by (a) avoiding division by zero and (b) ensuring non-negativity of the result.

Definition at line 164 of file simd.h.

References ryujin::min.

Referenced by ryujin::EulerAEOS::NASGRiemannSolverView< Number, options, MemorySpace >::alpha(), ryujin::EulerAEOS::IndicatorView< dim, Number, MemorySpace >::alpha(), ryujin::EulerBarotropic::IndicatorView< dim, Number, MemorySpace >::alpha(), ryujin::EulerAEOS::NASGRiemannSolverView< Number, options, MemorySpace >::df(), ryujin::EulerAEOS::NASGRiemannSolverView< Number, options, MemorySpace >::f(), ryujin::EulerAEOS::NASGRiemannSolverView< Number, options, MemorySpace >::lambda1_minus(), ryujin::EulerAEOS::NASGRiemannSolverView< Number, options, MemorySpace >::lambda3_plus(), ryujin::EulerAEOS::NASGRiemannSolverView< Number, options, MemorySpace >::p_star_failsafe(), ryujin::EulerAEOS::NASGRiemannSolverView< Number, options, MemorySpace >::p_star_interpolated(), ryujin::EulerAEOS::NASGRiemannSolverView< Number, options, MemorySpace >::p_star_RS_full(), ryujin::EulerAEOS::NASGRiemannSolverView< Number, options, MemorySpace >::p_star_single_gamma(), ryujin::EulerAEOS::NASGRiemannSolverView< Number, options, MemorySpace >::p_star_SS_full(), ryujin::EulerAEOS::NASGRiemannSolverView< Number, options, MemorySpace >::p_star_two_rarefaction(), ryujin::EulerAEOS::NASGRiemannSolverView< Number, options, MemorySpace >::phi_of_p_max(), ryujin::EulerAEOS::NASGRiemannSolverView< Number, options, MemorySpace >::rarefaction_fan_pressure(), ryujin::EulerAEOS::NASGRiemannSolverView< Number, options, MemorySpace >::rho_star(), ryujin::EulerAEOS::NASGRiemannSolverView< Number, options, MemorySpace >::safe_division(), ryujin::EulerAEOS::NASGRiemannSolverView< Number, options, MemorySpace >::speed_of_sound(), ryujin::EulerAEOS::HyperbolicSystemView< dim, Number, MemorySpace >::surrogate_gamma(), ryujin::EulerAEOS::HyperbolicSystemView< dim, Number, MemorySpace >::surrogate_harten_entropy_derivative(), and ryujin::EulerAEOS::HyperbolicSystemView< dim, Number, MemorySpace >::surrogate_pressure().

◆ compare_and_apply_mask() [1/2]

template<dealii::SIMDComparison predicate, typename Number >
DEAL_II_HOST_DEVICE_ALWAYS_INLINE Number ryujin::compare_and_apply_mask ( const Number &  left,
const Number &  right,
const Number &  true_value,
const Number &  false_value 
)

◆ compare_and_apply_mask() [2/2]

template<dealii::SIMDComparison predicate, typename T , std::size_t width>
DEAL_II_ALWAYS_INLINE dealii::VectorizedArray< T, width > ryujin::compare_and_apply_mask ( const dealii::VectorizedArray< T, width > &  left,
const dealii::VectorizedArray< T, width > &  right,
const dealii::VectorizedArray< T, width > &  true_value,
const dealii::VectorizedArray< T, width > &  false_value 
)
inline

Variant of above function for VectorizedArray that simply forwards to the dealii::compare_and_apply_mask() implementation. (Host only.)

Definition at line 216 of file simd.h.

◆ fixed_power()

template<int N, typename T >
DEAL_II_HOST_DEVICE_ALWAYS_INLINE T ryujin::fixed_power ( const T  x)

A wrapper around dealii::Utilities::fixed_power. We use a wrapper instead of calling the function directly so that we can easily change the implementation at one central place.

Definition at line 234 of file simd.h.

◆ pow() [1/3]

template<typename T >
DEAL_II_HOST_DEVICE T ryujin::pow ( const T  x,
const T  b 
)

Custom serial pow function.

Referenced by ryujin::ShallowWaterInitialStates::SlopingFriction< Description, dim, Number >::compute(), ryujin::EulerInitialStates::IsentropicVortex< Description, dim, Number >::compute(), ryujin::ShallowWaterInitialStates::FlowOverBump< Description, dim, Number >::compute(), ryujin::EulerAEOS::NASGRiemannSolverView< Number, options, MemorySpace >::df(), ryujin::EulerAEOS::NASGRiemannSolverView< Number, options, MemorySpace >::f(), ryujin::ShallowWater::HyperbolicSystem::fill_precomputed_values(), ryujin::Euler::HyperbolicSystemView< dim, Number, MemorySpace >::harten_entropy(), ryujin::Euler::HyperbolicSystemView< dim, Number, MemorySpace >::harten_entropy_derivative(), ryujin::Euler::LimiterView< dim, Number, MemorySpace >::limit(), ryujin::EulerAEOS::LimiterView< dim, Number, MemorySpace >::limit(), ryujin::Euler::HyperbolicSystemView< dim, Number, MemorySpace >::mathematical_entropy(), ryujin::Euler::HyperbolicSystemView< dim, Number, MemorySpace >::mathematical_entropy_derivative(), ryujin::EulerAEOS::NASGRiemannSolverView< Number, options, MemorySpace >::p_star_interpolated(), ryujin::EulerAEOS::NASGRiemannSolverView< Number, options, MemorySpace >::p_star_RS_full(), ryujin::EulerAEOS::NASGRiemannSolverView< Number, options, MemorySpace >::p_star_single_gamma(), ryujin::EulerAEOS::NASGRiemannSolverView< Number, options, MemorySpace >::p_star_SS_full(), ryujin::EulerAEOS::NASGRiemannSolverView< Number, options, MemorySpace >::p_star_two_rarefaction(), ryujin::pow(), ryujin::pow(), ryujin::Euler::HyperbolicSystemView< dim, Number, MemorySpace >::prescribe_riemann_characteristic(), ryujin::Euler::HyperbolicSystemView< dim, Number, MemorySpace >::prescribe_riemann_characteristic(), ryujin::EulerAEOS::NASGRiemannSolverView< Number, options, MemorySpace >::rarefaction_fan_pressure(), ryujin::EulerAEOS::NASGRiemannSolverView< Number, options, MemorySpace >::rho_star(), ryujin::Euler::HyperbolicSystemView< dim, Number, MemorySpace >::specific_entropy(), ryujin::EulerAEOS::HyperbolicSystemView< dim, Number, MemorySpace >::surrogate_harten_entropy(), ryujin::EulerAEOS::HyperbolicSystemView< dim, Number, MemorySpace >::surrogate_harten_entropy_derivative(), and ryujin::EulerAEOS::HyperbolicSystemView< dim, Number, MemorySpace >::surrogate_specific_entropy().

◆ pow() [2/3]

template<typename T , std::size_t width>
dealii::VectorizedArray< T, width > ryujin::pow ( const dealii::VectorizedArray< T, width >  x,
const T  b 
)

Custom implementation of a vectorized pow function.

Definition at line 220 of file simd.template.h.

◆ pow() [3/3]

template<typename T , std::size_t width>
dealii::VectorizedArray< T, width > ryujin::pow ( const dealii::VectorizedArray< T, width >  x,
const dealii::VectorizedArray< T, width >  b 
)

Custom implementation of a vectorized pow function with vectorized exponent.

Definition at line 230 of file simd.template.h.

◆ fast_pow() [1/3]

template<typename T >
DEAL_II_HOST_DEVICE T ryujin::fast_pow ( const T  x,
const T  b,
const Bias  bias = Bias::none 
)

Custom serial approximate pow function.

Referenced by ryujin::fast_pow(), and ryujin::fast_pow().

◆ fast_pow() [2/3]

template<typename T , std::size_t width>
dealii::VectorizedArray< T, width > ryujin::fast_pow ( const dealii::VectorizedArray< T, width >  x,
const T  b,
const Bias  bias = Bias::none 
)

Custom implementation of an approximate, vectorized pow function.

Definition at line 273 of file simd.template.h.

◆ fast_pow() [3/3]

template<typename T , std::size_t width>
dealii::VectorizedArray< T, width > ryujin::fast_pow ( const dealii::VectorizedArray< T, width >  x,
const dealii::VectorizedArray< T, width >  b,
const Bias  bias = Bias::none 
)

Custom implementation of an approximate, vectorized pow function with vectorized exponent.

Definition at line 283 of file simd.template.h.

◆ read_entry() [1/4]

template<typename T , typename V >
DEAL_II_ALWAYS_INLINE T ryujin::read_entry ( const V &  vector,
unsigned int  i 
)
inline

Return a VectorizedArray with { U[i] , U[i + 1] , ... , U[i + VectorizedArray::size() - 1] }

Definition at line 406 of file simd.h.

◆ read_entry() [2/4]

template<typename T , typename T2 >
DEAL_II_ALWAYS_INLINE T ryujin::read_entry ( const std::vector< T2 > &  vector,
unsigned int  i 
)
inline

Variant of above function specialized for std::vector.

Definition at line 430 of file simd.h.

◆ read_entry() [3/4]

template<typename T , typename V >
DEAL_II_ALWAYS_INLINE T ryujin::read_entry ( const V &  vector,
const unsigned int *  js 
)
inline

Return a VectorizedArray with { U[js[0] , U[js[1]] , ... , U[js[VectorizedArray::size() - 1]] }

Definition at line 468 of file simd.h.

◆ read_entry() [4/4]

template<typename T , typename T2 >
DEAL_II_ALWAYS_INLINE T ryujin::read_entry ( const std::vector< T2 > &  vector,
const unsigned int *  js 
)
inline

Variant of above function specialized for std::vector.

Definition at line 493 of file simd.h.

◆ write_entry() [1/2]

template<typename T , typename V >
DEAL_II_ALWAYS_INLINE void ryujin::write_entry ( V &  vector,
const T &  values,
unsigned int  i 
)
inline

Write out the given VectorizedArray to the vector

Definition at line 519 of file simd.h.

Referenced by ryujin::NavierStokes::VelocityMatrix< dim, Number, Number2 >::compute_diagonal().

◆ write_entry() [2/2]

template<typename T , typename T2 >
DEAL_II_ALWAYS_INLINE void ryujin::write_entry ( std::vector< T2 > &  vector,
const T &  values,
unsigned int  i 
)
inline

Variant of above function specialized for std::vector.

Definition at line 541 of file simd.h.

◆ serialize_tensor() [1/2]

template<int rank, int dim, std::size_t width, typename Number >
DEAL_II_ALWAYS_INLINE dealii::Tensor< rank, dim, Number > ryujin::serialize_tensor ( const dealii::Tensor< rank, dim, dealii::VectorizedArray< Number, width > > &  vectorized,
const unsigned int  k 
)
inline

Return the k-th serialized component of a Tensor of VectorizedArray

Definition at line 574 of file simd.h.

References ryujin::serialize_tensor().

Referenced by ryujin::serialize_tensor().

◆ serialize_tensor() [2/2]

template<int rank, int dim, typename Number >
DEAL_II_ALWAYS_INLINE dealii::Tensor< rank, dim, Number > ryujin::serialize_tensor ( const dealii::Tensor< rank, dim, Number > &  serial,
const unsigned int  k 
)
inline

Variant of above function for serial Tensors that simply returns the given tensor.

Definition at line 600 of file simd.h.

References ryujin::serial.

◆ assign_serial_tensor() [1/2]

template<int rank, int dim, std::size_t width, typename Number >
DEAL_II_ALWAYS_INLINE void ryujin::assign_serial_tensor ( dealii::Tensor< rank, dim, dealii::VectorizedArray< Number, width > > &  result,
const dealii::Tensor< rank, dim, Number > &  serial,
const unsigned int  k 
)
inline

Update the k-th serial component of a Tensor of VectorizedArray

Definition at line 616 of file simd.h.

References ryujin::assign_serial_tensor(), and ryujin::serial.

Referenced by ryujin::assign_serial_tensor().

◆ assign_serial_tensor() [2/2]

template<int rank, int dim, typename Number >
DEAL_II_ALWAYS_INLINE void ryujin::assign_serial_tensor ( dealii::Tensor< rank, dim, Number > &  result,
const dealii::Tensor< rank, dim, Number > &  serial,
const unsigned int  k 
)
inline

Variant of above function for serial Tensors that simply assigns the given tensor as is.

Definition at line 640 of file simd.h.

References ryujin::serial.