Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <deque>
7 : #include <memory>
8 : #include <utility>
9 :
10 : #include "Domain/Structure/ElementId.hpp"
11 : #include "Parallel/Callback.hpp"
12 : #include "Parallel/GlobalCache.hpp"
13 : #include "Parallel/Info.hpp"
14 : #include "Parallel/Phase.hpp"
15 : #include "ParallelAlgorithms/Amr/Actions/CollectDataFromChildren.hpp"
16 : #include "Utilities/ErrorHandling/Error.hpp"
17 :
18 : /// \cond
19 : namespace db {
20 : template <typename>
21 : class DataBox;
22 : } // namespace db
23 : /// \endcond
24 :
25 : namespace amr::Actions {
26 : /// \brief Creates a new element in an ArrayAlgorithm whose id is `parent_id`
27 : ///
28 : /// \details This action is meant to be initially invoked by
29 : /// amr::Actions::AdjustDomain on the amr::Component. This action inserts a
30 : /// new element with id `parent_id` in the array referenced by
31 : /// `element_proxy`. A Parallel::SimpleActionCallback `callback` is passed to
32 : /// the constructor of the new DistributedObject, which will invoke
33 : /// amr::Actions::CollectDataFromChildren on the element with id `child_id`.
34 : ///
35 : /// This action does not modify anything in the DataBox
36 1 : struct CreateParent {
37 : template <typename ParallelComponent, typename DbTagList,
38 : typename Metavariables, typename ElementProxy>
39 0 : static void apply(
40 : db::DataBox<DbTagList>& /*box*/,
41 : Parallel::GlobalCache<Metavariables>& cache, const int /*array_index*/,
42 : ElementProxy element_proxy,
43 : ElementId<Metavariables::volume_dim> parent_id,
44 : const ElementId<Metavariables::volume_dim>& child_id,
45 : std::deque<ElementId<Metavariables::volume_dim>> sibling_ids_to_collect,
46 : const std::unordered_map<Parallel::Phase, size_t> child_phase_bookmarks) {
47 : if (CHARM_VERSION_MAJOR < 8 and
48 : Parallel::number_of_procs<size_t>(cache) > 1) {
49 : ERROR_NO_TRACE(
50 : "Dynamically creating elements in parallel executables is broken "
51 : "until charm 8.");
52 : }
53 : auto child_proxy = element_proxy[child_id];
54 : element_proxy[parent_id].insert(
55 : cache.get_this_proxy(), Parallel::Phase::AdjustDomain,
56 : child_phase_bookmarks,
57 : std::make_unique<Parallel::SimpleActionCallback<
58 : CollectDataFromChildren, decltype(child_proxy),
59 : ElementId<Metavariables::volume_dim>,
60 : std::deque<ElementId<Metavariables::volume_dim>>>>(
61 : child_proxy, std::move(parent_id),
62 : std::move(sibling_ids_to_collect)));
63 : }
64 : };
65 : } // namespace amr::Actions
|