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.