17 #ifndef __deal2__solver_richardson_h
18 #define __deal2__solver_richardson_h
21 #include <deal.II/base/config.h>
22 #include <deal.II/base/logstream.h>
23 #include <deal.II/lac/solver.h>
24 #include <deal.II/lac/solver_control.h>
25 #include <deal.II/base/subscriptor.h>
54 template <
class VECTOR = Vector<
double> >
109 template<
class MATRIX,
class PRECONDITIONER>
114 const PRECONDITIONER &precondition);
119 template<
class MATRIX,
class PRECONDITIONER>
124 const PRECONDITIONER &precondition);
144 const VECTOR &d)
const;
151 virtual typename VECTOR::value_type
criterion();
186 typename VECTOR::value_type
res;
194 template <
class VECTOR>
198 const bool use_preconditioned_residual)
201 use_preconditioned_residual(use_preconditioned_residual)
205 template <
class VECTOR>
208 const AdditionalData &data)
211 additional_data(data)
216 template <
class VECTOR>
218 const AdditionalData &data)
221 additional_data(data)
226 template <
class VECTOR>
231 template <
class VECTOR>
232 template <
class MATRIX,
class PRECONDITIONER>
237 const PRECONDITIONER &precondition)
242 Vr = this->memory.alloc();
245 Vd = this->memory.alloc();
249 deallog.
push(
"Richardson");
260 precondition.vmult(d,r);
267 conv = this->control().check (iter, criterion());
272 x.add(additional_data.omega,d);
273 print_vectors(iter,x,r,d);
278 this->memory.free(Vr);
279 this->memory.free(Vd);
284 this->memory.free(Vr);
285 this->memory.free(Vd);
291 this->control().last_value()));
296 template <
class VECTOR>
297 template <
class MATRIX,
class PRECONDITIONER>
302 const PRECONDITIONER &precondition)
307 Vr = this->memory.alloc();
310 Vd =this-> memory.alloc();
314 deallog.
push(
"RichardsonT");
325 precondition.Tvmult(d,r);
327 conv = this->control().check (iter, criterion());
331 x.add(additional_data.omega,d);
332 print_vectors(iter,x,r,d);
337 this->memory.free(Vr);
338 this->memory.free(Vd);
344 this->memory.free(Vr);
345 this->memory.free(Vd);
350 this->control().last_value()));
355 template <
class VECTOR>
360 const VECTOR &)
const
365 template <
class VECTOR>
366 inline typename VECTOR::value_type
369 if (!additional_data.use_preconditioned_residual)
377 template <
class VECTOR>
381 additional_data.omega=om;
386 DEAL_II_NAMESPACE_CLOSE
void Tvmult(VECTOR &u, const VECTOR &v) const
SolverRichardson(SolverControl &cn, VectorMemory< VECTOR > &mem, const AdditionalData &data=AdditionalData())
void vmult(VECTOR &u, const VECTOR &v) const
AdditionalData(const double omega=1, const bool use_preconditioned_residual=false)
#define AssertThrow(cond, exc)
void solve(const MATRIX &A, VECTOR &x, const VECTOR &b, const PRECONDITIONER &precondition)
void Tsolve(const MATRIX &A, VECTOR &x, const VECTOR &b, const PRECONDITIONER &precondition)
AdditionalData additional_data
bool use_preconditioned_residual
void push(const std::string &text)
virtual ~SolverRichardson()
void set_omega(const double om=1.)
virtual VECTOR::value_type criterion()
virtual void print_vectors(const unsigned int step, const VECTOR &x, const VECTOR &r, const VECTOR &d) const
Stop iteration, goal reached.