Skip to content
Snippets Groups Projects
solverfactory.cc 1.78 KiB
Newer Older
podlesny's avatar
podlesny committed
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include <dune/solvers/common/wrapownshare.hh>
#include <dune/solvers/iterationsteps/blockgssteps.hh>
#include <dune/solvers/solvers/umfpacksolver.hh>

#include "solverfactory.hh"

#include "../utils/debugutils.hh"

template <class Functional, class BitVector>
SolverFactory<Functional, BitVector>::SolverFactory(
    const Dune::ParameterTree& parset,
    Functional& J,
    const BitVector& ignoreNodes) :
        parset_(parset),
        J_(Dune::Solvers::wrap_own_share<const Functional>(std::forward<Functional>(J))),
        ignoreNodes_(ignoreNodes)
{}

podlesny's avatar
podlesny committed
template <class Functional, class BitVector>
SolverFactory<Functional, BitVector>::SolverFactory(
    const Dune::ParameterTree& parset,
    std::shared_ptr<Functional> J,
    const BitVector& ignoreNodes) :
        parset_(parset),
        J_(Dune::Solvers::wrap_own_share<const Functional>(J)),
        ignoreNodes_(ignoreNodes)
{}

podlesny's avatar
podlesny committed
template <class Functional, class BitVector>
template <class LinearSolver>
void SolverFactory<Functional, BitVector>::build(std::shared_ptr<LinearSolver>& linearSolver) {
    nonlinearSmoother_ = std::make_shared<NonlinearSmoother>(*J_, dummyIterate_, LocalSolver());

    tnnmgStep_ = std::make_shared<Step>(*J_, dummyIterate_, nonlinearSmoother_, linearSolver, DefectProjection(), LineSearchSolver());
    tnnmgStep_->setPreSmoothingSteps(parset_.get<int>("main.pre"));
    tnnmgStep_->setIgnore(ignoreNodes_);
}

template <class Functional, class BitVector>
void SolverFactory<Functional, BitVector>::setProblem(Vector& x) {
    nonlinearSmoother_->setProblem(x);
    tnnmgStep_->setProblem(x);
}


template <class Functional, class BitVector>
auto SolverFactory<Functional, BitVector>::step()
-> std::shared_ptr<Step> {
    return tnnmgStep_;
}

#include "solverfactory_ex.cc"