Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <array>
7 : #include <pup.h>
8 : #include <type_traits>
9 :
10 : #include "DataStructures/DataBox/MetavariablesTag.hpp"
11 : #include "DataStructures/DataBox/ObservationBox.hpp"
12 : #include "Domain/Amr/Flag.hpp"
13 : #include "Domain/Structure/ElementId.hpp"
14 : #include "Parallel/GlobalCache.hpp"
15 : #include "ParallelAlgorithms/Amr/Criteria/Type.hpp"
16 : #include "Utilities/CallWithDynamicType.hpp"
17 : #include "Utilities/Serialization/CharmPupable.hpp"
18 : #include "Utilities/TMPL.hpp"
19 :
20 : namespace amr {
21 : /// \ingroup AmrGroup
22 : /// \brief Base class for something that determines how an adaptive mesh should
23 : /// be changed
24 : ///
25 : /// \details Each class derived from this class should (see the examples below):
26 : /// - Be option-creatable
27 : /// - Be serializable
28 : /// - Define a call operator that returns a std::array<amr::Flag, Dim>
29 : /// containing the recommended refinement choice in each logical dimension of
30 : /// the Element.
31 : /// - Define the type aliases `argument_tags` and
32 : /// `compute_tags_for_observation_box` that are type lists of tags used in the
33 : /// call operator.
34 : /// The call operator should take as arguments the values corresponding to each
35 : /// tag in `argument_tags` (in order), followed by the Parallel::GlobalCache,
36 : /// and the ElementId. The tags listed in `argument_tags` should either be tags
37 : /// in the DataBox of the array component, or listed in
38 : /// `compute_tags_for_observation_box`.
39 : ///
40 : /// \example
41 : /// \snippet Amr/Criteria/Test_Criterion.cpp criterion_examples
42 1 : class Criterion : public PUP::able {
43 : protected:
44 : /// \cond
45 : Criterion() = default;
46 : Criterion(const Criterion&) = default;
47 : Criterion(Criterion&&) = default;
48 : Criterion& operator=(const Criterion&) = default;
49 : Criterion& operator=(Criterion&&) = default;
50 : /// \endcond
51 :
52 : public:
53 0 : ~Criterion() override = default;
54 0 : explicit Criterion(CkMigrateMessage* msg) : PUP::able(msg) {}
55 :
56 0 : WRAPPED_PUPable_abstract(Criterion); // NOLINT
57 :
58 0 : virtual Criteria::Type type() = 0;
59 :
60 0 : virtual std::string observation_name() = 0;
61 :
62 : /// Evaluates the AMR criteria by selecting the appropriate derived class
63 : /// and forwarding its `argument_tags` from the ObservationBox (along with the
64 : /// GlobalCache and ArrayIndex) to the call operator of the derived class
65 : ///
66 : /// \note In order to be available, a derived Criterion must be listed in
67 : /// the entry for Criterion in
68 : /// Metavarialbes::factory_creation::factory_classes
69 : ///
70 : /// \note The ComputeTagsList of the ObservationBox should contain the union
71 : /// of the tags listed in `compute_tags_for_observation_box` for each derived
72 : /// Criterion listed in the `factory_classes`.
73 : template <typename ComputeTagsList, typename DataBoxType,
74 : typename Metavariables>
75 1 : auto evaluate(const ObservationBox<ComputeTagsList, DataBoxType>& box,
76 : Parallel::GlobalCache<Metavariables>& cache,
77 : const ElementId<Metavariables::volume_dim>& element_id) const {
78 : using factory_classes =
79 : typename std::decay_t<Metavariables>::factory_creation::factory_classes;
80 : return call_with_dynamic_type<
81 : std::array<amr::Flag, Metavariables::volume_dim>,
82 : tmpl::at<factory_classes, Criterion>>(
83 : this, [&box, &cache, &element_id](auto* const criterion) {
84 : return apply(*criterion, box, cache, element_id);
85 : });
86 : }
87 : };
88 : } // namespace amr
|