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>
65 inline std::ostream& operator<<(std::ostream& os,
Status status)
70 return os <<
"undefined";
72 return os <<
"progress";
74 return os <<
"success";
76 return os <<
"aborted";
78 return os <<
"diverged";
80 return os <<
"max-iter";
82 return os <<
"stagnated";
84 return os <<
"-unknown-";
181 template<
typename Vector_>
317 virtual Status apply(Vector_& vec_cor,
const Vector_& vec_def) = 0;
350 const Vector_& vec_rhs,
351 const Matrix_& matrix,
352 const Filter_& filter)
354 typedef typename Vector_::DataType DataType;
361 matrix.apply(vec_def, vec_sol, vec_rhs, -DataType(1));
364 filter.filter_def(vec_def);
371 filter.filter_cor(vec_cor);
374 vec_sol.axpy(vec_cor);
394 const String _solver_name;
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;
424 template<
typename Vector_>
426 _solver_name(solver.name()),
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;
466 XASSERTM(!_destroyed,
"IterationStats::destroy() was already called before!");
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));
#define XASSERTM(expr, msg)
Assertion macro definition with custom message.
A class organizing a tree of key-value pairs.
Invalid Matrix structure exception.
Helper class for iteration statistics collection.
~IterationStats()
Destructor.
void destroy()
destroy the objects contents (and generate Statistics::expression) before the actual destructor call
IterationStats(const SolverBase< Vector_ > &solver)
Constructor.
Singular Matrix exception.
Polymorphic solver interface.
virtual void init_symbolic()
Symbolic initialization method.
SolverBase(const String §ion_name, const PropertyMap *config_section)
Constructor using a PropertyMap.
virtual void init_numeric()
Numeric initialization method.
virtual ~SolverBase()
Virtual destructor.
virtual void done_symbolic()
Symbolic finalization method.
virtual void init()
Initialization method.
Vector_ VectorType
The type of vector this solver can be applied to.
virtual String name() const =0
Returns a descriptive string.
virtual void done()
Finalization method.
SolverBase()
Empty standard constructor.
virtual Status apply(Vector_ &vec_cor, const Vector_ &vec_def)=0
Solver application method.
virtual void done_numeric()
Numeric finalization method.
Base-class for solver generated exceptions.
String class implementation.
double elapsed_now() const
Calculates the time elapsed between the time stamp and now.
bool status_success(Status status)
Status success check function.
Status
Solver status return codes enumeration.
@ 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.