65 template<HasTemporalOperator T>
66 TemporalOperator(T cls) : model_(std::make_unique<TemporalOperatorModel<T>>(std::move(cls)))
75 model_->explicitOperation(source, t, dt);
80 model_->implicitOperation(ls, t, dt);
85 return model_->createEmptyLinearSystem();
91 std::string
getName()
const {
return model_->getName(); }
109 struct TemporalOperatorConcept
111 virtual ~TemporalOperatorConcept() =
default;
121 virtual void build(
const Input& input) = 0;
124 virtual std::string getName()
const = 0;
130 virtual Coeff& getCoefficient() = 0;
133 virtual Coeff getCoefficient()
const = 0;
136 virtual const Executor& exec()
const = 0;
139 virtual std::unique_ptr<TemporalOperatorConcept> clone()
const = 0;
143 template<
typename ConcreteTemporalOperatorType>
144 struct TemporalOperatorModel : TemporalOperatorConcept
147 TemporalOperatorModel(ConcreteTemporalOperatorType concreteOp)
148 : concreteOp_(std::move(concreteOp))
152 std::string getName()
const override {
return concreteOp_.getName(); }
154 virtual void explicitOperation(Field<ValueType>& source,
scalar t,
scalar dt)
override
156 if constexpr (HasTemporalExplicitOperator<ConcreteTemporalOperatorType>)
158 concreteOp_.explicitOperation(source, t, dt);
165 if constexpr (HasTemporalImplicitOperator<ConcreteTemporalOperatorType>)
167 concreteOp_.implicitOperation(ls, t, dt);
175 return concreteOp_.createEmptyLinearSystem();
177 throw std::runtime_error(
"Implicit operation not implemented");
191 virtual void build(
const Input& input)
override { concreteOp_.build(input); }
194 Operator::Type getType()
const override {
return concreteOp_.getType(); }
197 const Executor& exec()
const override {
return concreteOp_.exec(); }
200 virtual Coeff& getCoefficient()
override {
return concreteOp_.getCoefficient(); }
203 virtual Coeff getCoefficient()
const override {
return concreteOp_.getCoefficient(); }
206 std::unique_ptr<TemporalOperatorConcept> clone()
const override
208 return std::make_unique<TemporalOperatorModel>(*
this);
211 ConcreteTemporalOperatorType concreteOp_;
214 std::unique_ptr<TemporalOperatorConcept> model_;