NeoFOAM
WIP Prototype of a modern OpenFOAM core
Loading...
Searching...
No Matches
expression.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: MIT
2// SPDX-FileCopyrightText: 2023-2024 NeoFOAM authors
3#pragma once
4
5#include <memory>
6#include <vector>
7#include <utility>
8
13
14namespace NeoFOAM::dsl
15{
16
17
19{
20public:
21
23 : exec_(exec), temporalOperators_(), implicitOperators_(), explicitOperators_()
24 {}
25
27 : exec_(exp.exec_), temporalOperators_(exp.temporalOperators_),
28 implicitOperators_(exp.implicitOperators_), explicitOperators_(exp.explicitOperators_)
29 {}
30
31 void build(const NeoFOAM::Dictionary& input)
32 {
33 for (auto& op : temporalOperators_)
34 {
35 op.build(input);
36 }
37 for (auto& op : implicitOperators_)
38 {
39 op.build(input);
40 }
41 for (auto& op : explicitOperators_)
42 {
43 op.build(input);
44 }
45 }
46
47 /* @brief perform all explicit operation and accumulate the result */
49 {
50 Field<scalar> source(exec_, nCells, 0.0);
51 return explicitOperation(source);
52 }
53
54 /* @brief perform all explicit operation and accumulate the result */
56 {
57 for (auto& oper : explicitOperators_)
58 {
59 oper.explicitOperation(source);
60 }
61 return source;
62 }
63
64 void addOperator(const Operator& oper)
65 {
66 switch (oper.getType())
67 {
69 temporalOperators_.push_back(oper);
70 break;
72 implicitOperators_.push_back(oper);
73 break;
75 explicitOperators_.push_back(oper);
76 break;
77 }
78 }
79
80 void addExpression(const Expression& equation)
81 {
82 for (auto& oper : equation.temporalOperators_)
83 {
84 temporalOperators_.push_back(oper);
85 }
86 for (auto& oper : equation.implicitOperators_)
87 {
88 implicitOperators_.push_back(oper);
89 }
90 for (auto& oper : equation.explicitOperators_)
91 {
92 explicitOperators_.push_back(oper);
93 }
94 }
95
96
97 /* @brief getter for the total number of terms in the equation */
98 size_t size() const
99 {
100 return temporalOperators_.size() + implicitOperators_.size() + explicitOperators_.size();
101 }
102
103 // getters
104 const std::vector<Operator>& temporalOperators() const { return temporalOperators_; }
105
106 const std::vector<Operator>& implicitOperators() const { return implicitOperators_; }
107
108 const std::vector<Operator>& explicitOperators() const { return explicitOperators_; }
109
110 std::vector<Operator>& temporalOperators() { return temporalOperators_; }
111
112 std::vector<Operator>& implicitOperators() { return implicitOperators_; }
113
114 std::vector<Operator>& explicitOperators() { return explicitOperators_; }
115
116 const Executor& exec() const { return exec_; }
117
118private:
119
120 const Executor exec_;
121
122 std::vector<Operator> temporalOperators_;
123
124 std::vector<Operator> implicitOperators_;
125
126 std::vector<Operator> explicitOperators_;
127};
128
129[[nodiscard]] inline Expression operator+(Expression lhs, const Expression& rhs)
130{
131 lhs.addExpression(rhs);
132 return lhs;
133}
134
135[[nodiscard]] inline Expression operator+(Expression lhs, const Operator& rhs)
136{
137 lhs.addOperator(rhs);
138 return lhs;
139}
140
141[[nodiscard]] inline Expression operator+(const Operator& lhs, const Operator& rhs)
142{
143 Expression expr(lhs.exec());
144 expr.addOperator(lhs);
145 expr.addOperator(rhs);
146 return expr;
147}
148
149[[nodiscard]] inline Expression operator*(scalar scale, const Expression& es)
150{
151 Expression expr(es.exec());
152 for (const auto& oper : es.temporalOperators())
153 {
154 expr.addOperator(scale * oper);
155 }
156 for (const auto& oper : es.implicitOperators())
157 {
158 expr.addOperator(scale * oper);
159 }
160 for (const auto& oper : es.explicitOperators())
161 {
162 expr.addOperator(scale * oper);
163 }
164 return expr;
165}
166
167[[nodiscard]] inline Expression operator-(Expression lhs, const Expression& rhs)
168{
169 lhs.addExpression(-1.0 * rhs);
170 return lhs;
171}
172
173[[nodiscard]] inline Expression operator-(Expression lhs, const Operator& rhs)
174{
175 lhs.addOperator(-1.0 * rhs);
176 return lhs;
177}
178
179[[nodiscard]] inline Expression operator-(const Operator& lhs, const Operator& rhs)
180{
181 Expression expr(lhs.exec());
182 expr.addOperator(lhs);
183 expr.addOperator(Coeff(-1) * rhs);
184 return expr;
185}
186
187
188} // namespace NeoFOAM::dsl
A class representing a dictionary that stores key-value pairs.
A class to contain the data and executors for a field and define some basic operations.
Definition field.hpp:49
A class that represents a coefficient for the NeoFOAM dsl.
Definition coeff.hpp:22
void addOperator(const Operator &oper)
const std::vector< Operator > & temporalOperators() const
const std::vector< Operator > & implicitOperators() const
Field< scalar > explicitOperation(size_t nCells)
std::vector< Operator > & implicitOperators()
const Executor & exec() const
std::vector< Operator > & explicitOperators()
Expression(const Expression &exp)
const std::vector< Operator > & explicitOperators() const
Field< scalar > explicitOperation(Field< scalar > &source)
std::vector< Operator > & temporalOperators()
void build(const NeoFOAM::Dictionary &input)
Expression(const Executor &exec)
void addExpression(const Expression &equation)
Operator::Type getType() const
const Executor & exec() const
Expression operator+(Expression lhs, const Expression &rhs)
Expression operator-(Expression lhs, const Expression &rhs)
Coeff operator*(const Coeff &lhs, const Coeff &rhs)
Definition coeff.hpp:57
float scalar
Definition scalar.hpp:11
std::variant< SerialExecutor, CPUExecutor, GPUExecutor > Executor
Definition executor.hpp:16