diff --git a/dune/tectonic/factories/stackedblocksfactory.cc b/dune/tectonic/factories/stackedblocksfactory.cc index b4665f042f70b46f37e8c3dcb1d82d079abf0d7f..877e32cfb52c3a498dc00709a0a5b777227128fd 100644 --- a/dune/tectonic/factories/stackedblocksfactory.cc +++ b/dune/tectonic/factories/stackedblocksfactory.cc @@ -95,23 +95,24 @@ void StackedBlocksFactory<HostGridType, VectorType>::setBodies() { #error CuboidGeometry only supports 2D and 3D!" #endif - // set up reference grids - gridConstructor_ = std::make_unique<GridsConstructor<HostGridType>>(cuboidGeometries_); - auto& grids = gridConstructor_->getGrids(); - for (size_t i=0; i<this->bodyCount_; i++) { const auto& cuboidGeometry = *cuboidGeometries_[i]; + // set up reference grid + CuboidGridConstructor<HostGridType> gridConstructor(cuboidGeometry); + // define weak patch and refine grid const auto& weakeningRegions = cuboidGeometry.weakeningRegions(); for (size_t j=0; j<weakeningRegions.size(); j++) { - refine(*grids[i], weakeningRegions[j], this->parset_.template get<double>("boundary.friction.smallestDiameter"), CuboidGeometry::lengthScale()); + gridConstructor.refine(weakeningRegions[j], this->parset_.template get<double>("boundary.friction.smallestDiameter"), CuboidGeometry::lengthScale()); } + this->bodies_[i] = std::make_shared<typename Base::LeafBody>(bodyData_, gridConstructor.grid()); + // determine minDiameter and maxDiameter double minDiameter = std::numeric_limits<double>::infinity(); double maxDiameter = 0.0; - for (auto &&e : elements(grids[i]->leafGridView())) { + for (auto &&e : elements(gridConstructor.grid()->leafGridView())) { auto const geometry = e.geometry(); auto const diam = diameter(geometry); minDiameter = std::min(minDiameter, diam); @@ -120,10 +121,6 @@ void StackedBlocksFactory<HostGridType, VectorType>::setBodies() { std::cout << "Grid" << i << " min diameter: " << minDiameter << std::endl; std::cout << "Grid" << i << " max diameter: " << maxDiameter << std::endl; } - - for (size_t i=0; i<this->bodyCount_; i++) { - this->bodies_[i] = std::make_shared<typename Base::LeafBody>(bodyData_, grids[i]); - } } diff --git a/dune/tectonic/factories/stackedblocksfactory.hh b/dune/tectonic/factories/stackedblocksfactory.hh index fb21774a9619eafa7cb9626f2197649d1b8bcd74..d7d2c88d25834604d4d5808131718143eb74e47f 100644 --- a/dune/tectonic/factories/stackedblocksfactory.hh +++ b/dune/tectonic/factories/stackedblocksfactory.hh @@ -10,7 +10,7 @@ #include "contactnetworkfactory.hh" #include "../problem-data/mybody.hh" -#include "../problem-data/grid/mygrids.hh" +#include "../problem-data/grid/cuboidgridconstructor.hh" #include "../problem-data/grid/cuboidgeometry.hh" template <class HostGridType, class VectorType> class StackedBlocksFactory : public ContactNetworkFactory<HostGridType, VectorType>{ @@ -39,8 +39,6 @@ template <class HostGridType, class VectorType> class StackedBlocksFactory : pub const std::shared_ptr<MyBodyData<dim>> bodyData_; // material properties of bodies - std::unique_ptr<GridsConstructor<HostGridType>> gridConstructor_; - std::vector<std::shared_ptr<CuboidGeometry>> cuboidGeometries_; std::vector<std::shared_ptr<LeafFaces>> leafFaces_; @@ -54,7 +52,7 @@ template <class HostGridType, class VectorType> class StackedBlocksFactory : pub public: StackedBlocksFactory(const Dune::ParameterTree& parset) : Base(parset, parset.get<size_t>("problem.bodyCount"), parset.get<size_t>("problem.bodyCount")-1), - bodyData_(std::make_shared<MyBodyData<dim>>(this->parset_.sub("body"), this->parset_.template get<double>("gravity"), zenith_())), + bodyData_(std::make_shared<MyBodyData<dim>>(this->parset_.sub("body"), this->parset_.template get<double>("general.gravity"), zenith_())), cuboidGeometries_(this->bodyCount_), leafFaces_(this->bodyCount_), levelFaces_(this->bodyCount_), diff --git a/dune/tectonic/problem-data/grid/mygrids.hh b/dune/tectonic/problem-data/grid/mygrids.hh index 6883c228041c73e1a9b02c0013d23eb533e2ccbb..e324ead9ee3cb6e0ac43ee0b433bf6c9d5b648d5 100644 --- a/dune/tectonic/problem-data/grid/mygrids.hh +++ b/dune/tectonic/problem-data/grid/mygrids.hh @@ -7,6 +7,7 @@ #include <dune/fufem/boundarypatch.hh> #include <dune/fufem/geometry/convexpolyhedron.hh> +#include "cuboidgridconstructor.hh" #include "cuboidgeometry.hh" template <class GridView> struct MyFaces { @@ -46,7 +47,7 @@ template <class GridView> struct MyFaces { template <class Grid> -class CuboidGridConstructor : public GridConstructor<Grid> { +class CuboidGridConstructor : public CuboidGridConstructor<Grid> { public: CuboidGridConstructor(const CuboidGeometry<typename Grid::ctype>& cuboidGeometry); diff --git a/dune/tectonic/spatial-solving/fixedpointiterator.cc b/dune/tectonic/spatial-solving/fixedpointiterator.cc index 265790d4de74e9c1e46ecc21aa082c8d824adb63..2798c76574e2718ac4de19ab965d869fa2790b9b 100644 --- a/dune/tectonic/spatial-solving/fixedpointiterator.cc +++ b/dune/tectonic/spatial-solving/fixedpointiterator.cc @@ -152,7 +152,7 @@ FixedPointIterator<Factory, NBodyAssembler, Updaters, ErrorNorms>::run( nBodyAssembler_.postprocess(total_v, velocityIterates); //Rprint(velocityIterates, "velocityIterates loop:"); updaters.rate_->postProcess(velocityIterates); - bool breakCriterion = displacementCriterion(updaters, last_u); //displacementCriterion(updaters, last_u); //stateCriterion(alpha, newAlpha); + bool breakCriterion = stateCriterion(alpha, newAlpha); //displacementCriterion(updaters, last_u); //stateCriterion(alpha, newAlpha); //printRegularityTruncation(globalFriction_, total_v); diff --git a/src/foam/foam.cfg b/src/foam/foam.cfg index b0ce4bb0044aca99641654dbad7d77848e8c0c9e..572b7afc11e7d0d89e5580a814662605ac3e0d03 100644 --- a/src/foam/foam.cfg +++ b/src/foam/foam.cfg @@ -1,13 +1,13 @@ # -*- mode:conf -*- [general] -outPath = pipping-2013-euler # output written to ./output/outPath +outPath = pipping-2013-newmark-double-1e5 # output written to ./output/outPath gravity = 9.81 # [m/s^2] [body0] length = 6.0 # [m] height = 1.0 # [m] -bulkModulus = 0.0 # 4.12e7 #4.12e9 # [Pa] #2190 -poissonRatio = 0.0 #0.3 # [1] #0.11 +bulkModulus = 4.12e7 #4.12e9 # [Pa] #2190 +poissonRatio = 0.3 # [1] #0.11 [body0.elastic] density = 5e3 # [kg/m^3] #750 shearViscosity = 0.0 # [Pas] @@ -63,17 +63,17 @@ restarts.write = true #true vtk.write = true [problem] -finalTime = 15 # [s] #1000 +finalTime = 50 # [s] #1000 bodyCount = 2 [initialTime] timeStep = 0 relativeTime = 0.0 -relativeTau = 1e-4 # 1e-6 +relativeTau = 1e-5 # 1e-6 [timeSteps] -scheme = backwardEuler # newmark -timeSteps = 1e4 +scheme = newmark # newmark, backwardEuler +timeSteps = 1e5 [u0.solver] maximumIterations = 100 diff --git a/src/multi-body-problem/CMakeLists.txt b/src/multi-body-problem/CMakeLists.txt index 272477e6da80977fb420868e4791bd02056e0ecc..9654fa4e1659f5204fc69b300aabfdfb23c23979 100644 --- a/src/multi-body-problem/CMakeLists.txt +++ b/src/multi-body-problem/CMakeLists.txt @@ -11,7 +11,7 @@ set(MSW_SOURCE_FILES ../../dune/tectonic/data-structures/network/contactnetwork.cc ../../dune/tectonic/data-structures/enumparser.cc #../../dune/tectonic/factories/cantorfactory.cc - ../../dune/tectonic/factories/threeblocksfactory.cc + #../../dune/tectonic/factories/threeblocksfactory.cc ../../dune/tectonic/factories/stackedblocksfactory.cc #../../dune/tectonic/io/vtk.cc #../../dune/tectonic/io/hdf5/frictionalboundary-writer.cc @@ -21,7 +21,7 @@ set(MSW_SOURCE_FILES #../../dune/tectonic/io/hdf5/surface-writer.cc #../../dune/tectonic/io/hdf5/time-writer.cc ../../dune/tectonic/problem-data/grid/cuboidgeometry.cc - ../../dune/tectonic/problem-data/grid/mygrids.cc + #../../dune/tectonic/problem-data/grid/mygrids.cc ../../dune/tectonic/problem-data/grid/simplexmanager.cc ../../dune/tectonic/spatial-solving/solverfactory.cc ../../dune/tectonic/spatial-solving/fixedpointiterator.cc @@ -30,6 +30,7 @@ set(MSW_SOURCE_FILES ../../dune/tectonic/time-stepping/rate.cc ../../dune/tectonic/time-stepping/rate/rateupdater.cc ../../dune/tectonic/time-stepping/state.cc + ../../dune/tectonic/time-stepping/uniformtimestepper.cc multi-body-problem.cc ) diff --git a/src/multi-body-problem/multi-body-problem-2D.cfg b/src/multi-body-problem/multi-body-problem-2D.cfg index d17965a838358b1ed23731805907260c5bf5075e..f6110f74061c3e20f69c27855859fd284dedf12b 100644 --- a/src/multi-body-problem/multi-body-problem-2D.cfg +++ b/src/multi-body-problem/multi-body-problem-2D.cfg @@ -1,9 +1,9 @@ # -*- mode:conf -*- [boundary.friction] -smallestDiameter = 0.05 # 0.05 2e-3 [m] +smallestDiameter = 2e-2 # 0.05 2e-3 [m] [timeSteps] -refinementTolerance = 2e-2 # 1e-5 +refinementTolerance = 1e-5 # 1e-5 [u0.solver] tolerance = 1e-8 diff --git a/src/multi-body-problem/multi-body-problem.cc b/src/multi-body-problem/multi-body-problem.cc index 84a580ddbdfdd974d3ec2b8e46630de1cc96e224..58da326b67f1a0e671aebe00856881c20cdeb45a 100644 --- a/src/multi-body-problem/multi-body-problem.cc +++ b/src/multi-body-problem/multi-body-problem.cc @@ -55,7 +55,7 @@ #include <dune/tectonic/data-structures/friction/globalfriction.hh> #include <dune/tectonic/factories/stackedblocksfactory.hh> -#include <dune/tectonic/factories/threeblocksfactory.hh> +//#include <dune/tectonic/factories/threeblocksfactory.hh> #include <dune/tectonic/io/io-handler.hh> #include <dune/tectonic/io/hdf5-writer.hh> @@ -64,7 +64,7 @@ #include <dune/tectonic/problem-data/bc.hh> #include <dune/tectonic/problem-data/mybody.hh> -#include <dune/tectonic/problem-data/grid/mygrids.hh> +//#include <dune/tectonic/problem-data/grid/mygrids.hh> #include <dune/tectonic/spatial-solving/tnnmg/functional.hh> //#include <dune/tectonic/spatial-solving/preconditioners/multilevelpatchpreconditioner.hh> @@ -72,6 +72,7 @@ #include <dune/tectonic/spatial-solving/solverfactory.hh> #include <dune/tectonic/time-stepping/adaptivetimestepper.hh> +#include <dune/tectonic/time-stepping/uniformtimestepper.hh> #include <dune/tectonic/time-stepping/rate.hh> #include <dune/tectonic/time-stepping/state.hh> #include <dune/tectonic/time-stepping/stepbase.hh> @@ -92,11 +93,13 @@ size_t const dims = MY_DIM; #include <dune/tectonic/utils/reductionfactors.hh> std::vector<std::vector<double>> allReductionFactors; +const std::string sourcePath = "/home/joscha/software/dune/dune-tectonic/src/multi-body-problem/"; + Dune::ParameterTree getParameters(int argc, char *argv[]) { Dune::ParameterTree parset; - Dune::ParameterTreeParser::readINITree("/home/joscha/software/dune/dune-tectonic/src/multi-body-problem/multi-body-problem.cfg", parset); + Dune::ParameterTreeParser::readINITree(sourcePath + "multi-body-problem.cfg", parset); Dune::ParameterTreeParser::readINITree( - Dune::Fufem::formatString("/home/joscha/software/dune/dune-tectonic/src/multi-body-problem/multi-body-problem-%dD.cfg", dims), parset); + Dune::Fufem::formatString(sourcePath + "multi-body-problem-%dD.cfg", dims), parset); Dune::ParameterTreeParser::readOptions(argc, argv, parset); return parset; } @@ -105,6 +108,14 @@ static std::atomic<bool> terminationRequested(false); void handleSignal(int signum) { terminationRequested = true; } int main(int argc, char *argv[]) { + using BlocksFactory = StackedBlocksFactory<Grid, Vector>; + using ContactNetwork = typename BlocksFactory::ContactNetwork; + using MyProgramState = ProgramState<Vector, ScalarVector>; + using Assembler = MyAssembler<DefLeafGridView, dims>; + + using IOHandler = IOHandler<Assembler, ContactNetwork, MyProgramState>; + std::unique_ptr<IOHandler> ioHandler; + try { Dune::MPIHelper::instance(argc, argv); @@ -115,24 +126,28 @@ int main(int argc, char *argv[]) { std::cout << argv[0] << std::endl; } + auto const parset = getParameters(argc, argv); + + auto outPath = std::filesystem::current_path(); + outPath += "/output/" + parset.get<std::string>("general.outPath"); + if (!std::filesystem::is_directory(outPath)) + std::filesystem::create_directories(outPath); + + const auto copyOptions = std::filesystem::copy_options::overwrite_existing; + std::filesystem::copy(sourcePath + "multi-body-problem.cfg", outPath, copyOptions); + std::filesystem::copy(Dune::Fufem::formatString(sourcePath + "multi-body-problem-%dD.cfg", dims), outPath, copyOptions); + std::filesystem::current_path(outPath); + std::ofstream out("multi-body-problem.log"); std::streambuf *coutbuf = std::cout.rdbuf(); //save old buffer std::cout.rdbuf(out.rdbuf()); //redirect std::cout to log.txt - auto const parset = getParameters(argc, argv); - - using Assembler = MyAssembler<DefLeafGridView, dims>; using field_type = Matrix::field_type; // ---------------------- // set up contact network // ---------------------- - - using BlocksFactory = StackedBlocksFactory<Grid, Vector>; - //using BlocksFactory = ThreeBlocksFactory<Grid, Vector>; BlocksFactory blocksFactory(parset); - - using ContactNetwork = typename BlocksFactory::ContactNetwork; blocksFactory.build(); ContactNetwork& contactNetwork = blocksFactory.contactNetwork(); @@ -149,7 +164,7 @@ int main(int argc, char *argv[]) { const auto& level = *contactNetwork.level(i); for (size_t j=0; j<level.nBodies(); j++) { - writeToVTK(level.body(j)->gridView(), "../debug_print/bodies/", "body_" + std::to_string(j) + "_level_" + std::to_string(i)); + //writeToVTK(level.body(j)->gridView(), "../debug_print/bodies/", "body_" + std::to_string(j) + "_level_" + std::to_string(i)); } } @@ -172,20 +187,44 @@ int main(int argc, char *argv[]) { for (size_t i=0; i<bodyCount; i++) { nVertices[i] = contactNetwork.body(i)->nVertices(); } + print(nVertices, "#dofs: "); - using MyProgramState = ProgramState<Vector, ScalarVector>; MyProgramState programState(nVertices); - IOHandler<Assembler, ContactNetwork> ioHandler(parset.sub("io"), contactNetwork); + ioHandler = std::make_unique<IOHandler>(parset.sub("io"), contactNetwork); - bool restartRead = ioHandler.read(programState); + bool restartRead = ioHandler->read(programState); if (!restartRead) { programState.setupInitialConditions(parset, contactNetwork); } - //print(programState.u, "u:"); - auto& nBodyAssembler = contactNetwork.nBodyAssembler(); + + BitVector totalDirichletNodes; + contactNetwork.totalNodes("dirichlet", totalDirichletNodes); + + using BoundaryNodes = typename ContactNetwork::BoundaryNodes; + BoundaryNodes dirichletNodes; + contactNetwork.boundaryNodes("dirichlet", dirichletNodes); + + size_t dof = 0; + for (size_t i=0; i<bodyCount; i++) { + const auto& body = *contactNetwork.body(i); + + if (body.data()->getYoungModulus() == 0.0) { + for (size_t j=0; j<body.nVertices(); j++) { + totalDirichletNodes[dof] = true; + dof++; + } + } else { + dof += body.nVertices(); + } + } + + std::vector<const Dune::BitSetVector<1>*> frictionNodes; + contactNetwork.frictionNodes(frictionNodes); + + for (size_t i=0; i<bodyCount; i++) { contactNetwork.body(i)->setDeformation(programState.u[i]); } @@ -200,34 +239,14 @@ int main(int argc, char *argv[]) { auto& globalFriction = contactNetwork.globalFriction(); globalFriction.updateAlpha(programState.alpha); - IterationRegister iterationCount; - ioHandler.write(programState, contactNetwork, globalFriction, iterationCount, true); - - //DUNE_THROW(Dune::Exception, "Just need to stop here!"); + ioHandler->write(programState, contactNetwork, globalFriction, iterationCount, true); // ------------------- // Set up TNNMG solver // ------------------- - BitVector totalDirichletNodes; - contactNetwork.totalNodes("dirichlet", totalDirichletNodes); - - for (size_t i=0; i<totalDirichletNodes.size(); i++) { - bool val = false; - for (size_t d=0; d<dims; d++) { - val = val || totalDirichletNodes[i][d]; - } - - totalDirichletNodes[i] = val; - for (size_t d=0; d<dims; d++) { - totalDirichletNodes[i][d] = val; - } - } - - //print(totalDirichletNodes, "totalDirichletNodes:"); - //using Functional = Functional<Matrix&, Vector&, ZeroNonlinearity&, Vector&, Vector&, field_type>; using Functional = Functional<Matrix&, Vector&, GlobalFriction<Matrix, Vector>&, Vector&, Vector&, field_type>; using NonlinearFactory = SolverFactory<Functional, BitVector>; @@ -240,18 +259,12 @@ int main(int argc, char *argv[]) { BoundaryFunctions velocityDirichletFunctions; contactNetwork.boundaryFunctions("dirichlet", velocityDirichletFunctions); - BoundaryNodes dirichletNodes; - contactNetwork.boundaryNodes("dirichlet", dirichletNodes); - /*for (size_t i=0; i<dirichletNodes.size(); i++) { for (size_t j=0; j<dirichletNodes[i].size(); j++) { print(*dirichletNodes[i][j], "dirichletNodes_body_" + std::to_string(i) + "_boundary_" + std::to_string(j)); } }*/ - std::vector<const Dune::BitSetVector<1>*> frictionNodes; - contactNetwork.frictionNodes(frictionNodes); - /*for (size_t i=0; i<frictionNodes.size(); i++) { print(*frictionNodes[i], "frictionNodes_body_" + std::to_string(i)); }*/ @@ -272,7 +285,6 @@ int main(int argc, char *argv[]) { contactNetwork.couplings()) ); - auto const refinementTolerance = parset.get<double>("timeSteps.refinementTolerance"); const auto& stateEnergyNorms = contactNetwork.stateEnergyNorms(); @@ -346,21 +358,25 @@ int main(int argc, char *argv[]) { stepBase(parset, contactNetwork, totalDirichletNodes, globalFriction, frictionNodes, externalForces, stateEnergyNorms); + /*UniformTimeStepper<NonlinearFactory, std::decay_t<decltype(contactNetwork)>, Updaters, std::decay_t<decltype(stateEnergyNorms)>> + timeStepper(stepBase, contactNetwork, current, + programState.relativeTime, programState.relativeTau); */ + AdaptiveTimeStepper<NonlinearFactory, std::decay_t<decltype(contactNetwork)>, Updaters, std::decay_t<decltype(stateEnergyNorms)>> - adaptiveTimeStepper(stepBase, contactNetwork, current, + timeStepper(stepBase, contactNetwork, current, programState.relativeTime, programState.relativeTau, mustRefine); - size_t timeSteps = parset.get<size_t>("timeSteps.timeSteps"); + size_t timeSteps = std::round(parset.get<double>("timeSteps.timeSteps")); - while (!adaptiveTimeStepper.reachedEnd()) { + while (!timeStepper.reachedEnd()) { programState.timeStep++; //preconditioner.build(); - iterationCount = adaptiveTimeStepper.advance(); + iterationCount = timeStepper.advance(); - programState.relativeTime = adaptiveTimeStepper.relativeTime_; - programState.relativeTau = adaptiveTimeStepper.relativeTau_; + programState.relativeTime = timeStepper.relativeTime_; + programState.relativeTau = timeStepper.relativeTau_; current.rate_->extractDisplacement(programState.u); current.rate_->extractVelocity(programState.v); current.rate_->extractAcceleration(programState.a); @@ -374,7 +390,7 @@ int main(int argc, char *argv[]) { contactNetwork.setDeformation(programState.u); - ioHandler.write(programState, contactNetwork, globalFriction, iterationCount, false); + ioHandler->write(programState, contactNetwork, globalFriction, iterationCount, false); if (programState.timeStep==timeSteps) { std::cout << "limit of timeSteps reached!" << std::endl; diff --git a/src/multi-body-problem/multi-body-problem.cfg b/src/multi-body-problem/multi-body-problem.cfg index 244aeb3bfbcd0d21824cefb96961ea6963fd128f..384b352c59baa4cf6c3ad6573c987fdeedd0be1a 100644 --- a/src/multi-body-problem/multi-body-problem.cfg +++ b/src/multi-body-problem/multi-body-problem.cfg @@ -1,34 +1,36 @@ # -*- mode:conf -*- +[general] +outPath = newmark-1e4 # output written to ./output/outPath gravity = 9.81 # [m/s^2] [body] -bulkModulus = 1.5e5 # [Pa] -poissonRatio = 0.11 # [1] +bulkModulus = 4.12e7 # [Pa] +poissonRatio = 0.3 # [1] [body.elastic] -density = 1300 # [kg/m^3] -shearViscosity = 0 # [Pas] -bulkViscosity = 0 # [Pas] +density = 5e3 # [kg/m^3] +shearViscosity = 0.0 # [Pas] +bulkViscosity = 0.0 # [Pas] [body.viscoelastic] -density = 1300 # [kg/m^3] -shearViscosity = 1e4 # [Pas] -bulkViscosity = 1e4 # [Pas] +density = 5e3 # [kg/m^3] +shearViscosity = 0.0 # [Pas] +bulkViscosity = 0.0 # [Pas] [boundary.friction] -C = 6 # [Pa] -mu0 = 0.48 # [ ] -V0 = 1e-3 # [m/s] -L = 1e-6 # [m] -initialAlpha = 0 # [ ] +C = 0 # [Pa] +mu0 = 0.6 # [ ] +V0 = 1e-6 # [m/s] +L = 1e-5 # [m] +initialAlpha = -10 # [ ] stateModel = AgeingLaw -frictionModel = Truncated #Regularised +frictionModel = Truncated #Truncated #Regularised [boundary.friction.weakening] -a = 0.054 # [ ] -b = 0.074 # [ ] +a = 0.010 # [ ] +b = 0.015 # [ ] [boundary.friction.strengthening] -a = 0.054 # [ ] -b = 0.074 # [ ] +a = 0.010 # [ ] +b = 0.015 # [ ] [boundary.neumann] @@ -36,30 +38,30 @@ sigmaN = 0.0 # 200.0 [Pa] [boundary.dirichlet] -finalVelocity = 1e-4 # [m/s] +finalVelocity = 2e-4 # [m/s] [initialTime] timeStep = 0 relativeTime = 0.0 -relativeTau = 2e-4 # 1e-6 +relativeTau = 1e-4 # 1e-6 [timeSteps] scheme = newmark -timeSteps = 5 +timeSteps = 1e4 [problem] -finalTime = 100 # [s] #1000 +finalTime = 50 # [s] #1000 bodyCount = 4 [io] -data.write = false +data.write = true printProgress = true restarts.first = 0 -restarts.spacing= 1 #20 +restarts.spacing= 50 #20 restarts.write = true #true vtk.write = true