13 #include "NumericalAlgorithms/Convergence/HasConverged.hpp"
14 #include "Options/Auto.hpp"
17 #include "Parallel/PupStlCpp17.hpp"
18 #include "Utilities/FakeVirtual.hpp"
20 #include "Utilities/Registration.hpp"
23 namespace LinearSolver::Serial {
26 namespace Registrars {}
36 template <
typename LinearSolverRegistrars>
75 template <
typename LinearOperator,
typename VarsType,
typename SourceType,
79 const LinearOperator& linear_operator,
const SourceType& source,
80 Args&&... args)
const noexcept;
84 virtual void reset() noexcept = 0;
88 template <
typename LinearSolverRegistrars>
93 template <
typename LinearSolverRegistrars>
94 template <
typename LinearOperator,
typename VarsType,
typename SourceType,
98 const LinearOperator& linear_operator,
const SourceType& source,
99 Args&&... args)
const noexcept {
100 return call_with_dynamic_type<Convergence::HasConverged, creatable_classes>(
101 this, [&initial_guess_in_solution_out, &linear_operator, &source,
102 &args...](
auto*
const linear_solver) noexcept {
103 return linear_solver->solve(initial_guess_in_solution_out,
104 linear_operator, source,
105 std::forward<Args>(args)...);
124 template <
typename Preconditioner,
typename LinearSolverRegistrars>
130 using PreconditionerType =
131 tmpl::conditional_t<std::is_abstract_v<Preconditioner>,
134 static std::string name() noexcept {
return "Preconditioner"; }
138 "An approximate linear solve in every iteration that helps the "
139 "algorithm converge.";
161 void pup(PUP::er& p) noexcept
override {
163 if constexpr (not std::is_same_v<Preconditioner, NoPreconditioner>) {
170 if constexpr (not std::is_same_v<Preconditioner, NoPreconditioner>) {
171 return preconditioner_.has_value();
182 bool Enabled = not std::is_same_v<Preconditioner, NoPreconditioner>,
184 not std::is_same_v<Preconditioner, NoPreconditioner>> =
nullptr>
187 "No preconditioner is set. Please use `has_preconditioner()` to "
188 "check before trying to retrieve it.");
189 if constexpr (std::is_abstract_v<Preconditioner>) {
190 return **preconditioner_;
192 return *preconditioner_;
197 bool Enabled = not std::is_same_v<Preconditioner, NoPreconditioner>,
199 not std::is_same_v<Preconditioner, NoPreconditioner>> =
nullptr>
202 "No preconditioner is set. Please use `has_preconditioner()` to "
203 "check before trying to retrieve it.");
204 if constexpr (std::is_abstract_v<Preconditioner>) {
205 return **preconditioner_;
207 return *preconditioner_;
214 void reset() noexcept override = 0;
220 bool Enabled = not std::is_same_v<Preconditioner, NoPreconditioner>,
222 not std::is_same_v<Preconditioner, NoPreconditioner>> =
nullptr>
224 if constexpr (std::is_abstract_v<Preconditioner>) {
229 return preconditioner_;
240 template <
typename Preconditioner,
typename LinearSolverRegistrars>
241 PreconditionedLinearSolver<Preconditioner, LinearSolverRegistrars>::
242 PreconditionedLinearSolver(
244 : preconditioner_(std::move(local_preconditioner)) {}
247 template <
typename Preconditioner,
typename LinearSolverRegistrars>
248 PreconditionedLinearSolver<Preconditioner, LinearSolverRegistrars>::
249 PreconditionedLinearSolver(
const PreconditionedLinearSolver& rhs) noexcept
251 if constexpr (not std::is_same_v<Preconditioner, NoPreconditioner>) {
255 template <
typename Preconditioner,
typename LinearSolverRegistrars>
256 PreconditionedLinearSolver<Preconditioner, LinearSolverRegistrars>&
257 PreconditionedLinearSolver<Preconditioner, LinearSolverRegistrars>::operator=(
258 const PreconditionedLinearSolver& rhs) noexcept {
259 Base::operator=(rhs);
260 if constexpr (not std::is_same_v<Preconditioner, NoPreconditioner>) {
261 preconditioner_ = rhs.clone_preconditioner();
267 template <
typename Preconditioner,
typename LinearSolverRegistrars>
268 PreconditionedLinearSolver<Preconditioner, LinearSolverRegistrars>::
269 PreconditionedLinearSolver(CkMigrateMessage* m) noexcept
273 template <
typename Preconditioner,
typename LinearSolverRegistrars>
274 void PreconditionedLinearSolver<Preconditioner,
275 LinearSolverRegistrars>::reset() noexcept {
276 if constexpr (not std::is_same_v<Preconditioner, NoPreconditioner>) {
277 if (has_preconditioner()) {
278 preconditioner().
reset();