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 <unordered_map>
8 :
9 : #include "DataStructures/DataBox/Tag.hpp"
10 : #include "Parallel/ArrayCollection/Tags/ElementLocations.hpp"
11 : #include "Parallel/GlobalCache.hpp"
12 : #include "Parallel/Invoke.hpp"
13 : #include "Utilities/Gsl.hpp"
14 :
15 : /// \cond
16 : template <size_t Dim>
17 : class ElementId;
18 : namespace Parallel {
19 : class NodeLock;
20 : } // namespace Parallel
21 : /// \endcond
22 :
23 : namespace Parallel::Tags {
24 : /// \brief The node (location) where different elements are.
25 : ///
26 : /// This should be in the DgElementArrayMember's DataBox.
27 : ///
28 : /// Implementation note: This should point to the ElementLocations located in
29 : /// the nodegroup's DataBox.
30 : template <size_t Dim, typename Metavariables,
31 : typename DgElementCollectionComponent>
32 1 : struct ElementLocationsReference : ElementLocations<Dim>, db::ReferenceTag {
33 : private:
34 0 : struct GetReference {
35 0 : using return_type = const typename ElementLocations<Dim>::type&;
36 :
37 : template <typename ParallelComponent, typename DbTagList>
38 0 : static return_type apply(
39 : db::DataBox<DbTagList>& box,
40 : const gsl::not_null<Parallel::NodeLock*> /*node_lock*/) {
41 : return db::get_mutable_reference<ElementLocations<Dim>>(
42 : make_not_null(&box));
43 : }
44 : };
45 :
46 : public:
47 0 : using base = ElementLocations<Dim>;
48 0 : using type = typename base::type;
49 0 : using argument_tags = tmpl::list<Parallel::Tags::GlobalCache<Metavariables>>;
50 :
51 0 : static const type& get(
52 : const Parallel::GlobalCache<Metavariables>* const& cache) {
53 : auto& parallel_comp =
54 : Parallel::get_parallel_component<DgElementCollectionComponent>(*cache);
55 : return Parallel::local_synchronous_action<GetReference>(parallel_comp);
56 : }
57 : };
58 : } // namespace Parallel::Tags
|