72 template<IsSpatialOperator T>
73 SpatialOperator(T cls) : model_(std::make_unique<OperatorModel<T>>(std::move(cls)))
82 model_ = eqnOperator.model_->clone();
94 template<
typename U = ValueType>
95 requires(!std::is_same_v<U, scalar>)
98 model_->implicitOperationScalarMtx(ls);
104 std::string
getName()
const {
return model_->getName(); }
124 struct OperatorConcept
126 virtual ~OperatorConcept() =
default;
139 virtual void read(
const Input& input) = 0;
142 virtual std::string getName()
const = 0;
148 virtual Coeff& getCoefficient() = 0;
151 virtual Coeff getCoefficient()
const = 0;
157 virtual const Executor& exec()
const = 0;
160 virtual std::unique_ptr<OperatorConcept> clone()
const = 0;
164 template<
typename ConcreteOperatorType>
165 struct OperatorModel : OperatorConcept
168 OperatorModel(ConcreteOperatorType concreteOp) : concreteOp_(std::move(concreteOp)) {}
171 std::string getName()
const override {
return concreteOp_.getName(); }
173 virtual void explicitOperation(Vector<ValueType>& source)
const override
175 if constexpr (HasExplicitOperator<ConcreteOperatorType>)
177 concreteOp_.explicitOperation(source);
183 if constexpr (HasImplicitOperator<ConcreteOperatorType>)
185 concreteOp_.implicitOperation(ls);
192 if constexpr (HasImplicitOperatorScalarMtx<ConcreteOperatorType>)
194 concreteOp_.implicitOperation(ls);
202 "Operator '" << getName()
203 <<
"' does not support scalar-matrix (segregated) assembly."
209 virtual void read(
const Input& input)
override { concreteOp_.read(input); }
212 Operator::Type getType()
const override {
return concreteOp_.getType(); }
215 const Executor& exec()
const override {
return concreteOp_.exec(); }
218 virtual Coeff& getCoefficient()
override {
return concreteOp_.getCoefficient(); }
221 virtual Coeff getCoefficient()
const override {
return concreteOp_.getCoefficient(); }
223 virtual Dictionary getConfig()
const override {
return concreteOp_.getConfig(); }
226 std::unique_ptr<OperatorConcept> clone()
const override
228 return std::make_unique<OperatorModel>(*
this);
231 ConcreteOperatorType concreteOp_;
234 std::unique_ptr<OperatorConcept> model_;