58 template<IsSpatialOperator T>
59 SpatialOperator(T cls) : model_(std::make_unique<OperatorModel<T>>(std::move(cls)))
68 model_ = eqnOperator.model_->clone();
76 model_->implicitOperation(ls);
81 return model_->createEmptyLinearSystem();
87 std::string
getName()
const {
return model_->getName(); }
106 struct OperatorConcept
108 virtual ~OperatorConcept() =
default;
117 virtual void build(
const Input& input) = 0;
120 virtual std::string getName()
const = 0;
126 virtual Coeff& getCoefficient() = 0;
129 virtual Coeff getCoefficient()
const = 0;
132 virtual const Executor& exec()
const = 0;
135 virtual std::unique_ptr<OperatorConcept> clone()
const = 0;
139 template<
typename ConcreteOperatorType>
140 struct OperatorModel : OperatorConcept
143 OperatorModel(ConcreteOperatorType concreteOp) : concreteOp_(std::move(concreteOp)) {}
146 std::string getName()
const override {
return concreteOp_.getName(); }
148 virtual void explicitOperation(Field<ValueType>& source)
override
150 if constexpr (HasExplicitOperator<ConcreteOperatorType>)
152 concreteOp_.explicitOperation(source);
158 if constexpr (HasImplicitOperator<ConcreteOperatorType>)
160 concreteOp_.implicitOperation(ls);
166 if constexpr (HasImplicitOperator<ConcreteOperatorType>)
168 return concreteOp_.createEmptyLinearSystem();
170 throw std::runtime_error(
"Implicit operation not implemented");
175 Field<NeoFOAM::localIdx> colIdx(exec(), 1, 0);
184 virtual void build(
const Input& input)
override { concreteOp_.build(input); }
187 Operator::Type getType()
const override {
return concreteOp_.getType(); }
190 const Executor& exec()
const override {
return concreteOp_.exec(); }
193 virtual Coeff& getCoefficient()
override {
return concreteOp_.getCoefficient(); }
196 virtual Coeff getCoefficient()
const override {
return concreteOp_.getCoefficient(); }
199 std::unique_ptr<OperatorConcept> clone()
const override
201 return std::make_unique<OperatorModel>(*
this);
204 ConcreteOperatorType concreteOp_;
207 std::unique_ptr<OperatorConcept> model_;