Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <string>
7 : #include <vector>
8 :
9 : #include "ControlSystem/Actions/PrintCurrentMeasurement.hpp"
10 : #include "Domain/FunctionsOfTime/Tags.hpp"
11 : #include "Evolution/Deadlock/PrintDgElementArray.hpp"
12 : #include "Evolution/Deadlock/PrintFunctionsOfTime.hpp"
13 : #include "Parallel/ArrayCollection/IsDgElementCollection.hpp"
14 : #include "Parallel/ArrayCollection/SimpleActionOnElement.hpp"
15 : #include "Parallel/GlobalCache.hpp"
16 : #include "Parallel/Invoke.hpp"
17 : #include "ParallelAlgorithms/ApparentHorizonFinder/PrintDeadlockAnalysis.hpp"
18 : #include "ParallelAlgorithms/Interpolation/Actions/PrintInterpolationTargetForDeadlock.hpp"
19 : #include "Utilities/FileSystem.hpp"
20 : #include "Utilities/PrettyType.hpp"
21 : #include "Utilities/TMPL.hpp"
22 :
23 : /// \cond
24 : namespace intrp {
25 : template <class Metavariables, typename InterpolationTargetTag>
26 : struct InterpolationTarget;
27 : } // namespace intrp
28 : namespace observers {
29 : template <class Metavariables>
30 : struct ObserverWriter;
31 : } // namespace observers
32 : /// \endcond
33 :
34 0 : namespace gh::deadlock {
35 : template <typename DgElementArray, typename ControlComponents,
36 : typename InterpolationTargetTags, typename AhFinders,
37 : typename Metavariables>
38 0 : void run_deadlock_analysis_simple_actions(
39 : Parallel::GlobalCache<Metavariables>& cache,
40 : const std::vector<std::string>& deadlocked_components) {
41 : const std::string deadlock_dir{"deadlock"};
42 : if (file_system::check_if_dir_exists(deadlock_dir)) {
43 : file_system::rm(deadlock_dir, true);
44 : }
45 :
46 : file_system::create_directory(deadlock_dir);
47 :
48 : Parallel::simple_action<::deadlock::PrintFunctionsOfTime>(
49 : Parallel::get_parallel_component<
50 : observers::ObserverWriter<Metavariables>>(cache),
51 : deadlock_dir + "/functions_of_time.out");
52 :
53 : {
54 : auto cache_proxy = cache.get_this_proxy();
55 :
56 : cache_proxy.print_mutable_cache_callbacks(deadlock_dir +
57 : "/mutable_cache_callbacks.out");
58 : }
59 :
60 : if constexpr (tmpl::size<InterpolationTargetTags>::value > 0) {
61 : const std::string intrp_target_file =
62 : deadlock_dir + "/interpolation_targets.out";
63 : tmpl::for_each<InterpolationTargetTags>(
64 : [&cache, &intrp_target_file](const auto tag_v) {
65 : using TargetTag = tmpl::type_from<decltype(tag_v)>;
66 :
67 : Parallel::simple_action<::deadlock::PrintInterpolationTarget>(
68 : Parallel::get_parallel_component<
69 : intrp::InterpolationTarget<Metavariables, TargetTag>>(cache),
70 : intrp_target_file);
71 : });
72 : }
73 :
74 : if constexpr (tmpl::size<AhFinders>::value > 0) {
75 : tmpl::for_each<AhFinders>([&cache,
76 : &deadlock_dir](const auto horizon_metavars_v) {
77 : using HorizonMetavars = tmpl::type_from<decltype(horizon_metavars_v)>;
78 : const std::string ah_finder_file =
79 : deadlock_dir + "/" + pretty_type::name<HorizonMetavars>() + ".out";
80 : Parallel::simple_action<ah::Actions::PrintDeadlockAnalysis>(
81 : Parallel::get_parallel_component<
82 : ah::Component<Metavariables, HorizonMetavars>>(cache),
83 : ah_finder_file);
84 : });
85 : }
86 :
87 : if (alg::count(deadlocked_components, pretty_type::name<DgElementArray>()) ==
88 : 1) {
89 : if constexpr (tmpl::size<ControlComponents>::value > 0) {
90 : tmpl::for_each<ControlComponents>(
91 : [&cache, &deadlock_dir](auto component_v) {
92 : using component = tmpl::type_from<decltype(component_v)>;
93 : Parallel::simple_action<
94 : control_system::Actions::PrintCurrentMeasurement>(
95 : Parallel::get_parallel_component<component>(cache),
96 : deadlock_dir + "/control_systems.out");
97 : });
98 : }
99 :
100 : const std::string element_array_file =
101 : deadlock_dir + "/dg_element_array.out";
102 : if constexpr (Parallel::is_dg_element_collection_v<DgElementArray>) {
103 : Parallel::threaded_action<Parallel::Actions::SimpleActionOnElement<
104 : ::deadlock::PrintElementInfo, true>>(
105 : Parallel::get_parallel_component<DgElementArray>(cache),
106 : element_array_file);
107 : } else {
108 : Parallel::simple_action<::deadlock::PrintElementInfo>(
109 : Parallel::get_parallel_component<DgElementArray>(cache),
110 : element_array_file);
111 : }
112 : }
113 : }
114 : } // namespace gh::deadlock
|