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