diff --git a/dune/faultnetworks/preconditioners/cellpatchpreconditioner.hh b/dune/faultnetworks/preconditioners/cellpatchpreconditioner.hh index a14f005352084a4c1dd86aa6a47c6fa60e08b2c0..dae195f1fe60ef0d4ee0b1791edfcce8fed47ad4 100644 --- a/dune/faultnetworks/preconditioners/cellpatchpreconditioner.hh +++ b/dune/faultnetworks/preconditioners/cellpatchpreconditioner.hh @@ -28,7 +28,7 @@ public: const auto& boundaryDofs = patchFactory.getBoundaryDofs(); VectorType rhs; - rhs.resize(this->mat_->N()); + rhs.resize(this->matrix_.N()); rhs = 0; std::cout << "CellPatchPreconditioner::build() level: " << this->level_ << std::endl; @@ -38,7 +38,7 @@ public: for (size_t i=0; i<cellCount; i++) { using LocalProblemType = typename std::remove_reference<decltype(*(this->localProblems_[i]))>::type; - this->localProblems_[i] = std::make_shared<LocalProblemType>(*this->mat_, rhs, localToGlobal[i], boundaryDofs[i]); + this->localProblems_[i] = std::make_shared<LocalProblemType>(this->matrix_, rhs, localToGlobal[i], boundaryDofs[i]); } } }; diff --git a/dune/faultnetworks/preconditioners/levelpatchpreconditioner.hh b/dune/faultnetworks/preconditioners/levelpatchpreconditioner.hh index 3d9a9526ad7f09db9d610e7a35cf8ad96625679a..d651e55ef7fa3f22337b4cdf2e5668e8601d6acb 100644 --- a/dune/faultnetworks/preconditioners/levelpatchpreconditioner.hh +++ b/dune/faultnetworks/preconditioners/levelpatchpreconditioner.hh @@ -44,6 +44,7 @@ protected: size_t patchDepth_; BoundaryMode boundaryMode_; + MatrixType matrix_; std::vector<std::shared_ptr<OscLocalProblem<MatrixType, VectorType>> > localProblems_; public: @@ -65,6 +66,7 @@ public: setPatchDepth(); setBoundaryMode(); setDirection(); + setup(); } // has to setup localProblems_ @@ -121,6 +123,35 @@ public: } private: + void setup() { + // assemble stiffness matrix for entire level including all faults + GlobalFaultAssembler<BasisType, BasisType> globalFaultAssembler(basis_, basis_, levelInterfaceNetwork_); + globalFaultAssembler.assembleOperator(localAssembler_, localInterfaceAssemblers_, matrix_); + + // set boundary conditions + Dune::BitSetVector<1> globalBoundaryDofs; + BoundaryPatch<GridView> boundaryPatch(levelInterfaceNetwork_.levelGridView(), true); + constructBoundaryDofs(boundaryPatch, basis_, globalBoundaryDofs); + + typedef typename MatrixType::row_type RowType; + typedef typename RowType::ConstIterator ColumnIterator; + + for(size_t i=0; i<globalBoundaryDofs.size(); i++) { + if(!globalBoundaryDofs[i][0]) + continue; + + RowType& row = matrix_[i]; + + ColumnIterator cIt = row.begin(); + ColumnIterator cEndIt = row.end(); + + for(; cIt!=cEndIt; ++cIt) { + row[cIt.index()] = 0; + } + row[i] = 1; + } + } + void iterateAdd() { VectorType it, x; for (size_t i=0; i<localProblems_.size(); i++) { diff --git a/dune/faultnetworks/preconditioners/multilevelpatchpreconditioner.hh b/dune/faultnetworks/preconditioners/multilevelpatchpreconditioner.hh index 2f12d043cca61bef96032619c7d7be320341b462..459f3dcea43b9518bb3498fbcb43017242166b10 100644 --- a/dune/faultnetworks/preconditioners/multilevelpatchpreconditioner.hh +++ b/dune/faultnetworks/preconditioners/multilevelpatchpreconditioner.hh @@ -174,8 +174,7 @@ public: ignoreNodesHierarchy_[i] = new BitVector(); mgTransfer_[i]->restrictToFathers(*ignoreNodesHierarchy_[i+1], *ignoreNodesHierarchy_[i]); } - } else - DUNE_THROW(SolverError, "We need a set of nodes to ignore"); + } coarseGlobalPreconditioner_->setProblem(*matrixHierarchy_[0], *xHierarchy_[0], rhsHierarchy_[0]); coarseGlobalPreconditioner_->preprocess(); @@ -237,18 +236,35 @@ private: mgTransfer_[i]->restrict(rhsHierarchy_[i+1], rhsHierarchy_[i]); } - // coarseGlobalPreconditioner_->setProblem(*matrixHierarchy_[0], *xHierarchy_[0], rhsHierarchy_[0]); + //print(*matrixHierarchy_[0], "mat 0:"); + //print(rhsHierarchy_[0], "rhs0:"); + coarseGlobalPreconditioner_->setProblem(*matrixHierarchy_[0], *xHierarchy_[0], rhsHierarchy_[0]); coarseGlobalPreconditioner_->iterate(); + //print(*xHierarchy_[0], "x0:"); for (size_t i=0; i<levelPatchPreconditioners_.size(); i++) { - // levelPatchPreconditioners_[i]->setProblem(*matrixHierarchy_[i+1], *xHierarchy_[i+1], rhsHierarchy_[i+1]); + //print(*matrixHierarchy_[i+1], "mat:"); + //print(rhsHierarchy_[i+1], "rhs:"); + + levelPatchPreconditioners_[i]->setProblem(*matrixHierarchy_[i+1], *xHierarchy_[i+1], rhsHierarchy_[i+1]); levelPatchPreconditioners_[i]->iterate(); + //print(*xHierarchy_[i+1], "xi+1:"); + VectorType x(xHierarchy_[i+1]->size()); mgTransfer_[i]->prolong(*xHierarchy_[i], x); + //print(x, "xi:"); + *xHierarchy_[i+1] += x; + //print(*xHierarchy_[i+1], "xi+1:"); } + + + //print(*xHierarchy_[levelPatchPreconditioners_.size()] , "xback:"); + //print(*xHierarchy_.back() , "xback:"); + *(this->x_) = *xHierarchy_.back(); + //print(*(this->x_) , "x:"); } diff --git a/dune/faultnetworks/preconditioners/supportpatchpreconditioner.hh b/dune/faultnetworks/preconditioners/supportpatchpreconditioner.hh index dc4064e81981890575975847ab157993829b3c0f..bf57590d9e665ad78752b49c635b2f4070dfadf7 100644 --- a/dune/faultnetworks/preconditioners/supportpatchpreconditioner.hh +++ b/dune/faultnetworks/preconditioners/supportpatchpreconditioner.hh @@ -60,11 +60,11 @@ public: const auto& boundaryDofs = patchFactory.getBoundaryDofs(); VectorType rhs; - rhs.resize(this->mat_->N()); + rhs.resize(this->matrix_.N()); rhs = 0; using LocalProblemType = typename std::remove_reference<decltype(*(this->localProblems_[i]))>::type; - this->localProblems_[i] = std::make_shared<LocalProblemType>(*this->mat_, rhs, localToGlobal, boundaryDofs); + this->localProblems_[i] = std::make_shared<LocalProblemType>(this->matrix_, rhs, localToGlobal, boundaryDofs); } } }; diff --git a/src/cantorfaultnetworks/cantorfaultnetwork.cc b/src/cantorfaultnetworks/cantorfaultnetwork.cc index 90a9b2b9a97e37b4e5e625b4c1311e15ab5fc85d..4a65d2f2ded47798476c56b5846c5ad5f94103e5 100644 --- a/src/cantorfaultnetworks/cantorfaultnetwork.cc +++ b/src/cantorfaultnetworks/cantorfaultnetwork.cc @@ -141,7 +141,7 @@ int main(int argc, char** argv) { try matrixReader.read(matrix); const int oscGridN = matrix.N(); - const int oscGridLevelIdx = std::round(std::log2(oscGridN)) - coarseResolution; + const int oscGridLevelIdx = std::max(std::round(std::log2(oscGridN)) - coarseResolution, 0.0); if (oscGridN>fineGridN) DUNE_THROW(Dune::Exception, "Provided oscData too large!"); @@ -161,7 +161,7 @@ int main(int argc, char** argv) { try CantorFaultFactory<GridType> faultFactory(levelToCantorLevel, coarseResolution, exactLevelIdx, maxCantorLevel); const InterfaceNetwork<GridType>& interfaceNetwork = faultFactory.interfaceNetwork(); - if (problemCount==0) { + /*if (problemCount==0) { std::vector<int> writeLevels {1, 2, 8}; for (size_t i=0; i<writeLevels.size(); i++) { int writeLevel = writeLevels[i]; @@ -170,7 +170,7 @@ int main(int argc, char** argv) { try LevelInterfaceNetworkWriter networkWriter(resultPath + "levelinterfacenetwork_" + std::to_string(writeLevel) + ".tikz"); networkWriter.write(interfaceNetwork.levelInterfaceNetwork(writeLevel), writeGrid); } - } + }*/ const GridType& grid = faultFactory.grid(); @@ -307,6 +307,14 @@ int main(int argc, char** argv) { try } } + // set initial iterate + VectorType initialX; + DGMGTransfer<DGBasis> coarseFineTransfer(*coarseBasis, *fineBasis); + coarseFineTransfer.prolong(coarseSol, initialX); + + VectorType rhs(fineRhs); + + // setup preconditioner const auto& preconditionerParset = parameterSet.sub("preconditioner"); using MultilevelPatchPreconditioner = MultilevelPatchPreconditioner<DGBasis, LocalOscAssembler, LocalInterfaceAssembler, MatrixType, VectorType>; @@ -317,37 +325,31 @@ int main(int argc, char** argv) { try levelFaultPreconditioner.setPatchDepth(patchDepth); levelFaultPreconditioner.setBoundaryMode(LevelPatchPreconditioner::BoundaryMode::homogeneous); }*/ + preconditioner.setProblem(fineGlobalAssembler.matrix(), initialX, rhs); std::cout << "Setup complete, starting preconditioned cg iteration!" << std::endl; std::cout << std::endl << std::endl; - // set initial iterate - VectorType initialX; - DGMGTransfer<DGBasis> coarseFineTransfer(*coarseBasis, *fineBasis); - coarseFineTransfer.prolong(coarseSol, initialX); - - VectorType rhs(fineRhs); - DGMGTransfer<DGBasis> discMGTransfer(*fineBasis, *exactBasis); // solve - /*OscCGSolver<MatrixType, VectorType, DGBasis> + OscCGSolver<MatrixType, VectorType, DGBasis> solver(*fineBasis, &fineGlobalAssembler.matrix(), &initialX, &rhs, &preconditioner, maxIterations, solverTolerance, &exactEnergyNorm, - Solver::FULL, &exactSol, &fineSol, discMGTransfer, 1.0, true); //((oscGridN+0.0)/fineGridN) */ + Solver::FULL, &exactSol, &fineSol, discMGTransfer, 1.0, true); //((oscGridN+0.0)/fineGridN) //solver.historyBuffer_ = resultPath + "solutions/level_" + std::to_string(fineResolution) + ".vec"; - VectorType x = initialX; + /*VectorType x = initialX; preconditioner.setProblem(fineGlobalAssembler.matrix(), x, rhs); Dune::Solvers::LoopSolver<VectorType> solver (preconditioner, maxIterations, solverTolerance, fineEnergyNorm, Solver::FULL, - true, &fineSol); + true, &fineSol); */ solver.check(); solver.preprocess(); diff --git a/src/cantorfaultnetworks/cantorfaultnetwork.parset b/src/cantorfaultnetworks/cantorfaultnetwork.parset index 0af54c6260ea293ff2e6e68bb3eb56d8c2c31744..981054b93d2ad51fbb9ebdd8cf9e5d65e26c3855 100644 --- a/src/cantorfaultnetworks/cantorfaultnetwork.parset +++ b/src/cantorfaultnetworks/cantorfaultnetwork.parset @@ -10,12 +10,12 @@ patchDepth = 1 ########################################### [problem0] -oscDataFile = oscDataLaplace16.mat +oscDataFile = oscDataLaplace4.mat # level resolution in 2^(-...) -coarseResolution = 3 -fineResolution = 4 -exactResolution = 5 +coarseResolution = 2 +fineResolution = 3 +exactResolution = 4 minCantorResolution = 0 penaltyFactor = 1 diff --git a/src/geofaultnetworks/rockfaultnetwork.cc b/src/geofaultnetworks/rockfaultnetwork.cc index 777b2e11cbfbb32089f955dfd0dee024c8fbd301..b6983066fc8fb2e47575f8b963e09e92f96ed790 100644 --- a/src/geofaultnetworks/rockfaultnetwork.cc +++ b/src/geofaultnetworks/rockfaultnetwork.cc @@ -314,6 +314,14 @@ int main(int argc, char** argv) { try } } + // set initial iterate + VectorType initialX; + DGMGTransfer<DGBasis> coarseFineTransfer(*coarseBasis, *fineBasis); + coarseFineTransfer.prolong(coarseSol, initialX); + + VectorType rhs(fineRhs); + + // setup preconditioner const auto& preconditionerParset = parameterSet.sub("preconditioner"); using MultilevelPatchPreconditioner = MultilevelPatchPreconditioner<DGBasis, LocalOscAssembler, LocalInterfaceAssembler, MatrixType, VectorType>; @@ -324,16 +332,11 @@ int main(int argc, char** argv) { try levelFaultPreconditioner.setPatchDepth(patchDepth); levelFaultPreconditioner.setBoundaryMode(LevelPatchPreconditioner::BoundaryMode::homogeneous); }*/ + preconditioner.setProblem(fineGlobalAssembler.matrix(), initialX, rhs); std::cout << "Setup complete, starting preconditioned cg iteration!" << std::endl; std::cout << std::endl << std::endl; - // set initial iterate - VectorType initialX; - DGMGTransfer<DGBasis> coarseFineTransfer(*coarseBasis, *fineBasis); - coarseFineTransfer.prolong(coarseSol, initialX); - - VectorType rhs(fineRhs); DGMGTransfer<DGBasis> discMGTransfer(*fineBasis, *exactBasis);