7#include <Kokkos_Core.hpp>
17template<
typename ValueType>
28template<
typename T,
typename Inner>
29void map(
Vector<T>& a,
const Inner inner, std::pair<localIdx, localIdx> range = {0, 0})
31 auto [start, end] = range;
36 auto viewA = a.
view();
38 a.
exec(), {start, end}, KOKKOS_LAMBDA(
const localIdx i) { viewA[i] = inner(i); }
49template<
typename ValueType>
52 const std::type_identity_t<ValueType> value,
53 std::pair<localIdx, localIdx> range = {0, 0}
56 auto [start, end] = range;
61 auto viewA = a.
view();
63 a.
exec(), {start, end}, KOKKOS_LAMBDA(
const localIdx i) { viewA[i] = value; }
75template<
typename ValueType>
78 const View<
const std::type_identity_t<ValueType>> b,
79 std::pair<localIdx, localIdx> range = {0, 0}
82 auto [start, end] = range;
87 auto viewA = a.
view();
89 a.
exec(), {start, end}, KOKKOS_LAMBDA(
const localIdx i) { viewA[i] = b[i]; }
93template<
typename ValueType>
96 auto viewA = a.
view();
98 a, KOKKOS_LAMBDA(
const localIdx i) {
return viewA[i] * value; }
104template<
typename ValueType,
typename BinaryOp>
110 auto viewA = a.
view();
111 auto viewB = b.view();
113 a, KOKKOS_LAMBDA(
const localIdx i) {
return op(viewA[i], viewB[i]); }
118template<
typename ValueType>
122 a, b, KOKKOS_LAMBDA(ValueType va, ValueType vb) {
return va + vb; }
127template<
typename ValueType>
131 a, b, KOKKOS_LAMBDA(ValueType va, ValueType vb) {
return va - vb; }
135template<
typename ValueType>
139 a, b, KOKKOS_LAMBDA(ValueType va, ValueType vb) {
return va * vb; }
143template<
typename... Args>
146 return std::make_tuple(fields.view()...);
149template<
typename... Args>
152 return std::make_tuple(fields.copyToHost()...);
159 auto hostView = hostVector.view();
160 for (
localIdx i = 0; i < hostView.size(); i++)
162 if (hostView[i] != value)
173 auto [hostVector, hostVector2] =
copyToHosts(field, field2);
174 auto [hostSpan, hostSpan2] =
spans(hostVector, hostVector2);
176 if (hostSpan.size() != hostSpan2.size())
181 for (
localIdx i = 0; i < hostSpan.size(); i++)
183 if (hostSpan[i] != hostSpan2[i])
197 if (hostView.size() != span2.
size())
202 for (
localIdx i = 0; i < hostView.size(); i++)
204 if (hostView[i] != span2[i])
A class to contain the data and executors for a field and define some basic operations.
localIdx size() const
Gets the size of the field.
const Executor & exec() const
Gets the executor associated with the field.
View< ValueType > view() &&=delete
Vector< ValueType > copyToHost() const
Returns a copy of the field back to the host.
#define NeoN_ASSERT_EQUAL_LENGTH(_op1, _op2)
void fieldBinaryOp(Vector< ValueType > &a, const Vector< std::type_identity_t< ValueType > > &b, BinaryOp op)
bool equal(Vector< T > &field, T value)
void map(Vector< T > &a, const Inner inner, std::pair< localIdx, localIdx > range={0, 0})
Map a field using a specific executor.
void parallelFor(const Executor &exec, std::pair< localIdx, localIdx > range, Kernel kernel, std::string name="parallelFor")
void mul(Vector< ValueType > &a, const Vector< std::type_identity_t< ValueType > > &b)
void add(Vector< ValueType > &a, const Vector< std::type_identity_t< ValueType > > &b)
void fill(Vector< ValueType > &a, const std::type_identity_t< ValueType > value, std::pair< localIdx, localIdx > range={0, 0})
Fill the field with a scalar value using a specific executor.
void setVector(Vector< ValueType > &a, const View< const std::type_identity_t< ValueType > > b, std::pair< localIdx, localIdx > range={0, 0})
Set the field with a view of values using a specific executor.
auto copyToHosts(Args &... fields)
auto spans(Args &... fields)
void sub(Vector< ValueType > &a, const Vector< std::type_identity_t< ValueType > > &b)
void scalarMul(Vector< ValueType > &a, const scalar value)