Line data Source code
1 0 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : #pragma once 5 : 6 : #include <memory> 7 : #include <string> 8 : #include <typeindex> 9 : #include <vector> 10 : 11 : #include "DataStructures/DataBox/Tag.hpp" 12 : #include "DataStructures/DataBox/TagName.hpp" 13 : #include "ParallelAlgorithms/EventsAndTriggers/WhenToCheck.hpp" 14 : #include "Time/Tags/StepperErrorEstimatesEnabled.hpp" 15 : #include "Time/Tags/StepperErrorTolerances.hpp" 16 : #include "Utilities/Gsl.hpp" 17 : #include "Utilities/TMPL.hpp" 18 : 19 : /// \cond 20 : class EventsAndTriggers; 21 : template <typename StepChooserUse> 22 : class StepChooser; 23 : struct StepperErrorTolerances; 24 : class TimeStepper; 25 : class VariableOrderAlgorithm; 26 : namespace StepChooserUse { 27 : struct LtsStep; 28 : } // namespace StepChooserUse 29 : namespace Tags { 30 : template <Triggers::WhenToCheck WhenToCheck> 31 : struct EventsAndTriggers; 32 : struct StepChoosers; 33 : template <typename StepperInterface> 34 : struct TimeStepper; 35 : struct VariableOrderAlgorithm; 36 : } // namespace Tags 37 : /// \endcond 38 : 39 : namespace Tags { 40 : /// \ingroup TimeGroup 41 : /// \brief Searches the StepChoosers for any requesting error estimates. 42 : template <bool LocalTimeStepping> 43 1 : struct StepperErrorEstimatesEnabledCompute : db::ComputeTag, 44 : StepperErrorEstimatesEnabled { 45 0 : using base = StepperErrorEstimatesEnabled; 46 0 : using return_type = type; 47 0 : using argument_tags = tmpl::conditional_t< 48 : LocalTimeStepping, 49 : tmpl::list<::Tags::EventsAndTriggers<Triggers::WhenToCheck::AtSlabs>, 50 : ::Tags::StepChoosers>, 51 : tmpl::list<::Tags::EventsAndTriggers<Triggers::WhenToCheck::AtSlabs>>>; 52 : 53 : // local time stepping 54 0 : static void function( 55 : gsl::not_null<bool*> error_estimates_enabled, 56 : const ::EventsAndTriggers& events_and_triggers, 57 : const std::vector< 58 : std::unique_ptr<::StepChooser<StepChooserUse::LtsStep>>>& 59 : step_choosers); 60 : 61 : // global time stepping 62 0 : static void function(gsl::not_null<bool*> error_estimates_enabled, 63 : const ::EventsAndTriggers& events_and_triggers); 64 : }; 65 : 66 : namespace StepperErrorTolerancesCompute_detail { 67 : void lts_impl( 68 : gsl::not_null<::StepperErrorTolerances*> tolerances, 69 : const ::EventsAndTriggers& events_and_triggers, 70 : const std::vector<std::unique_ptr<::StepChooser<StepChooserUse::LtsStep>>>& 71 : step_choosers, 72 : const ::TimeStepper& time_stepper, 73 : const ::VariableOrderAlgorithm& variable_order_algorithm, 74 : const std::type_index& tag_type, const std::string& tag_name); 75 : 76 : void gts_impl(gsl::not_null<::StepperErrorTolerances*> tolerances, 77 : const ::EventsAndTriggers& events_and_triggers, 78 : const std::type_index& tag_type, const std::string& tag_name); 79 : } // namespace StepperErrorTolerancesCompute_detail 80 : 81 : /// \ingroup TimeGroup 82 : /// \brief A tag that contains the error tolerances if any StepChooser 83 : /// requests an error estimate for the variable. 84 : template <typename EvolvedVariableTag, bool LocalTimeStepping> 85 1 : struct StepperErrorTolerancesCompute 86 : : db::ComputeTag, 87 : StepperErrorTolerances<EvolvedVariableTag> { 88 0 : using base = StepperErrorTolerances<EvolvedVariableTag>; 89 0 : using return_type = typename base::type; 90 0 : using argument_tags = tmpl::conditional_t< 91 : LocalTimeStepping, 92 : tmpl::list<::Tags::EventsAndTriggers<Triggers::WhenToCheck::AtSlabs>, 93 : ::Tags::StepChoosers, ::Tags::TimeStepper<::TimeStepper>, 94 : ::Tags::VariableOrderAlgorithm>, 95 : tmpl::list<::Tags::EventsAndTriggers<Triggers::WhenToCheck::AtSlabs>>>; 96 : 97 : // local time stepping 98 0 : static void function( 99 : const gsl::not_null<::StepperErrorTolerances*> tolerances, 100 : const ::EventsAndTriggers& events_and_triggers, 101 : const std::vector< 102 : std::unique_ptr<::StepChooser<StepChooserUse::LtsStep>>>& 103 : step_choosers, 104 : const ::TimeStepper& time_stepper, 105 : const ::VariableOrderAlgorithm& variable_order_algorithm) { 106 : StepperErrorTolerancesCompute_detail::lts_impl( 107 : tolerances, events_and_triggers, step_choosers, time_stepper, 108 : variable_order_algorithm, typeid(EvolvedVariableTag), 109 : db::tag_name<EvolvedVariableTag>()); 110 : } 111 : 112 : // global time stepping 113 0 : static void function( 114 : const gsl::not_null<::StepperErrorTolerances*> tolerances, 115 : const ::EventsAndTriggers& events_and_triggers) { 116 : StepperErrorTolerancesCompute_detail::gts_impl( 117 : tolerances, events_and_triggers, typeid(EvolvedVariableTag), 118 : db::tag_name<EvolvedVariableTag>()); 119 : } 120 : }; 121 : } // namespace Tags