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