64 template<HasTemporalOperator T>
65 TemporalOperator(T cls) : model_(std::make_unique<TemporalOperatorModel<T>>(std::move(cls)))
74 model_->explicitOperation(source, t, dt);
79 model_->implicitOperation(ls, t, dt);
85 std::string
getName()
const {
return model_->getName(); }
92 void read(
const Input& input) { model_->read(input); }
103 struct TemporalOperatorConcept
105 virtual ~TemporalOperatorConcept() =
default;
113 virtual void read(
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<TemporalOperatorConcept> clone()
const = 0;
135 template<
typename ConcreteTemporalOperatorType>
136 struct TemporalOperatorModel : TemporalOperatorConcept
139 TemporalOperatorModel(ConcreteTemporalOperatorType concreteOp)
140 : concreteOp_(std::move(concreteOp))
144 std::string getName()
const override {
return concreteOp_.getName(); }
146 virtual void explicitOperation(Vector<ValueType>& source,
scalar t,
scalar dt)
override
148 if constexpr (HasTemporalExplicitOperator<ConcreteTemporalOperatorType>)
150 concreteOp_.explicitOperation(source, t, dt);
155 implicitOperation(la::LinearSystem<ValueType, localIdx>& ls,
scalar t,
scalar dt)
override
157 if constexpr (HasTemporalImplicitOperator<ConcreteTemporalOperatorType>)
159 concreteOp_.implicitOperation(ls, t, dt);
164 virtual void read(
const Input& input)
override { concreteOp_.read(input); }
167 Operator::Type getType()
const override {
return concreteOp_.getType(); }
170 const Executor& exec()
const override {
return concreteOp_.exec(); }
173 virtual Coeff& getCoefficient()
override {
return concreteOp_.getCoefficient(); }
176 virtual Coeff getCoefficient()
const override {
return concreteOp_.getCoefficient(); }
179 std::unique_ptr<TemporalOperatorConcept> clone()
const override
181 return std::make_unique<TemporalOperatorModel>(*
this);
184 ConcreteTemporalOperatorType concreteOp_;
187 std::unique_ptr<TemporalOperatorConcept> model_;