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 <pup.h>
8 :
9 : #include "NumericalAlgorithms/Convergence/Tags.hpp"
10 : #include "Options/String.hpp"
11 : #include "ParallelAlgorithms/EventsAndTriggers/Trigger.hpp"
12 : #include "Utilities/Serialization/CharmPupable.hpp"
13 : #include "Utilities/TMPL.hpp"
14 :
15 1 : namespace elliptic::Triggers {
16 : /// \ingroup EventsAndTriggersGroup
17 : /// Trigger every N iterations of the solver identifid by the `Label`, after a
18 : /// given offset.
19 : template <typename Label>
20 1 : class EveryNIterations : public Trigger {
21 : public:
22 : /// \cond
23 : EveryNIterations() = default;
24 : explicit EveryNIterations(CkMigrateMessage* /*unused*/) {}
25 : using PUP::able::register_constructor;
26 : WRAPPED_PUPable_decl_template(EveryNIterations); // NOLINT
27 : /// \endcond
28 :
29 0 : struct N {
30 0 : using type = uint64_t;
31 0 : static constexpr Options::String help{"How frequently to trigger."};
32 0 : static type lower_bound() { return 1; }
33 : };
34 0 : struct Offset {
35 0 : using type = uint64_t;
36 0 : static constexpr Options::String help{"First iteration to trigger on."};
37 : };
38 :
39 0 : using options = tmpl::list<N, Offset>;
40 0 : static constexpr Options::String help{
41 : "Trigger every N iterations after a given offset."};
42 :
43 0 : EveryNIterations(const uint64_t interval, const uint64_t offset)
44 : : interval_(interval), offset_(offset) {}
45 :
46 0 : using argument_tags = tmpl::list<Convergence::Tags::IterationId<Label>>;
47 :
48 0 : bool operator()(const size_t iteration_id) const {
49 : const auto step_number = static_cast<uint64_t>(iteration_id);
50 : return step_number >= offset_ and (step_number - offset_) % interval_ == 0;
51 : }
52 :
53 : // NOLINTNEXTLINE(google-runtime-references)
54 0 : void pup(PUP::er& p) {
55 : p | interval_;
56 : p | offset_;
57 : }
58 :
59 : private:
60 0 : uint64_t interval_{0};
61 0 : uint64_t offset_{0};
62 : };
63 :
64 : /// \cond
65 : template <typename Label>
66 : PUP::able::PUP_ID EveryNIterations<Label>::my_PUP_ID = 0; // NOLINT
67 : /// \endcond
68 : } // namespace elliptic::Triggers
|