83 template<HasTemporalOperator T>
84 TemporalOperator(T cls) : model_(std::make_unique<TemporalOperatorModel<T>>(std::move(cls)))
93 model_ = eqnOperator.model_->clone();
99 model_->explicitOperation(source, t, dt);
104 model_->implicitOperation(ls, t, dt);
111 template<
typename U = ValueType>
112 requires(!std::is_same_v<U, scalar>)
115 model_->implicitOperationScalarMtx(ls, t, dt);
121 std::string
getName()
const {
return model_->getName(); }
141 struct TemporalOperatorConcept
143 virtual ~TemporalOperatorConcept() =
default;
153 virtual void implicitOperationScalarMtx(
158 virtual void read(
const Input& input) = 0;
161 virtual std::string getName()
const = 0;
167 virtual Coeff& getCoefficient() = 0;
170 virtual Coeff getCoefficient()
const = 0;
173 virtual const Executor& exec()
const = 0;
182 virtual std::unique_ptr<TemporalOperatorConcept> clone()
const = 0;
186 template<
typename ConcreteTemporalOperatorType>
187 struct TemporalOperatorModel : TemporalOperatorConcept
190 TemporalOperatorModel(ConcreteTemporalOperatorType concreteOp)
191 : concreteOp_(std::move(concreteOp))
195 std::string getName()
const override {
return concreteOp_.getName(); }
197 virtual void explicitOperation(Vector<ValueType>& source,
scalar t,
scalar dt)
override
199 if constexpr (HasTemporalExplicitOperator<ConcreteTemporalOperatorType>)
201 concreteOp_.explicitOperation(source, t, dt);
208 if constexpr (HasTemporalImplicitOperator<ConcreteTemporalOperatorType>)
210 concreteOp_.implicitOperation(ls, t, dt);
214 virtual void implicitOperationScalarMtx(
218 if constexpr (HasTemporalImplicitOperatorScalarMtx<ConcreteTemporalOperatorType>)
220 concreteOp_.implicitOperation(ls, t, dt);
229 "Temporal operator '" << getName()
230 <<
"' does not support scalar-matrix (segregated) "
237 virtual void read(
const Input& input)
override { concreteOp_.read(input); }
240 Operator::Type getType()
const override {
return concreteOp_.getType(); }
243 const Executor& exec()
const override {
return concreteOp_.exec(); }
246 virtual Coeff& getCoefficient()
override {
return concreteOp_.getCoefficient(); }
249 virtual Coeff getCoefficient()
const override {
return concreteOp_.getCoefficient(); }
254 if constexpr (
requires { concreteOp_.scheme(); })
256 return concreteOp_.scheme();
264 std::unique_ptr<TemporalOperatorConcept> clone()
const override
266 return std::make_unique<TemporalOperatorModel>(*
this);
269 ConcreteTemporalOperatorType concreteOp_;
272 std::unique_ptr<TemporalOperatorConcept> model_;