Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <cstddef>
7 : #include <optional>
8 : #include <string>
9 :
10 : #include "DataStructures/DataBox/Tag.hpp"
11 : #include "DataStructures/LinkedMessageId.hpp"
12 : #include "Utilities/GetOutput.hpp"
13 : #include "Utilities/Gsl.hpp"
14 : #include "Utilities/TMPL.hpp"
15 :
16 : /// \cond
17 : namespace Tags {
18 : struct Time;
19 : struct PreviousTriggerTime;
20 : } // namespace Tags
21 : /// \endcond
22 :
23 : namespace Tags {
24 :
25 : /// @{
26 : /// \ingroup TimeGroup
27 : /// \brief Tag for the current and previous time as doubles
28 : ///
29 : /// \warning The previous time is calculated via the value of the
30 : /// ::Tags::PreviousTriggerTime. Therefore, this tag can only be
31 : /// used in the context of dense triggers as that is where the
32 : /// ::Tags::PreviousTriggerTime tag is set. Any Events that request
33 : /// this tag in their `argument_tags` type alias, must be triggered by a
34 : /// DenseTrigger.
35 : ///
36 : /// \note The Index is just so we can have multiple of this tag in the same
37 : /// DataBox.
38 : template <size_t Index>
39 1 : struct TimeAndPrevious : db::SimpleTag {
40 0 : static constexpr size_t index = Index;
41 0 : using type = LinkedMessageId<double>;
42 0 : static std::string name() { return "TimeAndPrevious" + get_output(Index); }
43 : };
44 :
45 : template <size_t Index>
46 0 : struct TimeAndPreviousCompute : TimeAndPrevious<Index>, db::ComputeTag {
47 0 : using argument_tags = tmpl::list<::Tags::Time, ::Tags::PreviousTriggerTime>;
48 0 : using base = TimeAndPrevious<Index>;
49 0 : using return_type = LinkedMessageId<double>;
50 :
51 0 : static void function(
52 : gsl::not_null<LinkedMessageId<double>*> time_and_previous,
53 : const double time, const std::optional<double>& previous_time) {
54 : time_and_previous->id = time;
55 : time_and_previous->previous = previous_time;
56 : }
57 : };
58 : /// @}
59 : } // namespace Tags
|