23template<
typename ValueType>
26 GradOperatorFactory<ValueType>,
27 Parameters<const Executor&, const UnstructuredMesh&, const Input&>>
32 static std::unique_ptr<GradOperatorFactory<ValueType>>
35 std::string key = (std::holds_alternative<Dictionary>(inputs))
36 ? std::get<Dictionary>(inputs).get<std::string>(
"GradOperator")
37 : std::get<TokenList>(inputs).next<std::string>();
42 static std::string
name() {
return "GradOperatorFactory"; }
94 NF_ERROR_EXIT(
"gradTensor is not implemented for this gradient scheme");
98 virtual std::unique_ptr<GradOperatorFactory<ValueType>>
clone()
const = 0;
107template<
typename ValueType>
120 gradOperatorStrategy_(
121 gradOp.gradOperatorStrategy_ ? gradOp.gradOperatorStrategy_->clone() : nullptr
126 phi.
exec(), dsl::Coeff(1.0), phi, termType
128 gradOperatorStrategy_(
138 phi.
exec(), dsl::Coeff(1.0), phi, termType
140 gradOperatorStrategy_(std::move(gradOperatorStrategy)) {};
144 phi.
exec(), dsl::Coeff(1.0), phi, termType
146 gradOperatorStrategy_(nullptr) {};
151 NF_ASSERT(gradOperatorStrategy_,
"GradOperatorStrategy not initialized");
154 gradOperatorStrategy_->grad(this->
getVector(), operatorScaling, tmpsource);
161 NF_ASSERT(gradOperatorStrategy_,
"GradOperatorStrategy not initialized");
163 gradOperatorStrategy_->grad(this->
getVector(), operatorScaling, ls);
167 [[deprecated(
"use explicit or implicit operation")]]
void grad(
auto&&... args)
const
170 gradOperatorStrategy_->grad(
171 std::forward<
decltype(args)>(args)..., this->
getVector(), operatorScaling
178 if (std::holds_alternative<NeoN::Dictionary>(input))
180 auto dict = std::get<NeoN::Dictionary>(input);
181 std::string schemeName =
"grad(" + this->
getVector().
name +
")";
182 auto tokens = dict.subDict(
"gradSchemes").get<
NeoN::TokenList>(schemeName);
183 gradOperatorStrategy_ =
188 auto tokens = std::get<NeoN::TokenList>(input);
189 gradOperatorStrategy_ =
194 std::string
getName()
const {
return "GradOperator"; }
206 std::unique_ptr<GradOperatorFactory<ValueType>> gradOperatorStrategy_;
A class representing a dictionary that stores key-value pairs.
A factory class for runtime selection of derived classes.
A class representing a list of tokens.
Represents an unstructured mesh in NeoN.
A class to contain the data and executors for a field and define some basic operations.
A class that represents a coefficient for the NeoN dsl.
const VolumeField< scalar > & field_
const Executor exec_
Executor associated with the field. (CPU, GPU, openMP, etc.)
OperatorMixin(const Executor exec, const Coeff &coeffs, const VolumeField< scalar > &field, Operator::Type type)
const VolumeField< scalar > & getVector() const
virtual const Executor & exec() const final
const UnstructuredMesh & mesh() const
Returns a const reference to the unstructured mesh object.
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, Vector< Vec3 > &gradPhi) const =0
virtual ~GradOperatorFactory()=default
static std::string name()
virtual void gradTensor(const VolumeField< Vec3 > &u, VolumeField< Tensor > &gradU, const dsl::Coeff operatorScaling) const
virtual VolumeField< ValueType > grad(const VolumeField< scalar > &phi, const dsl::Coeff operatorScaling) const =0
virtual void grad(const VolumeField< scalar > &phi, const dsl::Coeff operatorScaling, la::LinearSystem< ValueType > &ls) const =0
GradOperatorFactory(const Executor &exec, const UnstructuredMesh &mesh)
const UnstructuredMesh & mesh_
GradOperator(const GradOperator &gradOp)
void explicitOperation(Vector< Vec3 > &source) const
void grad(auto &&... args) const
Dictionary getConfig() const
void implicitOperation(la::LinearSystem< ValueType > &ls) const
GradOperator(dsl::Operator::Type termType, const VolumeField< scalar > &phi, std::unique_ptr< GradOperatorFactory< ValueType > > gradOperatorStrategy)
std::string getName() const
ValueType VectorValueType
void read(const Input &input)
GradOperator(dsl::Operator::Type termType, const VolumeField< scalar > &phi)
GradOperator(dsl::Operator::Type termType, const VolumeField< scalar > &phi, const Input &input)
Represents a volume field in a finite volume method.
A class representing a linear system of equations.
#define NF_ERROR_EXIT(message)
Macro for printing an error message and aborting the program.
#define NF_ASSERT(condition, message)
Macro for asserting a condition and printing an error message if the condition is false.
std::variant< Dictionary, TokenList > Input
KOKKOS_INLINE_FUNCTION Vec3 zero< Vec3 >()
std::variant< SerialExecutor, CPUExecutor, GPUExecutor > Executor
A wrapper class to put references in dictionaries to overcome the issue that std::any cannot hold a r...