Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <pup.h>
7 :
8 : #include "Options/String.hpp"
9 : #include "Time/History.hpp"
10 : #include "Time/StepChoosers/StepChooser.hpp"
11 : #include "Time/TimeStepRequest.hpp"
12 : #include "Utilities/Serialization/CharmPupable.hpp"
13 : #include "Utilities/TMPL.hpp"
14 : #include "Utilities/TypeTraits/IsA.hpp"
15 :
16 : /// \cond
17 : namespace Tags {
18 : template <typename Tag>
19 : struct HistoryEvolvedVariables;
20 : } // namespace Tags
21 : /// \endcond
22 :
23 : namespace StepChoosers {
24 : namespace PreventRapidIncrease_detail {
25 : template <typename T>
26 : bool limit_from_history(const TimeSteppers::ConstUntypedHistory<T>& history,
27 : double last_step);
28 : } // namespace PreventRapidIncrease_detail
29 : /// Limits the time step to prevent multistep integrator instabilities.
30 : ///
31 : /// Avoids instabilities due to rapid increases in the step size by
32 : /// preventing the step size from increasing if any step in the
33 : /// time-stepper history increased. If there have been recent step
34 : /// size increases, the new size bound is the size of the most recent
35 : /// step, otherwise no restriction is imposed.
36 : /// @{
37 : template <typename System,
38 : typename = tmpl::conditional_t<
39 : tt::is_a_v<tmpl::list, typename System::variables_tag>,
40 : typename System::variables_tag,
41 : tmpl::list<typename System::variables_tag>>>
42 1 : class PreventRapidIncrease;
43 :
44 : template <typename System, typename... VariablesTags>
45 0 : class PreventRapidIncrease<System, tmpl::list<VariablesTags...>>
46 : : public StepChooser<StepChooserUse::Slab>,
47 : public StepChooser<StepChooserUse::LtsStep> {
48 : public:
49 : /// \cond
50 : PreventRapidIncrease() = default;
51 : explicit PreventRapidIncrease(CkMigrateMessage* /*unused*/) {}
52 : using PUP::able::register_constructor;
53 : WRAPPED_PUPable_decl_template(PreventRapidIncrease); // NOLINT
54 : /// \endcond
55 :
56 0 : static constexpr Options::String help{
57 : "Limits the time step to prevent multistep integrator instabilities."};
58 0 : using options = tmpl::list<>;
59 :
60 0 : using argument_tags =
61 : tmpl::list<::Tags::HistoryEvolvedVariables<VariablesTags>...>;
62 :
63 0 : TimeStepRequest operator()(
64 : const ::TimeSteppers::History<typename VariablesTags::type>&... histories,
65 : const double last_step) const {
66 : if ((... or PreventRapidIncrease_detail::limit_from_history(
67 : histories.untyped(), last_step))) {
68 : return {.size = last_step};
69 : } else {
70 : return {};
71 : }
72 : }
73 :
74 1 : bool uses_local_data() const override { return false; }
75 1 : bool can_be_delayed() const override { return true; }
76 1 : bool must_set_step_size() const override { return true; }
77 :
78 0 : void pup(PUP::er& p) override {
79 : StepChooser<StepChooserUse::Slab>::pup(p);
80 : StepChooser<StepChooserUse::LtsStep>::pup(p);
81 : }
82 : };
83 : /// @}
84 :
85 : /// \cond
86 : template <typename System, typename... VariablesTags>
87 : PUP::able::PUP_ID PreventRapidIncrease<
88 : System, tmpl::list<VariablesTags...>>::my_PUP_ID = // NOLINT
89 : 0;
90 : /// \endcond
91 : } // namespace StepChoosers
|