19 t.temporalOperation(std::declval<Field<scalar>&>(), std::declval<scalar>())
20 } -> std::same_as<void>;
26 t.explicitOperation(std::declval<Field<scalar>&>())
27 } -> std::same_as<void>;
54 Operator(T cls) : model_(std::make_unique<OperatorModel<T>>(std::move(cls)))
84 struct OperatorConcept
86 virtual ~OperatorConcept() =
default;
93 virtual void build(
const Input& input) = 0;
96 virtual std::string getName()
const = 0;
102 virtual Coeff& getCoefficient() = 0;
105 virtual Coeff getCoefficient()
const = 0;
108 virtual const Executor& exec()
const = 0;
111 virtual std::unique_ptr<OperatorConcept> clone()
const = 0;
115 template<
typename ConcreteOperatorType>
116 struct OperatorModel : OperatorConcept
119 OperatorModel(ConcreteOperatorType concreteOp) : concreteOp_(std::move(concreteOp)) {}
122 std::string getName()
const override {
return concreteOp_.getName(); }
124 virtual void explicitOperation(Field<scalar>& source)
override
126 if constexpr (HasExplicitOperator<ConcreteOperatorType>)
128 concreteOp_.explicitOperation(source);
132 virtual void temporalOperation(Field<scalar>& field)
override
134 if constexpr (HasTemporalOperator<ConcreteOperatorType>)
136 concreteOp_.temporalOperation(field);
141 virtual void build(
const Input& input)
override { concreteOp_.build(input); }
144 Operator::Type getType()
const override {
return concreteOp_.getType(); }
147 const Executor& exec()
const override {
return concreteOp_.exec(); }
150 virtual Coeff& getCoefficient()
override {
return concreteOp_.getCoefficient(); }
153 virtual Coeff getCoefficient()
const override {
return concreteOp_.getCoefficient(); }
156 std::unique_ptr<OperatorConcept> clone()
const override
158 return std::make_unique<OperatorModel>(*
this);
161 ConcreteOperatorType concreteOp_;
164 std::unique_ptr<OperatorConcept> model_;
174template<
typename CoeffFunction>
175 requires std::invocable<CoeffFunction&, size_t>
195template<
typename FieldType>
A class to contain the data and executors for a field and define some basic operations.
A class that represents a coefficient for the NeoFOAM dsl.
const Coeff & getCoefficient() const
const FieldType & getField() const
virtual const Executor & exec() const final
OperatorMixin(const Executor exec, FieldType &field, Operator::Type type)
virtual ~OperatorMixin()=default
void build(const Input &input)
const Executor exec_
Executor associated with the field. (CPU, GPU, openMP, etc.)
Operator::Type getType() const
Operator(const Operator &eqnOperator)
void build(const Input &input)
Operator::Type getType() const
Operator(Operator &&eqnOperator)
Coeff getCoefficient() const
void temporalOperation(Field< scalar > &field)
const Executor & exec() const
void explicitOperation(Field< scalar > &source)
#define NF_ERROR_EXIT(message)
Macro for printing an error message and aborting the program.
Coeff operator*(const Coeff &lhs, const Coeff &rhs)
std::variant< Dictionary, TokenList > Input
std::variant< SerialExecutor, CPUExecutor, GPUExecutor > Executor