diff --git a/NumLib/TimeStepping/Algorithms/CreateEvolutionaryPIDcontroller.cpp b/NumLib/TimeStepping/Algorithms/CreateEvolutionaryPIDcontroller.cpp index 848690bb255abdbd765a364b8a288224b525e57e..37fdd0aeb8351b8787e8b93d6d212c140098bb4d 100644 --- a/NumLib/TimeStepping/Algorithms/CreateEvolutionaryPIDcontroller.cpp +++ b/NumLib/TimeStepping/Algorithms/CreateEvolutionaryPIDcontroller.cpp @@ -45,12 +45,9 @@ std::unique_ptr<TimeStepAlgorithm> createEvolutionaryPIDcontroller( auto fixed_output_times = //! \ogs_file_param{prj__time_loop__processes__process__time_stepping__EvolutionaryPIDcontroller__fixed_output_times} config.getConfigParameter<std::vector<double>>("fixed_output_times", - std::vector<double>{}); - if (!fixed_output_times.empty()) - { - // Remove possible duplicated elements and sort in descending order. - BaseLib::makeVectorUnique(fixed_output_times, std::greater<>()); - } + {}); + // Remove possible duplicated elements and sort. + BaseLib::makeVectorUnique(fixed_output_times); //! \ogs_file_param{prj__time_loop__processes__process__time_stepping__EvolutionaryPIDcontroller__tol} auto const tol = config.getConfigParameter<double>("tol"); diff --git a/NumLib/TimeStepping/Algorithms/CreateIterationNumberBasedTimeStepping.cpp b/NumLib/TimeStepping/Algorithms/CreateIterationNumberBasedTimeStepping.cpp index 742097186663bb782bece72c29c5e2a14656f725..8a7b8ebaa1afbf74bbbc09e95a83eb7213f120b6 100644 --- a/NumLib/TimeStepping/Algorithms/CreateIterationNumberBasedTimeStepping.cpp +++ b/NumLib/TimeStepping/Algorithms/CreateIterationNumberBasedTimeStepping.cpp @@ -46,12 +46,9 @@ std::unique_ptr<TimeStepAlgorithm> createIterationNumberBasedTimeStepping( auto fixed_output_times = //! \ogs_file_param{prj__time_loop__processes__process__time_stepping__IterationNumberBasedTimeStepping__fixed_output_times} config.getConfigParameter<std::vector<double>>("fixed_output_times", - std::vector<double>{}); - if (!fixed_output_times.empty()) - { - // Remove possible duplicated elements and sort in descending order. - BaseLib::makeVectorUnique(fixed_output_times, std::greater<>()); - } + {}); + // Remove possible duplicated elements and sort. + BaseLib::makeVectorUnique(fixed_output_times); return std::make_unique<IterationNumberBasedTimeStepping>( t_initial, t_end, minimum_dt, maximum_dt, initial_dt, diff --git a/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.cpp b/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.cpp index b0d0c3de1a6a2d162413a8100a29633a19238994..385a0ed9d9d1e2abd2ba1831c0297e6c4a279fde 100644 --- a/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.cpp +++ b/NumLib/TimeStepping/Algorithms/EvolutionaryPIDcontroller.cpp @@ -36,8 +36,12 @@ EvolutionaryPIDcontroller::EvolutionaryPIDcontroller( _e_n_minus2(0.), _is_accepted(true) { - // Remove possible duplicated elements. Result will be sorted. - BaseLib::makeVectorUnique(_fixed_output_times); + if (!std::is_sorted(cbegin(_fixed_output_times), cend(_fixed_output_times))) + { + OGS_FATAL( + "Vector of fixed time steps passed to the " + "EvolutionaryPIDcontroller constructor must be sorted"); + } } bool EvolutionaryPIDcontroller::next(double const solution_error, diff --git a/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.cpp b/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.cpp index a204a053b02c3621d184a1adb338d8d7c1e66a7b..a69d866af6d769fff0636258dbbd196142e17397 100644 --- a/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.cpp +++ b/NumLib/TimeStepping/Algorithms/IterationNumberBasedTimeStepping.cpp @@ -53,8 +53,12 @@ IterationNumberBasedTimeStepping::IterationNumberBasedTimeStepping( OGS_FATAL("Vector of iteration numbers must be sorted."); } - // Remove possible duplicated elements. Result will be sorted. - BaseLib::makeVectorUnique(_fixed_output_times); + if (!std::is_sorted(cbegin(_fixed_output_times), cend(_fixed_output_times))) + { + OGS_FATAL( + "Vector of fixed time steps passed to the " + "IterationNumberBasedTimeStepping constructor must be sorted"); + } } bool IterationNumberBasedTimeStepping::next(double const /*solution_error*/, diff --git a/ProcessLib/Output/CreateOutput.cpp b/ProcessLib/Output/CreateOutput.cpp index 0e1ac5bac287dd78644df570baa861584dca1830..27bdb5fba71b9ae70841c5ec8dfeae98f3a78f13 100644 --- a/ProcessLib/Output/CreateOutput.cpp +++ b/ProcessLib/Output/CreateOutput.cpp @@ -55,8 +55,6 @@ std::unique_ptr<Output> createOutput( // Construction of output times std::vector<Output::PairRepeatEachSteps> repeats_each_steps; - std::vector<double> fixed_output_times; - //! \ogs_file_param{prj__time_loop__output__timesteps} if (auto const timesteps = config.getConfigSubtreeOptional("timesteps")) { @@ -133,16 +131,12 @@ std::unique_ptr<Output> createOutput( } } - auto fixed_output_times_ptr = + std::vector<double> fixed_output_times = //! \ogs_file_param{prj__time_loop__output__fixed_output_times} - config.getConfigParameterOptional<std::vector<double>>( - "fixed_output_times"); - if (fixed_output_times_ptr) - { - fixed_output_times = std::move(*fixed_output_times_ptr); - // Remove possible duplicated elements and sort in descending order. - BaseLib::makeVectorUnique(fixed_output_times, std::greater<>()); - } + config.getConfigParameter<std::vector<double>>("fixed_output_times", + {}); + // Remove possible duplicated elements and sort. + BaseLib::makeVectorUnique(fixed_output_times); bool const output_iteration_results = //! \ogs_file_param{prj__time_loop__output__output_iteration_results} diff --git a/ProcessLib/Output/Output.cpp b/ProcessLib/Output/Output.cpp index 5526d622a966cdbabdc97a4aac32859966ac49fe..f45fcdf93a81df3080f8c1cccc843b0e1f760572 100644 --- a/ProcessLib/Output/Output.cpp +++ b/ProcessLib/Output/Output.cpp @@ -78,22 +78,20 @@ bool Output::shallDoOutput(int timestep, double const t) } } - bool make_output = timestep % each_steps == 0; - - if (_fixed_output_times.empty()) + if (timestep % each_steps == 0) { - return make_output; + return true; } - const double specific_time = _fixed_output_times.back(); - const double zero_threshold = std::numeric_limits<double>::min(); - if (std::fabs(specific_time - t) < zero_threshold) + auto const fixed_output_time = std::lower_bound( + cbegin(_fixed_output_times), cend(_fixed_output_times), t); + if (fixed_output_time == cend(_fixed_output_times)) { - _fixed_output_times.pop_back(); - make_output = true; + return false; } - return make_output; + return std::fabs(*fixed_output_time - t) < + std::numeric_limits<double>::min(); } Output::Output(std::string output_directory, std::string output_file_prefix, @@ -117,6 +115,12 @@ Output::Output(std::string output_directory, std::string output_file_prefix, _mesh_names_for_output(mesh_names_for_output), _meshes(meshes) { + if (!std::is_sorted(cbegin(_fixed_output_times), cend(_fixed_output_times))) + { + OGS_FATAL( + "Vector of fixed output time steps passed to the Output " + "constructor must be sorted"); + } } void Output::addProcess(ProcessLib::Process const& process, diff --git a/ProcessLib/Output/Output.h b/ProcessLib/Output/Output.h index 07ae325e3e3066113da3ecb8612c3a75e194eb08..4a14a38a9b595e853dde05b5df4def21cd0d2aff 100644 --- a/ProcessLib/Output/Output.h +++ b/ProcessLib/Output/Output.h @@ -104,7 +104,7 @@ private: std::vector<PairRepeatEachSteps> _repeats_each_steps; //! Given times that steps have to reach. - std::vector<double> _fixed_output_times; + std::vector<double> const _fixed_output_times; std::multimap<Process const*, MeshLib::IO::PVDFile> _process_to_pvd_file;