Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <type_traits>
7 :
8 : #include "DataStructures/DataBox/DataBox.hpp"
9 : #include "Utilities/Gsl.hpp"
10 :
11 : /// \cond
12 : namespace Parallel {
13 : template <typename Metavariables>
14 : struct GlobalCache;
15 : } // namespace Parallel
16 : /// \endcond
17 :
18 : namespace intrp::protocols {
19 : namespace detail {
20 : struct DummyMetavariables;
21 : struct DummyTag : db::SimpleTag {
22 : using type = int;
23 : };
24 :
25 : template <typename T, typename = std::void_t<>>
26 : struct has_signature_1 : std::false_type {};
27 :
28 : template <typename T>
29 : struct has_signature_1<
30 : T, std::void_t<decltype(T::apply(
31 : std::declval<const db::DataBox<DummyTag>&>(),
32 : std::declval<const Parallel::GlobalCache<DummyMetavariables>&>(),
33 : std::declval<const double&>()))>> : std::true_type {
34 : static_assert(
35 : std::is_same_v<
36 : void,
37 : decltype(T::apply(
38 : std::declval<const db::DataBox<DummyTag>&>(),
39 : std::declval<const Parallel::GlobalCache<DummyMetavariables>&>(),
40 : std::declval<const double&>()))>);
41 : };
42 :
43 : template <typename T, typename = std::void_t<>>
44 : struct has_signature_2 : std::false_type {};
45 :
46 : template <typename T>
47 : struct has_signature_2<
48 : T, std::void_t<decltype(
49 : T::apply(std::declval<const db::DataBox<DummyTag>&>(),
50 : std::declval<Parallel::GlobalCache<DummyMetavariables>&>(),
51 : std::declval<const double&>()))>> : std::true_type {
52 : static_assert(
53 : std::is_same_v<
54 : void, decltype(T::apply(
55 : std::declval<const db::DataBox<DummyTag>&>(),
56 : std::declval<Parallel::GlobalCache<DummyMetavariables>&>(),
57 : std::declval<const double&>()))>);
58 : };
59 :
60 : template <typename T, typename = std::void_t<>>
61 : struct has_signature_3 : std::false_type {};
62 :
63 : template <typename T>
64 : struct has_signature_3<
65 : T, std::void_t<decltype(
66 : T::apply(std::declval<const gsl::not_null<db::DataBox<DummyTag>*>>(),
67 : std::declval<const gsl::not_null<
68 : Parallel::GlobalCache<DummyMetavariables>*>>(),
69 : std::declval<const double&>()))>> : std::true_type {
70 : static_assert(
71 : std::is_same_v<
72 : bool, decltype(T::apply(
73 : std::declval<const gsl::not_null<db::DataBox<DummyTag>*>>(),
74 : std::declval<const gsl::not_null<
75 : Parallel::GlobalCache<DummyMetavariables>*>>(),
76 : std::declval<const double&>()))>);
77 : };
78 :
79 : } // namespace detail
80 :
81 : /*!
82 : * \brief A protocol for the type alias `post_interpolation_callbacks` found in
83 : * an InterpolationTargetTag.
84 : *
85 : * \details A struct conforming to the `PostInterpolationCallback` protocol must
86 : * have
87 : *
88 : * - a function `apply` with one of the 3 signatures in the example. This apply
89 : * function will be called once the interpolation is complete. `DbTags`
90 : * includes everything in the `vars_to_interpolate_to_target` alias and the
91 : * `compute_items_on_target` alias of the InterpolationTargetTag. The `apply`
92 : * that returns a bool should return false only if it calls another
93 : * `intrp::Action` that still needs the volume data at this temporal_id (such
94 : * as another iteration of the horizon finder). These functions must be able
95 : * to take any type for the `TemporalId`. If a specific temporal ID type is
96 : * required, it should be `static_assert`ed in the function itself.
97 : *
98 : * A struct conforming to this protocol can also have an optional `static
99 : * constexpr double fill_invalid_points_with`. Any points outside the Domain
100 : * will be filled with this value. If this variable is not defined, then the
101 : * `apply` function must check for invalid points, and should typically exit
102 : * with an error message if it finds any.
103 : *
104 : * Here is an example of a class that conforms to this protocols:
105 : *
106 : * \snippet Helpers/ParallelAlgorithms/Interpolation/Examples.hpp PostInterpolationCallback
107 : */
108 1 : struct PostInterpolationCallback {
109 : template <typename ConformingType>
110 0 : struct test {
111 : static_assert(detail::has_signature_1<ConformingType>::value or
112 : detail::has_signature_2<ConformingType>::value or
113 : detail::has_signature_3<ConformingType>::value);
114 : };
115 : };
116 : } // namespace intrp::protocols
|