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 <pup.h> 8 : #include <string> 9 : #include <unordered_map> 10 : 11 : #include "IO/Observer/ObserverComponent.hpp" 12 : #include "Options/String.hpp" 13 : #include "Parallel/ArrayCollection/IsDgElementCollection.hpp" 14 : #include "Parallel/GlobalCache.hpp" 15 : #include "Parallel/Reduction.hpp" 16 : #include "ParallelAlgorithms/EventsAndTriggers/Event.hpp" 17 : #include "Utilities/ErrorHandling/Error.hpp" 18 : #include "Utilities/Functional.hpp" 19 : #include "Utilities/Serialization/CharmPupable.hpp" 20 : #include "Utilities/TMPL.hpp" 21 : 22 : /// \cond 23 : namespace Tags { 24 : struct Time; 25 : } // namespace Tags 26 : namespace control_system::Tags { 27 : struct MeasurementTimescales; 28 : } // namespace control_system::Tags 29 : namespace db { 30 : template <typename TagsList> 31 : class DataBox; 32 : } // namespace db 33 : namespace domain::FunctionsOfTime { 34 : class FunctionOfTime; 35 : } // namespace domain::FunctionsOfTime 36 : namespace domain::Tags { 37 : struct FunctionsOfTime; 38 : } // namespace domain::Tags 39 : namespace gsl { 40 : template <class T> 41 : class not_null; 42 : } // namespace gsl 43 : /// \endcond 44 : 45 : namespace control_system { 46 : /// \ingroup ControlSystemGroup 47 : /// Reduction action that deletes function-of-time data from before 48 : /// the passed time. 49 : /// 50 : /// \see CleanFunctionsOfTime 51 1 : struct CleanFunctionsOfTimeAction { 52 : private: 53 0 : struct CleanFunc { 54 0 : static void apply( 55 : gsl::not_null<std::unordered_map< 56 : std::string, 57 : std::unique_ptr<domain::FunctionsOfTime::FunctionOfTime>>*> 58 : functions, 59 : double time); 60 : }; 61 : 62 : public: 63 : template <typename ParallelComponent, typename DbTags, typename Metavariables, 64 : typename ArrayIndex> 65 0 : static void apply(db::DataBox<DbTags>& /*box*/, 66 : Parallel::GlobalCache<Metavariables>& cache, 67 : const ArrayIndex& /*array_index*/, const double time) { 68 : Parallel::mutate<domain::Tags::FunctionsOfTime, CleanFunc>(cache, time); 69 : Parallel::mutate<Tags::MeasurementTimescales, CleanFunc>(cache, time); 70 : } 71 : }; 72 : 73 : /// \ingroup ControlSystemGroup 74 : /// Delete old function-of-time data to save memory. 75 : /// 76 : /// \warning Running this event will make the 77 : /// `global_functions_of_time` data stored in the output files 78 : /// useless. 79 1 : class CleanFunctionsOfTime : public Event { 80 0 : using ReductionData = Parallel::ReductionData< 81 : Parallel::ReductionDatum<double, funcl::AssertEqual<>>>; 82 : 83 : public: 84 : /// \cond 85 : explicit CleanFunctionsOfTime(CkMigrateMessage* m); 86 : using PUP::able::register_constructor; 87 : WRAPPED_PUPable_decl_template(CleanFunctionsOfTime); // NOLINT 88 : /// \endcond 89 : 90 0 : using options = tmpl::list<>; 91 0 : static constexpr Options::String help = 92 : "Delete old function-of-time data to save memory.\n" 93 : "\n" 94 : "WARNING: Running this event will make the global_functions_of_time\n" 95 : "data stored in the output files useless."; 96 : 97 0 : CleanFunctionsOfTime() = default; 98 : 99 0 : using compute_tags_for_observation_box = tmpl::list<>; 100 : 101 0 : using return_tags = tmpl::list<>; 102 0 : using argument_tags = tmpl::list<::Tags::Time>; 103 : 104 : template <typename Metavariables, typename ArrayIndex, 105 : typename ParallelComponent> 106 0 : void operator()(const double time, 107 : Parallel::GlobalCache<Metavariables>& cache, 108 : const ArrayIndex& array_index, 109 : const ParallelComponent* const /*meta*/, 110 : const ObservationValue& /*observation_value*/) const { 111 : if constexpr (Parallel::is_dg_element_collection_v<ParallelComponent>) { 112 : (void)cache; 113 : (void)array_index; 114 : (void)time; 115 : ERROR("Reductions not implemented with DgElementCollection."); 116 : } else { 117 : // It doesn't matter what individual component the target is. 118 : // We use ObserverWriter[0] because it must exist and is easy to 119 : // name here. 120 : const auto& writer0_proxy = Parallel::get_parallel_component< 121 : observers::ObserverWriter<Metavariables>>(cache)[0]; 122 : const auto& self_proxy = 123 : Parallel::get_parallel_component<ParallelComponent>( 124 : cache)[array_index]; 125 : Parallel::contribute_to_reduction<CleanFunctionsOfTimeAction>( 126 : ReductionData(time), self_proxy, writer0_proxy); 127 : } 128 : } 129 : 130 0 : using is_ready_argument_tags = tmpl::list<>; 131 : 132 : template <typename Metavariables, typename ArrayIndex, typename Component> 133 0 : bool is_ready(Parallel::GlobalCache<Metavariables>& /*cache*/, 134 : const ArrayIndex& /*array_index*/, 135 : const Component* const /*meta*/) const { 136 : return true; 137 : } 138 : 139 1 : bool needs_evolved_variables() const override; 140 : }; 141 : } // namespace control_system