Skip to content
Snippets Groups Projects
Forked from agnumpde / dune-tectonic
12 commits ahead of the upstream repository.
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
solverfactory.hh 2.07 KiB
#ifndef SRC_SPATIAL_SOLVING_SOLVERFACTORY_HH
#define SRC_SPATIAL_SOLVING_SOLVERFACTORY_HH

#include <dune/common/bitsetvector.hh>
#include <dune/common/parametertree.hh>

#include <dune/solvers/iterationsteps/multigridstep.hh>
#include <dune/solvers/iterationsteps/projectedblockgsstep.hh>
#include <dune/solvers/norms/energynorm.hh>
#include <dune/solvers/solvers/loopsolver.hh>
//#include <dune/solvers/transferoperators/compressedmultigridtransfer.hh>
//#include <dune/tnnmg/iterationsteps/genericnonlineargs.hh>
//#include <dune/tnnmg/iterationsteps/tnnmgstep.hh>

#include <dune/contact/assemblers/nbodyassembler.hh>

//#include <dune/contact/estimators/hierarchiccontactestimator.hh>
#include <dune/contact/solvers/nsnewtonmgstep.hh>
#include <dune/contact/solvers/contacttransfer.hh>
#include <dune/contact/solvers/contactobsrestrict.hh>
#include <dune/contact/solvers/contacttransferoperatorassembler.hh>
#include <dune/contact/solvers/nsnewtoncontacttransfer.hh>

#define USE_OLD_TNNMG //needed for old bisection.hh in tnnmg

template <class DeformedGridTEMPLATE, class MatrixType, class VectorType>
class SolverFactory {
//protected:
//  const size_t dim = DeformedGrid::dimension;

public:
  using Vector = VectorType;
  using Matrix = MatrixType;

  using DeformedGrid = DeformedGridTEMPLATE;

public:
  using Step = Dune::Contact::NonSmoothNewtonMGStep<Matrix, Vector>;

  SolverFactory(Dune::ParameterTree const &parset, const Dune::Contact::NBodyAssembler<DeformedGrid, Vector>& nBodyAssembler,
                const std::vector<Dune::BitSetVector<DeformedGrid::dimension>>& ignoreNodes);

  ~SolverFactory();

  std::shared_ptr<Step> getStep();

private:
  const Dune::Contact::NBodyAssembler<DeformedGrid, Vector>& nBodyAssembler_;

  ProjectedBlockGSStep<Matrix, Vector> baseSolverStep_;
  EnergyNorm<Matrix, Vector> baseEnergyNorm_;
  LoopSolver<Vector> baseSolver_;

  ProjectedBlockGSStep<Matrix, Vector> presmoother_;
  ProjectedBlockGSStep<Matrix, Vector> postsmoother_;
  std::shared_ptr<Step> multigridStep_;

  std::vector<Dune::Contact::ContactMGTransfer<Vector>* > transferOperators_;
};
#endif