From 1ef5b30f47b7086d538f45e6f8438abfbf96e761 Mon Sep 17 00:00:00 2001 From: podlesny <podlesny@mi.fu-berlin.de> Date: Fri, 26 Jul 2019 17:20:34 +0200 Subject: [PATCH] . --- src/multi-body-problem-2D.cfg | 2 +- src/multi-body-problem.cfg | 3 ++- src/solverfactorytest.cc | 40 +++++++++++++++++----------- src/spatial-solving/solverfactory.cc | 4 --- src/spatial-solving/solverfactory.hh | 2 +- 5 files changed, 29 insertions(+), 22 deletions(-) diff --git a/src/multi-body-problem-2D.cfg b/src/multi-body-problem-2D.cfg index a308c80b..647e99cb 100644 --- a/src/multi-body-problem-2D.cfg +++ b/src/multi-body-problem-2D.cfg @@ -1,6 +1,6 @@ # -*- mode:conf -*- [boundary.friction] -smallestDiameter = 0.01 # 2e-3 [m] +smallestDiameter = 0.05 # 2e-3 [m] [timeSteps] refinementTolerance = 1e-5 # 1e-5 diff --git a/src/multi-body-problem.cfg b/src/multi-body-problem.cfg index e8a3e97b..8df2a20d 100644 --- a/src/multi-body-problem.cfg +++ b/src/multi-body-problem.cfg @@ -47,6 +47,7 @@ relativeTau = 1e-4 # 1e-6 [timeSteps] scheme = newmark +timeSteps = 5 [u0.solver] maximumIterations = 100 @@ -76,7 +77,7 @@ maximumIterations = 10000 verbosity = quiet [solver.tnnmg.main] -pre = 1 +pre = 10 multi = 5 # number of multigrid steps post = 0 diff --git a/src/solverfactorytest.cc b/src/solverfactorytest.cc index 1d0f983b..9ae2798e 100644 --- a/src/solverfactorytest.cc +++ b/src/solverfactorytest.cc @@ -57,8 +57,6 @@ const int dim = MY_DIM; -const int timeSteps = 5; - Dune::ParameterTree parset; size_t bodyCount; @@ -71,6 +69,7 @@ std::vector<ScalarVector> weightedNormalStress; double relativeTime; double relativeTau; size_t timeStep = 0; +size_t timeSteps = 0; const std::string path = ""; const std::string outputFile = "solverfactorytest.log"; @@ -78,7 +77,7 @@ const std::string outputFile = "solverfactorytest.log"; template <class ContactNetwork> void solveProblem(const ContactNetwork& contactNetwork, const Matrix& mat, const Vector& rhs, Vector& x, - const BitVector& ignore, const Vector& lower, const Vector& upper) { + const BitVector& ignore, const Vector& lower, const Vector& upper, bool initial = false) { using Solver = typename Dune::Solvers::LoopSolver<Vector, BitVector>; using Norm = EnergyNorm<Matrix, Vector>; @@ -96,6 +95,8 @@ void solveProblem(const ContactNetwork& contactNetwork, using ContactFunctional = Dune::TNNMG::BoxConstrainedQuadraticFunctional<Matrix&, Vector&, Vector&, Vector&, double>; auto I = ContactFunctional(mat, rhs, lower, upper); + std::cout << "Energy start iterate: " << I(x) << std::endl; + using LocalSolver = Dune::TNNMG::ScalarObstacleSolver; auto localSolver = Dune::TNNMG::gaussSeidelLocalSolver(LocalSolver()); @@ -176,10 +177,16 @@ void solveProblem(const ContactNetwork& contactNetwork, refSolver.solve(); std::cout << correctionNorms.size() << std::endl; - + if (initial) { + x = refX; + return; + } // set up solver factory solver // set up functional + /*auto& globalFriction = contactNetwork.globalFriction(); + using MyFunctional = Functional<Matrix&, Vector&, std::decay_t<decltype(globalFriction)>&, Vector&, Vector&, typename Matrix::field_type>; + MyFunctional J(mat, rhs, globalFriction, lower, upper);*/ using MyFunctional = Functional<Matrix&, Vector&, ZeroNonlinearity&, Vector&, Vector&, typename Matrix::field_type>; MyFunctional J(mat, rhs, ZeroNonlinearity(), lower, upper); @@ -216,7 +223,7 @@ void solveProblem(const ContactNetwork& contactNetwork, diff -= refX; std::cout << "Solver error in energy norm: " << norm(diff) << std::endl; - x = refX; + std::cout << "Energy end iterate: " << J(x) << std::endl; } @@ -274,7 +281,7 @@ void setupInitialConditions(const ContactNetwork& contactNetwork) { print(lower, "lower"); print(upper, "upper");*/ - solveProblem(contactNetwork, bilinearForm, totalRhs, totalX, _dirichletNodes, lower, upper); + solveProblem(contactNetwork, bilinearForm, totalRhs, totalX, _dirichletNodes, lower, upper, true); nBodyAssembler.postprocess(totalX, _x); }; @@ -434,17 +441,17 @@ void run(Updaters& updaters, ContactNetwork& contactNetwork, } // compute velocity obstacles - Vector vLower, vUpper; + /*Vector vLower, vUpper; std::vector<Vector> u0, v0; updaters.rate_->extractOldVelocity(v0); updaters.rate_->extractOldDisplacement(u0); Vector totalu0, totalv0; - nBodyAssembler.concatenateVectors(u0, totalu0); - nBodyAssembler.concatenateVectors(v0, totalv0); + nBodyAssembler.nodalToTransformed(u0, totalu0); + nBodyAssembler.nodalToTransformed(v0, totalv0); - //updaters.rate_->velocityObstacles(totalu0, lower, totalv0, vLower); - //updaters.rate_->velocityObstacles(totalu0, upper, totalv0, vUpper); + updaters.rate_->velocityObstacles(totalu0, lower, totalv0, vLower); + updaters.rate_->velocityObstacles(totalu0, upper, totalv0, vUpper);*/ const auto& errorNorms = contactNetwork.stateEnergyNorms(); @@ -459,22 +466,24 @@ void run(Updaters& updaters, ContactNetwork& contactNetwork, size_t fixedPointIteration; size_t multigridIterations = 0; + std::vector<ScalarVector> alpha(nBodies); updaters.state_->extractAlpha(alpha); + + Vector totalVelocityIterate; + nBodyAssembler.nodalToTransformed(velocityIterates, totalVelocityIterate); + for (fixedPointIteration = 0; fixedPointIteration < fixedPointMaxIterations; ++fixedPointIteration) { // contribution from nonlinearity globalFriction.updateAlpha(alpha); - Vector totalVelocityIterate; - nBodyAssembler.nodalToTransformed(velocityIterates, totalVelocityIterate); - solveProblem(contactNetwork, bilinearForm, totalRhs, totalVelocityIterate, totalDirichletNodes, lower, upper); nBodyAssembler.postprocess(totalVelocityIterate, velocityIterates); - std::vector<Vector> v_m; + std::vector<Vector> v_m; //TODO : wrong, isnt used atm; updaters.rate_->extractOldVelocity(v_m); for (size_t i=0; i<v_m.size(); i++) { @@ -730,6 +739,7 @@ int main(int argc, char *argv[]) { try { //const auto& stateEnergyNorms = contactNetwork.stateEnergyNorms(); + timeSteps = parset.get<size_t>("timeSteps.timeSteps"); for (timeStep=1; timeStep<=timeSteps; timeStep++) { advanceStep(current, contactNetwork); diff --git a/src/spatial-solving/solverfactory.cc b/src/spatial-solving/solverfactory.cc index 5f02147e..0650c522 100644 --- a/src/spatial-solving/solverfactory.cc +++ b/src/spatial-solving/solverfactory.cc @@ -20,14 +20,10 @@ SolverFactory<Functional, BitVector>::SolverFactory( J_(Dune::Solvers::wrap_own_share<const Functional>(std::forward<Functional>(J))) { auto localSolver = Dune::TNNMG::gaussSeidelLocalSolver(LocalSolver()); - //nonlinearSmoother_ = std::make_shared<NonlinearSmoother>(*J_, dummyIterate_, localSolver); - - //using MyNonlinearSmoother = Dune::TNNMG::NonlinearGSStep<Functional, decltype(localSolver), BitVector>; nonlinearSmoother_ = std::make_shared<NonlinearSmoother>(*J_, dummyIterate_, localSolver); //nonlinearSmoother_ = std::make_shared<NonlinearSmoother>(*J_, dummyIterate_, LocalSolver()); - auto linearSolver_ptr = Dune::Solvers::wrap_own_share<std::decay_t<LinearSolver>>(std::forward<LinearSolver>(linearSolver)); //tnnmgStep_ = std::make_shared<Step>(*J_, dummyIterate_, nonlinearSmoother_, linearSolver_ptr, 10, DefectProjection(), LineSearchSolver()); diff --git a/src/spatial-solving/solverfactory.hh b/src/spatial-solving/solverfactory.hh index 5fe7e62f..203bd955 100644 --- a/src/spatial-solving/solverfactory.hh +++ b/src/spatial-solving/solverfactory.hh @@ -33,7 +33,7 @@ class SolverFactory { using Linearization = Linearization<Functional, BitVector>; using DefectProjection = typename Dune::TNNMG::ObstacleDefectProjection; - //using Step = TNNMGStep<Functional, BitVector, Linearization, DefectProjection, LineSearchSolver>; + //using Step = Dune::TNNMG::TNNMGStep<Functional, BitVector, Linearization, DefectProjection, LineSearchSolver>; using Step = Dune::TNNMG::TNNMGStep<Functional, BitVector, Linearization, DefectProjection, LineSearchSolver>; template <class LinearSolver> -- GitLab