NeoN
A framework for CFD software
Loading...
Searching...
No Matches
gradOperator.hpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2023 - 2025 NeoN authors
2//
3// SPDX-License-Identifier: MIT
4
5#pragma once
6
10#include "NeoN/core/input.hpp"
14
16{
17
18/* @class Factory class to create gradient operators by a given name using
19 * using NeoNs runTimeFactory mechanism
20 */
21template<typename ValueType>
24 GradOperatorFactory<ValueType>,
25 Parameters<const Executor&, const UnstructuredMesh&>>
26{
27
28public:
29
30 static std::unique_ptr<GradOperatorFactory<ValueType>>
31 create(const Executor& exec, const UnstructuredMesh& uMesh, const Input& inputs)
32 {
33 std::string key = (std::holds_alternative<Dictionary>(inputs))
34 ? std::get<Dictionary>(inputs).get<std::string>("GradOperator")
35 : std::get<TokenList>(inputs).next<std::string>();
37 return GradOperatorFactory<ValueType>::table().at(key)(exec, uMesh);
38 }
39
40 static std::string name() { return "GradOperatorFactory"; }
41
43 : exec_(exec), mesh_(mesh), sparsityPattern_(la::SparsityPattern::readOrCreate(mesh)) {};
44
45 virtual ~GradOperatorFactory() = default; // Virtual destructor
46
47 /* @brief compute implicit gradient operator contribution
48 *
49 * @param [in] phi
50 * @param [in] operatorScaling
51 * @param [in,out] ls the linear system to assemble into
52 */
53 virtual void grad(
54 const VolumeField<scalar>& phi,
55 const dsl::Coeff operatorScaling,
57 ) const = 0;
58
59 /* @brief compute explicit gradient operator
60 *
61 * @param phi [in] - field for which the gradient is computed
62 * @param operatorScaling [in] - scales operator by a coefficient
63 * @param gradPhi [in,out] - resulting gradient field
64 */
65 virtual void grad(
66 const VolumeField<scalar>& phi, const dsl::Coeff operatorScaling, Vector<Vec3>& gradPhi
67 ) const = 0;
68
69 /* @brief compute explicit gradient operator and return result
70 *
71 * @param phi [in] - field for which the gradient is computed
72 * @param operatorScaling [in] - scales operator by a coefficient
73 * @return gradPhi - resulting gradient field
74 */
76 grad(const VolumeField<scalar>& phi, const dsl::Coeff operatorScaling) const = 0;
77
78 [[deprecated("This function will be removed")]] const la::SparsityPattern&
80 {
81 return sparsityPattern_;
82 }
83
84 // Pure virtual function for cloning
85 virtual std::unique_ptr<GradOperatorFactory<ValueType>> clone() const = 0;
86
87protected:
88
90
92
94};
95
96template<typename ValueType>
97class GradOperator : public dsl::OperatorMixin<VolumeField<ValueType>, VolumeField<scalar>>
98{
99
100public:
101
102 using VectorValueType = ValueType;
103
104 // copy constructor
106 : dsl::OperatorMixin<VolumeField<ValueType>, VolumeField<scalar>>(
107 gradOp.exec_, gradOp.coeffs_, gradOp.field_, gradOp.type_
108 ),
109 gradOperatorStrategy_(
110 gradOp.gradOperatorStrategy_ ? gradOp.gradOperatorStrategy_->clone() : nullptr
111 ) {};
112
113 GradOperator(dsl::Operator::Type termType, const VolumeField<scalar>& phi, const Input& input)
114 : dsl::OperatorMixin<VolumeField<ValueType>, VolumeField<scalar>>(
115 phi.exec(), dsl::Coeff(1.0), phi, termType
116 ),
117 gradOperatorStrategy_(
118 GradOperatorFactory<ValueType>::create(phi.exec(), phi.mesh(), input)
119 ) {};
120
122 dsl::Operator::Type termType,
123 const VolumeField<scalar>& phi,
124 std::unique_ptr<GradOperatorFactory<ValueType>> gradOperatorStrategy
125 )
126 : dsl::OperatorMixin<VolumeField<ValueType>, VolumeField<scalar>>(
127 phi.exec(), dsl::Coeff(1.0), phi, termType
128 ),
129 gradOperatorStrategy_(std::move(gradOperatorStrategy)) {};
130
132 : dsl::OperatorMixin<VolumeField<ValueType>, VolumeField<scalar>>(
133 phi.exec(), dsl::Coeff(1.0), phi, termType
134 ),
135 gradOperatorStrategy_(nullptr) {};
136
137
138 void explicitOperation(Vector<Vec3>& source) const
139 {
140 NF_ASSERT(gradOperatorStrategy_, "GradOperatorStrategy not initialized");
141 auto tmpsource = Vector<Vec3>(source.exec(), source.size(), zero<Vec3>());
142 const auto operatorScaling = this->getCoefficient();
143 gradOperatorStrategy_->grad(this->getVector(), operatorScaling, tmpsource);
144 source += tmpsource;
145 }
146
147 [[deprecated("This function will be removed")]] la::LinearSystem<ValueType, localIdx>
149 {
150 NF_ASSERT(gradOperatorStrategy_, "GradOperatorStrategy not initialized");
151 return gradOperatorStrategy_->createEmptyLinearSystem();
152 }
153
154 /* @brief forwards to implicit gradOperatorStrategy_->grad() with arguments */
156 {
157 NF_ASSERT(gradOperatorStrategy_, "GradOperatorStrategy not initialized");
158 const auto operatorScaling = this->getCoefficient();
159 gradOperatorStrategy_->grad(this->getVector(), operatorScaling, ls);
160 }
161
162 /* @brief forwards to gradOperatorStrategy_->grad() with arguments */
163 [[deprecated("use explicit or implicit operation")]] void grad(auto&&... args) const
164 {
165 const auto operatorScaling = this->getCoefficient();
166 gradOperatorStrategy_->grad(
167 std::forward<decltype(args)>(args)..., this->getVector(), operatorScaling
168 );
169 }
170
171 void read(const Input& input)
172 {
173 const UnstructuredMesh& mesh = this->getVector().mesh();
174 if (std::holds_alternative<NeoN::Dictionary>(input))
175 {
176 auto dict = std::get<NeoN::Dictionary>(input);
177 std::string schemeName = "grad(" + this->getVector().name + ")";
178 auto tokens = dict.subDict("gradSchemes").get<NeoN::TokenList>(schemeName);
179 gradOperatorStrategy_ =
180 GradOperatorFactory<ValueType>::create(this->exec(), mesh, tokens);
181 }
182 else
183 {
184 auto tokens = std::get<NeoN::TokenList>(input);
185 gradOperatorStrategy_ =
186 GradOperatorFactory<ValueType>::create(this->exec(), mesh, tokens);
187 }
188 }
189
190 std::string getName() const { return "GradOperator"; }
191
192private:
193
194 std::unique_ptr<GradOperatorFactory<ValueType>> gradOperatorStrategy_;
195};
196
197
198} // namespace NeoN
A factory class for runtime selection of derived classes.
A class representing a list of tokens.
Definition tokenList.hpp:29
Represents an unstructured mesh in NeoN.
A class to contain the data and executors for a field and define some basic operations.
Definition vector.hpp:30
A class that represents a coefficient for the NeoN dsl.
Definition coeff.hpp:24
const Executor exec_
Executor associated with the field. (CPU, GPU, openMP, etc.)
Definition operator.hpp:64
OperatorMixin(const Executor exec, const Coeff &coeffs, const VolumeField< scalar > &field, Operator::Type type)
Definition operator.hpp:41
const UnstructuredMesh & mesh() const
Returns a const reference to the unstructured mesh object.
Definition domain.hpp:122
virtual std::unique_ptr< GradOperatorFactory< ValueType > > clone() const =0
static std::unique_ptr< GradOperatorFactory< ValueType > > create(const Executor &exec, const UnstructuredMesh &uMesh, const Input &inputs)
virtual void grad(const VolumeField< scalar > &phi, const dsl::Coeff operatorScaling, la::LinearSystem< ValueType, localIdx > &ls) const =0
virtual void grad(const VolumeField< scalar > &phi, const dsl::Coeff operatorScaling, Vector< Vec3 > &gradPhi) const =0
virtual VolumeField< ValueType > grad(const VolumeField< scalar > &phi, const dsl::Coeff operatorScaling) const =0
GradOperatorFactory(const Executor &exec, const UnstructuredMesh &mesh)
const la::SparsityPattern & getSparsityPattern() const
void explicitOperation(Vector< Vec3 > &source) const
GradOperator(dsl::Operator::Type termType, const VolumeField< scalar > &phi, std::unique_ptr< GradOperatorFactory< ValueType > > gradOperatorStrategy)
GradOperator(dsl::Operator::Type termType, const VolumeField< scalar > &phi)
la::LinearSystem< ValueType, localIdx > createEmptyLinearSystem() const
GradOperator(dsl::Operator::Type termType, const VolumeField< scalar > &phi, const Input &input)
void implicitOperation(la::LinearSystem< ValueType, localIdx > &ls) const
Represents a volume field in a finite volume method.
A class representing a linear system of equations.
#define NF_ASSERT(condition, message)
Macro for asserting a condition and printing an error message if the condition is false.
Definition error.hpp:144
std::variant< Dictionary, TokenList > Input
Definition input.hpp:15
KOKKOS_INLINE_FUNCTION Vec3 zero< Vec3 >()
Definition vec3.hpp:175
std::variant< SerialExecutor, CPUExecutor, GPUExecutor > Executor
Definition executor.hpp:18
float scalar
Definition scalar.hpp:16