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 <type_traits> 10 : #include <utility> 11 : 12 : #include "DataStructures/DataBox/DataBox.hpp" 13 : #include "DataStructures/Tensor/Tensor.hpp" 14 : #include "DataStructures/Variables.hpp" 15 : #include "Domain/Tags.hpp" 16 : #include "Parallel/AlgorithmExecution.hpp" 17 : #include "ParallelAlgorithms/Initialization/MutateAssign.hpp" 18 : #include "Utilities/Gsl.hpp" 19 : #include "Utilities/TMPL.hpp" 20 : #include "Utilities/TaggedTuple.hpp" 21 : 22 : /// \cond 23 : namespace Parallel { 24 : template <typename Metavariables> 25 : struct GlobalCache; 26 : } // namespace Parallel 27 : /// \endcond 28 : 29 : namespace elliptic::Actions { 30 : 31 : /*! 32 : * \brief Initialize the variable-independent background fields for an elliptic 33 : * solve. 34 : * 35 : * Examples for background fields would be a background metric, associated 36 : * curvature quantities, or matter sources such as a mass-density in the XCTS 37 : * equations. 38 : * 39 : * This action retrieves the `System::background_fields` from the 40 : * `BackgroundTag`. It invokes the `variables` function with the inertial 41 : * coordinates, the element's `Mesh` and the element's inverse Jacobian. These 42 : * arguments allow computing numeric derivatives, if necessary. 43 : * 44 : * Uses: 45 : * - System: 46 : * - `background_fields` 47 : * - DataBox: 48 : * - `BackgroundTag` 49 : * - `domain::Tags::Coordinates<Dim, Frame::Inertial>` 50 : * 51 : * DataBox: 52 : * - Adds: 53 : * - `::Tags::Variables<background_fields>` 54 : */ 55 : template <typename System, typename BackgroundTag> 56 1 : struct InitializeBackgroundFields { 57 : static_assert( 58 : not std::is_same_v<typename System::background_fields, tmpl::list<>>, 59 : "The system has no background fields. Don't add the " 60 : "'InitializeBackgroundFields' action to the action list."); 61 : 62 : private: 63 0 : using background_fields_tag = 64 : ::Tags::Variables<typename System::background_fields>; 65 : 66 : public: 67 0 : using simple_tags = tmpl::list<background_fields_tag>; 68 0 : using compute_tags = tmpl::list<>; 69 : 70 : template <typename DbTags, typename... InboxTags, typename Metavariables, 71 : size_t Dim, typename ActionList, typename ParallelComponent> 72 0 : static Parallel::iterable_action_return_t apply( 73 : db::DataBox<DbTags>& box, 74 : const tuples::TaggedTuple<InboxTags...>& /*inboxes*/, 75 : const Parallel::GlobalCache<Metavariables>& /*cache*/, 76 : const ElementId<Dim>& /*array_index*/, const ActionList /*meta*/, 77 : const ParallelComponent* const /*meta*/) { 78 : const auto& background = db::get<BackgroundTag>(box); 79 : const auto& inertial_coords = 80 : get<domain::Tags::Coordinates<Dim, Frame::Inertial>>(box); 81 : const auto& mesh = get<domain::Tags::Mesh<Dim>>(box); 82 : const auto& inv_jacobian = 83 : get<domain::Tags::InverseJacobian<Dim, Frame::ElementLogical, 84 : Frame::Inertial>>(box); 85 : auto background_fields = variables_from_tagged_tuple( 86 : background.variables(inertial_coords, mesh, inv_jacobian, 87 : typename background_fields_tag::tags_list{})); 88 : ::Initialization::mutate_assign<simple_tags>(make_not_null(&box), 89 : std::move(background_fields)); 90 : return {Parallel::AlgorithmExecution::Continue, std::nullopt}; 91 : } 92 : }; 93 : 94 : } // namespace elliptic::Actions