Skip to content
Snippets Groups Projects
Commit 84d34531 authored by podlesny's avatar podlesny
Browse files

.

parent 04961a91
No related branches found
No related tags found
No related merge requests found
...@@ -2,7 +2,13 @@ ...@@ -2,7 +2,13 @@
#define SRC_EXPLICITGRID_HH #define SRC_EXPLICITGRID_HH
#include "gridselector.hh" #include "gridselector.hh"
#include "explicitvectors.hh"
#include <dune/contact/common/deformedcontinuacomplex.hh>
using LeafGridView = Grid::LeafGridView; using LeafGridView = Grid::LeafGridView;
using LevelGridView = Grid::LevelGridView; using LevelGridView = Grid::LevelGridView;
using DeformedGridComplex = typename Dune::Contact::DeformedContinuaComplex<Grid, Vector>;
using DeformedGrid = DeformedGridComplex::DeformedGridType;
#endif #endif
...@@ -65,11 +65,11 @@ ...@@ -65,11 +65,11 @@
#include "multi-body-problem-data/myglobalfrictiondata.hh" #include "multi-body-problem-data/myglobalfrictiondata.hh"
#include "multi-body-problem-data/mygrids.hh" #include "multi-body-problem-data/mygrids.hh"
#include "multi-body-problem-data/weakpatch.hh" #include "multi-body-problem-data/weakpatch.hh"
#include "spatial-solving/solverfactory.hh" //#include "spatial-solving/solverfactory.hh"
#include "time-stepping/adaptivetimestepper.hh" //#include "time-stepping/adaptivetimestepper.hh"
#include "time-stepping/rate.hh" #include "time-stepping/rate.hh"
#include "time-stepping/state.hh" #include "time-stepping/state.hh"
#include "time-stepping/updaters.hh" //#include "time-stepping/updaters.hh"
#include "vtk.hh" #include "vtk.hh"
// for getcwd // for getcwd
...@@ -194,8 +194,21 @@ int main(int argc, char *argv[]) { ...@@ -194,8 +194,21 @@ int main(int argc, char *argv[]) {
for (size_t i=0; i<grids.size(); i++) { for (size_t i=0; i<grids.size(); i++) {
deformedGridComplex.addGrid(*grids[i], "body" + std::to_string(i)); deformedGridComplex.addGrid(*grids[i], "body" + std::to_string(i));
} }
const auto deformedGrids = deformedGridComplex.gridVector(); const auto deformedGrids = deformedGridComplex.gridVector();
/*
// test deformed grids
for (size_t i=0; i<deformedGrids.size(); i++) {
Vector def(deformedGrids[i]->size(dims));
def = 1;
deformedGridComplex.setDeformation(def, i);
writeToVTK(deformedGrids[i]->leafGridView(), "", "deformedGrid" + std::to_string(i));
}
// test deformed grids
*/
std::vector<std::shared_ptr<DefLeafGridView>> leafViews(deformedGrids.size()); std::vector<std::shared_ptr<DefLeafGridView>> leafViews(deformedGrids.size());
std::vector<std::shared_ptr<DefLevelGridView>> levelViews(deformedGrids.size()); std::vector<std::shared_ptr<DefLevelGridView>> levelViews(deformedGrids.size());
std::vector<int> leafVertexCounts(deformedGrids.size()); std::vector<int> leafVertexCounts(deformedGrids.size());
......
...@@ -32,8 +32,8 @@ void FixedPointIterationCounter::operator+=( ...@@ -32,8 +32,8 @@ void FixedPointIterationCounter::operator+=(
multigridIterations += other.multigridIterations; multigridIterations += other.multigridIterations;
} }
template <class DeformedGrid, class Factory, class Updaters, class ErrorNorm> template <class Factory, class Updaters, class ErrorNorm>
FixedPointIterator<DeformedGrid, Factory, Updaters, ErrorNorm>::FixedPointIterator( FixedPointIterator<Factory, Updaters, ErrorNorm>::FixedPointIterator(
const Dune::Contact::NBodyAssembler<DeformedGrid, Vector>& nBodyAssembler, const Dune::Contact::NBodyAssembler<DeformedGrid, Vector>& nBodyAssembler,
Factory &factory, Dune::ParameterTree const &parset, Factory &factory, Dune::ParameterTree const &parset,
std::shared_ptr<Nonlinearity> globalFriction, ErrorNorm const &errorNorm) std::shared_ptr<Nonlinearity> globalFriction, ErrorNorm const &errorNorm)
...@@ -49,9 +49,9 @@ FixedPointIterator<DeformedGrid, Factory, Updaters, ErrorNorm>::FixedPointIterat ...@@ -49,9 +49,9 @@ FixedPointIterator<DeformedGrid, Factory, Updaters, ErrorNorm>::FixedPointIterat
verbosity_(parset.get<Solver::VerbosityMode>("v.solver.verbosity")), verbosity_(parset.get<Solver::VerbosityMode>("v.solver.verbosity")),
errorNorm_(errorNorm) {} errorNorm_(errorNorm) {}
template <class DeformedGrid,class Factory, class Updaters, class ErrorNorm> template <class Factory, class Updaters, class ErrorNorm>
FixedPointIterationCounter FixedPointIterationCounter
FixedPointIterator<DeformedGrid, Factory, Updaters, ErrorNorm>::run( FixedPointIterator<Factory, Updaters, ErrorNorm>::run(
Updaters updaters, Matrix const &velocityMatrix, Vector const &velocityRHS, Updaters updaters, Matrix const &velocityMatrix, Vector const &velocityRHS,
Vector &velocityIterate) { Vector &velocityIterate) {
EnergyNorm<Matrix, Vector> energyNorm(velocityMatrix); EnergyNorm<Matrix, Vector> energyNorm(velocityMatrix);
...@@ -66,7 +66,7 @@ FixedPointIterator<DeformedGrid, Factory, Updaters, ErrorNorm>::run( ...@@ -66,7 +66,7 @@ FixedPointIterator<DeformedGrid, Factory, Updaters, ErrorNorm>::run(
for (fixedPointIteration = 0; fixedPointIteration < fixedPointMaxIterations_; for (fixedPointIteration = 0; fixedPointIteration < fixedPointMaxIterations_;
++fixedPointIteration) { ++fixedPointIteration) {
// solve a velocity problem // solve a velocity problem
globalFriction_->updateAlpha(alpha); // globalFriction_->updateAlpha(alpha);
ConvexProblem convexProblem(1.0, velocityMatrix, *globalFriction_, ConvexProblem convexProblem(1.0, velocityMatrix, *globalFriction_,
velocityRHS, velocityIterate); velocityRHS, velocityIterate);
BlockProblem velocityProblem(parset_, convexProblem); BlockProblem velocityProblem(parset_, convexProblem);
...@@ -82,7 +82,7 @@ FixedPointIterator<DeformedGrid, Factory, Updaters, ErrorNorm>::run( ...@@ -82,7 +82,7 @@ FixedPointIterator<DeformedGrid, Factory, Updaters, ErrorNorm>::run(
for (size_t i=0; i<v_m.size(); i++) { for (size_t i=0; i<v_m.size(); i++) {
v_m[i] *= 1.0 - lambda_; v_m[i] *= 1.0 - lambda_;
Arithmetic::addProduct(v_m[i], lambda_, velocityIterate[i]); //Arithmetic::addProduct(v_m[i], lambda_, velocityIterate[i]);
} }
// compute relative velocities on contact boundaries // compute relative velocities on contact boundaries
...@@ -91,14 +91,14 @@ FixedPointIterator<DeformedGrid, Factory, Updaters, ErrorNorm>::run( ...@@ -91,14 +91,14 @@ FixedPointIterator<DeformedGrid, Factory, Updaters, ErrorNorm>::run(
// solve a state problem // solve a state problem
updaters.state_->solve(v_m); updaters.state_->solve(v_m);
ScalarVector newAlpha; ScalarVector newAlpha;
updaters.state_->extractAlpha(newAlpha); /* updaters.state_->extractAlpha(newAlpha);
if (lambda_ < 1e-12 or if (lambda_ < 1e-12 or
errorNorm_.diff(alpha, newAlpha) < fixedPointTolerance_) { errorNorm_.diff(alpha, newAlpha) < fixedPointTolerance_) {
fixedPointIteration++; fixedPointIteration++;
break; break;
} }
alpha = newAlpha; alpha = newAlpha;*/
} }
if (fixedPointIteration == fixedPointMaxIterations_) if (fixedPointIteration == fixedPointMaxIterations_)
DUNE_THROW(Dune::Exception, "FPI failed to converge"); DUNE_THROW(Dune::Exception, "FPI failed to converge");
...@@ -119,8 +119,10 @@ std::ostream &operator<<(std::ostream &stream, ...@@ -119,8 +119,10 @@ std::ostream &operator<<(std::ostream &stream,
<< ")"; << ")";
} }
template <class DeformedGrid, class Factory, class Updaters, class ErrorNorm> template <class Factory, class Updaters, class ErrorNorm>
void FixedPointIterator<DeformedGrid, Factory, Updaters, ErrorNorm>::relativeVelocities(std::vector<Vector>& v_m) const { void FixedPointIterator<Factory, Updaters, ErrorNorm>::relativeVelocities(std::vector<Vector>& v_m) const {
using field_type = typename Factory::Matrix::field_type;
// adaptation of DualMortarCoupling::setup() // adaptation of DualMortarCoupling::setup()
const size_t dim = DeformedGrid::dimension; const size_t dim = DeformedGrid::dimension;
...@@ -134,7 +136,7 @@ void FixedPointIterator<DeformedGrid, Factory, Updaters, ErrorNorm>::relativeVel ...@@ -134,7 +136,7 @@ void FixedPointIterator<DeformedGrid, Factory, Updaters, ErrorNorm>::relativeVel
using DualCache = Dune::Contact::DualBasisAdapter<GridView, field_type>; using DualCache = Dune::Contact::DualBasisAdapter<GridView, field_type>;
std::unique_ptr<DualCache> dualCache; std::unique_ptr<DualCache> dualCache;
dualCache = std::make_unique< Dune::Contact::DualBasisAdapterGlobal<GridView, field_type> >(); dualCache = std::make_unique< Dune::Contact::DualBasisAdapterGlobal<GridView, field_type> >();
/*
// define FE grid functions // define FE grid functions
std::vector<BasisGridFunction<> > gridFunctions(nBodyAssembler_.nGrids()); std::vector<BasisGridFunction<> > gridFunctions(nBodyAssembler_.nGrids());
for (size_t i=0; i<gridFunctions.size(); i++) { for (size_t i=0; i<gridFunctions.size(); i++) {
...@@ -245,9 +247,6 @@ void FixedPointIterator<DeformedGrid, Factory, Updaters, ErrorNorm>::relativeVel ...@@ -245,9 +247,6 @@ void FixedPointIterator<DeformedGrid, Factory, Updaters, ErrorNorm>::relativeVel
} }
/////////////////////////////////// ///////////////////////////////////
// reducing nonmortar boundary // reducing nonmortar boundary
///////////////////////////////// /////////////////////////////////
...@@ -278,7 +277,7 @@ void FixedPointIterator<DeformedGrid, Factory, Updaters, ErrorNorm>::relativeVel ...@@ -278,7 +277,7 @@ void FixedPointIterator<DeformedGrid, Factory, Updaters, ErrorNorm>::relativeVel
//writeBoundary(boundaryWithMapping,debugPath_ + "relevantNonmortar"); //writeBoundary(boundaryWithMapping,debugPath_ + "relevantNonmortar");
/** \todo replace by all fine grid segments which are totally covered by the RemoteIntersections. */ // \todo replace by all fine grid segments which are totally covered by the RemoteIntersections.
//for (const auto& rIs : intersections(glue)) //for (const auto& rIs : intersections(glue))
// boundaryWithMapping.addFace(rIs.inside(),rIs.indexInInside()); // boundaryWithMapping.addFace(rIs.inside(),rIs.indexInInside());
...@@ -303,7 +302,7 @@ void FixedPointIterator<DeformedGrid, Factory, Updaters, ErrorNorm>::relativeVel ...@@ -303,7 +302,7 @@ void FixedPointIterator<DeformedGrid, Factory, Updaters, ErrorNorm>::relativeVel
// Get the occupation structure for the mortar matrix // Get the occupation structure for the mortar matrix
// /////////////////////////////////////////////////////////// // ///////////////////////////////////////////////////////////
/** \todo Also restrict mortar indices and don't use the whole grid level. */ // todo Also restrict mortar indices and don't use the whole grid level.
Dune::MatrixIndexSet mortarIndices(nonmortarBoundary_.numVertices(), grid1_->size(dim)); Dune::MatrixIndexSet mortarIndices(nonmortarBoundary_.numVertices(), grid1_->size(dim));
// Create mapping from the global set of block dofs to the ones on the contact boundary // Create mapping from the global set of block dofs to the ones on the contact boundary
...@@ -382,7 +381,7 @@ void FixedPointIterator<DeformedGrid, Factory, Updaters, ErrorNorm>::relativeVel ...@@ -382,7 +381,7 @@ void FixedPointIterator<DeformedGrid, Factory, Updaters, ErrorNorm>::relativeVel
for(size_t rowIdx=0; rowIdx<weakObstacle_.size(); rowIdx++) for(size_t rowIdx=0; rowIdx<weakObstacle_.size(); rowIdx++)
weakObstacle_[rowIdx] *= D[rowIdx][rowIdx][0][0]; weakObstacle_[rowIdx] *= D[rowIdx][rowIdx][0][0];
gridGlueBackend_->clear(); gridGlueBackend_->clear(); */
} }
#include "fixedpointiterator_tmpl.cc" #include "fixedpointiterator_tmpl.cc"
...@@ -8,6 +8,8 @@ ...@@ -8,6 +8,8 @@
#include <dune/solvers/norms/norm.hh> #include <dune/solvers/norms/norm.hh>
#include <dune/solvers/solvers/solver.hh> #include <dune/solvers/solvers/solver.hh>
#include <dune/contact/assemblers/nbodyassembler.hh>
struct FixedPointIterationCounter { struct FixedPointIterationCounter {
size_t iterations = 0; size_t iterations = 0;
size_t multigridIterations = 0; size_t multigridIterations = 0;
...@@ -27,10 +29,16 @@ class FixedPointIterator { ...@@ -27,10 +29,16 @@ class FixedPointIterator {
using BlockProblem = typename Factory::BlockProblem; using BlockProblem = typename Factory::BlockProblem;
using Nonlinearity = typename ConvexProblem::NonlinearityType; using Nonlinearity = typename ConvexProblem::NonlinearityType;
using DeformedGrid = typename Factory::DeformedGrid;
private:
void relativeVelocities(std::vector<Vector>& v_m) const;
public: public:
FixedPointIterator(Factory &factory, Dune::ParameterTree const &parset, FixedPointIterator(const Dune::Contact::NBodyAssembler<DeformedGrid, Vector>& nBodyAssembler,
Factory &factory, const Dune::ParameterTree& parset,
std::shared_ptr<Nonlinearity> globalFriction, std::shared_ptr<Nonlinearity> globalFriction,
ErrorNorm const &errorNorm_); const ErrorNorm& errorNorm);
FixedPointIterationCounter run(Updaters updaters, FixedPointIterationCounter run(Updaters updaters,
Matrix const &velocityMatrix, Matrix const &velocityMatrix,
...@@ -38,6 +46,7 @@ class FixedPointIterator { ...@@ -38,6 +46,7 @@ class FixedPointIterator {
Vector &velocityIterate); Vector &velocityIterate);
private: private:
const Dune::Contact::NBodyAssembler<DeformedGrid, Vector>& nBodyAssembler_;
std::shared_ptr<typename Factory::Step> step_; std::shared_ptr<typename Factory::Step> step_;
Dune::ParameterTree const &parset_; Dune::ParameterTree const &parset_;
std::shared_ptr<Nonlinearity> globalFriction_; std::shared_ptr<Nonlinearity> globalFriction_;
......
...@@ -10,6 +10,8 @@ ...@@ -10,6 +10,8 @@
#include <dune/solvers/norms/energynorm.hh> #include <dune/solvers/norms/energynorm.hh>
#include <dune/tnnmg/problem-classes/convexproblem.hh> #include <dune/tnnmg/problem-classes/convexproblem.hh>
#include <dune/contact/common/deformedcontinuacomplex.hh>
#include <dune/tectonic/globalfriction.hh> #include <dune/tectonic/globalfriction.hh>
#include <dune/tectonic/myblockproblem.hh> #include <dune/tectonic/myblockproblem.hh>
...@@ -22,7 +24,7 @@ using Function = Dune::VirtualFunction<double, double>; ...@@ -22,7 +24,7 @@ using Function = Dune::VirtualFunction<double, double>;
using Factory = SolverFactory< using Factory = SolverFactory<
MY_DIM, MY_DIM,
MyBlockProblem<ConvexProblem<GlobalFriction<Matrix, Vector>, Matrix>>, MyBlockProblem<ConvexProblem<GlobalFriction<Matrix, Vector>, Matrix>>,
Grid>; DeformedGrid>;
using MyStateUpdater = StateUpdater<ScalarVector, Vector>; using MyStateUpdater = StateUpdater<ScalarVector, Vector>;
using MyRateUpdater = RateUpdater<Vector, Matrix, Function, MY_DIM>; using MyRateUpdater = RateUpdater<Vector, Matrix, Function, MY_DIM>;
using MyUpdaters = Updaters<MyRateUpdater, MyStateUpdater>; using MyUpdaters = Updaters<MyRateUpdater, MyStateUpdater>;
......
...@@ -11,9 +11,9 @@ ...@@ -11,9 +11,9 @@
#include "solverfactory.hh" #include "solverfactory.hh"
template <size_t dim, class BlockProblem, class Grid> template <size_t dim, class BlockProblem, class DeformedGrid>
SolverFactory<dim, BlockProblem, Grid>::SolverFactory( SolverFactory<dim, BlockProblem, DeformedGrid>::SolverFactory(
Dune::ParameterTree const &parset, Grid const &grid, Dune::ParameterTree const &parset, const DeformedGrid& grid,
Dune::BitSetVector<dim> const &ignoreNodes) Dune::BitSetVector<dim> const &ignoreNodes)
: baseEnergyNorm(linearBaseSolverStep), : baseEnergyNorm(linearBaseSolverStep),
linearBaseSolver(&linearBaseSolverStep, linearBaseSolver(&linearBaseSolverStep,
...@@ -33,7 +33,7 @@ SolverFactory<dim, BlockProblem, Grid>::SolverFactory( ...@@ -33,7 +33,7 @@ SolverFactory<dim, BlockProblem, Grid>::SolverFactory(
// transfer operators // transfer operators
for (auto &&x : transferOperators) for (auto &&x : transferOperators)
x = new CompressedMultigridTransfer<Vector>; x = new CompressedMultigridTransfer<Vector>;
TransferOperatorAssembler<Grid>(grid) TransferOperatorAssembler<DeformedGrid>(grid)
.assembleOperatorPointerHierarchy(transferOperators); .assembleOperatorPointerHierarchy(transferOperators);
linearIterationStep.setTransferOperators(transferOperators); linearIterationStep.setTransferOperators(transferOperators);
...@@ -44,14 +44,14 @@ SolverFactory<dim, BlockProblem, Grid>::SolverFactory( ...@@ -44,14 +44,14 @@ SolverFactory<dim, BlockProblem, Grid>::SolverFactory(
multigridStep->ignoreNodes_ = &ignoreNodes; multigridStep->ignoreNodes_ = &ignoreNodes;
} }
template <size_t dim, class BlockProblem, class Grid> template <size_t dim, class BlockProblem, class DeformedGrid>
SolverFactory<dim, BlockProblem, Grid>::~SolverFactory() { SolverFactory<dim, BlockProblem, DeformedGrid>::~SolverFactory() {
for (auto &&x : transferOperators) for (auto &&x : transferOperators)
delete x; delete x;
} }
template <size_t dim, class BlockProblem, class Grid> template <size_t dim, class BlockProblem, class DeformedGrid>
auto SolverFactory<dim, BlockProblem, Grid>::getStep() auto SolverFactory<dim, BlockProblem, DeformedGrid>::getStep()
-> std::shared_ptr<Step> { -> std::shared_ptr<Step> {
return multigridStep; return multigridStep;
} }
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
#include <dune/tnnmg/iterationsteps/genericnonlineargs.hh> #include <dune/tnnmg/iterationsteps/genericnonlineargs.hh>
#include <dune/tnnmg/iterationsteps/tnnmgstep.hh> #include <dune/tnnmg/iterationsteps/tnnmgstep.hh>
template <size_t dim, class BlockProblemTEMPLATE, class Grid> template <size_t dim, class BlockProblemTEMPLATE, class DeformedGridTEMPLATE>
class SolverFactory { class SolverFactory {
public: public:
using BlockProblem = BlockProblemTEMPLATE; using BlockProblem = BlockProblemTEMPLATE;
...@@ -20,6 +20,8 @@ class SolverFactory { ...@@ -20,6 +20,8 @@ class SolverFactory {
using Vector = typename BlockProblem::VectorType; using Vector = typename BlockProblem::VectorType;
using Matrix = typename BlockProblem::MatrixType; using Matrix = typename BlockProblem::MatrixType;
using DeformedGrid = DeformedGridTEMPLATE;
private: private:
using NonlinearSmoother = GenericNonlinearGS<BlockProblem>; using NonlinearSmoother = GenericNonlinearGS<BlockProblem>;
...@@ -27,7 +29,7 @@ class SolverFactory { ...@@ -27,7 +29,7 @@ class SolverFactory {
using Step = using Step =
TruncatedNonsmoothNewtonMultigrid<BlockProblem, NonlinearSmoother>; TruncatedNonsmoothNewtonMultigrid<BlockProblem, NonlinearSmoother>;
SolverFactory(Dune::ParameterTree const &parset, Grid const &grid, SolverFactory(Dune::ParameterTree const &parset, const DeformedGrid& grid,
Dune::BitSetVector<dim> const &ignoreNodes); Dune::BitSetVector<dim> const &ignoreNodes);
~SolverFactory(); ~SolverFactory();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment