IPPL API Reference
Independent Parallel Particle Layer C++ API
Loading...
Searching...
No Matches
Vector.hpp
1//
2// Class Vector
3// Vector class used for vector fields and particle attributes like the coordinate.
4//
5// #include "Utility/PAssert.h"
6
7#include <iomanip>
8#include <iostream>
9
10namespace ippl {
11 namespace detail {
12 template <typename T, unsigned Dim>
13 struct isExpression<Vector<T, Dim>> : std::true_type {};
14 } // namespace detail
15
16 template <typename T, unsigned Dim>
17 template <typename... Args, typename std::enable_if<sizeof...(Args) == Dim, bool>::type>
18 KOKKOS_FUNCTION Vector<T, Dim>::Vector(const Args&... args)
19 : data_m{static_cast<T>(args)...} {}
20
21 template <typename T, unsigned Dim>
22 template <typename E, size_t N>
23 KOKKOS_FUNCTION Vector<T, Dim>::Vector(const detail::Expression<E, N>& expr) {
24 for (unsigned int i = 0; i < Dim; ++i) {
25 data_m[i] = expr[i];
26 }
27 }
28
29 template <typename T, unsigned Dim>
30 KOKKOS_FUNCTION Vector<T, Dim>::Vector(const T& val) {
31 for (unsigned int i = 0; i < Dim; ++i)
32 data_m[i] = val;
33 }
34
35 template <typename T, unsigned Dim>
36 KOKKOS_FUNCTION Vector<T, Dim>::Vector(const std::initializer_list<T>& list) {
37 unsigned int i = 0;
38 for (auto& l : list) {
39 data_m[i] = l;
40 ++i;
41 }
42 }
43
44 /*
45 *
46 * Element access operators
47 *
48 */
49 template <typename T, unsigned Dim>
50 KOKKOS_INLINE_FUNCTION typename Vector<T, Dim>::value_type& Vector<T, Dim>::operator[](
51 unsigned int i) {
52 // PAssert(i < Dim);
53 return data_m[i];
54 }
55
56 template <typename T, unsigned Dim>
57 KOKKOS_INLINE_FUNCTION typename Vector<T, Dim>::value_type Vector<T, Dim>::operator[](
58 unsigned int i) const {
59 // PAssert(i < Dim);
60 return data_m[i];
61 }
62
63 template <typename T, unsigned Dim>
64 KOKKOS_INLINE_FUNCTION typename Vector<T, Dim>::value_type& Vector<T, Dim>::operator()(
65 unsigned int i) {
66 // PAssert(i < Dim);
67 return data_m[i];
68 }
69
70 template <typename T, unsigned Dim>
71 KOKKOS_INLINE_FUNCTION typename Vector<T, Dim>::value_type Vector<T, Dim>::operator()(
72 unsigned int i) const {
73 // PAssert(i < Dim);
74 return data_m[i];
75 }
76
77 /*
78 *
79 * Vector Expression assignment operators
80 *
81 */
82 template <typename T, unsigned Dim>
83 template <typename E, size_t N>
84 KOKKOS_INLINE_FUNCTION Vector<T, Dim>& Vector<T, Dim>::operator=(
85 const detail::Expression<E, N>& expr) {
86 for (unsigned int i = 0; i < Dim; ++i) {
87 data_m[i] = expr[i];
88 }
89 return *this;
90 }
91
92 template <typename T, unsigned Dim>
93 template <typename E, size_t N>
94 KOKKOS_INLINE_FUNCTION Vector<T, Dim>& Vector<T, Dim>::operator+=(
95 const detail::Expression<E, N>& expr) {
96 for (unsigned int i = 0; i < Dim; ++i) {
97 data_m[i] += expr[i];
98 }
99 return *this;
100 }
101
102 template <typename T, unsigned Dim>
103 template <typename E, size_t N>
104 KOKKOS_INLINE_FUNCTION Vector<T, Dim>& Vector<T, Dim>::operator-=(
105 const detail::Expression<E, N>& expr) {
106 for (unsigned int i = 0; i < Dim; ++i) {
107 data_m[i] -= expr[i];
108 }
109 return *this;
110 }
111
112 template <typename T, unsigned Dim>
113 template <typename E, size_t N>
114 KOKKOS_INLINE_FUNCTION Vector<T, Dim>& Vector<T, Dim>::operator*=(
115 const detail::Expression<E, N>& expr) {
116 for (unsigned int i = 0; i < Dim; ++i) {
117 data_m[i] *= expr[i];
118 }
119 return *this;
120 }
121
122 template <typename T, unsigned Dim>
123 template <typename E, size_t N>
124 KOKKOS_INLINE_FUNCTION Vector<T, Dim>& Vector<T, Dim>::operator/=(
125 const detail::Expression<E, N>& expr) {
126 for (unsigned int i = 0; i < Dim; ++i) {
127 data_m[i] /= expr[i];
128 }
129 return *this;
130 }
131
132 template <typename T, unsigned Dim>
133 KOKKOS_INLINE_FUNCTION Vector<T, Dim>& Vector<T, Dim>::operator+=(const T& val) {
134 for (unsigned int i = 0; i < Dim; ++i) {
135 data_m[i] += val;
136 }
137 return *this;
138 }
139
140 template <typename T, unsigned Dim>
141 KOKKOS_INLINE_FUNCTION Vector<T, Dim>& Vector<T, Dim>::operator-=(const T& val) {
142 return this->operator+=(-val);
143 }
144
145 template <typename T, unsigned Dim>
146 KOKKOS_INLINE_FUNCTION Vector<T, Dim>& Vector<T, Dim>::operator*=(const T& val) {
147 for (unsigned int i = 0; i < Dim; ++i) {
148 data_m[i] *= val;
149 }
150 return *this;
151 }
152
153 template <typename T, unsigned Dim>
154 KOKKOS_INLINE_FUNCTION Vector<T, Dim>& Vector<T, Dim>::operator/=(const T& val) {
155 return this->operator*=(T(1.0) / val);
156 }
157
158 template <typename T, unsigned Dim>
159 KOKKOS_INLINE_FUNCTION constexpr typename Vector<T, Dim>::iterator Vector<T, Dim>::begin() {
160 return data_m;
161 }
162
163 template <typename T, unsigned Dim>
164 KOKKOS_INLINE_FUNCTION constexpr typename Vector<T, Dim>::iterator Vector<T, Dim>::end() {
165 return data_m + Dim;
166 }
167
168 template <typename T, unsigned Dim>
169 KOKKOS_INLINE_FUNCTION constexpr typename Vector<T, Dim>::const_iterator Vector<T, Dim>::begin()
170 const {
171 return data_m;
172 }
173
174 template <typename T, unsigned Dim>
175 KOKKOS_INLINE_FUNCTION constexpr typename Vector<T, Dim>::const_iterator Vector<T, Dim>::end()
176 const {
177 return data_m + Dim;
178 }
179
180 template <typename T, unsigned Dim>
181 KOKKOS_INLINE_FUNCTION T Vector<T, Dim>::dot(const Vector<T, Dim>& rhs) const {
182 T res = 0.0;
183 for (unsigned i = 0; i < Dim; ++i) {
184 res += data_m[i] * rhs[i];
185 }
186 return res;
187 }
188
189 template <typename T, unsigned Dim>
190 KOKKOS_INLINE_FUNCTION T Vector<T, Dim>::Pnorm(const int p) const {
191
192 T val = 0.0;
193 for(unsigned i = 0; i < Dim; ++i) {
194 val += Kokkos::pow(Kokkos::abs(data_m[i]), p);
195 }
196
197 return Kokkos::pow(val, T(1.0) / T(p));
198 }
199
200 template <typename T, unsigned Dim>
201 inline std::ostream& operator<<(std::ostream& out, const Vector<T, Dim>& v) {
202 std::streamsize sw = out.width();
203 out << std::setw(1);
204 if constexpr (Dim > 1) {
205 out << "( ";
206 for (unsigned int i = 0; i < Dim - 1; i++) {
207 out << std::setw(sw) << v[i] << " , ";
208 }
209 out << std::setw(sw) << v[Dim - 1] << " )";
210 } else {
211 out << "( " << std::setw(sw) << v[0] << " )";
212 }
213 return out;
214 }
215 template <typename T, unsigned Dim>
216 KOKKOS_INLINE_FUNCTION Vector<T, Dim> min(const Vector<T, Dim>& a, const Vector<T, Dim>& b) {
217 using Kokkos::min;
218 Vector<T, Dim> ret;
219 for (unsigned d = 0; d < Dim; d++) {
220 ret[d] = min(a[d], b[d]);
221 }
222 return ret;
223 }
224 template <typename T, unsigned Dim>
225 KOKKOS_INLINE_FUNCTION Vector<T, Dim> max(const Vector<T, Dim>& a, const Vector<T, Dim>& b) {
226 using Kokkos::max;
227 Vector<T, Dim> ret;
228 for (unsigned d = 0; d < Dim; d++) {
229 ret[d] = max(a[d], b[d]);
230 }
231 return ret;
232 }
233} // namespace ippl
234
235// vi: set et ts=4 sw=4 sts=4:
236// Local Variables:
237// mode:c
238// c-basic-offset: 4
239// indent-tabs-mode: nil
240// require-final-newline: nil
241// End:
Definition Vector.h:23
Definition Archive.h:20
Definition IpplExpressions.h:92