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 <type_traits> 9 : 10 : #include "DataStructures/DataBox/Protocols/Mutator.hpp" 11 : #include "DataStructures/DataVector.hpp" 12 : #include "DataStructures/Tensor/Tensor.hpp" 13 : #include "Domain/Tags.hpp" 14 : #include "Evolution/DgSubcell/Tags/Coordinates.hpp" 15 : #include "Evolution/DgSubcell/Tags/Inactive.hpp" 16 : #include "Evolution/Systems/ForceFree/Tags.hpp" 17 : #include "PointwiseFunctions/InitialDataUtilities/InitialData.hpp" 18 : #include "PointwiseFunctions/InitialDataUtilities/Tags/InitialData.hpp" 19 : #include "Utilities/CallWithDynamicType.hpp" 20 : #include "Utilities/Gsl.hpp" 21 : #include "Utilities/ProtocolHelpers.hpp" 22 : #include "Utilities/TMPL.hpp" 23 : #include "Utilities/TypeTraits/CreateIsCallable.hpp" 24 : 25 : namespace ForceFree { 26 : namespace detail { 27 : CREATE_IS_CALLABLE(interior_mask) 28 : CREATE_IS_CALLABLE_V(interior_mask) 29 : CREATE_IS_CALLABLE_R_V(interior_mask) 30 : } // namespace detail 31 : 32 : /*! 33 : * \brief Assign the masking scalar variable (see Tags::NsInteriorMask) at the 34 : * initialization phase in NS magnetosphere simulations. 35 : * 36 : * Run the `interior_mask()` member function of the initial data if it is 37 : * callable. 38 : */ 39 : template <typename Metavariables, bool UsedForFdGrid> 40 1 : struct MaskNeutronStarInterior : tt::ConformsTo<db::protocols::Mutator> { 41 0 : using argument_tags = tmpl::list< 42 : tmpl::conditional_t< 43 : UsedForFdGrid, 44 : evolution::dg::subcell::Tags::Coordinates<3, Frame::Inertial>, 45 : domain::Tags::Coordinates<3, Frame::Inertial>>, 46 : evolution::initial_data::Tags::InitialData>; 47 : 48 0 : using return_tags = tmpl::list<tmpl::conditional_t< 49 : UsedForFdGrid, 50 : evolution::dg::subcell::Tags::Inactive<Tags::NsInteriorMask>, 51 : Tags::NsInteriorMask>>; 52 : 53 0 : static void apply( 54 : const gsl::not_null<std::optional<Scalar<DataVector>>*> 55 : neutron_star_interior_mask, 56 : const tnsr::I<DataVector, 3, Frame::Inertial>& inertial_coords, 57 : const evolution::initial_data::InitialData& solution_or_data) { 58 : using all_data_and_solutions = 59 : tmpl::at<typename Metavariables::factory_creation::factory_classes, 60 : evolution::initial_data::InitialData>; 61 : 62 : call_with_dynamic_type<void, all_data_and_solutions>( 63 : &solution_or_data, [&neutron_star_interior_mask, 64 : &inertial_coords](const auto* initial_data_ptr) { 65 : using InitialData = std::decay_t<decltype(*initial_data_ptr)>; 66 : 67 : if constexpr (detail::is_interior_mask_callable_r_v< 68 : std::optional<Scalar<DataVector>>, InitialData, 69 : tnsr::I<DataVector, 3, Frame::Inertial>>) { 70 : (*neutron_star_interior_mask) = 71 : (*initial_data_ptr).interior_mask(inertial_coords); 72 : } 73 : }); 74 : } 75 : }; 76 : 77 : } // namespace ForceFree