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 <tuple>
9 : #include <utility>
10 :
11 : #include "DataStructures/DataBox/DataBox.hpp"
12 : #include "DataStructures/TaggedTuple.hpp"
13 : #include "Evolution/Initialization/InitialData.hpp"
14 : #include "Parallel/AlgorithmExecution.hpp"
15 : #include "Parallel/GlobalCache.hpp"
16 : #include "ParallelAlgorithms/Initialization/MutateAssign.hpp"
17 : #include "PointwiseFunctions/AnalyticData/RadiationTransport/M1Grey/Factory.hpp"
18 : #include "PointwiseFunctions/AnalyticSolutions/RadiationTransport/M1Grey/Factory.hpp"
19 : #include "PointwiseFunctions/InitialDataUtilities/InitialData.hpp"
20 : #include "PointwiseFunctions/InitialDataUtilities/Tags/InitialData.hpp"
21 : #include "Utilities/CallWithDynamicType.hpp"
22 : #include "Utilities/Gsl.hpp"
23 : #include "Utilities/TMPL.hpp"
24 :
25 : /// \cond
26 : namespace Frame {
27 : struct Inertial;
28 : } // namespace Frame
29 : namespace Tags {
30 : struct Time;
31 : } // namespace Tags
32 : namespace domain {
33 : namespace Tags {
34 : template <size_t Dim, typename Frame>
35 : struct Coordinates;
36 : template <size_t VolumeDim>
37 : struct Mesh;
38 : } // namespace Tags
39 : } // namespace domain
40 :
41 : /// \endcond
42 :
43 : namespace RadiationTransport {
44 : namespace M1Grey {
45 0 : namespace Actions {
46 :
47 : template <typename System>
48 0 : struct InitializeM1Tags {
49 0 : using evolved_variables_tag = typename System::variables_tag;
50 0 : using hydro_variables_tag = typename System::hydro_variables_tag;
51 0 : using m1_variables_tag = typename System::primitive_variables_tag;
52 : // List of variables to be created... does NOT include
53 : // evolved_variables_tag because the evolved variables
54 : // are created by the ConservativeSystem initialization.
55 0 : using simple_tags = tmpl::list<hydro_variables_tag, m1_variables_tag>;
56 0 : using compute_tags = tmpl::list<>;
57 :
58 : template <typename DbTagsList, typename... InboxTags, typename Metavariables,
59 : typename ArrayIndex, typename ActionList,
60 : typename ParallelComponent>
61 0 : static Parallel::iterable_action_return_t apply(
62 : db::DataBox<DbTagsList>& box,
63 : const tuples::TaggedTuple<InboxTags...>& /*inboxes*/,
64 : const Parallel::GlobalCache<Metavariables>& cache,
65 : const ArrayIndex& /*array_index*/, ActionList /*meta*/,
66 : const ParallelComponent* const /*meta*/) {
67 : using EvolvedVars = typename evolved_variables_tag::type;
68 : using HydroVars = typename hydro_variables_tag::type;
69 : using M1Vars = typename m1_variables_tag::type;
70 :
71 : static constexpr size_t dim = System::volume_dim;
72 : const double initial_time = db::get<::Tags::Time>(box);
73 : const size_t num_grid_points =
74 : db::get<domain::Tags::Mesh<dim>>(box).number_of_grid_points();
75 : const auto& inertial_coords =
76 : db::get<domain::Tags::Coordinates<dim, Frame::Inertial>>(box);
77 :
78 : using initial_data_evo_tags = typename evolved_variables_tag::tags_list;
79 : using initial_data_hydro_tags = typename hydro_variables_tag::tags_list;
80 :
81 : using initial_data_list =
82 : tmpl::append<RadiationTransport::M1Grey::AnalyticData::all_data,
83 : RadiationTransport::M1Grey::Solutions::all_solutions>;
84 :
85 : const auto initial_data_evo_and_hydro_vars = call_with_dynamic_type<
86 : tuples::tagged_tuple_from_typelist<
87 : tmpl ::append<initial_data_evo_tags, initial_data_hydro_tags>>,
88 : initial_data_list>(
89 : &Parallel::get<evolution::initial_data::Tags::InitialData>(cache),
90 : [&inertial_coords, &initial_time](const auto* const initial_data) {
91 : return evolution::Initialization::initial_data(
92 : *initial_data, inertial_coords, initial_time,
93 : tmpl::append<initial_data_evo_tags, initial_data_hydro_tags>{});
94 : });
95 :
96 : db::mutate<evolved_variables_tag>(
97 : [&initial_data_evo_and_hydro_vars](
98 : const gsl::not_null<EvolvedVars*> evolved_vars) {
99 : evolved_vars->assign_subset(initial_data_evo_and_hydro_vars);
100 : },
101 : make_not_null(&box));
102 :
103 : // Get hydro variables
104 : HydroVars hydro_variables{num_grid_points};
105 :
106 : hydro_variables.assign_subset(initial_data_evo_and_hydro_vars);
107 :
108 : M1Vars m1_variables{num_grid_points, -1.};
109 : Initialization::mutate_assign<simple_tags>(make_not_null(&box),
110 : std::move(hydro_variables),
111 : std::move(m1_variables));
112 :
113 : return {Parallel::AlgorithmExecution::Continue, std::nullopt};
114 : }
115 : };
116 :
117 : } // namespace Actions
118 : } // namespace M1Grey
119 : } // namespace RadiationTransport
|