From 2614079b403991d86bbcd15bd4db9be985abf9f9 Mon Sep 17 00:00:00 2001 From: Elias Pipping <elias.pipping@fu-berlin.de> Date: Thu, 10 Jul 2014 23:15:06 +0200 Subject: [PATCH] [Kill] Remove the sliding block problem --- src/Makefile.am | 6 +- src/sliding-block-data/boundaryconditions.py | 16 - src/sliding-block-data/mybody.hh | 54 -- src/sliding-block-data/mygeometry.hh | 27 - .../myglobalfrictiondata.hh | 45 -- src/sliding-block-data/mygrid.hh | 36 -- src/sliding-block-data/parset.cfg | 69 --- src/sliding-block.cc | 463 ------------------ 8 files changed, 1 insertion(+), 715 deletions(-) delete mode 100644 src/sliding-block-data/boundaryconditions.py delete mode 100644 src/sliding-block-data/mybody.hh delete mode 100644 src/sliding-block-data/mygeometry.hh delete mode 100644 src/sliding-block-data/myglobalfrictiondata.hh delete mode 100644 src/sliding-block-data/mygrid.hh delete mode 100644 src/sliding-block-data/parset.cfg delete mode 100644 src/sliding-block.cc diff --git a/src/Makefile.am b/src/Makefile.am index 6864003b..a939e404 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,4 +1,4 @@ -bin_PROGRAMS = sand-wedge sliding-block-2D +bin_PROGRAMS = sand-wedge common_sources = \ assemblers.cc \ @@ -12,10 +12,6 @@ sand_wedge_SOURCES = $(common_sources) sand-wedge.cc sand_wedge_CPPFLAGS = \ $(AM_CPPFLAGS) $(BOOST_CPPFLAGS) \ -Ddatadir=\"$(abs_srcdir)/sand-wedge-data/\" -DDIM=2 -sliding_block_2D_SOURCES = $(common_sources) sliding-block.cc -sliding_block_2D_CPPFLAGS = \ - $(AM_CPPFLAGS) \ - -Ddatadir=\"$(abs_srcdir)/sliding-block-data/\" -DDIM=2 # Some are for clang, others are for gcc AM_CXXFLAGS = \ diff --git a/src/sliding-block-data/boundaryconditions.py b/src/sliding-block-data/boundaryconditions.py deleted file mode 100644 index 04a1799a..00000000 --- a/src/sliding-block-data/boundaryconditions.py +++ /dev/null @@ -1,16 +0,0 @@ -class neumannCondition: - def __call__(self, relativeTime): - return 0 - -class velocityDirichletCondition: - def __call__(self, relativeTime): - if relativeTime <= 0.25: - factor = 4*relativeTime; - else: - factor = 1 - return 2e-4 * factor - -Functions = { - 'neumannCondition' : neumannCondition(), - 'velocityDirichletCondition' : velocityDirichletCondition() -} diff --git a/src/sliding-block-data/mybody.hh b/src/sliding-block-data/mybody.hh deleted file mode 100644 index b058898b..00000000 --- a/src/sliding-block-data/mybody.hh +++ /dev/null @@ -1,54 +0,0 @@ -#ifndef SRC_SLIDING_BLOCK_DATA_MYBODY_HH -#define SRC_SLIDING_BLOCK_DATA_MYBODY_HH - -#include <dune/common/fvector.hh> - -#include <dune/fufem/functions/constantfunction.hh> - -#include <dune/tectonic/body.hh> -#include <dune/tectonic/gravity.hh> - -#include "mygeometry.hh" - -template <int dimension> class MyBody : public Body<dimension> { - using typename Body<dimension>::ScalarFunction; - using typename Body<dimension>::VectorField; - using MyConstantFunction = ConstantFunction< - Dune::FieldVector<double, dimension>, Dune::FieldVector<double, 1>>; - -public: - MyBody(Dune::ParameterTree const &parset) - : poissonRatio_(parset.get<double>("body.poissonRatio")), - youngModulus_(parset.get<double>("body.youngModulus")), - shearViscosityField_(parset.get<double>("body.shearViscosity")), - bulkViscosityField_(parset.get<double>("body.bulkViscosity")), - densityField_(parset.get<double>("body.density")), - gravityField_(densityField_, MyGeometry::zenith, - parset.get<double>("gravity")) {} - - double getPoissonRatio() const override { return poissonRatio_; } - - double getYoungModulus() const override { return youngModulus_; } - - ScalarFunction const &getShearViscosityField() const override { - return shearViscosityField_; - } - ScalarFunction const &getBulkViscosityField() const override { - return bulkViscosityField_; - } - - ScalarFunction const &getDensityField() const override { - return densityField_; - } - VectorField const &getGravityField() const override { return gravityField_; } - -private: - double const poissonRatio_; - double const youngModulus_; - MyConstantFunction const shearViscosityField_; - MyConstantFunction const bulkViscosityField_; - MyConstantFunction const densityField_; - Gravity<dimension> const gravityField_; -}; - -#endif diff --git a/src/sliding-block-data/mygeometry.hh b/src/sliding-block-data/mygeometry.hh deleted file mode 100644 index 96cd6534..00000000 --- a/src/sliding-block-data/mygeometry.hh +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef SRC_SLIDING_BLOCK_DATA_MYGEOMETRY_HH -#define SRC_SLIDING_BLOCK_DATA_MYGEOMETRY_HH - -#include <dune/common/fassign.hh> -#include <dune/common/fvector.hh> - -namespace MyGeometry { -namespace { - using LocalVector = Dune::FieldVector<double, 2>; - - // kludge because fieldvectors have no initialiser_list constructor, see - // https://dune-project.org/flyspray/index.php?do=details&task_id=1166 - LocalVector generateVector(double x, double y) { - LocalVector tmp; - tmp <<= x, y; - return tmp; - } -} - -LocalVector const A = generateVector(0, 0); -LocalVector const B = generateVector(5, 0); -LocalVector const C = generateVector(5, 1); -LocalVector const D = generateVector(0, 1); - -LocalVector const zenith = generateVector(0, 1); -} -#endif diff --git a/src/sliding-block-data/myglobalfrictiondata.hh b/src/sliding-block-data/myglobalfrictiondata.hh deleted file mode 100644 index 8487a125..00000000 --- a/src/sliding-block-data/myglobalfrictiondata.hh +++ /dev/null @@ -1,45 +0,0 @@ -#ifndef SRC_SLIDING_BLOCK_DATA_MYGLOBALFRICTIONDATA_HH -#define SRC_SLIDING_BLOCK_DATA_MYGLOBALFRICTIONDATA_HH - -#include <dune/common/function.hh> -#include <dune/common/fvector.hh> - -#include <dune/fufem/functions/constantfunction.hh> - -#include <dune/tectonic/globalfrictiondata.hh> - -#include "mygeometry.hh" - -template <int dimension> -class MyGlobalFrictionData : public GlobalFrictionData<dimension> { -private: - using typename GlobalFrictionData<dimension>::VirtualFunction; - -public: - MyGlobalFrictionData(Dune::ParameterTree const &parset) - : C_(parset.get<double>("C")), - L_(parset.get<double>("L")), - V0_(parset.get<double>("V0")), - a_(parset.get<double>("a")), - b_(parset.get<double>("b")), - mu0_(parset.get<double>("mu0")) {} - - double virtual const &C() const override { return C_; } - double virtual const &L() const override { return L_; } - double virtual const &V0() const override { return V0_; } - VirtualFunction virtual const &a() const override { return a_; } - VirtualFunction virtual const &b() const override { return b_; } - double virtual const &mu0() const override { return mu0_; } - -private: - using MyConstantFunction = ConstantFunction< - Dune::FieldVector<double, dimension>, Dune::FieldVector<double, 1>>; - - double const C_; - double const L_; - double const V0_; - MyConstantFunction const a_; - MyConstantFunction const b_; - double const mu0_; -}; -#endif diff --git a/src/sliding-block-data/mygrid.hh b/src/sliding-block-data/mygrid.hh deleted file mode 100644 index d38616c1..00000000 --- a/src/sliding-block-data/mygrid.hh +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef SRC_SLIDING_BLOCK_DATA_MYGRID_HH -#define SRC_SLIDING_BLOCK_DATA_MYGRID_HH - -#include <dune/grid/common/gridfactory.hh> - -#include <dune/fufem/boundarypatch.hh> - -#include "mygeometry.hh" - -template <class Grid> std::shared_ptr<Grid> constructGrid() { - std::array<unsigned int, 2> elements = { { 5, 1 } }; - return Dune::StructuredGridFactory<Grid>::createSimplexGrid( - MyGeometry::A, MyGeometry::C, elements); -} - -template <class GridView> class MyFaces { -private: - bool isClose(double a, double b) { - return std::abs(a - b) < 1e-14; - }; - -public: - MyFaces(GridView const &gridView) : lower(gridView), upper(gridView) { - lower.insertFacesByProperty([&](typename GridView::Intersection const &in) { - return isClose(MyGeometry::A[1], in.geometry().center()[1]); - }); - - upper.insertFacesByProperty([&](typename GridView::Intersection const &in) { - return isClose(MyGeometry::C[1], in.geometry().center()[1]); - }); - } - - BoundaryPatch<GridView> lower; - BoundaryPatch<GridView> upper; -}; -#endif diff --git a/src/sliding-block-data/parset.cfg b/src/sliding-block-data/parset.cfg deleted file mode 100644 index 7f477c49..00000000 --- a/src/sliding-block-data/parset.cfg +++ /dev/null @@ -1,69 +0,0 @@ -# -*- mode:conf -*- -gravity = 9.81 - -[io] -printProgress = false -writeVTK = false - -[problem] -finalTime = 15 - -[body] -youngModulus = 5e7 -poissonRatio = 0.3 -density = 5000 -shearViscosity = 0 -bulkViscosity = 0 - -[boundary.friction] -C = 0.0 -mu0 = 0.6 -a = 0.010 -b = 0.015 -V0 = 1e-6 -L = 1e-5 -initialState = 4.54e-05 # = exp(-10) = theta, so that alpha = -10 -stateModel = Dieterich - -[timeSteps] -number = 10000 -scheme = newmark - -[grid] -refinements = 4 - -[u0.solver] -tolerance = 1e-10 -maximumIterations = 100000 -verbosity = quiet - -[a0.solver] -tolerance = 1e-10 -maximumIterations = 100000 -verbosity = quiet - -[v.solver] -tolerance = 1e-10 -maximumIterations = 100000 -verbosity = quiet - -[v.fpi] -tolerance = 1e-10 -maximumIterations = 10000 -relaxation = 0.5 -requiredReduction = 0.5 - -[solver.tnnmg.linear] -maxiumumIterations = 100000 -tolerance = 1e-10 -pre = 3 -cycle = 1 # 1 = V, 2 = W, etc. -post = 3 - -[solver.tnnmg.main] -pre = 1 -multi = 5 # number of multigrid steps -post = 0 - -[localsolver] -steps = 1 diff --git a/src/sliding-block.cc b/src/sliding-block.cc deleted file mode 100644 index ef52fbe3..00000000 --- a/src/sliding-block.cc +++ /dev/null @@ -1,463 +0,0 @@ -#include <Python.h> - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#ifndef HAVE_PYTHON -#error Python is required -#endif - -#ifdef HAVE_IPOPT -#undef HAVE_IPOPT -#endif - -#ifndef datadir -#error datadir unset -#endif - -#ifndef DIM -#error DIM unset -#endif - -#if !HAVE_ALUGRID -#error ALUGRID is required -#endif - -#include <cmath> -#include <exception> -#include <fstream> -#include <iostream> - -#include <dune/common/bitsetvector.hh> -#include <dune/common/exceptions.hh> -#include <dune/common/fmatrix.hh> -#include <dune/common/function.hh> -#include <dune/common/fvector.hh> -#include <dune/common/parametertree.hh> -#include <dune/common/parametertreeparser.hh> - -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wignored-qualifiers" -#include <dune/grid/alugrid.hh> -#pragma clang diagnostic pop - -#include <dune/grid/common/mcmgmapper.hh> -#include <dune/grid/utility/structuredgridfactory.hh> -#include <dune/istl/bcrsmatrix.hh> -#include <dune/istl/bvector.hh> - -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" -#include <dune/fufem/boundarypatch.hh> -#pragma clang diagnostic pop - -#include <dune/fufem/dunepython.hh> -#include <dune/fufem/functions/basisgridfunction.hh> -#include <dune/fufem/functionspacebases/p1nodalbasis.hh> -#include <dune/fufem/sharedpointermap.hh> -#include <dune/solvers/norms/energynorm.hh> -#include <dune/solvers/norms/sumnorm.hh> -#include <dune/solvers/solvers/loopsolver.hh> -#include <dune/solvers/solvers/solver.hh> -#include <dune/tnnmg/nonlinearities/zerononlinearity.hh> -#include <dune/tnnmg/problem-classes/blocknonlineartnnmgproblem.hh> -#include <dune/tnnmg/problem-classes/convexproblem.hh> - -#include <dune/tectonic/myblockproblem.hh> -#include <dune/tectonic/globalnonlinearity.hh> - -#include "assemblers.hh" -#include "enum_parser.cc" -#include "enum_scheme.cc" -#include "enum_state_model.cc" -#include "enum_verbosity.cc" -#include "enums.hh" -#include "friction_writer.hh" -#include "sliding-block-data/mybody.hh" -#include "sliding-block-data/mygeometry.hh" -#include "sliding-block-data/myglobalfrictiondata.hh" -#include "sliding-block-data/mygrid.hh" -#include "solverfactory.hh" -#include "state.hh" -#include "timestepping.hh" -#include "vtk.hh" -size_t const dims = DIM; - -void initPython() { - Python::start(); - - Python::run("import sys"); - Python::run("sys.path.append('" datadir "')"); -} - -int main(int argc, char *argv[]) { - try { - Dune::ParameterTree parset; - Dune::ParameterTreeParser::readINITree(datadir "/parset.cfg", parset); - Dune::ParameterTreeParser::readOptions(argc, argv, parset); - - // {{{ Set up grid - using Grid = Dune::ALUGrid<dims, dims, Dune::simplex, Dune::nonconforming>; - auto grid = constructGrid<Grid>(); - - auto const refinements = parset.get<size_t>("grid.refinements"); - grid->globalRefine(refinements); - size_t const fineVertexCount = grid->size(grid->maxLevel(), dims); - - using GridView = Grid::LeafGridView; - GridView const leafView = grid->leafView(); - // }}} - - // Set up myFaces - MyFaces<GridView> myFaces(leafView); - - // Neumann boundary - BoundaryPatch<GridView> const neumannBoundary(leafView); - - // Frictional Boundary - BoundaryPatch<GridView> const &frictionalBoundary = myFaces.lower; - Dune::BitSetVector<1> frictionalNodes(fineVertexCount); - frictionalBoundary.getVertices(frictionalNodes); - - // Dirichlet Boundary - Dune::BitSetVector<dims> noNodes(fineVertexCount); - Dune::BitSetVector<dims> dirichletNodes(fineVertexCount); - for (size_t i = 0; i < fineVertexCount; ++i) { - if (myFaces.lower.containsVertex(i)) - dirichletNodes[i][1] = true; - - if (myFaces.upper.containsVertex(i)) - dirichletNodes[i] = true; - } - - // Set up functions for time-dependent boundary conditions - using Function = Dune::VirtualFunction<double, double>; - using FunctionMap = SharedPointerMap<std::string, Function>; - FunctionMap functions; - { - initPython(); - Python::import("boundaryconditions") - .get("Functions") - .toC<typename FunctionMap::Base>(functions); - } - auto const &velocityDirichletFunction = - functions.get("velocityDirichletCondition"), - &neumannFunction = functions.get("neumannCondition"); - - using MyAssembler = MyAssembler<GridView, dims>; - using Matrix = MyAssembler::Matrix; - using LocalMatrix = Matrix::block_type; - using Vector = MyAssembler::Vector; - using LocalVector = Vector::block_type; - using ScalarMatrix = MyAssembler::ScalarMatrix; - using ScalarVector = MyAssembler::ScalarVector; - - MyAssembler myAssembler(leafView); - - MyBody<dims> const body(parset); - - Matrix A, C, M; - myAssembler.assembleElasticity(body.getYoungModulus(), - body.getPoissonRatio(), A); - myAssembler.assembleViscosity(body.getShearViscosityField(), - body.getBulkViscosityField(), C); - myAssembler.assembleMass(body.getDensityField(), M); - EnergyNorm<Matrix, Vector> const ANorm(A), MNorm(M); - // Q: Does it make sense to weigh them in this manner? - SumNorm<Vector> const AMNorm(1.0, ANorm, 1.0, MNorm); - - ScalarMatrix frictionalBoundaryMass; - myAssembler.assembleFrictionalBoundaryMass(frictionalBoundary, - frictionalBoundaryMass); - EnergyNorm<ScalarMatrix, ScalarVector> const stateEnergyNorm( - frictionalBoundaryMass); - - // Assemble forces - Vector gravityFunctional; - myAssembler.assembleBodyForce(body.getGravityField(), gravityFunctional); - - // Problem formulation: right-hand side - auto const computeExternalForces = [&](double _relativeTime, Vector &_ell) { - myAssembler.assembleNeumann(neumannBoundary, _ell, neumannFunction, - _relativeTime); - _ell += gravityFunctional; - }; - Vector ell(fineVertexCount); - computeExternalForces(0.0, ell); - - // {{{ Initial conditions - using LinearFactory = SolverFactory< - dims, BlockNonlinearTNNMGProblem<ConvexProblem< - ZeroNonlinearity<LocalVector, LocalMatrix>, Matrix>>, - Grid>; - ZeroNonlinearity<LocalVector, LocalMatrix> zeroNonlinearity; - - // TODO: clean up once generic lambdas arrive - auto const solveLinearProblem = [&]( - Dune::BitSetVector<dims> const &_dirichletNodes, Matrix const &_matrix, - Vector const &_rhs, Vector &_x, EnergyNorm<Matrix, Vector> const &_norm, - Dune::ParameterTree const &_localParset) { - LinearFactory factory(parset.sub("solver.tnnmg"), // FIXME - refinements, *grid, _dirichletNodes); - - typename LinearFactory::ConvexProblem convexProblem( - 1.0, _matrix, zeroNonlinearity, _rhs, _x); - typename LinearFactory::BlockProblem problem(parset, convexProblem); - - auto multigridStep = factory.getSolver(); - multigridStep->setProblem(_x, problem); - LoopSolver<Vector> solver( - multigridStep, _localParset.get<size_t>("maximumIterations"), - _localParset.get<double>("tolerance"), &_norm, - _localParset.get<Solver::VerbosityMode>("verbosity"), - false); // absolute error - - solver.preprocess(); - solver.solve(); - }; - - // Solve the stationary problem - Vector u_initial(fineVertexCount); - u_initial = 0.0; - solveLinearProblem(dirichletNodes, A, ell, u_initial, ANorm, - parset.sub("u0.solver")); - Vector ur_initial(fineVertexCount); - ur_initial = 0.0; - - ScalarVector alpha_initial(fineVertexCount); - alpha_initial = - std::log(parset.get<double>("boundary.friction.initialState")); - ScalarVector normalStress(fineVertexCount); - myAssembler.assembleNormalStress(frictionalBoundary, normalStress, - body.getYoungModulus(), - body.getPoissonRatio(), u_initial); - MyGlobalFrictionData<dims> frictionInfo(parset.sub("boundary.friction")); - auto myGlobalNonlinearity = myAssembler.assembleFrictionNonlinearity( - frictionalBoundary, frictionInfo, normalStress); - myGlobalNonlinearity->updateLogState(alpha_initial); - - Vector v_initial(fineVertexCount); - v_initial = 0.0; - { - // Prescribe a homogeneous velocity field in the x-direction - // This way, the initial condition for v and the Dirichlet - // condition match up at t=0 - double v_initial_const; - velocityDirichletFunction.evaluate(0.0, v_initial_const); - for (auto &x : v_initial) - x[0] = v_initial_const; - } - Vector vr_initial(fineVertexCount); - vr_initial = 0.0; - - Vector a_initial(fineVertexCount); - a_initial = 0.0; - { - // We solve Ma = ell - [Au + Cv + Psi(v)] - Vector accelerationRHS(fineVertexCount); - { - accelerationRHS = 0.0; - Arithmetic::addProduct(accelerationRHS, A, u_initial); - Arithmetic::addProduct(accelerationRHS, C, v_initial); - // NOTE: We assume differentiability of Psi at v0 here! - myGlobalNonlinearity->addGradient(v_initial, accelerationRHS); - accelerationRHS *= -1.0; - accelerationRHS += ell; - } - solveLinearProblem(noNodes, M, accelerationRHS, a_initial, MNorm, - parset.sub("a0.solver")); - } - // }}} - - Vector vertexCoordinates(fineVertexCount); - { - Dune::MultipleCodimMultipleGeomTypeMapper< - GridView, Dune::MCMGVertexLayout> const vertexMapper(leafView); - for (auto it = leafView.begin<dims>(); it != leafView.end<dims>(); ++it) { - auto const geometry = it->geometry(); - assert(geometry.corners() == 1); - vertexCoordinates[vertexMapper.map(*it)] = geometry.corner(0); - } - } - FrictionWriter<ScalarVector, Vector> frictionWriter( - vertexCoordinates, frictionalNodes, "friction", - [](LocalVector const &x) { return x[0]; }); - auto const reportFriction = [&](Vector const &_u, Vector const &_v, - ScalarVector const &_alpha) { - ScalarVector c; - myGlobalNonlinearity->coefficientOfFriction(_v, c); - frictionWriter.writeKinetics(_u, _v); - frictionWriter.writeOther(c, _alpha); - }; - reportFriction(ur_initial, vr_initial, alpha_initial); - - MyVTKWriter<typename MyAssembler::VertexBasis, - typename MyAssembler::CellBasis> const - vtkWriter(myAssembler.cellBasis, myAssembler.vertexBasis, "obs"); - - if (parset.get<bool>("io.writeVTK")) { - ScalarVector stress; - myAssembler.assembleVonMisesStress( - body.getYoungModulus(), body.getPoissonRatio(), u_initial, stress); - vtkWriter.write(0, ur_initial, vr_initial, alpha_initial, stress); - } - - // Set up TNNMG solver - using NonlinearFactory = - SolverFactory<dims, MyBlockProblem<ConvexProblem< - GlobalNonlinearity<Matrix, Vector>, Matrix>>, - Grid>; - NonlinearFactory factory(parset.sub("solver.tnnmg"), refinements, *grid, - dirichletNodes); - auto multigridStep = factory.getSolver(); - - std::fstream iterationWriter("iterations", std::fstream::out), - relaxationWriter("relaxation", std::fstream::out); - - auto timeSteppingScheme = initTimeStepper( - parset.get<Config::scheme>("timeSteps.scheme"), - velocityDirichletFunction, dirichletNodes, M, A, C, u_initial, - ur_initial, v_initial, vr_initial, a_initial); - auto stateUpdater = initStateUpdater<ScalarVector, Vector>( - parset.get<Config::stateModel>("boundary.friction.stateModel"), - alpha_initial, frictionalNodes, - parset.get<double>("boundary.friction.L")); - - Vector v = v_initial; - Vector v_m(fineVertexCount); - ScalarVector alpha(fineVertexCount); - - auto const timeSteps = parset.get<size_t>("timeSteps.number"), - maximumStateFPI = parset.get<size_t>("v.fpi.maximumIterations"), - maximumIterations = - parset.get<size_t>("v.solver.maximumIterations"); - auto const tau = parset.get<double>("problem.finalTime") / timeSteps, - tolerance = parset.get<double>("v.solver.tolerance"), - fixedPointTolerance = parset.get<double>("v.fpi.tolerance"), - relaxation = parset.get<double>("v.fpi.relaxation"), - requiredReduction = - parset.get<double>("v.fpi.requiredReduction"); - auto const printProgress = parset.get<bool>("io.printProgress"); - auto const verbosity = - parset.get<Solver::VerbosityMode>("v.solver.verbosity"); - for (size_t timeStep = 1; timeStep <= timeSteps; ++timeStep) { - if (printProgress) - std::cout << std::setw(7) << timeStep << " " << std::flush; - - stateUpdater->nextTimeStep(); - timeSteppingScheme->nextTimeStep(); - - auto const relativeTime = double(timeStep) / double(timeSteps); - computeExternalForces(relativeTime, ell); - - Matrix velocityMatrix; - Vector velocityRHS(fineVertexCount); - Vector velocityIterate(fineVertexCount); - - stateUpdater->setup(tau); - timeSteppingScheme->setup(ell, tau, relativeTime, velocityRHS, - velocityIterate, velocityMatrix); - - LoopSolver<Vector> velocityProblemSolver(multigridStep, maximumIterations, - tolerance, &AMNorm, verbosity, - false); // absolute error - - size_t iterationCounter; - auto solveVelocityProblem = [&](Vector &_velocityIterate, - ScalarVector const &_alpha) { - myGlobalNonlinearity->updateLogState(_alpha); - - // NIT: Do we really need to pass u here? - typename NonlinearFactory::ConvexProblem convexProblem( - 1.0, velocityMatrix, *myGlobalNonlinearity, velocityRHS, - _velocityIterate); - typename NonlinearFactory::BlockProblem velocityProblem(parset, - convexProblem); - multigridStep->setProblem(_velocityIterate, velocityProblem); - - velocityProblemSolver.preprocess(); - velocityProblemSolver.solve(); - iterationCounter = velocityProblemSolver.getResult().iterations; - }; - - Vector u; - Vector v_saved; - ScalarVector alpha_saved; - double lastStateCorrection; - for (size_t stateFPI = 1; stateFPI <= maximumStateFPI; ++stateFPI) { - timeSteppingScheme->extractOldVelocity(v_m); - v_m *= 0.5; - Arithmetic::addProduct(v_m, 0.5, v); - - stateUpdater->solve(v_m); - stateUpdater->extractLogState(alpha); - - if (stateFPI == 1) - relaxationWriter << "N "; - else { - double const stateCorrection = - stateEnergyNorm.diff(alpha, alpha_saved); - if (stateFPI <= 2 // lastStateCorrection is only set for stateFPI > 2 - or stateCorrection < requiredReduction * lastStateCorrection) - relaxationWriter << "N "; - else { - alpha *= (1.0 - relaxation); - Arithmetic::addProduct(alpha, relaxation, alpha_saved); - relaxationWriter << "Y "; - } - lastStateCorrection = stateCorrection; - } - - solveVelocityProblem(velocityIterate, alpha); - timeSteppingScheme->postProcess(velocityIterate); - timeSteppingScheme->extractDisplacement(u); - timeSteppingScheme->extractVelocity(v); - - iterationWriter << iterationCounter << " "; - if (printProgress) - std::cout << '.' << std::flush; - - if (stateFPI > 1) { - double const velocityCorrection = AMNorm.diff(v_saved, v); - if (velocityCorrection < fixedPointTolerance) - break; - } - if (stateFPI == maximumStateFPI) - DUNE_THROW(Dune::Exception, "FPI failed to converge"); - - alpha_saved = alpha; - v_saved = v; - } - if (printProgress) - std::cout << std::endl; - - Vector ur; - Vector vr; - timeSteppingScheme->postProcessRelativeQuantities(); - timeSteppingScheme->extractRelativeDisplacement(ur); - timeSteppingScheme->extractRelativeVelocity(vr); - - reportFriction(ur, vr, alpha); - iterationWriter << std::endl; - relaxationWriter << std::endl; - - if (parset.get<bool>("io.writeVTK")) { - ScalarVector stress; - myAssembler.assembleVonMisesStress(body.getYoungModulus(), - body.getPoissonRatio(), u, stress); - vtkWriter.write(timeStep, ur, vr, alpha, stress); - } - } - iterationWriter.close(); - relaxationWriter.close(); - - Python::stop(); - } - catch (Dune::Exception &e) { - Dune::derr << "Dune reported error: " << e << std::endl; - } - catch (std::exception &e) { - std::cerr << "Standard exception: " << e.what() << std::endl; - } -} -- GitLab