60 template<IsSpatialOperator T>
61 SpatialOperator(T cls) : model_(std::make_unique<OperatorModel<T>>(std::move(cls)))
70 model_ = eqnOperator.model_->clone();
78 model_->implicitOperation(ls);
84 std::string
getName()
const {
return model_->getName(); }
91 void read(
const Input& input) { model_->read(input); }
102 struct OperatorConcept
104 virtual ~OperatorConcept() =
default;
111 virtual void read(
const Input& input) = 0;
114 virtual std::string getName()
const = 0;
120 virtual Coeff& getCoefficient() = 0;
123 virtual Coeff getCoefficient()
const = 0;
126 virtual const Executor& exec()
const = 0;
129 virtual std::unique_ptr<OperatorConcept> clone()
const = 0;
133 template<
typename ConcreteOperatorType>
134 struct OperatorModel : OperatorConcept
137 OperatorModel(ConcreteOperatorType concreteOp) : concreteOp_(std::move(concreteOp)) {}
140 std::string getName()
const override {
return concreteOp_.getName(); }
142 virtual void explicitOperation(Vector<ValueType>& source)
const override
144 if constexpr (HasExplicitOperator<ConcreteOperatorType>)
146 concreteOp_.explicitOperation(source);
152 if constexpr (HasImplicitOperator<ConcreteOperatorType>)
154 concreteOp_.implicitOperation(ls);
159 virtual void read(
const Input& input)
override { concreteOp_.read(input); }
162 Operator::Type getType()
const override {
return concreteOp_.getType(); }
165 const Executor& exec()
const override {
return concreteOp_.exec(); }
168 virtual Coeff& getCoefficient()
override {
return concreteOp_.getCoefficient(); }
171 virtual Coeff getCoefficient()
const override {
return concreteOp_.getCoefficient(); }
174 std::unique_ptr<OperatorConcept> clone()
const override
176 return std::make_unique<OperatorModel>(*
this);
179 ConcreteOperatorType concreteOp_;
182 std::unique_ptr<OperatorConcept> model_;