NeoN
WIP Prototype of a modern OpenFOAM core
Loading...
Searching...
No Matches
fieldFreeFunctions.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: MIT
2// SPDX-FileCopyrightText: 2023 NeoN authors
3#pragma once
4
5#include <tuple>
6
7#include <Kokkos_Core.hpp>
11#include "NeoN/core/view.hpp"
12
13namespace NeoN
14{
15
16// Forward declaration
17template<typename ValueType>
18class Vector;
19
20
28template<typename T, typename Inner>
29void map(Vector<T>& a, const Inner inner, std::pair<localIdx, localIdx> range = {0, 0})
30{
31 auto [start, end] = range;
32 if (end == 0)
33 {
34 end = a.size();
35 }
36 auto viewA = a.view();
38 a.exec(), {start, end}, KOKKOS_LAMBDA(const localIdx i) { viewA[i] = inner(i); }
39 );
40}
41
49template<typename ValueType>
50void fill(
52 const std::type_identity_t<ValueType> value,
53 std::pair<localIdx, localIdx> range = {0, 0}
54)
55{
56 auto [start, end] = range;
57 if (end == 0)
58 {
59 end = a.size();
60 }
61 auto viewA = a.view();
63 a.exec(), {start, end}, KOKKOS_LAMBDA(const localIdx i) { viewA[i] = value; }
64 );
65}
66
67
75template<typename ValueType>
78 const View<const std::type_identity_t<ValueType>> b,
79 std::pair<localIdx, localIdx> range = {0, 0}
80)
81{
82 auto [start, end] = range;
83 if (end == 0)
84 {
85 end = a.size();
86 }
87 auto viewA = a.view();
89 a.exec(), {start, end}, KOKKOS_LAMBDA(const localIdx i) { viewA[i] = b[i]; }
90 );
91}
92
93template<typename ValueType>
94void scalarMul(Vector<ValueType>& a, const scalar value)
95{
96 auto viewA = a.view();
98 a, KOKKOS_LAMBDA(const localIdx i) { return viewA[i] * value; }
99 );
100}
101
102namespace detail
103{
104template<typename ValueType, typename BinaryOp>
106 Vector<ValueType>& a, const Vector<std::type_identity_t<ValueType>>& b, BinaryOp op
107)
108{
110 auto viewA = a.view();
111 auto viewB = b.view();
113 a, KOKKOS_LAMBDA(const localIdx i) { return op(viewA[i], viewB[i]); }
114 );
115}
116}
117
118template<typename ValueType>
119void add(Vector<ValueType>& a, const Vector<std::type_identity_t<ValueType>>& b)
120{
122 a, b, KOKKOS_LAMBDA(ValueType va, ValueType vb) { return va + vb; }
123 );
124}
125
126
127template<typename ValueType>
128void sub(Vector<ValueType>& a, const Vector<std::type_identity_t<ValueType>>& b)
129{
131 a, b, KOKKOS_LAMBDA(ValueType va, ValueType vb) { return va - vb; }
132 );
133}
134
135template<typename ValueType>
136void mul(Vector<ValueType>& a, const Vector<std::type_identity_t<ValueType>>& b)
137{
139 a, b, KOKKOS_LAMBDA(ValueType va, ValueType vb) { return va * vb; }
140 );
141}
142
143template<typename... Args>
144auto spans(Args&... fields)
145{
146 return std::make_tuple(fields.view()...);
147}
148
149template<typename... Args>
150auto copyToHosts(Args&... fields)
151{
152 return std::make_tuple(fields.copyToHost()...);
153}
154
155template<typename T>
156bool equal(Vector<T>& field, T value)
157{
158 auto hostVector = field.copyToHost();
159 auto hostView = hostVector.view();
160 for (localIdx i = 0; i < hostView.size(); i++)
161 {
162 if (hostView[i] != value)
163 {
164 return false;
165 }
166 }
167 return true;
168};
169
170template<typename T>
171bool equal(const Vector<T>& field, const Vector<T>& field2)
172{
173 auto [hostVector, hostVector2] = copyToHosts(field, field2);
174 auto [hostSpan, hostSpan2] = spans(hostVector, hostVector2);
175
176 if (hostSpan.size() != hostSpan2.size())
177 {
178 return false;
179 }
180
181 for (localIdx i = 0; i < hostSpan.size(); i++)
182 {
183 if (hostSpan[i] != hostSpan2[i])
184 {
185 return false;
186 }
187 }
188
189 return true;
190};
191
192template<typename T>
193bool equal(const Vector<T>& field, View<T> span2)
194{
195 auto hostView = field.copyToHost().view();
196
197 if (hostView.size() != span2.size())
198 {
199 return false;
200 }
201
202 for (localIdx i = 0; i < hostView.size(); i++)
203 {
204 if (hostView[i] != span2[i])
205 {
206 return false;
207 }
208 }
209
210 return true;
211}
212
213} // namespace NeoN
A class to contain the data and executors for a field and define some basic operations.
Definition vector.hpp:53
localIdx size() const
Gets the size of the field.
Definition vector.hpp:364
const Executor & exec() const
Gets the executor associated with the field.
Definition vector.hpp:358
View< ValueType > view() &&=delete
Vector< ValueType > copyToHost() const
Returns a copy of the field back to the host.
Definition vector.hpp:192
localIdx size() const
Definition view.hpp:72
#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")
int32_t localIdx
Definition label.hpp:30
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.
float scalar
Definition scalar.hpp:14
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)