FEAT 3
Finite Element Analysis Toolbox
Loading...
Searching...
No Matches
hessian_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
8#include <kernel/solver/nlopt_precond.hpp>
9#include <kernel/solver/test_aux/analytic_function_operator.hpp>
10#include <kernel/util/dist.hpp>
11
12namespace FEAT
13{
14 namespace Solver
15 {
31#ifndef DOXYGEN
32 template<typename Operator_, typename Filter_>
33 class HessianPrecond;
34#else
35 template<typename Operator_, typename Filter_>
36 class HessianPrecond : public NLOptPrecond<typename Operator_::VectorType, Filter_>
37 {};
38#endif
39
41
53 template<typename DT_, typename IT_, typename Function_, typename Filter_>
54 class HessianPrecond<AnalyticFunctionOperator<DT_, IT_, Function_>, Filter_>
55 : public NLOptPrecond<typename AnalyticFunctionOperator<DT_, IT_, Function_>::VectorTypeL, Filter_>
56 {
57 public:
61 typedef Filter_ FilterType;
62
64 typedef typename OperatorType::VectorTypeL VectorType;
66 typedef NLOptPrecond<VectorType, Filter_> BaseClass;
67
69 typedef typename OperatorType::DataType DataType;
71 typedef typename OperatorType::HessianType HessianType;
72
73 protected:
75 OperatorType& _op;
77 const FilterType& _filter;
79 HessianType _hessian;
81 HessianType _inv_hessian;
82
83 public:
94 explicit HessianPrecond(OperatorType& op_, const FilterType& filter_) :
95 _op(op_),
96 _filter(filter_),
97 _hessian(DT_(0)),
98 _inv_hessian(DT_(0))
99 {
100 }
101
105 virtual ~HessianPrecond()
106 {
107 }
108
110 virtual String name() const override
111 {
112 return "HessianPrecond";
113 }
114
116 virtual void prepare(const VectorType& DOXY(vec_state), FilterType& DOXY(filter)) override
117 {
118 _op.compute_hess(_hessian);
119 _inv_hessian.set_inverse(_hessian);
120 }
121
123 virtual Status apply(VectorType& vec_cor, const VectorType& vec_def) override
124 {
125 Statistics::add_solver_expression(std::make_shared<ExpressionStartSolve>(this->name()));
126 Statistics::add_solver_expression(std::make_shared<ExpressionCallPrecond>(this->name(), _op.name()));
127
128 vec_cor(0, _inv_hessian*vec_def(0));
129 this->_filter.filter_cor(vec_cor);
130
131 Statistics::add_solver_expression(std::make_shared<ExpressionEndSolve>(this->name(), Status::success, 1));
132
133 return Status::success;
134 }
135 };
137
156 template<typename Operator_, typename Filter_>
157 inline std::shared_ptr<HessianPrecond<Operator_, Filter_>> new_hessian_precond(
158 Operator_& op_, const Filter_& filter_)
159 {
160 return std::make_shared<HessianPrecond<Operator_, Filter_>>(op_, filter_);
161 }
162
180#ifndef DOXYGEN
181 template<typename Operator_, typename Filter_>
182 class ApproximateHessianPrecond;
183#else
184 template<typename Operator_, typename Filter_>
185 class ApproximateHessianPrecond : public NLOptPrecond<typename OperatorType_::VectorType, Filter>
186 {};
187#endif
188
190
202 template<typename DT_, typename IT_, typename Function_, typename Filter_>
203 class ApproximateHessianPrecond<AnalyticFunctionOperator<DT_, IT_, Function_>, Filter_>
204 : public NLOptPrecond<typename AnalyticFunctionOperator<DT_, IT_, Function_>::VectorTypeL, Filter_>
205 {
206 public:
210 typedef Filter_ FilterType;
211
213 typedef typename OperatorType::VectorTypeL VectorType;
215 typedef NLOptPrecond<VectorType, Filter_> BaseClass;
216
218 typedef typename OperatorType::DataType DataType;
220 typedef typename OperatorType::HessianType HessianType;
221
222 protected:
224 OperatorType& _op;
226 const FilterType& _filter;
228 HessianType _hessian;
230 HessianType _inv_hessian;
231
232 public:
243 explicit ApproximateHessianPrecond(OperatorType& op_, const FilterType& filter_) :
244 _op(op_),
245 _filter(filter_),
246 _hessian(DT_(0)),
247 _inv_hessian(DT_(0))
248 {
249 }
250
255 virtual ~ApproximateHessianPrecond()
256 {
257 }
258
260 virtual String name() const override
261 {
262 return "ApproximateHessianPrecond";
263 }
264
265 //virtual void init_symbolic() override
266 //{
267 // _inv_diag = _op.create_vector_r();
268 //}
269
270 //virtual void done_symbolic() override
271 //{
272 // _inv_diag.clear();
273 //}
274
275 //virtual void init_numeric() override
276 //{
277 // // extract matrix diagonal
278 // _op.extract_diag(_inv_diag);
279
280 // // invert diagonal elements
281 // _inv_diag.component_invert(_inv_diag, _omega);
282 //}
283
284
286 virtual void prepare(const VectorType& DOXY(vec_state), FilterType& DOXY(filter)) override
287 {
288 _op.compute_approx_hess(_hessian);
289 _inv_hessian.set_inverse(_hessian);
290 }
291
293 virtual Status apply(VectorType& vec_cor, const VectorType& vec_def) override
294 {
295 Statistics::add_solver_expression(std::make_shared<ExpressionStartSolve>(this->name()));
296 Statistics::add_solver_expression(std::make_shared<ExpressionCallPrecond>(this->name(), _op.name()));
297
298 vec_cor(0, _inv_hessian*vec_def(0));
299 this->_filter.filter_cor(vec_cor);
300
301 Statistics::add_solver_expression(std::make_shared<ExpressionEndSolve>(this->name(), Status::success, 1));
302
303 return Status::success;
304 }
305 };
307
326 template<typename Operator_, typename Filter_>
327 inline std::shared_ptr<ApproximateHessianPrecond<Operator_, Filter_>> new_approximate_hessian_precond(
328 Operator_& op_, const Filter_& filter_)
329 {
330 return std::make_shared<ApproximateHessianPrecond<Operator_, Filter_>>(op_, filter_);
331 }
332
333 } // namespace Solver
334} // namespace FEAT
FEAT Kernel base header.
Wrapper class defining an operator based on a scalar AnalyticFunction.
Wrapper class for applying an the inverse of an operator's approximate Hessian as a preconditioner.
Preconditioner that applies the inverse of an operator's Hessian.
Abstract base class for preconditioners for nonlinear optimization.
virtual void prepare(const VectorType &vec_state, FilterType &filter)=0
Prepares the preconditioner for application.
virtual String name() const override=0
Returns a descriptive String.
Operator_::VectorType VectorType
Floating point data type.
virtual Status apply(VectorType &vec_cor, const VectorType &vec_def) override=0
Applies the preconditioner.
std::shared_ptr< HessianPrecond< Operator_, Filter_ > > new_hessian_precond(Operator_ &op_, const Filter_ &filter_)
Creates a new HessianPrecond.
Status
Solver status return codes enumeration.
Definition: base.hpp:47
@ success
solving successful (convergence criterion fulfilled)
std::shared_ptr< ApproximateHessianPrecond< Operator_, Filter_ > > new_approximate_hessian_precond(Operator_ &op_, const Filter_ &filter_)
Creates a new ApproximateHessianPrecond.
FEAT namespace.
Definition: adjactor.hpp:12