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 : 8 : #include "DataStructures/DataVector.hpp" 9 : #include "DataStructures/Tensor/Tensor.hpp" 10 : #include "Domain/Creators/Tags/Domain.hpp" 11 : #include "Domain/Tags.hpp" 12 : #include "Evolution/Initialization/InitialData.hpp" 13 : #include "Evolution/Initialization/Tags.hpp" 14 : #include "Evolution/Systems/CurvedScalarWave/BackgroundSpacetime.hpp" 15 : #include "Evolution/Systems/CurvedScalarWave/System.hpp" 16 : #include "Parallel/AlgorithmExecution.hpp" 17 : #include "Parallel/GlobalCache.hpp" 18 : #include "PointwiseFunctions/AnalyticData/Tags.hpp" 19 : 20 : /// \cond 21 : namespace Tags { 22 : struct Time; 23 : } // namespace Tags 24 : /// \endcond 25 : 26 0 : namespace CurvedScalarWave::Actions { 27 : 28 : /// \ingroup ActionsGroup 29 : /// \brief Action that initializes or updates items related to the 30 : /// spacetime background of the CurvedScalarWave system 31 : /// 32 : /// If `SkipForStaticBlocks` is `true`, then this action does nothing if the 33 : /// block of the domain is time independent. This is a performance optimization 34 : /// to avoid updating the background spacetime in blocks that are time 35 : /// independent. Note that this assumes that the background spacetime is also 36 : /// time independent. 37 : /// 38 : /// DataBox changes: 39 : /// - Adds: 40 : /// * `CurvedScalarWave::System::spacetime_tag_list` 41 : /// - Removes: nothing 42 : /// - Modifies: nothing 43 : template <typename System, bool SkipForStaticDomains> 44 1 : struct CalculateGrVars { 45 0 : static constexpr size_t Dim = System::volume_dim; 46 0 : using simple_tags = db::AddSimpleTags<typename System::spacetime_tag_list>; 47 0 : using compute_tags = db::AddComputeTags<>; 48 : 49 : template <typename DbTagsList, typename... InboxTags, typename Metavariables, 50 : typename ActionList, typename ParallelComponent> 51 0 : static Parallel::iterable_action_return_t apply( 52 : db::DataBox<DbTagsList>& box, 53 : const tuples::TaggedTuple<InboxTags...>& /*inboxes*/, 54 : const Parallel::GlobalCache<Metavariables>& /*cache*/, 55 : const ElementId<Dim>& element_id, ActionList /*meta*/, 56 : const ParallelComponent* const /*meta*/) { 57 : if constexpr (SkipForStaticDomains) { 58 : const auto& domain = db::get<domain::Tags::Domain<Dim>>(box); 59 : const auto& block = domain.blocks()[element_id.block_id()]; 60 : if (not block.is_time_dependent()) { 61 : return {Parallel::AlgorithmExecution::Continue, std::nullopt}; 62 : } 63 : } 64 : auto initial_data = evolution::Initialization::initial_data( 65 : db::get<CurvedScalarWave::Tags::BackgroundSpacetime< 66 : typename Metavariables::background_spacetime>>(box), 67 : db::get<domain::Tags::Coordinates<Dim, Frame::Inertial>>(box), 68 : db::get<::Tags::Time>(box), typename System::spacetime_tag_list{}); 69 : tmpl::for_each<typename System::spacetime_tag_list>( 70 : [&box, &initial_data](auto spacetime_tag_v) { 71 : using spacetime_tag = tmpl::type_from<decltype(spacetime_tag_v)>; 72 : db::mutate<spacetime_tag>( 73 : [&initial_data](const auto spacetime_tag_ptr) { 74 : *spacetime_tag_ptr = 75 : std::move(get<spacetime_tag>(initial_data)); 76 : }, 77 : make_not_null(&box)); 78 : }); 79 : 80 : return {Parallel::AlgorithmExecution::Continue, std::nullopt}; 81 : } 82 : }; 83 : } // namespace CurvedScalarWave::Actions