62 template<HasTemporalOperator T>
63 TemporalOperator(T cls) : model_(std::make_unique<TemporalOperatorModel<T>>(std::move(cls)))
72 model_->explicitOperation(source, t, dt);
77 model_->implicitOperation(ls, t, dt);
83 std::string
getName()
const {
return model_->getName(); }
101 struct TemporalOperatorConcept
103 virtual ~TemporalOperatorConcept() =
default;
111 virtual void build(
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<TemporalOperatorConcept> clone()
const = 0;
133 template<
typename ConcreteTemporalOperatorType>
134 struct TemporalOperatorModel : TemporalOperatorConcept
137 TemporalOperatorModel(ConcreteTemporalOperatorType concreteOp)
138 : concreteOp_(std::move(concreteOp))
142 std::string getName()
const override {
return concreteOp_.getName(); }
144 virtual void explicitOperation(Vector<ValueType>& source,
scalar t,
scalar dt)
override
146 if constexpr (HasTemporalExplicitOperator<ConcreteTemporalOperatorType>)
148 concreteOp_.explicitOperation(source, t, dt);
153 implicitOperation(la::LinearSystem<ValueType, localIdx>& ls,
scalar t,
scalar dt)
override
155 if constexpr (HasTemporalImplicitOperator<ConcreteTemporalOperatorType>)
157 concreteOp_.implicitOperation(ls, t, dt);
162 virtual void build(
const Input& input)
override { concreteOp_.build(input); }
165 Operator::Type getType()
const override {
return concreteOp_.getType(); }
168 const Executor& exec()
const override {
return concreteOp_.exec(); }
171 virtual Coeff& getCoefficient()
override {
return concreteOp_.getCoefficient(); }
174 virtual Coeff getCoefficient()
const override {
return concreteOp_.getCoefficient(); }
177 std::unique_ptr<TemporalOperatorConcept> clone()
const override
179 return std::make_unique<TemporalOperatorModel>(*
this);
182 ConcreteTemporalOperatorType concreteOp_;
185 std::unique_ptr<TemporalOperatorConcept> model_;