diff --git a/test/porousmediumflow/2pncmin/implicit/CMakeLists.txt b/test/porousmediumflow/2pncmin/implicit/CMakeLists.txt index c2916b90c0efb9e4e3742cd2e2e7432fa99ec352..97acf87e36e2b0bb2fd322f7614103c65360870f 100644 --- a/test/porousmediumflow/2pncmin/implicit/CMakeLists.txt +++ b/test/porousmediumflow/2pncmin/implicit/CMakeLists.txt @@ -10,6 +10,18 @@ dune_add_test(NAME test_2pncmin_box ${CMAKE_CURRENT_BINARY_DIR}/saltflushbox-00044.vtu --command "${CMAKE_CURRENT_BINARY_DIR}/test_2pncmin_box -ParameterFile test_2pncmin.input -Problem.Name saltflushbox") +dune_add_test(NAME test_2pncmin_box_restart + SOURCES test_2pncmin_fv.cc + COMPILE_DEFINITIONS TYPETAG=DissolutionBoxTypeTag + COMMAND ${CMAKE_SOURCE_DIR}/bin/testing/runtest.py + CMD_ARGS --script fuzzy + --files ${CMAKE_SOURCE_DIR}/test/references/saltflushbox2pncmin-reference.vtu + ${CMAKE_CURRENT_BINARY_DIR}/saltflushbox_restart-00005.vtu + --command "${CMAKE_CURRENT_BINARY_DIR}/test_2pncmin_box test_2pncmin.input -Problem.Name saltflushbox_restart -TimeLoop.DtInitial 50000 -Restart.Time 756290 -Restart.File saltflushbox-00039.vtu") + +# the restart test has to run after the test that produces the corresponding vtu file +set_tests_properties(test_2pncmin_box_restart PROPERTIES DEPENDS test_2pncmin_box) + dune_add_test(NAME test_2pncmin_tpfa SOURCES test_2pncmin_fv.cc COMPILE_DEFINITIONS TYPETAG=DissolutionCCTpfaTypeTag diff --git a/test/porousmediumflow/2pncmin/implicit/test_2pncmin.input b/test/porousmediumflow/2pncmin/implicit/test_2pncmin.input index 0fd2372265fbdf8e1a9d062ca49c134a604bacd2..4c2792f064a50eaa4cbaea59fa44052c53467e3a 100644 --- a/test/porousmediumflow/2pncmin/implicit/test_2pncmin.input +++ b/test/porousmediumflow/2pncmin/implicit/test_2pncmin.input @@ -4,7 +4,7 @@ [TimeLoop] TEnd = 1e6 # duration of the simulation [s] -DtInitial = 10 # initial time step size [s] +DtInitial = 10 # initial time step size [s] MaxTimeStepSize = 50000 # maximum time step size [Grid] diff --git a/test/porousmediumflow/2pncmin/implicit/test_2pncmin_fv.cc b/test/porousmediumflow/2pncmin/implicit/test_2pncmin_fv.cc index 3fec54e9c6e40039975c9a36f4ceea6e6de58afc..494f6854ad060e7854b495aa80f334f6e3e0dfe4 100644 --- a/test/porousmediumflow/2pncmin/implicit/test_2pncmin_fv.cc +++ b/test/porousmediumflow/2pncmin/implicit/test_2pncmin_fv.cc @@ -50,6 +50,7 @@ #include <dumux/io/vtkoutputmodule.hh> #include <dumux/io/grid/gridmanager.hh> +#include <dumux/io/loadsolution.hh> /*! * \brief Provides an interface for customizing error messages associated with @@ -111,10 +112,29 @@ int main(int argc, char** argv) try using Problem = typename GET_PROP_TYPE(TypeTag, Problem); auto problem = std::make_shared<Problem>(fvGridGeometry); + // get some time loop parameters + using Scalar = typename GET_PROP_TYPE(TypeTag, Scalar); + const auto tEnd = getParam<Scalar>("TimeLoop.TEnd"); + const auto maxDt = getParam<Scalar>("TimeLoop.MaxTimeStepSize"); + auto dt = getParam<Scalar>("TimeLoop.DtInitial"); + + // check if we are about to restart a previously interrupted simulation + Scalar restartTime = getParam<Scalar>("Restart.Time", 0); + // the solution vector using SolutionVector = typename GET_PROP_TYPE(TypeTag, SolutionVector); SolutionVector x(fvGridGeometry->numDofs()); - problem->applyInitialSolution(x); + if (restartTime > 0) + { + using ModelTraits = typename GET_PROP_TYPE(TypeTag, ModelTraits); + using FluidSystem = typename GET_PROP_TYPE(TypeTag, FluidSystem); + using SolidSystem = typename GET_PROP_TYPE(TypeTag, SolidSystem); + const auto fileName = getParam<std::string>("Restart.File"); + const auto pvName = createPVNameFunctionWithState<ModelTraits, FluidSystem, SolidSystem>(); + loadSolution(x, fileName, pvName, *fvGridGeometry); + } + else + problem->applyInitialSolution(x); auto xOld = x; // the grid variables @@ -122,12 +142,6 @@ int main(int argc, char** argv) try auto gridVariables = std::make_shared<GridVariables>(problem, fvGridGeometry); gridVariables->init(x, xOld); - // get some time loop parameters - using Scalar = typename GET_PROP_TYPE(TypeTag, Scalar); - const auto tEnd = getParam<Scalar>("TimeLoop.TEnd"); - const auto maxDt = getParam<Scalar>("TimeLoop.MaxTimeStepSize"); - auto dt = getParam<Scalar>("TimeLoop.DtInitial"); - // initialize the vtk output module using VtkOutputFields = typename GET_PROP_TYPE(TypeTag, VtkOutputFields); VtkOutputModule<GridVariables, SolutionVector> vtkWriter(*gridVariables, x, problem->name()); @@ -138,10 +152,10 @@ int main(int argc, char** argv) try vtkWriter.addField(problem->getPermeability(), "Permeability"); // update the output fields before write problem->updateVtkOutput(x); - vtkWriter.write(0.0); + vtkWriter.write(restartTime); // instantiate time loop - auto timeLoop = std::make_shared<TimeLoop<Scalar>>(0, dt, tEnd); + auto timeLoop = std::make_shared<TimeLoop<Scalar>>(restartTime, dt, tEnd); timeLoop->setMaxTimeStepSize(maxDt); // the assembler with time loop for instationary problem