diff --git a/src/solverfactorytest.cc b/src/solverfactorytest.cc index 8fea0370ed5499f2ba1d24bb12178a3c0b8bd9c5..bbd7aeb09015b3d768a5724d391786d0b630805b 100644 --- a/src/solverfactorytest.cc +++ b/src/solverfactorytest.cc @@ -164,7 +164,7 @@ void solveProblem(const ContactNetwork& contactNetwork, using Step = Dune::TNNMG::TNNMGStep<ContactFunctional, BitVector, Linearization, DefectProjection, LocalSolver, ContactNetwork>; // set multigrid solver - auto smoother = TruncatedBlockGSStep<Matrix, Vector>{}; + auto smoother = TruncatedBlockGSStep<Matrix, Vector>(); using TransferOperator = NBodyContactTransfer<ContactNetwork, Vector>; using TransferOperators = std::vector<std::shared_ptr<TransferOperator>>; @@ -284,7 +284,7 @@ void solveProblem(const ContactNetwork& contactNetwork, //Norm mgNorm(*linearMultigridStep); //auto mgSolver = std::make_shared<Solver>(linearMultigridStep, parset.get<size_t>("solver.tnnmg.linear.maximumIterations"), parset.get<double>("solver.tnnmg.linear.tolerance"), mgNorm, Solver::QUIET); Norm mgNorm(*cgStep); - auto mgSolver = std::make_shared<Solver>(cgStep, parset.get<size_t>("solver.tnnmg.linear.maximumIterations"), parset.get<double>("solver.tnnmg.linear.tolerance"), mgNorm, Solver::QUIET); + auto mgSolver = std::make_shared<Solver>(cgStep, parset.get<int>("solver.tnnmg.main.multi"), parset.get<double>("solver.tnnmg.linear.tolerance"), mgNorm, Solver::QUIET); using Factory = SolverFactory<MyFunctional, BitVector, ContactNetwork>; Factory factory(parset.sub("solver.tnnmg"), J, *mgSolver, ignore, contactNetwork); diff --git a/src/spatial-solving/preconditioners/levelpatchpreconditioner.hh b/src/spatial-solving/preconditioners/levelpatchpreconditioner.hh index 5713677a32d0c18776cc3c442259830881f536c0..6135de9c97dab8a8e4d575718cc54f67f1af10ed 100644 --- a/src/spatial-solving/preconditioners/levelpatchpreconditioner.hh +++ b/src/spatial-solving/preconditioners/levelpatchpreconditioner.hh @@ -184,38 +184,39 @@ class LevelPatchPreconditioner : public LinearIterationStep<MatrixType, VectorTy for (const auto& p : patches_) { x = 0; - /* + auto ignore = this->ignore(); + for (size_t i=0; i<ignore.size(); i++) { + for (size_t d=0; d<dim; d++) { + if (p[i][d]) + ignore[i][d] = true; + } + } + auto& step = patchSolver_->getIterationStep(); dynamic_cast<LinearIterationStep<MatrixType, VectorType>&>(step).setProblem(*this->mat_, x, *this->rhs_); - step.setIgnore(p); + step.setIgnore(ignore); patchSolver_->check(); patchSolver_->preprocess(); patchSolver_->solve(); - *(this->x_) += step.getSol();*/ + *(this->x_) += x; + - auto ignore = this->ignore(); - for (size_t i=0; i<ignore.size(); i++) { - for (size_t d=0; d<dim; d++) { - if (p[i][d]) - ignore[i][d] = true; - } - } - LocalProblem<MatrixType, VectorType> localProblem(*this->mat_, *this->rhs_, ignore); + /*LocalProblem<MatrixType, VectorType> localProblem(*this->mat_, *this->rhs_, ignore); Vector newR; - localProblem.getLocalRhs(x, newR); + localProblem.getLocalRhs(x, newR); */ /*print(ignore, "ignore:"); print(*this->mat_, "Mat:"); print(localProblem.getMat(), "localMat:");*/ - patchSolver_->setProblem(localProblem.getMat(), x, newR); + /*patchSolver_->setProblem(localProblem.getMat(), x, newR); patchSolver_->preprocess(); patchSolver_->solve(); - *(this->x_) += x; + *(this->x_) += x;*/ } } diff --git a/src/spatial-solving/preconditioners/multilevelpatchpreconditioner.hh b/src/spatial-solving/preconditioners/multilevelpatchpreconditioner.hh index 0ae5bfeccc6ae2d7eaf1566a3adf1775a3b901b5..1b75e51e3f30ef7546010ef630f23eea543850a0 100644 --- a/src/spatial-solving/preconditioners/multilevelpatchpreconditioner.hh +++ b/src/spatial-solving/preconditioners/multilevelpatchpreconditioner.hh @@ -15,6 +15,7 @@ //#include <dune/solvers/iterationsteps/blockgsstep.hh> #include <dune/solvers/iterationsteps/cgstep.hh> #include <dune/solvers/iterationsteps/lineariterationstep.hh> +#include <dune/solvers/iterationsteps/truncatedblockgsstep.hh> #include "nbodycontacttransfer.hh" #include "levelpatchpreconditioner.hh" @@ -29,8 +30,8 @@ class MultilevelPatchPreconditioner : public LinearIterationStep<MatrixType, Vec private: using Base = LinearIterationStep<MatrixType, VectorType>; - //using PatchSolver = typename Dune::Solvers::LoopSolver<Vector, BitVector>; - using PatchSolver = Dune::Solvers::UMFPackSolver<MatrixType, VectorType>; + using PatchSolver = typename Dune::Solvers::LoopSolver<Vector, BitVector>; + //using PatchSolver = Dune::Solvers::UMFPackSolver<MatrixType, VectorType>; using LevelContactNetwork = typename ContactNetwork::LevelContactNetwork; using LevelPatchPreconditioner = LevelPatchPreconditioner<LevelContactNetwork, PatchSolver, MatrixType, VectorType>; @@ -104,27 +105,27 @@ class MultilevelPatchPreconditioner : public LinearIterationStep<MatrixType, Vec levelItSteps_.resize(size()); levelErrorNorms_.resize(size()); //auto coarseStep = - levelItSteps_[0] = Dune::Solvers::BlockGSStepFactory<MatrixType, VectorType>::createPtr(Dune::Solvers::BlockGS::LocalSolvers::direct(0.0)); + levelItSteps_[0] = std::make_shared<TruncatedBlockGSStep<MatrixType, VectorType>>();//Dune::Solvers::BlockGSStepFactory<MatrixType, VectorType>::createPtr(Dune::Solvers::BlockGS::LocalSolvers::direct(0.0)); levelErrorNorms_[0] = std::make_shared<EnergyNorm<MatrixType, VectorType>>(*levelItSteps_[0].get()); - levelSolvers_[0] = /*std::make_shared<PatchSolver>(*levelItSteps_[0].get(), + levelSolvers_[0] = std::make_shared<PatchSolver>(*levelItSteps_[0].get(), parset.get<size_t>("maximumIterations"), parset.get<double>("tolerance"), *levelErrorNorms_[0].get(), parset.get<Solver::VerbosityMode>("verbosity"), - false); // absolute error */ - std::make_shared<PatchSolver>(); + false); // absolute error + //std::make_shared<PatchSolver>(); for (size_t i=1; i<levelSolvers_.size(); i++) { //auto gsStep = Dune::Solvers::BlockGSStepFactory<MatrixType, VectorType>::create(Dune::Solvers::BlockGS::LocalSolvers::direct(0.0)); - levelItSteps_[i] = Dune::Solvers::BlockGSStepFactory<MatrixType, VectorType>::createPtr(Dune::Solvers::BlockGS::LocalSolvers::direct(0.0)); + levelItSteps_[i] = std::make_shared<TruncatedBlockGSStep<MatrixType, VectorType>>(); //Dune::Solvers::BlockGSStepFactory<MatrixType, VectorType>::createPtr(Dune::Solvers::BlockGS::LocalSolvers::direct(0.0)); levelErrorNorms_[i] = std::make_shared<EnergyNorm<MatrixType, VectorType>>(*levelItSteps_[i].get()); - levelSolvers_[i] = /*std::make_shared<PatchSolver>(*levelItSteps_[i].get(), + levelSolvers_[i] = std::make_shared<PatchSolver>(*levelItSteps_[i].get(), parset.get<size_t>("maximumIterations"), parset.get<double>("tolerance"), *levelErrorNorms_[i].get(), parset.get<Solver::VerbosityMode>("verbosity"), - false); // absolute error*/ - std::make_shared<PatchSolver>(); + false); // absolute error + //std::make_shared<PatchSolver>(); levelPatchPreconditioners_[i]->setPatchSolver(levelSolvers_[i]); } @@ -257,11 +258,6 @@ class MultilevelPatchPreconditioner : public LinearIterationStep<MatrixType, Vec for (int i=levelPatchPreconditioners_.size()-2; i>0; i--) { const auto& transfer = *mgTransfer_[i]; - /*print(levelX_[i+1], "levelX_:"); - print(levelX_[i], "levelX_:"); - print(levelRhs_[i+1], "levelRhs_:"); - print(levelRhs_[i], "levelRhs_:");*/ - transfer.restrict(levelX_[i+1], levelX_[i]); transfer.restrict(levelRhs_[i+1], levelRhs_[i]); } @@ -279,16 +275,13 @@ class MultilevelPatchPreconditioner : public LinearIterationStep<MatrixType, Vec } void iterateAdd() { - //print(this->ignore(), "ignore: "); - *(this->x_) = 0; VectorType x; - /* // solve coarse global problem auto& coarseSolver = levelSolvers_[0]; - //coarseSolver->getIterationStep().setIgnore(ignoreHierarchy_[0]); + coarseSolver->getIterationStep().setIgnore(ignoreHierarchy_[0]); dynamic_cast<LinearIterationStep<MatrixType, VectorType>&>(levelSolvers_[0]->getIterationStep()).setProblem(levelMat_[0], levelX_[0], levelRhs_[0]); @@ -296,10 +289,10 @@ class MultilevelPatchPreconditioner : public LinearIterationStep<MatrixType, Vec coarseSolver->preprocess(); coarseSolver->solve(); - mgTransfer_[0]->prolong(coarseSolver->getIterationStep().getSol(), x); */ + mgTransfer_[0]->prolong(levelX_[0], x); - BitVector emptyIgnore0(levelX_[0].size(), false); + /* BitVector emptyIgnore0(levelX_[0].size(), false); LocalProblem<MatrixType, VectorType> localProblem(levelMat_[0], levelRhs_[0], ignoreHierarchy_[0]); Vector newR; localProblem.getLocalRhs(levelX_[0], newR); @@ -309,7 +302,7 @@ class MultilevelPatchPreconditioner : public LinearIterationStep<MatrixType, Vec coarseSolver->preprocess(); coarseSolver->solve(); - mgTransfer_[0]->prolong(levelX_[0], x); + mgTransfer_[0]->prolong(levelX_[0], x);*/ //print(levelX_[0], "MultilevelPatchPreconditioner: levelX_[0]"); //print(x, "MultilevelPatchPreconditioner: x0");