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 "Evolution/Initialization/InitialData.hpp" 13 : #include "Parallel/AlgorithmExecution.hpp" 14 : #include "Parallel/GlobalCache.hpp" 15 : #include "ParallelAlgorithms/Initialization/MutateAssign.hpp" 16 : #include "PointwiseFunctions/AnalyticData/RadiationTransport/M1Grey/Factory.hpp" 17 : #include "PointwiseFunctions/AnalyticSolutions/RadiationTransport/M1Grey/Factory.hpp" 18 : #include "PointwiseFunctions/InitialDataUtilities/InitialData.hpp" 19 : #include "PointwiseFunctions/InitialDataUtilities/Tags/InitialData.hpp" 20 : #include "Utilities/CallWithDynamicType.hpp" 21 : #include "Utilities/Gsl.hpp" 22 : #include "Utilities/TMPL.hpp" 23 : #include "Utilities/TaggedTuple.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