FEAT 3
Finite Element Analysis Toolbox
Loading...
Searching...
No Matches
base.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
10#include <kernel/lafem/dense_vector.hpp>
13#include <kernel/util/math.hpp>
14#include <kernel/util/property_map.hpp>
15#include <kernel/util/string.hpp>
16
17// includes, system
18#include <memory>
19
20namespace FEAT
21{
25 namespace Solver
26 {
28
35 namespace Intern
36 {
37 } // namespace Intern
39
46 enum class Status
47 {
49 undefined = 0,
53 success,
55 aborted,
62 };
63
65 inline std::ostream& operator<<(std::ostream& os, Status status)
66 {
67 switch(status)
68 {
70 return os << "undefined";
72 return os << "progress";
73 case Status::success:
74 return os << "success";
75 case Status::aborted:
76 return os << "aborted";
78 return os << "diverged";
80 return os << "max-iter";
82 return os << "stagnated";
83 default:
84 return os << "-unknown-";
85 }
86 }
88
108 inline bool status_success(Status status)
109 {
110 switch(status)
111 {
112 case Status::success:
113 case Status::max_iter:
115 return true;
116
117 default:
118 return false;
119 }
120 }
121
126 public Exception
127 {
128 public:
129 explicit SolverException(const String& msg) :
130 Exception(msg)
131 {
132 }
133 };
134
142 public SolverException
143 {
144 public:
145 explicit InvalidMatrixStructureException(const String& msg = "invalid matrix structure") :
146 SolverException(msg)
147 {
148 }
149 };
150
158 public SolverException
159 {
160 public:
161 explicit SingularMatrixException(const String& msg = "singular matrix") :
162 SolverException(msg)
163 {
164 }
165 };
166
181 template<typename Vector_>
183 {
184 public:
186 typedef Vector_ VectorType;
187
188 public:
193 {
194 }
195
211 explicit SolverBase(const String& DOXY(section_name), const PropertyMap* DOXY(config_section))
212 {
213 }
214
218 virtual ~SolverBase()
219 {
220 }
221
227 virtual void init_symbolic()
228 {
229 }
230
237 virtual void init_numeric()
238 {
239 }
240
246 virtual void done_numeric()
247 {
248 }
249
255 virtual void done_symbolic()
256 {
257 }
258
268 virtual void init()
269 {
271 init_numeric();
272 }
273
283 virtual void done()
284 {
285 done_numeric();
287 }
288
294 virtual String name() const = 0;
295
317 virtual Status apply(Vector_& vec_cor, const Vector_& vec_def) = 0;
318 }; // class SolverBase<...>
319
343 template<
344 typename Vector_,
345 typename Matrix_,
346 typename Filter_>
347 inline Status solve(
348 SolverBase<Vector_>& solver,
349 Vector_& vec_sol,
350 const Vector_& vec_rhs,
351 const Matrix_& matrix,
352 const Filter_& filter)
353 {
354 typedef typename Vector_::DataType DataType;
355
356 // create two temporary vectors
357 Vector_ vec_def(vec_rhs.clone(LAFEM::CloneMode::Layout));
358 Vector_ vec_cor(vec_sol.clone(LAFEM::CloneMode::Layout));
359
360 // compute defect
361 matrix.apply(vec_def, vec_sol, vec_rhs, -DataType(1));
362
363 // apply defect filter
364 filter.filter_def(vec_def);
365
366 // apply solver
367 Status status = solver.apply(vec_cor, vec_def);
368 if(status_success(status))
369 {
370 // apply correction filter
371 filter.filter_cor(vec_cor);
372
373 // update solution
374 vec_sol.axpy(vec_cor);
375 }
376
377 // return status
378 return status;
379 }
380
392 {
393 private:
394 const String _solver_name;
395 TimeStamp _at;
396 double _mpi_execute_reduction_start;
397 double _mpi_execute_reduction_stop;
398 double _mpi_execute_blas2_start;
399 double _mpi_execute_blas2_stop;
400 double _mpi_execute_blas3_start;
401 double _mpi_execute_blas3_stop;
402 double _mpi_execute_collective_start;
403 double _mpi_execute_collective_stop;
404 double _mpi_wait_start_reduction;
405 double _mpi_wait_start_blas2;
406 double _mpi_wait_start_blas3;
407 double _mpi_wait_start_collective;
408 double _mpi_wait_stop_reduction;
409 double _mpi_wait_stop_blas2;
410 double _mpi_wait_stop_blas3;
411 double _mpi_wait_stop_collective;
412 bool _destroyed;
413
414 public:
424 template<typename Vector_>
425 explicit IterationStats(const SolverBase<Vector_>& solver) :
426 _solver_name(solver.name()),
427 _destroyed(false)
428 {
429 _mpi_execute_reduction_start = Statistics::get_time_mpi_execute_reduction();
430 _mpi_execute_blas2_start = Statistics::get_time_mpi_execute_blas2();
431 _mpi_execute_blas3_start = Statistics::get_time_mpi_execute_blas3();
432 _mpi_execute_collective_start = Statistics::get_time_mpi_execute_collective();
433 _mpi_wait_start_reduction = Statistics::get_time_mpi_wait_reduction();
434 _mpi_wait_start_blas2 = Statistics::get_time_mpi_wait_blas2();
435 _mpi_wait_start_blas3 = Statistics::get_time_mpi_wait_blas3();
436 _mpi_wait_start_collective = Statistics::get_time_mpi_wait_collective();
437 _mpi_execute_reduction_stop = _mpi_execute_reduction_start;
438 _mpi_execute_blas2_stop = _mpi_execute_blas2_start;
439 _mpi_execute_blas3_stop = _mpi_execute_blas3_start;
440 _mpi_execute_collective_stop = _mpi_execute_collective_start;
441 _mpi_wait_stop_reduction = _mpi_wait_start_reduction;
442 _mpi_wait_stop_blas2 = _mpi_wait_start_blas2;
443 _mpi_wait_stop_blas3 = _mpi_wait_start_blas3;
444 _mpi_wait_stop_collective = _mpi_wait_start_collective;
445 }
446
447 // delete copy-ctor and assign operator
448 IterationStats(const IterationStats&) = delete;
449 IterationStats& operator=(const IterationStats&) = delete;
450
458 {
459 if (!_destroyed)
460 destroy();
461 }
462
464 void destroy()
465 {
466 XASSERTM(!_destroyed, "IterationStats::destroy() was already called before!");
467
468 _mpi_execute_reduction_stop = Statistics::get_time_mpi_execute_reduction();
469 _mpi_execute_blas2_stop = Statistics::get_time_mpi_execute_blas2();
470 _mpi_execute_blas3_stop = Statistics::get_time_mpi_execute_blas3();
471 _mpi_execute_collective_stop = Statistics::get_time_mpi_execute_collective();
472 _mpi_wait_stop_reduction = Statistics::get_time_mpi_wait_reduction();
473 _mpi_wait_stop_blas2 = Statistics::get_time_mpi_wait_blas2();
474 _mpi_wait_stop_blas3 = Statistics::get_time_mpi_wait_blas3();
475 _mpi_wait_stop_collective = Statistics::get_time_mpi_wait_collective();
476 Statistics::add_solver_expression(std::make_shared<ExpressionTimings>(_solver_name, _at.elapsed_now(),
477 _mpi_execute_reduction_stop - _mpi_execute_reduction_start,
478 _mpi_execute_blas2_stop - _mpi_execute_blas2_start,
479 _mpi_execute_blas3_stop - _mpi_execute_blas3_start,
480 _mpi_execute_collective_stop - _mpi_execute_collective_start,
481 _mpi_wait_stop_reduction - _mpi_wait_start_reduction,
482 _mpi_wait_stop_blas2 - _mpi_wait_start_blas2,
483 _mpi_wait_stop_blas3 - _mpi_wait_start_blas3,
484 _mpi_wait_stop_collective - _mpi_wait_start_collective));
485
486 _destroyed = true;
487 }
488 }; // class IterationStats
489 } // namespace Solver
490} // namespace FEAT
#define XASSERTM(expr, msg)
Assertion macro definition with custom message.
Definition: assertion.hpp:263
FEAT Kernel base header.
Base exception class.
Definition: exception.hpp:27
A class organizing a tree of key-value pairs.
Invalid Matrix structure exception.
Definition: base.hpp:143
Helper class for iteration statistics collection.
Definition: base.hpp:392
~IterationStats()
Destructor.
Definition: base.hpp:457
void destroy()
destroy the objects contents (and generate Statistics::expression) before the actual destructor call
Definition: base.hpp:464
IterationStats(const SolverBase< Vector_ > &solver)
Constructor.
Definition: base.hpp:425
Singular Matrix exception.
Definition: base.hpp:159
Polymorphic solver interface.
Definition: base.hpp:183
virtual void init_symbolic()
Symbolic initialization method.
Definition: base.hpp:227
SolverBase(const String &section_name, const PropertyMap *config_section)
Constructor using a PropertyMap.
Definition: base.hpp:211
virtual void init_numeric()
Numeric initialization method.
Definition: base.hpp:237
virtual ~SolverBase()
Virtual destructor.
Definition: base.hpp:218
virtual void done_symbolic()
Symbolic finalization method.
Definition: base.hpp:255
virtual void init()
Initialization method.
Definition: base.hpp:268
Vector_ VectorType
The type of vector this solver can be applied to.
Definition: base.hpp:186
virtual String name() const =0
Returns a descriptive string.
virtual void done()
Finalization method.
Definition: base.hpp:283
SolverBase()
Empty standard constructor.
Definition: base.hpp:192
virtual Status apply(Vector_ &vec_cor, const Vector_ &vec_def)=0
Solver application method.
virtual void done_numeric()
Numeric finalization method.
Definition: base.hpp:246
Base-class for solver generated exceptions.
Definition: base.hpp:127
String class implementation.
Definition: string.hpp:46
Time stamp class.
Definition: time_stamp.hpp:54
double elapsed_now() const
Calculates the time elapsed between the time stamp and now.
Definition: time_stamp.hpp:121
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)
@ progress
continue iteration (internal use only)
@ undefined
undefined status
@ stagnated
solver stagnated (stagnation criterion fulfilled)
@ max_iter
solver reached maximum iterations
@ diverged
solver diverged (divergence criterion fulfilled)
@ aborted
premature abort (solver aborted due to internal errors or preconditioner failure)
Status solve(SolverBase< Vector_ > &solver, Vector_ &vec_sol, const Vector_ &vec_rhs, const Matrix_ &matrix, const Filter_ &filter)
Solve linear system with initial solution guess.
Definition: base.hpp:347
FEAT namespace.
Definition: adjactor.hpp:12