Loading...
Searching...
No Matches
vec.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "../terra/kokkos/kokkos_wrapper.hpp"
4
5namespace terra::dense {
6
7template < typename T, int N >
8struct Vec
9{
10 T data[N] = {};
11
12 KOKKOS_INLINE_FUNCTION
13 constexpr T& operator()( int i ) { return data[i]; }
14
15 KOKKOS_INLINE_FUNCTION
16 constexpr const T& operator()( int i ) const { return data[i]; }
17
18 template < int SliceSize >
19 KOKKOS_INLINE_FUNCTION constexpr Vec< T, SliceSize > slice( const int start )
20 {
22 for ( int i = 0; i < SliceSize; ++i )
23 {
24 result( i ) = data[i + start];
25 }
26 return result;
27 }
28
29 KOKKOS_INLINE_FUNCTION
30 void fill( const T value )
31 {
32 for ( int i = 0; i < N; ++i )
33 {
34 data[i] = value;
35 }
36 }
37
38 KOKKOS_INLINE_FUNCTION
39 T dot( const Vec& other ) const
40 {
41 T sum = 0;
42 for ( int i = 0; i < N; ++i )
43 sum += data[i] * other( i );
44 return sum;
45 }
46
47 KOKKOS_INLINE_FUNCTION
48 constexpr Vec cross( const Vec& other ) const
49 {
50 static_assert( N == 3 );
51 return {
52 data[1] * other( 2 ) - data[2] * other( 1 ),
53 data[2] * other( 0 ) - data[0] * other( 2 ),
54 data[0] * other( 1 ) - data[1] * other( 0 ) };
55 }
56
57 KOKKOS_INLINE_FUNCTION
58 constexpr Vec operator+( const Vec& rhs ) const
59 {
60 Vec out;
61 for ( int i = 0; i < N; ++i )
62 out( i ) = data[i] + rhs( i );
63 return out;
64 }
65
66 KOKKOS_INLINE_FUNCTION
67 constexpr Vec operator-( const Vec& rhs ) const
68 {
69 Vec out;
70 for ( int i = 0; i < N; ++i )
71 out( i ) = data[i] - rhs( i );
72 return out;
73 }
74
75 KOKKOS_INLINE_FUNCTION
76 T norm() const
77 {
78 T sum = 0;
79 for ( int i = 0; i < N; ++i )
80 {
81 sum += data[i] * data[i];
82 }
83 return Kokkos::sqrt( sum );
84 }
85
86 /// @brief Normalize the vector to unit length in-place.
87 KOKKOS_INLINE_FUNCTION
88 void normalize()
89 {
90 T mag = norm();
91 if ( mag > 1e-15 )
92 { // Avoid division by zero
93 for ( int i = 0; i < N; ++i )
94 {
95 data[i] /= mag;
96 }
97 }
98 }
99
100 /// @brief Return a normalized copy of the vector.
101 KOKKOS_INLINE_FUNCTION
103 {
104 Vec res = *this; // Make a copy
105 res.normalize();
106 return res;
107 }
108
109 KOKKOS_INLINE_FUNCTION
111 {
112 Vec res;
113 for ( int i = 0; i < N; ++i )
114 res( i ) = 1.0 / data[i];
115 return res;
116 }
117};
118
119template < typename T, int N >
120KOKKOS_INLINE_FUNCTION constexpr Vec< T, N > operator*( const Vec< T, N >& v, const T scalar ) noexcept
121{
122 Vec< T, N > result{};
123 for ( int i = 0; i < N; ++i )
124 result( i ) = v( i ) * scalar;
125 return result;
126}
127
128template < typename T, int N >
129KOKKOS_INLINE_FUNCTION constexpr Vec< T, N > operator*( const T scalar, const Vec< T, N >& v ) noexcept
130{
131 Vec< T, N > result{};
132 for ( int i = 0; i < N; ++i )
133 result( i ) = v( i ) * scalar;
134 return result;
135}
136
137template < typename T, int N >
138std::ostream& operator<<( std::ostream& os, const Vec< T, N >& v )
139{
140 for ( int i = 0; i < N; ++i )
141 {
142 os << v( i ) << '\n';
143 }
144 return os;
145}
146
147} // namespace terra::dense
Definition mat.hpp:6
std::ostream & operator<<(std::ostream &os, const Mat< T, Rows, Cols > &A)
Definition mat.hpp:392
constexpr Vec< T, N > operator*(const Vec< T, N > &v, const T scalar) noexcept
Definition vec.hpp:120
Definition vec.hpp:9
constexpr Vec operator-(const Vec &rhs) const
Definition vec.hpp:67
Vec normalized() const
Return a normalized copy of the vector.
Definition vec.hpp:102
constexpr const T & operator()(int i) const
Definition vec.hpp:16
constexpr Vec< T, SliceSize > slice(const int start)
Definition vec.hpp:19
constexpr T & operator()(int i)
Definition vec.hpp:13
constexpr Vec cross(const Vec &other) const
Definition vec.hpp:48
T dot(const Vec &other) const
Definition vec.hpp:39
T norm() const
Definition vec.hpp:76
Vec inverted_elementwise() const
Definition vec.hpp:110
void normalize()
Normalize the vector to unit length in-place.
Definition vec.hpp:88
void fill(const T value)
Definition vec.hpp:30
T data[N]
Definition vec.hpp:10
constexpr Vec operator+(const Vec &rhs) const
Definition vec.hpp:58