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 <optional> 8 : #include <pup.h> 9 : #include <string> 10 : 11 : #include "Options/String.hpp" 12 : #include "ParallelAlgorithms/EventsAndDenseTriggers/DenseTrigger.hpp" 13 : #include "ParallelAlgorithms/EventsAndTriggers/Trigger.hpp" 14 : #include "Utilities/Gsl.hpp" 15 : #include "Utilities/Serialization/CharmPupable.hpp" 16 : #include "Utilities/TMPL.hpp" 17 : 18 : /// \cond 19 : namespace Parallel { 20 : template <typename Metavariables> 21 : class GlobalCache; 22 : } // namespace Parallel 23 : namespace Tags { 24 : struct DataBox; 25 : } // namespace Tags 26 : namespace db { 27 : template <typename TagsList> 28 : class DataBox; 29 : } // namespace db 30 : /// \endcond 31 : 32 : namespace DenseTriggers { 33 : /// \ingroup EventsAndTriggersGroup 34 : /// %Filter activations of a dense trigger using a non-dense trigger. 35 : /// 36 : /// For example, to trigger every 10 starting at 100, one could use 37 : /// 38 : /// \snippet DenseTriggers/Test_Filter.cpp example 39 1 : class Filter : public DenseTrigger { 40 : public: 41 : /// \cond 42 : Filter() = default; 43 : explicit Filter(CkMigrateMessage* const msg) : DenseTrigger(msg) {} 44 : using PUP::able::register_constructor; 45 : WRAPPED_PUPable_decl_template(Filter); // NOLINT 46 : /// \endcond 47 : 48 0 : struct TriggerOption { 49 0 : static std::string name() { return "Trigger"; } 50 0 : using type = std::unique_ptr<DenseTrigger>; 51 0 : static constexpr Options::String help = "Dense trigger to filter"; 52 : }; 53 : 54 0 : struct FilterOption { 55 0 : static std::string name() { return "Filter"; } 56 0 : using type = std::unique_ptr<Trigger>; 57 0 : static constexpr Options::String help = "Non-dense trigger to filter with"; 58 : }; 59 : 60 0 : using options = tmpl::list<TriggerOption, FilterOption>; 61 0 : static constexpr Options::String help = 62 : "Filter activations of a dense trigger using a non-dense trigger."; 63 : 64 0 : explicit Filter(std::unique_ptr<DenseTrigger> trigger, 65 : std::unique_ptr<Trigger> filter); 66 : 67 0 : using is_triggered_return_tags = tmpl::list<Tags::DataBox>; 68 0 : using is_triggered_argument_tags = tmpl::list<>; 69 : 70 : template <typename Metavariables, typename ArrayIndex, typename Component, 71 : typename DbTags> 72 0 : std::optional<bool> is_triggered( 73 : Parallel::GlobalCache<Metavariables>& cache, 74 : const ArrayIndex& array_index, const Component* component, 75 : const gsl::not_null<db::DataBox<DbTags>*> box) const { 76 : auto result = trigger_->is_triggered(box, cache, array_index, component); 77 : if (result == std::optional{true}) { 78 : return filter_->is_triggered(*box); 79 : } 80 : return result; 81 : } 82 : 83 0 : using next_check_time_return_tags = tmpl::list<Tags::DataBox>; 84 0 : using next_check_time_argument_tags = tmpl::list<>; 85 : 86 : template <typename Metavariables, typename ArrayIndex, typename Component, 87 : typename DbTags> 88 0 : std::optional<double> next_check_time( 89 : Parallel::GlobalCache<Metavariables>& cache, 90 : const ArrayIndex& array_index, const Component* component, 91 : const gsl::not_null<db::DataBox<DbTags>*> box) const { 92 : return trigger_->next_check_time(box, cache, array_index, component); 93 : } 94 : 95 : // NOLINTNEXTLINE(google-runtime-references) 96 0 : void pup(PUP::er& p) override; 97 : 98 : private: 99 0 : std::unique_ptr<DenseTrigger> trigger_{}; 100 0 : std::unique_ptr<Trigger> filter_{}; 101 : }; 102 : } // namespace DenseTriggers