Skip to content
Snippets Groups Projects
Commit 1862b924 authored by podlesny's avatar podlesny
Browse files

.

parent b6090dfb
No related branches found
No related tags found
No related merge requests found
...@@ -24,14 +24,12 @@ ...@@ -24,14 +24,12 @@
template <class ContactNetwork, class MatrixType, class VectorType> template <class ContactNetwork, class MatrixType, class VectorType>
class MultilevelPatchPreconditioner : public LinearIterationStep<MatrixType, VectorType> { class MultilevelPatchPreconditioner : public LinearIterationStep<MatrixType, VectorType> {
public:
//struct Mode { enum ModeType {additive, multiplicative}; };
private: private:
using Base = LinearIterationStep<MatrixType, VectorType>; using Base = LinearIterationStep<MatrixType, VectorType>;
using PatchSolver = typename Dune::Solvers::LoopSolver<Vector, BitVector>; using PatchSolver = LoopSolver<Vector, BitVector>;
//using PatchSolver = Dune::Solvers::UMFPackSolver<MatrixType, VectorType>; using PatchSolverStep = TruncatedBlockGSStep<MatrixType, VectorType>;
using CoarseSolver = Dune::Solvers::UMFPackSolver<MatrixType, VectorType>;
using LevelContactNetwork = typename ContactNetwork::LevelContactNetwork; using LevelContactNetwork = typename ContactNetwork::LevelContactNetwork;
using LevelPatchPreconditioner = LevelPatchPreconditioner<LevelContactNetwork, PatchSolver, MatrixType, VectorType>; using LevelPatchPreconditioner = LevelPatchPreconditioner<LevelContactNetwork, PatchSolver, MatrixType, VectorType>;
...@@ -57,10 +55,10 @@ class MultilevelPatchPreconditioner : public LinearIterationStep<MatrixType, Vec ...@@ -57,10 +55,10 @@ class MultilevelPatchPreconditioner : public LinearIterationStep<MatrixType, Vec
std::vector<std::shared_ptr<EnergyNorm<MatrixType, VectorType>>> levelErrorNorms_; std::vector<std::shared_ptr<EnergyNorm<MatrixType, VectorType>>> levelErrorNorms_;
std::vector<std::shared_ptr<LinearIterationStep<MatrixType, VectorType>>> levelItSteps_; std::vector<std::shared_ptr<LinearIterationStep<MatrixType, VectorType>>> levelItSteps_;
std::vector<std::shared_ptr<PatchSolver>> levelSolvers_; std::vector<std::shared_ptr<PatchSolver>> levelSolvers_;
CoarseSolver coarseSolver_;
std::vector<BitVector> recompute_; //std::vector<BitVector> recompute_;
//std::vector<BitVector> truncation_; std::vector<std::shared_ptr<MGTransfer>> mgTransfer_;
std::vector<std::shared_ptr<MGTransfer>> mgTransfer_; //TODO
public: public:
MultilevelPatchPreconditioner(const Dune::ParameterTree& parset, MultilevelPatchPreconditioner(const Dune::ParameterTree& parset,
...@@ -84,8 +82,6 @@ class MultilevelPatchPreconditioner : public LinearIterationStep<MatrixType, Vec ...@@ -84,8 +82,6 @@ class MultilevelPatchPreconditioner : public LinearIterationStep<MatrixType, Vec
} }
} }
const int coarsestLevel = maxLevel;
for (size_t i=maxLevel+1; i<activeLevels_.size(); i++) { for (size_t i=maxLevel+1; i<activeLevels_.size(); i++) {
if (activeLevels_[i][0]) { if (activeLevels_[i][0]) {
// init local patch preconditioners on each level // init local patch preconditioners on each level
...@@ -104,16 +100,6 @@ class MultilevelPatchPreconditioner : public LinearIterationStep<MatrixType, Vec ...@@ -104,16 +100,6 @@ class MultilevelPatchPreconditioner : public LinearIterationStep<MatrixType, Vec
levelSolvers_.resize(size()); levelSolvers_.resize(size());
levelItSteps_.resize(size()); levelItSteps_.resize(size());
levelErrorNorms_.resize(size()); levelErrorNorms_.resize(size());
//auto coarseStep =
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(),
parset.get<size_t>("maximumIterations"),
parset.get<double>("tolerance"),
*levelErrorNorms_[0].get(),
parset.get<Solver::VerbosityMode>("verbosity"),
false); // absolute error
//std::make_shared<PatchSolver>();
for (size_t i=1; i<levelSolvers_.size(); i++) { for (size_t i=1; i<levelSolvers_.size(); i++) {
//auto gsStep = Dune::Solvers::BlockGSStepFactory<MatrixType, VectorType>::create(Dune::Solvers::BlockGS::LocalSolvers::direct(0.0)); //auto gsStep = Dune::Solvers::BlockGSStepFactory<MatrixType, VectorType>::create(Dune::Solvers::BlockGS::LocalSolvers::direct(0.0));
...@@ -123,13 +109,10 @@ class MultilevelPatchPreconditioner : public LinearIterationStep<MatrixType, Vec ...@@ -123,13 +109,10 @@ class MultilevelPatchPreconditioner : public LinearIterationStep<MatrixType, Vec
parset.get<size_t>("maximumIterations"), parset.get<size_t>("maximumIterations"),
parset.get<double>("tolerance"), parset.get<double>("tolerance"),
*levelErrorNorms_[i].get(), *levelErrorNorms_[i].get(),
parset.get<Solver::VerbosityMode>("verbosity"), parset.get<Solver::VerbosityMode>("verbosity"));
false); // absolute error
//std::make_shared<PatchSolver>();
levelPatchPreconditioners_[i]->setPatchSolver(levelSolvers_[i]); levelPatchPreconditioners_[i]->setPatchSolver(levelSolvers_[i]);
} }
// init multigrid transfer // init multigrid transfer
mgTransfer_.resize(levelPatchPreconditioners_.size()-1); mgTransfer_.resize(levelPatchPreconditioners_.size()-1);
for (size_t i=0; i<mgTransfer_.size(); i++) { for (size_t i=0; i<mgTransfer_.size(); i++) {
...@@ -137,19 +120,23 @@ class MultilevelPatchPreconditioner : public LinearIterationStep<MatrixType, Vec ...@@ -137,19 +120,23 @@ class MultilevelPatchPreconditioner : public LinearIterationStep<MatrixType, Vec
mgTransfer_[i]->setup(contactNetwork_, levelPatchPreconditioners_[i+1]->level(), levelPatchPreconditioners_[i+1]->fineLevel()); mgTransfer_[i]->setup(contactNetwork_, levelPatchPreconditioners_[i+1]->level(), levelPatchPreconditioners_[i+1]->fineLevel());
} }
// Remove any recompute filed so that initially the full transferoperator is assembled // from dune/contact/solvers/nsnewtonmgstep.cc
/*// Remove any recompute filed so that initially the full transferoperator is assembled
for (size_t i=0; i<mgTransfer_.size(); i++) for (size_t i=0; i<mgTransfer_.size(); i++)
std::dynamic_pointer_cast<TruncatedMGTransfer<VectorType> >(mgTransfer_[i])->setRecomputeBitField(nullptr); std::dynamic_pointer_cast<TruncatedMGTransfer<VectorType> >(mgTransfer_[i])->setRecomputeBitField(nullptr);
// specify the subset of entries to be reassembled at each iteration // specify the subset of entries to be reassembled at each iteration
/* recompute_.resize(size()); recompute_.resize(size());
recompute_[recompute_.size()-1] = contactNetwork_.nBodyAssembler().totalHasObstacle_; recompute_[recompute_.size()-1] = contactNetwork_.nBodyAssembler().totalHasObstacle_;
for (int i=mgTransfer_.size()-1; i>=0; i--) { for (int i=mgTransfer_.size(); i>=1; i--) {
std::dynamic_pointer_cast<TruncatedMGTransfer<VectorType> >(mgTransfer_[i])->restrict(recompute_[i+1], recompute_[i]); std::dynamic_pointer_cast<TruncatedMGTransfer<VectorType> >(mgTransfer_[i-1])->restrict(recompute_[i], recompute_[i-1]);
// std::dynamic_pointer_cast<DenseMultigridTransfer<VectorType, BitVector, MatrixType> >(mgTransfer_[i])->restrict(recompute_[i+1], recompute_[i]); // std::dynamic_pointer_cast<DenseMultigridTransfer<VectorType, BitVector, MatrixType> >(mgTransfer_[i])->restrict(recompute_[i+1], recompute_[i]);
std::dynamic_pointer_cast<TruncatedMGTransfer<VectorType> >(mgTransfer_[i])->setRecomputeBitField(&recompute_[i]);
print(recompute_[i], "recompute: "); //print(recompute_[i], "recompute: ");
}*/ }
for (size_t i=0; i<this->mgTransfer_.size(); i++)
std::dynamic_pointer_cast<TruncatedMGTransfer<VectorType> >(mgTransfer_[i])->setRecomputeBitField(&recompute_[i]); */
} }
void setMatrix(const MatrixType& mat) override { void setMatrix(const MatrixType& mat) override {
...@@ -161,32 +148,16 @@ class MultilevelPatchPreconditioner : public LinearIterationStep<MatrixType, Vec ...@@ -161,32 +148,16 @@ class MultilevelPatchPreconditioner : public LinearIterationStep<MatrixType, Vec
std::dynamic_pointer_cast<TruncatedMGTransfer<VectorType> >(mgTransfer_[i])->restrictToFathers(ignoreHierarchy_[i+1], ignoreHierarchy_[i]); std::dynamic_pointer_cast<TruncatedMGTransfer<VectorType> >(mgTransfer_[i])->restrictToFathers(ignoreHierarchy_[i+1], ignoreHierarchy_[i]);
} }
/* truncation_.resize(size());
truncation_[size()-1] = Base::ignore();
print(truncation_.back(), "truncation: ");
for (int i=mgTransfer_.size()-1; i>=0; i--) {
std::dynamic_pointer_cast<TruncatedMGTransfer<VectorType> >(mgTransfer_[i])->restrict(truncation_[i+1], truncation_[i]);
std::dynamic_pointer_cast<TruncatedMGTransfer<VectorType> >(mgTransfer_[i])->setCriticalBitField(&truncation_[i+1]);
print(truncation_[i], "truncation: ");
}*/
size_t maxLevel = levelPatchPreconditioners_.size()-1; size_t maxLevel = levelPatchPreconditioners_.size()-1;
levelPatchPreconditioners_[maxLevel]->setMatrix(mat); levelPatchPreconditioners_[maxLevel]->setMatrix(mat);
//print(mat, "levelMat_" + std::to_string(maxLevel) + ":");
for (int i=levelPatchPreconditioners_.size()-2; i>0; i--) { for (int i=levelPatchPreconditioners_.size()-2; i>0; i--) {
const auto& transfer = *mgTransfer_[i]; const auto& transfer = *mgTransfer_[i];
//print(*levelPatchPreconditioners_[i+1]->getMatrix(), "levelMat:");
//print(levelMat_[i], "coarseMat:");
transfer.galerkinRestrictSetOccupation(*levelPatchPreconditioners_[i+1]->getMatrix(), levelMat_[i]); transfer.galerkinRestrictSetOccupation(*levelPatchPreconditioners_[i+1]->getMatrix(), levelMat_[i]);
transfer.galerkinRestrict(*levelPatchPreconditioners_[i+1]->getMatrix(), levelMat_[i]); transfer.galerkinRestrict(*levelPatchPreconditioners_[i+1]->getMatrix(), levelMat_[i]);
levelPatchPreconditioners_[i]->setMatrix(levelMat_[i]); levelPatchPreconditioners_[i]->setMatrix(levelMat_[i]);
//print(levelMat_[i], "levelMat_" + std::to_string(i) + ":");
// Set solution vector sizes for the lower levels // Set solution vector sizes for the lower levels
Dune::MatrixVector::resize(levelX_[i], levelMat_[i]); Dune::MatrixVector::resize(levelX_[i], levelMat_[i]);
//Dune::MatrixVector::resize(levelRhs_[i], levelMat_[i]); //Dune::MatrixVector::resize(levelRhs_[i], levelMat_[i]);
...@@ -198,58 +169,9 @@ class MultilevelPatchPreconditioner : public LinearIterationStep<MatrixType, Vec ...@@ -198,58 +169,9 @@ class MultilevelPatchPreconditioner : public LinearIterationStep<MatrixType, Vec
coarseTransfer.galerkinRestrictSetOccupation(fineMat, levelMat_[0]); coarseTransfer.galerkinRestrictSetOccupation(fineMat, levelMat_[0]);
coarseTransfer.galerkinRestrict(fineMat, levelMat_[0]); coarseTransfer.galerkinRestrict(fineMat, levelMat_[0]);
//print(levelMat_[0], "levelMat_0:");
/*dynamic_cast<Base&>(levelSolvers_[0]->getIterationStep()).setMatrix(levelMat_[0]); */
Dune::MatrixVector::resize(levelX_[0], levelMat_[0]); Dune::MatrixVector::resize(levelX_[0], levelMat_[0]);
//Dune::MatrixVector::resize(levelRhs_[0], levelMat_[0]);
} }
void setTruncation(const BitVector& truncation) {
std::dynamic_pointer_cast<TruncatedMGTransfer<VectorType> >(mgTransfer_.back())->setCriticalBitField(&truncation);
}
/*void setProblem(const MatrixType& mat, VectorType& x, const VectorType& rhs) override {
LinearIterationStep<MatrixType, VectorType>::setProblem(mat, x, rhs);
truncation_.resize(size());
truncation_[size()-1] = this->ignore();
print(truncation_.back(), "truncation: ");
for (int i=mgTransfer_.size()-1; i>=0; i--) {
std::dynamic_pointer_cast<TruncatedMGTransfer<VectorType> >(mgTransfer_[i])->restrict(truncation_[i+1], truncation_[i]);
std::dynamic_pointer_cast<TruncatedMGTransfer<VectorType> >(mgTransfer_[i])->setCriticalBitField(&truncation_[i]);
print(truncation_[i], "truncation: ");
}
size_t maxLevel = levelPatchPreconditioners_.size()-1;
levelX_[maxLevel] = x;
levelRhs_[maxLevel] = rhs;
levelPatchPreconditioners_[maxLevel]->setProblem(mat, levelX_[maxLevel], levelRhs_[maxLevel]);
for (int i=levelPatchPreconditioners_.size()-2; i>0; i--) {
const auto& transfer = *mgTransfer_[i];
transfer.restrict(levelX_[i+1], levelX_[i]);
transfer.restrict(levelRhs_[i+1], levelRhs_[i]);
transfer.galerkinRestrict(*levelPatchPreconditioners_[i+1]->getMatrix(), levelMat_[i]);
levelPatchPreconditioners_[i]->setProblem(levelMat_[i], levelX_[i], levelRhs_[i]);
}
// set coarse global problem
const auto& coarseTransfer = *mgTransfer_[0];
coarseTransfer.restrict(levelX_[1], levelX_[0]);
coarseTransfer.restrict(levelRhs_[1], levelRhs_[0]);
coarseTransfer.galerkinRestrict(levelMat_[1], levelMat_[0]);
dynamic_cast<LinearIterationStep<MatrixType, VectorType>&>(levelSolvers_[0]->getIterationStep()).setProblem(levelMat_[0], levelX_[0], levelRhs_[0]);
// EnergyNorm<MatrixType, VectorType> coarseErrorNorm(levelSolvers_[0]->getIterationStep());
// levelSolvers_[0]->setErrorNorm(coarseErrorNorm);
} */
void iterate() { void iterate() {
size_t maxLevel = levelPatchPreconditioners_.size()-1; size_t maxLevel = levelPatchPreconditioners_.size()-1;
levelX_[maxLevel] = *this->getIterate(); levelX_[maxLevel] = *this->getIterate();
...@@ -280,33 +202,15 @@ class MultilevelPatchPreconditioner : public LinearIterationStep<MatrixType, Vec ...@@ -280,33 +202,15 @@ class MultilevelPatchPreconditioner : public LinearIterationStep<MatrixType, Vec
VectorType x; VectorType x;
// solve coarse global problem // solve coarse global problem
auto& coarseSolver = levelSolvers_[0];
coarseSolver->getIterationStep().setIgnore(ignoreHierarchy_[0]);
dynamic_cast<LinearIterationStep<MatrixType, VectorType>&>(levelSolvers_[0]->getIterationStep()).setProblem(levelMat_[0], levelX_[0], levelRhs_[0]);
coarseSolver->check();
coarseSolver->preprocess();
coarseSolver->solve();
mgTransfer_[0]->prolong(levelX_[0], x);
/* BitVector emptyIgnore0(levelX_[0].size(), false);
LocalProblem<MatrixType, VectorType> localProblem(levelMat_[0], levelRhs_[0], ignoreHierarchy_[0]); LocalProblem<MatrixType, VectorType> localProblem(levelMat_[0], levelRhs_[0], ignoreHierarchy_[0]);
Vector newR; Vector newR;
localProblem.getLocalRhs(levelX_[0], newR); localProblem.getLocalRhs(levelX_[0], newR);
auto& coarseSolver = levelSolvers_[0]; coarseSolver_.setProblem(localProblem.getMat(), levelX_[0], newR);
coarseSolver->setProblem(localProblem.getMat(), levelX_[0], newR); coarseSolver_.preprocess();
coarseSolver->preprocess(); coarseSolver_.solve();
coarseSolver->solve();
mgTransfer_[0]->prolong(levelX_[0], x);*/
//print(levelX_[0], "MultilevelPatchPreconditioner: levelX_[0]");
//print(x, "MultilevelPatchPreconditioner: x0");
mgTransfer_[0]->prolong(levelX_[0], x);
for (size_t i=1; i<levelPatchPreconditioners_.size()-1; i++) { for (size_t i=1; i<levelPatchPreconditioners_.size()-1; i++) {
const auto& transfer = *mgTransfer_[i]; const auto& transfer = *mgTransfer_[i];
...@@ -315,18 +219,12 @@ class MultilevelPatchPreconditioner : public LinearIterationStep<MatrixType, Vec ...@@ -315,18 +219,12 @@ class MultilevelPatchPreconditioner : public LinearIterationStep<MatrixType, Vec
preconditioner.setIgnore(ignoreHierarchy_[i]); preconditioner.setIgnore(ignoreHierarchy_[i]);
preconditioner.apply(levelX_[i], levelRhs_[i]); preconditioner.apply(levelX_[i], levelRhs_[i]);
//print(levelX_[i], "MultilevelPatchPreconditioner: levelX_[i] " + std::to_string(i));
x += preconditioner.getSol(); x += preconditioner.getSol();
VectorType newX; VectorType newX;
transfer.prolong(x, newX); transfer.prolong(x, newX);
//print(newX, "MultilevelPatchPreconditioner: newX " + std::to_string(i));
x = newX; x = newX;
//print(x, "MultilevelPatchPreconditioner: x " + std::to_string(i));
} }
auto& preconditioner = *levelPatchPreconditioners_.back(); auto& preconditioner = *levelPatchPreconditioners_.back();
...@@ -336,29 +234,15 @@ class MultilevelPatchPreconditioner : public LinearIterationStep<MatrixType, Vec ...@@ -336,29 +234,15 @@ class MultilevelPatchPreconditioner : public LinearIterationStep<MatrixType, Vec
x += preconditioner.getSol(); x += preconditioner.getSol();
//print(x, "MultilevelPatchPreconditioner: xmax");
/* BitVector emptyIgnore(this->x_->size(), false);
LocalProblem<MatrixType, VectorType> globalProblem(*this->mat_.get(), *this->rhs_, emptyIgnore);
globalProblem.getLocalRhs(*this->x_, newR);
VectorType totalX = *(this->x_);
auto& globalSolver = levelSolvers_.back();
globalSolver->setProblem(globalProblem.getMat(), totalX, newR);
globalSolver->preprocess();
globalSolver->solve();
print(totalX, "MultilevelPatchPreconditioner: totalX"); */
*(this->x_) = x; *(this->x_) = x;
//print(*(this->x_), "MultilevelPatchPreconditioner: sol");
} }
void iterateMult() { void iterateMult() {
*(this->x_) = 0; *(this->x_) = 0;
DUNE_THROW(Dune::Exception, "Not implemented!");
/* /*
VectorType x; VectorType x;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment