FEAT 3
Finite Element Analysis Toolbox
Loading...
Searching...
No Matches
convert_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// includes, FEAT
9#include <kernel/solver/base.hpp>
10#include <kernel/global/vector.hpp>
11
12namespace FEAT
13{
14 namespace Solver
15 {
38 template<typename VectorOuter_, typename VectorInner_>
40 public SolverBase<VectorOuter_>
41 {
42 public:
43 using VectorTypeOuter = VectorOuter_;
45
46 using VectorTypeInner = VectorInner_;
48
49 protected:
50 std::shared_ptr<SolverTypeInner> _inner_solver;
51
52 public:
59 explicit ConvertPrecond(std::shared_ptr<SolverTypeInner> inner_solver) :
60 _inner_solver(inner_solver)
61 {
62 }
63
65 virtual String name() const override
66 {
67 return "Convert";
68 }
69
70 virtual void init_symbolic() override
71 {
73 if(_inner_solver)
74 _inner_solver->init_symbolic();
75 }
76
77 virtual void init_numeric() override
78 {
80 if(_inner_solver)
81 _inner_solver->init_numeric();
82 }
83
84 virtual void done_numeric() override
85 {
86 if(_inner_solver)
87 _inner_solver->done_numeric();
89 }
90
91 virtual void done_symbolic() override
92 {
93 if(_inner_solver)
94 _inner_solver->done_symbolic();
96 }
97
98 virtual Status apply(VectorTypeOuter& vec_cor, const VectorTypeOuter& vec_def) override
99 {
100 Statistics::add_solver_expression(std::make_shared<ExpressionStartSolve>(this->name()));
101
102 VectorTypeInner vec_def_inner;
103 vec_def_inner.convert(vec_def);
104 VectorTypeInner vec_cor_inner(vec_def_inner.clone(LAFEM::CloneMode::Layout));
105
106 Statistics::add_solver_expression(std::make_shared<ExpressionCallPrecond>(this->name(), this->_inner_solver->name()));
107 Status status = _inner_solver->apply(vec_cor_inner, vec_def_inner);
108 if(!status_success(status))
109 {
110 Statistics::add_solver_expression(std::make_shared<ExpressionEndSolve>(this->name(), status, 0));
111 return status;
112 }
113
114 vec_cor.convert(vec_cor_inner);
115 Statistics::add_solver_expression(std::make_shared<ExpressionEndSolve>(this->name(), Status::success, 0));
116 return Status::success;
117 }
118 }; // class ConvertPrecond<...>
119
129 template<typename VectorOuter_, typename VectorInner_>
130 inline std::shared_ptr<ConvertPrecond<VectorOuter_, VectorInner_>> new_convert_precond(std::shared_ptr<SolverBase<VectorInner_> > inner_solver)
131 {
132 return std::make_shared<ConvertPrecond<VectorOuter_, VectorInner_>>(inner_solver);
133 }
134
135
139 template<typename LocalVectorOuter_, typename LocalVectorInner_, typename MirrorOuter_, typename MirrorInner_>
140 class ConvertPrecond<Global::Vector<LocalVectorOuter_, MirrorOuter_>, Global::Vector<LocalVectorInner_, MirrorInner_>> :
141 public SolverBase<Global::Vector<LocalVectorOuter_, MirrorOuter_>>
142 {
143 public:
146
149
150 //using GateTypeOuter = Gate<VectorOuter_, MirrorOuter_>;
151 //using GateTypeInner = Gate<VectorInner_, MirrorInner_>;
152
153 protected:
154 std::shared_ptr<SolverTypeInner> _inner_solver;
155
156 public:
163 explicit ConvertPrecond(std::shared_ptr<SolverTypeInner> inner_solver) :
164 _inner_solver(inner_solver)
165 {
166 }
167
169 virtual String name() const override
170 {
171 return "Convert";
172 }
173
174 virtual void init_symbolic() override
175 {
177 if(_inner_solver)
178 _inner_solver->init_symbolic();
179 }
180
181 virtual void init_numeric() override
182 {
184 if(_inner_solver)
185 _inner_solver->init_numeric();
186 }
187
188 virtual void done_numeric() override
189 {
190 if(_inner_solver)
191 _inner_solver->done_numeric();
193 }
194
195 virtual void done_symbolic() override
196 {
197 if(_inner_solver)
198 _inner_solver->done_symbolic();
200 }
201
202 virtual Status apply(VectorTypeOuter& vec_cor, const VectorTypeOuter& vec_def) override
203 {
204 Statistics::add_solver_expression(std::make_shared<ExpressionStartSolve>(this->name()));
205
206 VectorTypeInner vec_def_inner;
207 vec_def_inner.convert(vec_def_inner.get_gate(), vec_def);
208 VectorTypeInner vec_cor_inner(vec_def_inner.clone(LAFEM::CloneMode::Layout));
209
210 Statistics::add_solver_expression(std::make_shared<ExpressionCallPrecond>(this->name(), this->_inner_solver->name()));
211 Status status = _inner_solver->apply(vec_cor_inner, vec_def_inner);
212 if(!status_success(status))
213 {
214 Statistics::add_solver_expression(std::make_shared<ExpressionEndSolve>(this->name(), status, 0));
215 return status;
216 }
217
218 vec_cor.convert(vec_cor.get_gate(), vec_cor_inner);
219 Statistics::add_solver_expression(std::make_shared<ExpressionEndSolve>(this->name(), Status::success, 0));
220 return Status::success;
221 }
222 }; // class ConvertPrecond<...>
223
233 template<typename LocalVectorOuter_, typename LocalVectorInner_, typename MirrorOuter_, typename MirrorInner_>
234 inline std::shared_ptr<ConvertPrecond<Global::Vector<LocalVectorOuter_, MirrorOuter_>, Global::Vector<LocalVectorInner_, MirrorInner_>>>
236 {
237 return std::make_shared<ConvertPrecond<Global::Vector<LocalVectorOuter_, MirrorOuter_>, Global::Vector<LocalVectorInner_, MirrorInner_>>>(inner_solver);
238 }
239 } // namespace Solver
240} // namespace FEAT
Global vector wrapper class template.
Definition: vector.hpp:68
const GateType * get_gate() const
Returns a const pointer to the internal gate of the vector.
Definition: vector.hpp:149
Vector clone(LAFEM::CloneMode mode=LAFEM::CloneMode::Weak) const
Creates and returns a clone of this global vector.
Definition: vector.hpp:270
virtual Status apply(VectorTypeOuter &vec_cor, const VectorTypeOuter &vec_def) override
Solver application method.
Solver conversion module.
virtual Status apply(VectorTypeOuter &vec_cor, const VectorTypeOuter &vec_def) override
Solver application method.
virtual String name() const override
Returns the name of the solver.
ConvertPrecond(std::shared_ptr< SolverTypeInner > inner_solver)
Constructor.
virtual void done_numeric() override
Numeric finalization method.
virtual void init_numeric() override
Numeric initialization method.
virtual void init_symbolic() override
Symbolic initialization method.
virtual void done_symbolic() override
Symbolic finalization method.
Polymorphic solver interface.
Definition: base.hpp:183
virtual void init_symbolic()
Symbolic initialization method.
Definition: base.hpp:227
virtual void init_numeric()
Numeric initialization method.
Definition: base.hpp:237
virtual void done_symbolic()
Symbolic finalization method.
Definition: base.hpp:255
virtual void done_numeric()
Numeric finalization method.
Definition: base.hpp:246
String class implementation.
Definition: string.hpp:47
bool status_success(Status status)
Status success check function.
Definition: base.hpp:108
std::shared_ptr< ConvertPrecond< VectorOuter_, VectorInner_ > > new_convert_precond(std::shared_ptr< SolverBase< VectorInner_ > > inner_solver)
Creates a new ConvertPrecond solver object.
Status
Solver status return codes enumeration.
Definition: base.hpp:47
@ success
solving successful (convergence criterion fulfilled)
FEAT namespace.
Definition: adjactor.hpp:12