21template<
typename ValueType>
24 GradOperatorFactory<ValueType>,
25 Parameters<const Executor&, const UnstructuredMesh&>>
30 static std::unique_ptr<GradOperatorFactory<ValueType>>
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>();
40 static std::string
name() {
return "GradOperatorFactory"; }
85 virtual std::unique_ptr<GradOperatorFactory<ValueType>>
clone()
const = 0;
96template<
typename ValueType>
109 gradOperatorStrategy_(
110 gradOp.gradOperatorStrategy_ ? gradOp.gradOperatorStrategy_->clone() : nullptr
115 phi.
exec(), dsl::Coeff(1.0), phi, termType
117 gradOperatorStrategy_(
127 phi.
exec(), dsl::Coeff(1.0), phi, termType
129 gradOperatorStrategy_(std::move(gradOperatorStrategy)) {};
133 phi.
exec(), dsl::Coeff(1.0), phi, termType
135 gradOperatorStrategy_(nullptr) {};
140 NF_ASSERT(gradOperatorStrategy_,
"GradOperatorStrategy not initialized");
143 gradOperatorStrategy_->grad(this->
getVector(), operatorScaling, tmpsource);
150 NF_ASSERT(gradOperatorStrategy_,
"GradOperatorStrategy not initialized");
151 return gradOperatorStrategy_->createEmptyLinearSystem();
157 NF_ASSERT(gradOperatorStrategy_,
"GradOperatorStrategy not initialized");
159 gradOperatorStrategy_->grad(this->
getVector(), operatorScaling, ls);
163 [[deprecated(
"use explicit or implicit operation")]]
void grad(
auto&&... args)
const
166 gradOperatorStrategy_->grad(
167 std::forward<
decltype(args)>(args)..., this->
getVector(), operatorScaling
174 if (std::holds_alternative<NeoN::Dictionary>(input))
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_ =
184 auto tokens = std::get<NeoN::TokenList>(input);
185 gradOperatorStrategy_ =
190 std::string
getName()
const {
return "GradOperator"; }
194 std::unique_ptr<GradOperatorFactory<ValueType>> gradOperatorStrategy_;
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, la::LinearSystem< ValueType, localIdx > &ls) const =0
virtual void grad(const VolumeField< scalar > &phi, const dsl::Coeff operatorScaling, Vector< Vec3 > &gradPhi) const =0
const la::SparsityPattern & sparsityPattern_
virtual ~GradOperatorFactory()=default
static std::string name()
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
const UnstructuredMesh & mesh_
GradOperator(const GradOperator &gradOp)
void explicitOperation(Vector< Vec3 > &source) const
void grad(auto &&... args) 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)
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.
std::variant< Dictionary, TokenList > Input
KOKKOS_INLINE_FUNCTION Vec3 zero< Vec3 >()
std::variant< SerialExecutor, CPUExecutor, GPUExecutor > Executor