FEAT 3
Finite Element Analysis Toolbox
Loading...
Searching...
No Matches
scale_precond.hpp
1// FEAT3: Finite Element Analysis Toolbox, Version 3
2// Copyright (C) 2010 by Stefan Turek & the FEAT group
3// FEAT3 is released under the GNU General Public License version 3,
4// see the file 'copyright.txt' in the top level directory for details.
5
6#pragma once
7
8#include <kernel/solver/base.hpp>
9
10namespace FEAT
11{
12 namespace Solver
13 {
21 template<typename Vector_, typename Filter_>
23 public SolverBase<Vector_>
24 {
25 protected:
27 typedef typename Vector_::DataType DataType;
29 const Filter_& _filter;
34
35 public:
42 explicit ScalePrecond(const Filter_& filter, DataType omega) :
43 _filter(filter),
44 _omega(omega)
45 {
46 }
47
61 explicit ScalePrecond(const String& section_name, const PropertyMap* section,
62 const Filter_& filter) :
63 BaseClass(section_name, section),
64 _filter(filter),
65 _omega(0)
66 {
67 // Check if we have set _krylov_vim
68 auto omega_p = section->query("omega");
69 if(omega_p.second && !omega_p.first.parse(this->_omega))
70 throw ParseError(section_name + ".omega", omega_p.first, "a positive float");
71 }
72
76 virtual ~ScalePrecond()
77 {
78 }
79
81 virtual String name() const override
82 {
83 return "Scale";
84 }
85
93 void set_omega(DataType omega)
94 {
95 XASSERT(omega > DataType(0));
96 _omega = omega;
97 }
98
100 virtual Status apply(Vector_& vec_cor, const Vector_& vec_def) override
101 {
102 vec_cor.scale(vec_def, this->_omega);
103 _filter.filter_cor(vec_cor);
104 return Status::success;
105 }
106 }; // class ScalePrecond<...>
107
108
121 template<typename Filter_, typename DataType_>
122 inline std::shared_ptr<ScalePrecond<typename Filter_::VectorType, Filter_>> new_scale_precond(
123 const Filter_& filter, DataType_ omega)
124 {
125 return std::make_shared<ScalePrecond<typename Filter_::VectorType, Filter_>>(filter, omega);
126 }
127
143 template<typename Filter_>
144 inline std::shared_ptr<ScalePrecond<typename Filter_::VectorType, Filter_>> new_scale_precond(
145 const String& section_name, const PropertyMap* section,
146 const Filter_& filter)
147 {
148 return std::make_shared<ScalePrecond<typename Filter_::VectorType, Filter_>>(
149 section_name, section, filter);
150 }
151 } // namespace Solver
152} // namespace FEAT
#define XASSERT(expr)
Assertion macro definition.
Definition: assertion.hpp:262
Class for parser related errors.
Definition: exception.hpp:132
A class organizing a tree of key-value pairs.
std::pair< String, bool > query(String key_path) const
Queries a value by its key path.
Scaling preconditioner class template.
ScalePrecond(const String &section_name, const PropertyMap *section, const Filter_ &filter)
Constructor using a PropertyMap.
DataType _omega
the scaling factor
virtual ~ScalePrecond()
Empty virtual destructor.
SolverBase< Vector_ > BaseClass
Our base class.
virtual Status apply(Vector_ &vec_cor, const Vector_ &vec_def) override
Solver application method.
const Filter_ & _filter
the filter
ScalePrecond(const Filter_ &filter, DataType omega)
Constructor.
Vector_::DataType DataType
our data type
virtual String name() const override
Returns the name of the solver.
void set_omega(DataType omega)
Sets the damping parameter.
Polymorphic solver interface.
Definition: base.hpp:183
String class implementation.
Definition: string.hpp:47
std::shared_ptr< ScalePrecond< typename Filter_::VectorType, Filter_ > > new_scale_precond(const Filter_ &filter, DataType_ omega)
Creates a new ScalePrecond solver object.
Status
Solver status return codes enumeration.
Definition: base.hpp:47
@ success
solving successful (convergence criterion fulfilled)
FEAT namespace.
Definition: adjactor.hpp:12