include/meltpooldg/linear_algebra/preconditioner.hpp Source File

Developer Documentation: include/meltpooldg/linear_algebra/preconditioner.hpp Source File
Developer Documentation
preconditioner.hpp
Go to the documentation of this file.
1
5#pragma once
6
8
9#include <any>
10#include <memory>
11#include <utility>
12
13namespace MeltPoolDG
14{
18 template <typename PreconditionerType, unsigned int dim, typename VectorType, typename number>
20 requires(PreconditionerType preconditioner, VectorType &vec, const VectorType &const_vec) {
25 preconditioner.update(std::declval<std::any>());
26
31 preconditioner.vmult(vec, const_vec);
32
36 preconditioner.reinit();
37 };
38
39
40 template <unsigned int dim, typename VectorType, typename number>
42 {
43 public:
44 Preconditioner() = default;
45
51 template <typename PreconditionerType>
52 explicit Preconditioner(PreconditionerType &&preconditioner)
53 : preconditioner_pimpl(new PreconditionerModel<PreconditionerType>(std::move(preconditioner)))
54 {}
55
62 void
63 vmult(VectorType &dst, const VectorType &src) const
64 {
65 preconditioner_pimpl->vmult(dst, src);
66 }
67
71 void
72 update(const std::any &external_setup = std::any())
73 {
74 if (flag_update_preconditioner == always_update or flag_update_preconditioner == update_once)
75 preconditioner_pimpl->update(external_setup);
76 if (flag_update_preconditioner == update_once)
77 flag_update_preconditioner = do_not_update;
78 }
79
84 void
86 {
87 preconditioner_pimpl->reinit();
88 }
89
96 bool
98 {
99 return (preconditioner_pimpl != nullptr);
100 }
101
105 void
107 {
108 preconditioner_pimpl->reset(nullptr);
109 }
110
134 void
135 set_do_update_preconditioner(const bool do_update, const bool do_overwrite = false)
136 {
137 if ((do_update || flag_update_preconditioner == update_once) && not do_overwrite)
138 flag_update_preconditioner = update_once;
139 else
140 flag_update_preconditioner = do_not_update;
141 }
142
143 private:
145 {
146 virtual ~PreconditionerConcept() = default;
147
148 virtual void
149 vmult(VectorType &dst, const VectorType &src) const = 0;
150
151 virtual void
152 update(const std::any &external_setup) = 0;
153
154 virtual void
155 reinit() = 0;
156 };
157
158 template <PreconditionerTypeConcept<dim, VectorType, number> PreconditionerType>
160 {
161 public:
162 explicit PreconditionerModel(PreconditionerType &&preconditioner_in)
163 : preconditioner(std::forward<PreconditionerType>(preconditioner_in))
164 {}
165
166 void
167 vmult(VectorType &dst, const VectorType &src) const override
168 {
169 preconditioner.vmult(dst, src);
170 }
171
172 void
173 update(const std::any &external_setup) override
174 {
175 preconditioner.update(external_setup);
176 }
177
178 void
179 reinit() override
180 {
181 preconditioner.reinit();
182 }
183
184 private:
185 PreconditionerType preconditioner;
186 };
187
190 std::unique_ptr<PreconditionerConcept> preconditioner_pimpl;
191
194 enum
195 {
202 } flag_update_preconditioner{always_update};
203 };
204} // namespace MeltPoolDG
Definition preconditioner.hpp:42
void set_do_update_preconditioner(const bool do_update, const bool do_overwrite=false)
Definition preconditioner.hpp:135
std::unique_ptr< PreconditionerConcept > preconditioner_pimpl
Definition preconditioner.hpp:190
void clear()
Definition preconditioner.hpp:106
void update(const std::any &external_setup=std::any())
Definition preconditioner.hpp:72
@ always_update
always update the preconditioner when calling update()
Definition preconditioner.hpp:197
@ do_not_update
do nothing when calling update()
Definition preconditioner.hpp:201
@ update_once
update the precondioner only when calling update() for the next time
Definition preconditioner.hpp:199
enum MeltPoolDG::Preconditioner::@3 always_update
void reinit()
Definition preconditioner.hpp:85
Preconditioner(PreconditionerType &&preconditioner)
Definition preconditioner.hpp:52
bool is_initialized() const
Definition preconditioner.hpp:97
void vmult(VectorType &dst, const VectorType &src) const
Definition preconditioner.hpp:63
Definition preconditioner.hpp:19
Interface for a general preconditioner.
Definition boundary_condition_functions.hpp:17
Definition preconditioner.hpp:145
virtual void vmult(VectorType &dst, const VectorType &src) const =0
virtual void update(const std::any &external_setup)=0
Definition preconditioner.hpp:160
void vmult(VectorType &dst, const VectorType &src) const override
Definition preconditioner.hpp:167
PreconditionerModel(PreconditionerType &&preconditioner_in)
Definition preconditioner.hpp:162
void update(const std::any &external_setup) override
Definition preconditioner.hpp:173
void reinit() override
Definition preconditioner.hpp:179
PreconditionerType preconditioner
Definition preconditioner.hpp:185