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 <pup_stl.h>
9 : #include <utility>
10 :
11 : #include "DataStructures/DataBox/DataBoxTag.hpp"
12 : #include "Options/Options.hpp"
13 : #include "Options/ParseOptions.hpp"
14 : #include "Options/String.hpp"
15 : #include "ParallelAlgorithms/EventsAndTriggers/Trigger.hpp"
16 : #include "Utilities/Serialization/CharmPupable.hpp"
17 : #include "Utilities/TMPL.hpp"
18 :
19 : /// \cond
20 : namespace db {
21 : template <typename TagsList>
22 : class DataBox;
23 : } // namespace db
24 : /// \endcond
25 :
26 : namespace Triggers {
27 : /*!
28 : * \ingroup EventsAndTriggersGroup
29 : * \ingroup TimeGroup
30 : * Check a trigger on substeps, as well as full steps. Primarily for
31 : * debugging.
32 : *
33 : * In LTS mode, only substeps of the first step in each slab will be
34 : * checked. Such substeps may not be aligned across the domain.
35 : *
36 : * The observation value on a substep is set to the start time of the
37 : * step plus $10^6$ times the substep number.
38 : *
39 : * This trigger can be used as:
40 : *
41 : * ```yaml
42 : * - Trigger:
43 : * OnSubsteps:
44 : * Always:
45 : * ```
46 : */
47 1 : class OnSubsteps : public Trigger {
48 : public:
49 : /// \cond
50 : OnSubsteps() = default;
51 : explicit OnSubsteps(CkMigrateMessage* /*unused*/) {}
52 : using PUP::able::register_constructor;
53 : WRAPPED_PUPable_decl_template(OnSubsteps); // NOLINT
54 : /// \endcond
55 :
56 0 : static constexpr Options::String help =
57 : "Check a trigger on substeps in addition to steps.";
58 :
59 0 : explicit OnSubsteps(std::unique_ptr<Trigger> trigger)
60 : : trigger_(std::move(trigger)) {}
61 :
62 0 : using argument_tags = tmpl::list<Tags::DataBox>;
63 :
64 : template <typename DbTags>
65 0 : bool operator()(const db::DataBox<DbTags>& box) const {
66 : // This trigger doesn't actually do anything. All the special
67 : // logic is in the RunEventsAndTriggers action. Just forward
68 : // along.
69 : return trigger_->is_triggered(box);
70 : }
71 :
72 : // NOLINTNEXTLINE(google-runtime-references)
73 0 : void pup(PUP::er& p) override { p | trigger_; }
74 :
75 : private:
76 0 : std::unique_ptr<Trigger> trigger_;
77 : };
78 : } // namespace Triggers
79 :
80 : template <>
81 0 : struct Options::create_from_yaml<Triggers::OnSubsteps> {
82 : template <typename Metavariables>
83 0 : static Triggers::OnSubsteps create(const Option& options) {
84 : return Triggers::OnSubsteps(
85 : options.parse_as<std::unique_ptr<Trigger>, Metavariables>());
86 : }
87 : };
|