Line data Source code
1 0 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : #pragma once 5 : 6 : #include "IO/Observer/Tags.hpp" 7 : #include "Parallel/GlobalCache.hpp" 8 : #include "Parallel/Reduction.hpp" 9 : #include "Parallel/Tags/InputSource.hpp" 10 : #include "Utilities/TMPL.hpp" 11 : #include "Utilities/TypeTraits.hpp" 12 : 13 : namespace observers { 14 : namespace detail { 15 : template <class ObservingAction, class = std::void_t<>> 16 : struct get_reduction_data_tags { 17 : using type = tmpl::list<>; 18 : }; 19 : 20 : template <class ObservingAction> 21 : struct get_reduction_data_tags< 22 : ObservingAction, 23 : std::void_t<typename ObservingAction::observed_reduction_data_tags>> { 24 : using type = typename ObservingAction::observed_reduction_data_tags; 25 : }; 26 : 27 : template <class ReductionDataType> 28 : struct make_reduction_data_tag_impl { 29 : using type = tmpl::wrap<typename ReductionDataType::datum_list, 30 : ::observers::Tags::ReductionData>; 31 : }; 32 : } // namespace detail 33 : 34 : /// Function that returns from the global cache a string containing the 35 : /// options provided in the yaml-formatted input file, if those options are 36 : /// in the global cache. Otherwise, returns an empty string. 37 : template <typename Metavariables> 38 1 : std::string input_source_from_cache( 39 : const Parallel::GlobalCache<Metavariables>& cache) { 40 : if constexpr (tmpl::list_contains_v< 41 : ::Parallel::get_const_global_cache_tags<Metavariables>, 42 : ::Parallel::Tags::InputSource>) { 43 : const std::vector<std::string> input_source_vector{ 44 : Parallel::get<::Parallel::Tags::InputSource>(cache)}; 45 : std::string input_source{}; 46 : for (auto it = input_source_vector.begin(); it != input_source_vector.end(); 47 : ++it) { 48 : input_source += *it; 49 : } 50 : return input_source; 51 : } else { 52 : return ""s; 53 : } 54 : } 55 : 56 : /// Each Action that sends data to the reduction Observer must specify 57 : /// a type alias `observed_reduction_data_tags` that describes the data it 58 : /// sends. Given a list of such Actions (or other types that expose the alias), 59 : /// this metafunction is used to create 60 : /// `Metavariables::observed_reduction_data_tags` (which is required to 61 : /// initialize the Observer). 62 : template <class ObservingActionList> 63 1 : using collect_reduction_data_tags = 64 : tmpl::remove_duplicates<tmpl::flatten<tmpl::transform< 65 : ObservingActionList, detail::get_reduction_data_tags<tmpl::_1>>>>; 66 : 67 : /// Produces the `tmpl::list` of `observers::Tags::ReductionData` tags that 68 : /// corresponds to the `tmpl::list` of `Parallel::ReductionData` passed into 69 : /// this metafunction. 70 : template <typename ReductionDataList> 71 1 : using make_reduction_data_tags = tmpl::remove_duplicates<tmpl::transform< 72 : ReductionDataList, detail::make_reduction_data_tag_impl<tmpl::_1>>>; 73 : } // namespace observers