Skip to content
Snippets Groups Projects
fixedpointiterator.hh 1.63 KiB
Newer Older
#ifndef SRC_FIXEDPOINTITERATOR_HH
#define SRC_FIXEDPOINTITERATOR_HH

#include <memory>

#include <dune/common/parametertree.hh>

#include <dune/solvers/norms/norm.hh>
#include <dune/solvers/solvers/solver.hh>

struct FixedPointIterationCounter {
  size_t iterations;
  size_t multigridIterations;
};

std::ostream &operator<<(std::ostream &stream,
                         FixedPointIterationCounter const &fpic);

template <class Factory, class StateUpdater, class VelocityUpdater,
          class ErrorNorm>
class FixedPointIterator {
  using ScalarVector = typename StateUpdater::ScalarVector;
  using Vector = typename Factory::Vector;
  using Matrix = typename Factory::Matrix;
  using ConvexProblem = typename Factory::ConvexProblem;
  using BlockProblem = typename Factory::BlockProblem;
  using Nonlinearity = typename ConvexProblem::NonlinearityType;

public:
  FixedPointIterator(Factory &factory, Dune::ParameterTree const &parset,
                     std::shared_ptr<Nonlinearity> globalFriction,
                     ErrorNorm const &errorNorm_);
  FixedPointIterationCounter run(
      std::shared_ptr<StateUpdater> stateUpdater,
      std::shared_ptr<VelocityUpdater> velocityUpdater,
      Matrix const &velocityMatrix, Vector const &velocityRHS,
      Vector &velocityIterate);
  std::shared_ptr<typename Factory::Step> step_;
  Dune::ParameterTree const &parset_;
  std::shared_ptr<Nonlinearity> globalFriction_;

  size_t fixedPointMaxIterations_;
  double fixedPointTolerance_;
  double lambda_;
  size_t velocityMaxIterations_;
  double velocityTolerance_;
  Solver::VerbosityMode verbosity_;
  ErrorNorm const &errorNorm_;