62 SpatialOperator(T cls) : model_(std::make_unique<OperatorModel<T>>(std::move(cls)))
71 model_ = eqnOperator.model_->clone();
79 model_->implicitOperation(ls);
85 std::string
getName()
const {
return model_->getName(); }
104 struct OperatorConcept
106 virtual ~OperatorConcept() =
default;
113 virtual void build(
const Input& input) = 0;
116 virtual std::string getName()
const = 0;
122 virtual Coeff& getCoefficient() = 0;
125 virtual Coeff getCoefficient()
const = 0;
128 virtual const Executor& exec()
const = 0;
131 virtual std::unique_ptr<OperatorConcept> clone()
const = 0;
135 template<
typename ConcreteOperatorType>
136 struct OperatorModel : OperatorConcept
139 OperatorModel(ConcreteOperatorType concreteOp) : concreteOp_(std::move(concreteOp)) {}
142 std::string getName()
const override {
return concreteOp_.getName(); }
144 virtual void explicitOperation(Vector<ValueType>& source)
override
146 if constexpr (HasExplicitOperator<ConcreteOperatorType>)
148 concreteOp_.explicitOperation(source);
152 virtual void implicitOperation(la::LinearSystem<ValueType, localIdx>& ls)
override
154 if constexpr (HasImplicitOperator<ConcreteOperatorType>)
156 concreteOp_.implicitOperation(ls);
161 virtual void build(
const Input& input)
override { concreteOp_.build(input); }
164 Operator::Type getType()
const override {
return concreteOp_.getType(); }
167 const Executor& exec()
const override {
return concreteOp_.exec(); }
170 virtual Coeff& getCoefficient()
override {
return concreteOp_.getCoefficient(); }
173 virtual Coeff getCoefficient()
const override {
return concreteOp_.getCoefficient(); }
176 std::unique_ptr<OperatorConcept> clone()
const override
178 return std::make_unique<OperatorModel>(*
this);
181 ConcreteOperatorType concreteOp_;
184 std::unique_ptr<OperatorConcept> model_;