20template<
typename ValueType>
23 DivOperatorFactory<ValueType>,
24 Parameters<const Executor&, const UnstructuredMesh&, const Input&>>
29 static std::unique_ptr<DivOperatorFactory<ValueType>>
32 std::string key = (std::holds_alternative<Dictionary>(inputs))
33 ? std::get<Dictionary>(inputs).get<std::string>(
"DivOperator")
34 : std::get<TokenList>(inputs).next<std::string>();
39 static std::string
name() {
return "DivOperatorFactory"; }
75 virtual std::unique_ptr<DivOperatorFactory<ValueType>>
clone()
const = 0;
86template<
typename ValueType>
99 faceFlux_(divOp.faceFlux_),
100 divOperatorStrategy_(
101 divOp.divOperatorStrategy_ ? divOp.divOperatorStrategy_->clone() : nullptr
122 faceFlux_(faceFlux), divOperatorStrategy_(std::move(divOperatorStrategy)) {};
130 faceFlux_(faceFlux), divOperatorStrategy_(nullptr) {};
135 NF_ASSERT(divOperatorStrategy_,
"DivOperatorStrategy not initialized");
136 auto tmpsource =
Vector<ValueType>(source.exec(), source.size(), zero<ValueType>());
138 divOperatorStrategy_->div(tmpsource, faceFlux_, this->
getVector(), operatorScaling);
144 NF_ASSERT(divOperatorStrategy_,
"DivOperatorStrategy not initialized");
145 return divOperatorStrategy_->createEmptyLinearSystem();
150 NF_ASSERT(divOperatorStrategy_,
"DivOperatorStrategy not initialized");
152 divOperatorStrategy_->div(ls, faceFlux_, this->
getVector(), operatorScaling);
158 divOperatorStrategy_->div(divPhi, faceFlux_, this->
getVector(), operatorScaling);
164 divOperatorStrategy_->div(ls, faceFlux_, this->
getVector(), operatorScaling);
170 divOperatorStrategy_->div(divPhi, faceFlux_, this->
getVector(), operatorScaling);
176 if (std::holds_alternative<NeoN::Dictionary>(input))
178 auto dict = std::get<NeoN::Dictionary>(input);
179 std::string schemeName =
"div(" + faceFlux_.
name +
"," + this->
getVector().name +
")";
180 auto tokens = dict.subDict(
"divSchemes").get<
NeoN::TokenList>(schemeName);
181 divOperatorStrategy_ =
186 auto tokens = std::get<NeoN::TokenList>(input);
187 divOperatorStrategy_ =
192 std::string
getName()
const {
return "DivOperator"; }
198 std::unique_ptr<DivOperatorFactory<ValueType>> divOperatorStrategy_;
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.
VolumeField< ValueType > & getVector()
const Executor exec_
Executor associated with the field. (CPU, GPU, openMP, etc.)
OperatorMixin(const Executor exec, const Coeff &coeffs, VolumeField< ValueType > &field, Operator::Type type)
VolumeField< ValueType > & field_
virtual const Executor & exec() const final
virtual void div(la::LinearSystem< ValueType, localIdx > &ls, const SurfaceField< scalar > &faceFlux, const VolumeField< ValueType > &phi, const dsl::Coeff operatorScaling) const =0
virtual ~DivOperatorFactory()
const la::SparsityPattern & getSparsityPattern() const
static std::string name()
const UnstructuredMesh & mesh_
static std::unique_ptr< DivOperatorFactory< ValueType > > create(const Executor &exec, const UnstructuredMesh &uMesh, const Input &inputs)
const la::SparsityPattern & sparsityPattern_
virtual void div(Vector< ValueType > &divPhi, const SurfaceField< scalar > &faceFlux, const VolumeField< ValueType > &phi, const dsl::Coeff operatorScaling) const =0
virtual void div(VolumeField< ValueType > &divPhi, const SurfaceField< scalar > &faceFlux, const VolumeField< ValueType > &phi, const dsl::Coeff operatorScaling) const =0
DivOperatorFactory(const Executor &exec, const UnstructuredMesh &mesh)
virtual std::unique_ptr< DivOperatorFactory< ValueType > > clone() const =0
virtual VolumeField< ValueType > div(const SurfaceField< scalar > &faceFlux, const VolumeField< ValueType > &phi, const dsl::Coeff operatorScaling) const =0
la::LinearSystem< ValueType, localIdx > createEmptyLinearSystem() const
ValueType VectorValueType
void read(const Input &input)
DivOperator(dsl::Operator::Type termType, const SurfaceField< scalar > &faceFlux, VolumeField< ValueType > &phi, Input input)
void explicitOperation(Vector< ValueType > &source) const
void div(la::LinearSystem< ValueType, localIdx > &ls) const
DivOperator(dsl::Operator::Type termType, const SurfaceField< scalar > &faceFlux, VolumeField< ValueType > &phi, std::unique_ptr< DivOperatorFactory< ValueType > > divOperatorStrategy)
DivOperator(const DivOperator &divOp)
void implicitOperation(la::LinearSystem< ValueType, localIdx > &ls) const
void div(Vector< ValueType > &divPhi) const
void div(VolumeField< ValueType > &divPhi) const
DivOperator(dsl::Operator::Type termType, const SurfaceField< scalar > &faceFlux, VolumeField< ValueType > &phi)
std::string getName() const
Represents a surface field in a finite volume method.
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
std::variant< SerialExecutor, CPUExecutor, GPUExecutor > Executor