From ab7aa6f1f16b0e4f8c12f26f0f285be6e968aa96 Mon Sep 17 00:00:00 2001 From: Katharina Heck <katharina.heck@iws.uni-stuttgart.de> Date: Wed, 29 Apr 2020 14:59:33 +0000 Subject: [PATCH] Merge branch 'fix/test-saltwaterintrusion-increase-robustness' into 'master' Fix/test saltwaterintrusion increase robustness See merge request dumux-repositories/dumux!2092 (cherry picked from commit 5dbf559639f277a6069e0d83a4327122ee301236) 326c52a0 [test][1pnc] Cleanup unsused header files 5f769cbc [test][1p2c] Fix dt for saltwaterintrusion for more stable results --- .../saltwaterintrusion/CMakeLists.txt | 4 +- .../isothermal/saltwaterintrusion/main.cc | 72 ++++++++++++------- ...2c_saltwaterintrusion_box_dt-reference.dat | 33 +++++++++ 3 files changed, 80 insertions(+), 29 deletions(-) create mode 100644 test/porousmediumflow/1pnc/implicit/1p2c/isothermal/saltwaterintrusion/test_1p2c_saltwaterintrusion_box_dt-reference.dat diff --git a/test/porousmediumflow/1pnc/implicit/1p2c/isothermal/saltwaterintrusion/CMakeLists.txt b/test/porousmediumflow/1pnc/implicit/1p2c/isothermal/saltwaterintrusion/CMakeLists.txt index bab5486b2e..db68cc4654 100644 --- a/test/porousmediumflow/1pnc/implicit/1p2c/isothermal/saltwaterintrusion/CMakeLists.txt +++ b/test/porousmediumflow/1pnc/implicit/1p2c/isothermal/saltwaterintrusion/CMakeLists.txt @@ -1,4 +1,4 @@ -add_input_file_links() +dune_symlink_to_source_files(FILES params.input test_1p2c_saltwaterintrusion_box_dt-reference.dat) # salt-water intrusion test using the box model dumux_add_test(NAME test_1p2c_saltwaterintrusion_box @@ -10,4 +10,4 @@ dumux_add_test(NAME test_1p2c_saltwaterintrusion_box CMD_ARGS --script fuzzy --files ${CMAKE_SOURCE_DIR}/test/references/test_1p2c_saltwaterintrusion_box-reference.vtu ${CMAKE_CURRENT_BINARY_DIR}/test_1p2c_saltwaterintrusion_box-00033.vtu - --command "${CMAKE_CURRENT_BINARY_DIR}/test_1p2c_saltwaterintrusion_box params.input -Problem.Name test_1p2c_saltwaterintrusion_box") + --command "${CMAKE_CURRENT_BINARY_DIR}/test_1p2c_saltwaterintrusion_box params.input -Problem.Name test_1p2c_saltwaterintrusion_box -TimeLoop.TimeStepSizeFile test_1p2c_saltwaterintrusion_box_dt-reference.dat") diff --git a/test/porousmediumflow/1pnc/implicit/1p2c/isothermal/saltwaterintrusion/main.cc b/test/porousmediumflow/1pnc/implicit/1p2c/isothermal/saltwaterintrusion/main.cc index f55bc9d610..d3f834de13 100644 --- a/test/porousmediumflow/1pnc/implicit/1p2c/isothermal/saltwaterintrusion/main.cc +++ b/test/porousmediumflow/1pnc/implicit/1p2c/isothermal/saltwaterintrusion/main.cc @@ -24,16 +24,11 @@ #include <config.h> -#include <ctime> #include <iostream> +#include <limits> #include <dune/common/parallel/mpihelper.hh> -#include <dune/common/timer.hh> #include <dune/grid/io/file/dgfparser/dgfexception.hh> -#include <dune/grid/io/file/vtk.hh> -#include <dune/istl/io.hh> - -#include <dumux/discretization/method.hh> #include <dumux/common/properties.hh> #include <dumux/common/parameters.hh> @@ -41,11 +36,11 @@ #include <dumux/linear/seqsolverbackend.hh> #include <dumux/nonlinear/newtonsolver.hh> - #include <dumux/assembly/fvassembler.hh> #include <dumux/io/vtkoutputmodule.hh> -#include <dumux/io/grid/gridmanager.hh> +#include <dumux/io/grid/gridmanager_yasp.hh> +#include <dumux/io/container.hh> #include "problem.hh" @@ -94,7 +89,7 @@ int main(int argc, char** argv) try // the solution vector using SolutionVector = GetPropType<TypeTag, Properties::SolutionVector>; - SolutionVector x(gridGeometry->numDofs()); + SolutionVector x; problem->applyInitialSolution(x); auto xOld = x; @@ -103,12 +98,6 @@ int main(int argc, char** argv) try auto gridVariables = std::make_shared<GridVariables>(problem, gridGeometry); gridVariables->init(x); - // get some time loop parameters - using Scalar = GetPropType<TypeTag, Properties::Scalar>; - auto tEnd = getParam<Scalar>("TimeLoop.TEnd"); - auto dt = getParam<Scalar>("TimeLoop.DtInitial"); - auto maxDt = getParam<Scalar>("TimeLoop.MaxTimeStepSize"); - // intialize the vtk output module VtkOutputModule<GridVariables, SolutionVector> vtkWriter(*gridVariables, x, problem->name()); using VelocityOutput = GetPropType<TypeTag, Properties::VelocityOutput>; @@ -117,9 +106,26 @@ int main(int argc, char** argv) try IOFields::initOutputModule(vtkWriter); // Add model specific output fields vtkWriter.write(0.0); - // instantiate time loop - auto timeLoop = std::make_shared<TimeLoop<Scalar>>(0.0, dt, tEnd); - timeLoop->setMaxTimeStepSize(maxDt); + // time loop and parameters + std::shared_ptr<CheckPointTimeLoop<double>> timeLoop; + const bool hasTimeStepSizeFile = hasParam("TimeLoop.TimeStepSizeFile"); + std::vector<double> timeStepSizes; + + if (hasTimeStepSizeFile) + { + timeStepSizes = readFileToContainer<std::vector<double>>(getParam<std::string>("TimeLoop.TimeStepSizeFile")); + const auto dtInit = timeStepSizes[0]; + const auto tEnd = std::accumulate(timeStepSizes.begin(), timeStepSizes.end(), 0.0); + timeLoop = std::make_shared<CheckPointTimeLoop<double>>(0, dtInit, tEnd); + } + else + { + const auto dtInit = getParam<double>("TimeLoop.DtInitial"); + const auto tEnd = getParam<double>("TimeLoop.TEnd"); + const auto maxDt = getParam<double>("TimeLoop.MaxTimeStepSize"); + timeLoop = std::make_shared<CheckPointTimeLoop<double>>(0, dtInit, tEnd); + timeLoop->setMaxTimeStepSize(maxDt); + } // the assembler with time loop for instationary problem using Assembler = FVAssembler<TypeTag, DiffMethod::numeric>; @@ -138,6 +144,13 @@ int main(int argc, char** argv) try // solve the non-linear system with time step control nonLinearSolver.solve(x, *timeLoop); + // if the time step sizes are not read from file + // save the succeeded time step size in the time step size vector + // we write that to file below to that it can be used on the next run + // to reproduce exactly the same time step sizes + if (!hasTimeStepSizeFile) + timeStepSizes.push_back(timeLoop->timeStepSize()); + // make the new solution the old solution xOld = x; gridVariables->advanceTimeStep(); @@ -152,7 +165,10 @@ int main(int argc, char** argv) try timeLoop->reportTimeStep(); // set new dt as suggested by the newton solver - timeLoop->setTimeStepSize(nonLinearSolver.suggestTimeStepSize(timeLoop->timeStepSize())); + if (hasTimeStepSizeFile) + timeLoop->setTimeStepSize(timeStepSizes[timeLoop->timeStepIndex()]); + else + timeLoop->setTimeStepSize(nonLinearSolver.suggestTimeStepSize(timeLoop->timeStepSize())); } while (!timeLoop->finished()); @@ -164,17 +180,24 @@ int main(int argc, char** argv) try // print dumux end message if (mpiHelper.rank() == 0) + { + // write out the exact time steps this program used to produce a well-reproducible test + if (!hasTimeStepSizeFile) + writeContainerToFile(timeStepSizes, problem->name() + "_dt-reference.dat", + std::numeric_limits<double>::digits10); + DumuxMessage::print(/*firstCall=*/false); + } return 0; } -catch (Dumux::ParameterException &e) +catch (const Dumux::ParameterException &e) { std::cerr << std::endl << e << " ---> Abort!" << std::endl; return 1; } -catch (Dune::DGFException & e) +catch (const Dune::DGFException & e) { std::cerr << "DGF exception thrown (" << e << "). Most likely, the DGF file name is wrong " @@ -183,13 +206,8 @@ catch (Dune::DGFException & e) << " ---> Abort!" << std::endl; return 2; } -catch (Dune::Exception &e) +catch (const Dune::Exception &e) { std::cerr << "Dune reported error: " << e << " ---> Abort!" << std::endl; return 3; } -catch (...) -{ - std::cerr << "Unknown exception thrown! ---> Abort!" << std::endl; - return 4; -} diff --git a/test/porousmediumflow/1pnc/implicit/1p2c/isothermal/saltwaterintrusion/test_1p2c_saltwaterintrusion_box_dt-reference.dat b/test/porousmediumflow/1pnc/implicit/1p2c/isothermal/saltwaterintrusion/test_1p2c_saltwaterintrusion_box_dt-reference.dat new file mode 100644 index 0000000000..3bedb71ae1 --- /dev/null +++ b/test/porousmediumflow/1pnc/implicit/1p2c/isothermal/saltwaterintrusion/test_1p2c_saltwaterintrusion_box_dt-reference.dat @@ -0,0 +1,33 @@ +1.000000000000000e+00 +1.500000000000000e+00 +2.375000000000000e+00 +3.760416666666667e+00 +5.953993055555556e+00 +9.923321759259261e+00 +1.653886959876544e+01 +2.756478266460906e+01 +4.594130444101511e+01 +7.656884073502518e+01 +1.276147345583753e+02 +2.126912242639588e+02 +3.544853737732648e+02 +5.908089562887747e+02 +9.846815938146244e+02 +1.641135989691041e+03 +2.735226649485068e+03 +4.558711082475114e+03 +7.597851804125191e+03 +1.266308634020865e+04 +2.110514390034775e+04 +3.517523983391292e+04 +5.862539972318820e+04 +9.282354956171467e+04 +1.469706201393816e+05 +2.327034818873542e+05 +3.684471796549775e+05 +5.526707694824662e+05 +8.290061542236992e+05 +1.243509231335549e+06 +1.761638077725361e+06 +2.202047597156702e+06 +2.423620135097741e+06 -- GitLab