Line data Source code
1 0 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : #pragma once 5 : 6 : #include <type_traits> 7 : #include <utility> 8 : 9 : #include "DataStructures/DataBox/MetavariablesTag.hpp" 10 : #include "DataStructures/DataBox/Tag.hpp" 11 : #include "DataStructures/Tensor/Tensor.hpp" 12 : #include "DataStructures/Variables.hpp" 13 : #include "DataStructures/VariablesTag.hpp" 14 : #include "Domain/Tags.hpp" 15 : #include "Elliptic/Tags.hpp" 16 : #include "PointwiseFunctions/GeneralRelativity/Tags.hpp" 17 : #include "PointwiseFunctions/Hydro/Tags.hpp" 18 : #include "PointwiseFunctions/InitialDataUtilities/Background.hpp" 19 : #include "Utilities/CallWithDynamicType.hpp" 20 : #include "Utilities/Gsl.hpp" 21 : #include "Utilities/TMPL.hpp" 22 : 23 1 : namespace Xcts::Tags { 24 : namespace detail { 25 : 26 : template <typename Background, typename HydroTags, typename = std::void_t<>> 27 : struct has_hydro_variables : std::false_type {}; 28 : 29 : template <typename Background, typename HydroTags> 30 : struct has_hydro_variables< 31 : Background, HydroTags, 32 : std::void_t<decltype(std::declval<const Background&>().variables( 33 : std::declval<const tnsr::I<DataVector, 3, Frame::Inertial>&>(), 34 : HydroTags{}))>> : std::true_type {}; 35 : 36 : } // namespace detail 37 : 38 : /*! 39 : * \brief MHD quantities retrieved from the background solution/data 40 : * 41 : * Retrieve the `HydroTags` from the background solution/data so they can be 42 : * written out to disk. These quantities don't take part in a pure XCTS solve, 43 : * (which only solves for the gravity sector given the matter profile) except 44 : * for their contributions to the matter source terms in the XCTS equations. 45 : * However, the matter source terms are computed and stored separately, so these 46 : * hydro quantities are only used for observations. 47 : */ 48 : template <typename HydroTags> 49 1 : struct HydroQuantitiesCompute : ::Tags::Variables<HydroTags>, db::ComputeTag { 50 0 : using base = ::Tags::Variables<HydroTags>; 51 0 : using argument_tags = tmpl::list< 52 : domain::Tags::Coordinates<3, Frame::Inertial>, 53 : elliptic::Tags::Background<elliptic::analytic_data::Background>, 54 : Parallel::Tags::Metavariables>; 55 : template <typename Metavariables> 56 0 : static void function(const gsl::not_null<Variables<HydroTags>*> result, 57 : const tnsr::I<DataVector, 3>& inertial_coords, 58 : const elliptic::analytic_data::Background& background, 59 : const Metavariables& /*meta*/) { 60 : using background_classes = 61 : tmpl::at<typename Metavariables::factory_creation::factory_classes, 62 : elliptic::analytic_data::Background>; 63 : *result = call_with_dynamic_type<Variables<HydroTags>, background_classes>( 64 : &background, [&inertial_coords](const auto* const derived) { 65 : using derived_type = std::decay_t<decltype(*derived)>; 66 : if constexpr (detail::has_hydro_variables<derived_type, 67 : HydroTags>::value) { 68 : return variables_from_tagged_tuple( 69 : derived->variables(inertial_coords, HydroTags{})); 70 : } else { 71 : return Variables<HydroTags>{inertial_coords.begin()->size(), 0.}; 72 : } 73 : }); 74 : } 75 : }; 76 : 77 : } // namespace Xcts::Tags