Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <cstdint>
7 : #include <memory>
8 : #include <pup.h>
9 : #include <pup_stl.h>
10 : #include <utility>
11 :
12 : #include "Options/ParseOptions.hpp"
13 : #include "Options/String.hpp"
14 : #include "ParallelAlgorithms/EventsAndTriggers/Trigger.hpp"
15 : #include "Time/TimeSequence.hpp"
16 : #include "Time/TimeStepId.hpp"
17 : #include "Utilities/Serialization/CharmPupable.hpp"
18 : #include "Utilities/TMPL.hpp"
19 :
20 : /// \cond
21 : namespace Tags {
22 : struct TimeStepId;
23 : } // namespace Tags
24 : /// \endcond
25 :
26 : namespace Triggers {
27 : /// \ingroup EventsAndTriggersGroup
28 : /// \ingroup TimeGroup
29 : /// Trigger at specified numbers of slabs after the simulation start.
30 1 : class Slabs : public Trigger {
31 : public:
32 : /// \cond
33 : Slabs() = default;
34 : explicit Slabs(CkMigrateMessage* /*unused*/) {}
35 : using PUP::able::register_constructor;
36 : WRAPPED_PUPable_decl_template(Slabs); // NOLINT
37 : /// \endcond
38 :
39 0 : static constexpr Options::String help{
40 : "Trigger at specified numbers of slabs after the simulation start."};
41 :
42 0 : explicit Slabs(std::unique_ptr<TimeSequence<uint64_t>> slabs)
43 : : slabs_(std::move(slabs)) {}
44 :
45 0 : using argument_tags = tmpl::list<Tags::TimeStepId>;
46 :
47 0 : bool operator()(const TimeStepId& time_id) const {
48 : const auto unsigned_slab =
49 : static_cast<std::uint64_t>(time_id.slab_number());
50 : return slabs_->times_near(unsigned_slab)[1] == unsigned_slab;
51 : }
52 :
53 : // NOLINTNEXTLINE(google-runtime-references)
54 0 : void pup(PUP::er& p) override { p | slabs_; }
55 :
56 : private:
57 0 : std::unique_ptr<TimeSequence<uint64_t>> slabs_{};
58 : };
59 : } // namespace Triggers
60 :
61 : template <>
62 0 : struct Options::create_from_yaml<Triggers::Slabs> {
63 : template <typename Metavariables>
64 0 : static Triggers::Slabs create(const Option& options) {
65 : return Triggers::Slabs(
66 : options.parse_as<std::unique_ptr<TimeSequence<uint64_t>>,
67 : Metavariables>());
68 : }
69 : };
|