Mundy: Multibody Nonlocal Dynamics Version of the Day
Loading...
Searching...
No Matches
mundy::AVector< T, N, Accessor > Class Template Reference

Class for an Nx1 vector with arithmetic entries. More...

#include <Vector.hpp>

Inheritance diagram for mundy::AVector< T, N, Accessor >:
[legend]

Public Member Functions

Constructors and destructor
constexpr AVector ()=default
 Default constructor. Assume elements are uninitialized.
constexpr AVector (const Accessor &data)
 Constructor from a given accessor.
constexpr AVector (Accessor &&data)
 Constructor from a given accessor.
constexpr AVector (const T &value)
 Constructor to initialize all elements to a single value. Requires the number of arguments to be N and the type of each to be T. Only enabled if the Accessor has a N-argument constructor.
template<typename... Args>
constexpr AVector (Args &&... args)
 Constructor to initialize all elements explicitly. Requires the number of arguments to be N and the type of each to be T. Only enabled if the Accessor has a N-argument constructor.
constexpr AVector (const std::initializer_list< T > &list)
 Constructor to initialize all elements via initializer list.
constexpr ~AVector ()=default
 Destructor.
constexpr AVector (const AVector< T, N, Accessor > &)=default
 Default copy constructor (deep copies the accessor, not necessarily the data).
constexpr AVector (AVector< T, N, Accessor > &&)=default
 Default move constructor (deep moves the accessor, not necessarily the data).
constexpr AVector< T, N, Accessor > & operator= (const AVector< T, N, Accessor > &other)
 Default copy assignment operator (deep copies the data).
constexpr AVector< T, N, Accessor > & operator= (AVector< T, N, Accessor > &&other)
 Default move assignment operator (deep copies the data).
template<ValidVectorType OtherVectorType>
constexpr AVector (const OtherVectorType &other)
 Deep copy constructor with different accessor or ownership.
template<ValidVectorType OtherVectorType>
constexpr AVector (OtherVectorType &&other)
 Deep move constructor with different accessor or ownership.
template<ValidVectorType OtherVectorType>
constexpr AVector< T, N, Accessor > & operator= (const OtherVectorType &other)
 Deep copy assignment operator with different accessor or ownership.
template<ValidVectorType OtherVectorType>
constexpr AVector< T, N, Accessor > & operator= (OtherVectorType &&other)
 Deep move assignment operator with different accessor or ownership.
constexpr AVector< T, N, Accessor > & operator= (const T value)
 Deep copy assignment operator from a single value.
constexpr operator T ()
 Allow for automatic conversion of a length 1 vector to a scalar.
Accessors
constexpr T & operator[] (size_t index)
 Element access operator via a single index.
constexpr const T & operator[] (size_t index) const
constexpr T & operator() (size_t index)
 Element access operator via a single index.
constexpr const T & operator() (size_t index) const
constexpr decltype(auto) data ()
 Get the internal data accessor.
constexpr decltype(auto) data () const
constexpr deep_copy_t copy () const
 Get a deep copy of the vector.
template<typename U>
constexpr auto cast () const
 Cast (and copy) the vector to a different type.
Setters and modifiers
template<typename... Args>
constexpr void set (Args &&... args)
 Set all elements of the vector.
template<ValidAccessor< T > OtherAccessor>
constexpr void set (const OtherAccessor &accessor)
 Set all elements of the vector using an accessor.
constexpr void fill (const T &value)
 Set all elements of the vector to a single value.
Unary operators
constexpr AVector< T, Noperator+ () const
 Unary plus operator.
constexpr AVector< T, Noperator- () const
 Unary minus operator.
Addition and subtraction
template<typename U, ValidAccessor< U > OtherAccessor>
constexpr auto operator+ (const AVector< U, N, OtherAccessor > &other) const
 AVector-vector addition.
template<typename U, ValidAccessor< U > OtherAccessor>
constexpr AVector< T, N, Accessor > & operator+= (const AVector< U, N, OtherAccessor > &other)
 AVector-vector addition.
template<typename U, ValidAccessor< U > OtherAccessor>
constexpr auto operator- (const AVector< U, N, OtherAccessor > &other) const
 AVector-vector subtraction.
template<typename U, ValidAccessor< U > OtherAccessor>
constexpr AVector< T, N, Accessor > & operator-= (const AVector< U, N, OtherAccessor > &other)
 Self-vector subtraction.
template<typename U>
constexpr auto operator+ (const U &scalar) const
 AVector-scalar addition.
template<typename U>
constexpr AVector< T, N, Accessor > & operator+= (const U &scalar)
 Self-scalar addition.
template<typename U>
constexpr auto operator- (const U &scalar) const
 AVector-scalar subtraction.
template<typename U>
constexpr AVector< T, N, Accessor > & operator-= (const U &scalar)
 AVector-scalar subtraction.
Multiplication and division
template<typename U>
constexpr auto operator* (const U &scalar) const
 AVector-scalar multiplication.
template<typename U>
constexpr AVector< T, N, Accessor > & operator*= (const U &scalar)
 Self-scalar multiplication.
template<typename U>
constexpr auto operator/ (const U &scalar) const
 AVector-scalar division. (Type promotes the result to a double if both vector and scalar are integral.).
template<typename U>
constexpr AVector< T, N, Accessor > & operator/= (const U &scalar)
 Self-scalar division (Does not type-promote the result!!).

Static Public Member Functions

Static methods
static constexpr AVector< T, Nones ()
 Get a vector of ones.
static constexpr AVector< T, Nzeros ()
 Get the zero vector.

Public Attributes

Internal data
storage< Accessor > accessor_
 Our data accessor.

Friends

Friends <3
template<typename U, size_t M, ValidAccessor< U > OtherAccessor>
class AVector
template<typename U, size_t M, ValidAccessor< U > OtherAccessor>
std::ostream & operator<< (std::ostream &os, const AVector< U, M, OtherAccessor > &vec)

Type aliases

using value_type = T
 The type of the entries.
using non_const_value_type = std::remove_const_t<T>
 The non-const type of the entries.
using deep_copy_t = AVector<T, N>
 Deep copy type.
using accessor_t = Accessor
 The type of the accessor.
static constexpr size_t size = N
 The size of the vector.

Detailed Description

template<typename T, size_t N, ValidAccessor< T > Accessor>
class mundy::AVector< T, N, Accessor >
Template Parameters
TThe type of the entries.
AccessorThe type of the accessor.

This class is designed to be used with Kokkos. It is a simple Nx1 vector with arithmetic entries. It is templated on the type of the entries and Accessor type. See Accessor.hpp for more details on the Accessor type requirements.

The goal of AVector is to be a lightweight class that can be used with Kokkos to perform mathematical operations on vectors in R3. It does not own the data, but rather it is templated on an Accessor type that provides access to the underlying data. This allows us to use AVector with Kokkos::Views, raw pointers, or any other type that meets the ValidAccessor requirements without copying the data. This is especially important for GPU-compatible code.

Vectors can be constructed by passing an accessor to the constructor. However, if the accessor has a N-argument constructor, then the AVector can also be constructed by passing the elements directly to the constructor. Similarly, if the accessor has an initializer list constructor, then the AVector can be constructed by passing an initializer list to the constructor. This is a convenience feature which makes working with the default accessor (Array<T, N>) easier. For example, the following are all valid ways to construct an AVector:

// Constructs an AVector with the default accessor (Array<int, N>)
AVector<int, 3> vec1({1, 2, 3});
AVector<int, 3> vec2(1, 2, 3);
AVector<int, 3> vec3(Array<int, 3>({1, 2, 3}));
vec4.set(1, 2, 3);
// Construct a AVector from a double array
double data[3] = {1.0, 2.0, 3.0};
// Do math with Vectors that have different accessors without copying the data
double mundy::dot(vec1, vec5);
Class for an Nx1 vector with arithmetic entries.
Definition Vector.hpp:112
constexpr decltype(auto) data()
Get the internal data accessor.
Definition Vector.hpp:301
friend class AVector
Definition Vector.hpp:503
constexpr void set(Args &&... args)
Set all elements of the vector.
Definition Vector.hpp:329
A simplistic array type with a fixed size and type.
Definition Array.hpp:44
constexpr auto dot(const AQuaternion< U, Accessor1 > &q1, const AQuaternion< T, Accessor2 > &q2)
Get the dot product of two quaternions.
Definition Quaternion.hpp:746
Note
Accessors may be owning or non-owning, that is irrelevant to the AVector class; however, these accessors should be lightweight such that they can be copied around without much overhead. Furthermore, the lifetime of the data underlying the accessor should be as long as the AVector that use it.

Member Typedef Documentation

◆ value_type

template<typename T, size_t N, ValidAccessor< T > Accessor>
using mundy::AVector< T, N, Accessor >::value_type = T

◆ non_const_value_type

template<typename T, size_t N, ValidAccessor< T > Accessor>
using mundy::AVector< T, N, Accessor >::non_const_value_type = std::remove_const_t<T>

◆ deep_copy_t

template<typename T, size_t N, ValidAccessor< T > Accessor>
using mundy::AVector< T, N, Accessor >::deep_copy_t = AVector<T, N>

◆ accessor_t

template<typename T, size_t N, ValidAccessor< T > Accessor>
using mundy::AVector< T, N, Accessor >::accessor_t = Accessor

Constructor & Destructor Documentation

◆ AVector() [1/10]

template<typename T, size_t N, ValidAccessor< T > Accessor>
mundy::AVector< T, N, Accessor >::AVector ( )
constexprdefault
Note
This constructor is only enabled if the Accessor has a default constructor.

◆ AVector() [2/10]

template<typename T, size_t N, ValidAccessor< T > Accessor>
mundy::AVector< T, N, Accessor >::AVector ( const Accessor & data)
inlineexplicitconstexpr
Parameters
[in]dataThe accessor.

◆ AVector() [3/10]

template<typename T, size_t N, ValidAccessor< T > Accessor>
mundy::AVector< T, N, Accessor >::AVector ( Accessor && data)
inlineexplicitconstexpr
Parameters
[in]dataThe accessor.

◆ AVector() [4/10]

template<typename T, size_t N, ValidAccessor< T > Accessor>
mundy::AVector< T, N, Accessor >::AVector ( const T & value)
inlineexplicitconstexpr

◆ AVector() [5/10]

template<typename T, size_t N, ValidAccessor< T > Accessor>
template<typename... Args>
mundy::AVector< T, N, Accessor >::AVector ( Args &&... args)
inlineexplicitconstexpr

◆ AVector() [6/10]

template<typename T, size_t N, ValidAccessor< T > Accessor>
mundy::AVector< T, N, Accessor >::AVector ( const std::initializer_list< T > & list)
inlineconstexpr
Parameters
[in]listThe initializer list.

◆ ~AVector()

template<typename T, size_t N, ValidAccessor< T > Accessor>
mundy::AVector< T, N, Accessor >::~AVector ( )
constexprdefault

◆ AVector() [7/10]

template<typename T, size_t N, ValidAccessor< T > Accessor>
mundy::AVector< T, N, Accessor >::AVector ( const AVector< T, N, Accessor > & )
constexprdefault

◆ AVector() [8/10]

template<typename T, size_t N, ValidAccessor< T > Accessor>
mundy::AVector< T, N, Accessor >::AVector ( AVector< T, N, Accessor > && )
constexprdefault

◆ AVector() [9/10]

template<typename T, size_t N, ValidAccessor< T > Accessor>
template<ValidVectorType OtherVectorType>
mundy::AVector< T, N, Accessor >::AVector ( const OtherVectorType & other)
inlineconstexpr

◆ AVector() [10/10]

template<typename T, size_t N, ValidAccessor< T > Accessor>
template<ValidVectorType OtherVectorType>
mundy::AVector< T, N, Accessor >::AVector ( OtherVectorType && other)
inlineconstexpr

Member Function Documentation

◆ operator=() [1/5]

template<typename T, size_t N, ValidAccessor< T > Accessor>
AVector< T, N, Accessor > & mundy::AVector< T, N, Accessor >::operator= ( const AVector< T, N, Accessor > & other)
inlineconstexpr

◆ operator=() [2/5]

template<typename T, size_t N, ValidAccessor< T > Accessor>
AVector< T, N, Accessor > & mundy::AVector< T, N, Accessor >::operator= ( AVector< T, N, Accessor > && other)
inlineconstexpr

◆ operator=() [3/5]

template<typename T, size_t N, ValidAccessor< T > Accessor>
template<ValidVectorType OtherVectorType>
AVector< T, N, Accessor > & mundy::AVector< T, N, Accessor >::operator= ( const OtherVectorType & other)
inlineconstexpr

Copies the data from the other vector to our data. This is only enabled if T is not const.

◆ operator=() [4/5]

template<typename T, size_t N, ValidAccessor< T > Accessor>
template<ValidVectorType OtherVectorType>
AVector< T, N, Accessor > & mundy::AVector< T, N, Accessor >::operator= ( OtherVectorType && other)
inlineconstexpr

Moves the data from the other vector to our data. This is only enabled if T is not const.

◆ operator=() [5/5]

template<typename T, size_t N, ValidAccessor< T > Accessor>
AVector< T, N, Accessor > & mundy::AVector< T, N, Accessor >::operator= ( const T value)
inlineconstexpr
Parameters
[in]valueThe value to set all elements to.

◆ operator T()

template<typename T, size_t N, ValidAccessor< T > Accessor>
mundy::AVector< T, N, Accessor >::operator T ( )
inlineconstexpr

◆ operator[]() [1/2]

template<typename T, size_t N, ValidAccessor< T > Accessor>
T & mundy::AVector< T, N, Accessor >::operator[] ( size_t index)
inlineconstexpr
Parameters
[in]indexThe index of the element.

◆ operator[]() [2/2]

template<typename T, size_t N, ValidAccessor< T > Accessor>
const T & mundy::AVector< T, N, Accessor >::operator[] ( size_t index) const
inlineconstexpr

◆ operator()() [1/2]

template<typename T, size_t N, ValidAccessor< T > Accessor>
T & mundy::AVector< T, N, Accessor >::operator() ( size_t index)
inlineconstexpr
Parameters
[in]indexThe index of the element.

◆ operator()() [2/2]

template<typename T, size_t N, ValidAccessor< T > Accessor>
const T & mundy::AVector< T, N, Accessor >::operator() ( size_t index) const
inlineconstexpr

◆ data() [1/2]

template<typename T, size_t N, ValidAccessor< T > Accessor>
decltype(auto) mundy::AVector< T, N, Accessor >::data ( )
inlineconstexpr

◆ data() [2/2]

template<typename T, size_t N, ValidAccessor< T > Accessor>
decltype(auto) mundy::AVector< T, N, Accessor >::data ( ) const
inlineconstexpr

◆ copy()

template<typename T, size_t N, ValidAccessor< T > Accessor>
deep_copy_t mundy::AVector< T, N, Accessor >::copy ( ) const
inlineconstexpr

◆ cast()

template<typename T, size_t N, ValidAccessor< T > Accessor>
template<typename U>
auto mundy::AVector< T, N, Accessor >::cast ( ) const
inlineconstexpr

◆ set() [1/2]

template<typename T, size_t N, ValidAccessor< T > Accessor>
template<typename... Args>
void mundy::AVector< T, N, Accessor >::set ( Args &&... args)
inlineconstexpr

◆ set() [2/2]

template<typename T, size_t N, ValidAccessor< T > Accessor>
template<ValidAccessor< T > OtherAccessor>
void mundy::AVector< T, N, Accessor >::set ( const OtherAccessor & accessor)
inlineconstexpr
Parameters
[in]accessorA valid accessor.
Note
An AVector is also a valid accessor.

◆ fill()

template<typename T, size_t N, ValidAccessor< T > Accessor>
void mundy::AVector< T, N, Accessor >::fill ( const T & value)
inlineconstexpr
Parameters
[in]valueThe value to set all elements to.

◆ operator+() [1/3]

template<typename T, size_t N, ValidAccessor< T > Accessor>
AVector< T, N > mundy::AVector< T, N, Accessor >::operator+ ( ) const
inlineconstexpr

◆ operator-() [1/3]

template<typename T, size_t N, ValidAccessor< T > Accessor>
AVector< T, N > mundy::AVector< T, N, Accessor >::operator- ( ) const
inlineconstexpr

◆ operator+() [2/3]

template<typename T, size_t N, ValidAccessor< T > Accessor>
template<typename U, ValidAccessor< U > OtherAccessor>
auto mundy::AVector< T, N, Accessor >::operator+ ( const AVector< U, N, OtherAccessor > & other) const
inlineconstexpr
Parameters
[in]otherThe other vector.

◆ operator+=() [1/2]

template<typename T, size_t N, ValidAccessor< T > Accessor>
template<typename U, ValidAccessor< U > OtherAccessor>
AVector< T, N, Accessor > & mundy::AVector< T, N, Accessor >::operator+= ( const AVector< U, N, OtherAccessor > & other)
inlineconstexpr
Parameters
[in]otherThe other vector.

◆ operator-() [2/3]

template<typename T, size_t N, ValidAccessor< T > Accessor>
template<typename U, ValidAccessor< U > OtherAccessor>
auto mundy::AVector< T, N, Accessor >::operator- ( const AVector< U, N, OtherAccessor > & other) const
inlineconstexpr
Parameters
[in]otherThe other vector.

◆ operator-=() [1/2]

template<typename T, size_t N, ValidAccessor< T > Accessor>
template<typename U, ValidAccessor< U > OtherAccessor>
AVector< T, N, Accessor > & mundy::AVector< T, N, Accessor >::operator-= ( const AVector< U, N, OtherAccessor > & other)
inlineconstexpr
Parameters
[in]otherThe other vector.

◆ operator+() [3/3]

template<typename T, size_t N, ValidAccessor< T > Accessor>
template<typename U>
auto mundy::AVector< T, N, Accessor >::operator+ ( const U & scalar) const
inlineconstexpr
Parameters
[in]scalarThe scalar.

◆ operator+=() [2/2]

template<typename T, size_t N, ValidAccessor< T > Accessor>
template<typename U>
AVector< T, N, Accessor > & mundy::AVector< T, N, Accessor >::operator+= ( const U & scalar)
inlineconstexpr
Parameters
[in]scalarThe scalar.

◆ operator-() [3/3]

template<typename T, size_t N, ValidAccessor< T > Accessor>
template<typename U>
auto mundy::AVector< T, N, Accessor >::operator- ( const U & scalar) const
inlineconstexpr
Parameters
[in]scalarThe scalar.

◆ operator-=() [2/2]

template<typename T, size_t N, ValidAccessor< T > Accessor>
template<typename U>
AVector< T, N, Accessor > & mundy::AVector< T, N, Accessor >::operator-= ( const U & scalar)
inlineconstexpr
Parameters
[in]scalarThe scalar.

◆ operator*()

template<typename T, size_t N, ValidAccessor< T > Accessor>
template<typename U>
auto mundy::AVector< T, N, Accessor >::operator* ( const U & scalar) const
inlineconstexpr
Parameters
[in]scalarThe scalar.

◆ operator*=()

template<typename T, size_t N, ValidAccessor< T > Accessor>
template<typename U>
AVector< T, N, Accessor > & mundy::AVector< T, N, Accessor >::operator*= ( const U & scalar)
inlineconstexpr
Parameters
[in]scalarThe scalar.

◆ operator/()

template<typename T, size_t N, ValidAccessor< T > Accessor>
template<typename U>
auto mundy::AVector< T, N, Accessor >::operator/ ( const U & scalar) const
inlineconstexpr
Parameters
[in]scalarThe scalar.

◆ operator/=()

template<typename T, size_t N, ValidAccessor< T > Accessor>
template<typename U>
AVector< T, N, Accessor > & mundy::AVector< T, N, Accessor >::operator/= ( const U & scalar)
inlineconstexpr
Note
Because there is no type promotion, this will perform integer division if the scalar is an integer.
Parameters
[in]scalarThe scalar.

◆ ones()

template<typename T, size_t N, ValidAccessor< T > Accessor>
constexpr AVector< T, N > mundy::AVector< T, N, Accessor >::ones ( )
inlinestaticconstexpr

◆ zeros()

template<typename T, size_t N, ValidAccessor< T > Accessor>
constexpr AVector< T, N > mundy::AVector< T, N, Accessor >::zeros ( )
inlinestaticconstexpr

◆ AVector

template<typename T, size_t N, ValidAccessor< T > Accessor>
template<typename U, size_t M, ValidAccessor< U > OtherAccessor>
friend class AVector
friend

◆ operator<<

template<typename T, size_t N, ValidAccessor< T > Accessor>
template<typename U, size_t M, ValidAccessor< U > OtherAccessor>
std::ostream & operator<< ( std::ostream & os,
const AVector< U, M, OtherAccessor > & vec )
friend

Member Data Documentation

◆ accessor_

template<typename T, size_t N, ValidAccessor< T > Accessor>
storage<Accessor> mundy::AVector< T, N, Accessor >::accessor_

◆ size

template<typename T, size_t N, ValidAccessor< T > Accessor>
size_t mundy::AVector< T, N, Accessor >::size = N
staticconstexpr