FEAT 3
Finite Element Analysis Toolbox
Loading...
Searching...
No Matches
schwarz_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#include <kernel/global/vector.hpp>
10#include <kernel/global/filter.hpp>
11
12namespace FEAT
13{
14 namespace Solver
15 {
28 template<typename Vector_, typename Filter_>
30
51 template<typename LocalVector_, typename LocalFilter_, typename Mirror_>
52 class SchwarzPrecond<Global::Vector<LocalVector_, Mirror_>, Global::Filter<LocalFilter_, Mirror_>> :
53 public SolverBase<Global::Vector<LocalVector_, Mirror_>>
54 {
55 public:
57 typedef LocalVector_ LocalVectorType;
64
67
68 protected:
70 std::shared_ptr<LocalSolverType> _local_solver;
75
76 public:
89 explicit SchwarzPrecond(std::shared_ptr<LocalSolverType> local_solver, const GlobalFilterType& filter, bool ignore_status = false) :
90 _local_solver(local_solver),
91 _filter(filter),
92 _ignore_status(ignore_status)
93 {
94 }
95
111 explicit SchwarzPrecond(const String& section_name, const PropertyMap* section,
112 std::shared_ptr<LocalSolverType> local_solver, const GlobalFilterType& filter) :
113 BaseClass(section_name, section),
114 _local_solver(local_solver),
115 _filter(filter),
116 _ignore_status(false)
117 {
118 auto ignore_status_p = section->query("ignore_status");
119 if(ignore_status_p.second)
120 {
121 if(ignore_status_p.first.is_one_of("yes true"))
122 this->_ignore_status = true;
123 else if(ignore_status_p.first.is_one_of("no false"))
124 this->_ignore_status = false;
125 else
126 throw ParseError(section_name + ".ignore_status", ignore_status_p.first, "yes/no or true/false");
127 }
128 }
129
131 virtual String name() const override
132 {
133 return "Schwarz";
134 }
135
136 void set_ignore_status(bool ignore_status)
137 {
138 this->_ignore_status = ignore_status;
139 }
140
141 virtual void init_symbolic() override
142 {
143 _local_solver->init_symbolic();
144 }
145
146 virtual void init_numeric() override
147 {
148 _local_solver->init_numeric();
149 }
150
151 virtual void done_numeric() override
152 {
153 _local_solver->done_numeric();
154 }
155
156 virtual void done_symbolic() override
157 {
158 _local_solver->done_symbolic();
159 }
160
161 virtual Status apply(GlobalVectorType& vec_cor, const GlobalVectorType& vec_def) override
162 {
163 Statistics::add_solver_expression(std::make_shared<ExpressionStartSolve>(this->name()));
164
165 // apply local solver
166 Statistics::add_solver_expression(std::make_shared<ExpressionCallPrecond>(this->name(), this->_local_solver->name()));
167 Status status = _local_solver->apply(vec_cor.local(), vec_def.local());
168
169 // ignore or synchronize status codes?
170 if(this->_ignore_status)
171 status = Status::success;
172 else
173 {
174 // synchronize local status over communicator to obtain
175 // a consistent status code on all processes
176 const Dist::Comm* comm = vec_cor.get_comm();
177 if(comm != nullptr)
178 {
179 // local status: 0: success, 1: failure
180 int lstat = (status_success(status) ? 0 : 1);
181 int gstat = -1;
182
183 // sum up over all processes:
184 comm->allreduce(&lstat, &gstat, std::size_t(1), Dist::op_sum);
185 XASSERT(gstat >= 0);
186
187 // if all processes succeeded, the sum will also be 0
188 // if the sum is > 0, then at least one process failed,
189 // so the global status will also be failure
190 status = (gstat == 0 ? Status::success : Status::aborted);
191 }
192 }
193
194 // did all processes succeed?
195 if(status == Status::success)
196 {
197 // synchronize correction vector
198 vec_cor.sync_1();
199
200 // apply filter
201 _filter.filter_cor(vec_cor);
202 }
203
204 // okay
205 Statistics::add_solver_expression(std::make_shared<ExpressionEndSolve>(this->name(), status, 0));
206 return status;
207 }
208 }; // class SchwarzPrecond<...>
209
222 template<typename LocalFilter_, typename Mirror_>
223 inline std::shared_ptr<SchwarzPrecond<Global::Vector<typename LocalFilter_::VectorType, Mirror_>, Global::Filter<LocalFilter_, Mirror_>>> new_schwarz_precond(
224 std::shared_ptr<SolverBase<typename LocalFilter_::VectorType>> local_solver,
226 {
227 return std::make_shared<SchwarzPrecond<Global::Vector<typename LocalFilter_::VectorType, Mirror_>, Global::Filter<LocalFilter_, Mirror_>>>
228 (local_solver, filter);
229 }
230
249 template<typename LocalFilter_, typename Mirror_>
250 inline std::shared_ptr
251 <
252 SchwarzPrecond
253 <
256 >
257 >
259 const String& section_name, const PropertyMap* section,
260 std::shared_ptr<SolverBase<typename LocalFilter_::VectorType>> local_solver,
262 {
263 return std::make_shared<SchwarzPrecond<Global::Vector<typename LocalFilter_::VectorType, Mirror_>, Global::Filter<LocalFilter_, Mirror_>>>
264 (section_name, section, local_solver, filter);
265 }
266 } // namespace Solver
267} // namespace FEAT
#define XASSERT(expr)
Assertion macro definition.
Definition: assertion.hpp:262
Communicator class.
Definition: dist.hpp:1349
void allreduce(const void *sendbuf, void *recvbuf, std::size_t count, const Datatype &datatype, const Operation &op) const
Blocking All-Reduce.
Definition: dist.cpp:655
Global Filter wrapper class template.
Definition: filter.hpp:21
Global vector wrapper class template.
Definition: vector.hpp:68
void sync_1()
Performs a type-1 synchronization of the vector, i.e. averages all local DOF contributions.
Definition: vector.hpp:220
const Dist::Comm * get_comm() const
Returns a const pointer to the internal communicator of the gate of the vector.
Definition: vector.hpp:158
LocalVector_ & local()
Returns a reference to the internal local LAFEM vector object.
Definition: vector.hpp:121
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.
SchwarzPrecond(const String &section_name, const PropertyMap *section, std::shared_ptr< LocalSolverType > local_solver, const GlobalFilterType &filter)
Constructor using a PropertyMap.
SchwarzPrecond(std::shared_ptr< LocalSolverType > local_solver, const GlobalFilterType &filter, bool ignore_status=false)
Constructor.
virtual Status apply(GlobalVectorType &vec_cor, const GlobalVectorType &vec_def) override
Solver application method.
Schwarz preconditioner class template declaration.
Polymorphic solver interface.
Definition: base.hpp:183
String class implementation.
Definition: string.hpp:46
const Operation op_sum(MPI_SUM)
Operation wrapper for MPI_SUM.
Definition: dist.hpp:271
bool status_success(Status status)
Status success check function.
Definition: base.hpp:108
Status
Solver status return codes enumeration.
Definition: base.hpp:47
@ success
solving successful (convergence criterion fulfilled)
@ aborted
premature abort (solver aborted due to internal errors or preconditioner failure)
std::shared_ptr< SchwarzPrecond< Global::Vector< typename LocalFilter_::VectorType, Mirror_ >, Global::Filter< LocalFilter_, Mirror_ > > > new_schwarz_precond(std::shared_ptr< SolverBase< typename LocalFilter_::VectorType > > local_solver, const Global::Filter< LocalFilter_, Mirror_ > &filter)
Creates a new SchwarzPrecond solver object.
FEAT namespace.
Definition: adjactor.hpp:12