Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <iomanip>
7 : #include <ios>
8 : #include <limits>
9 : #include <sstream>
10 :
11 : #include "DataStructures/DataBox/DataBox.hpp"
12 : #include "Parallel/GlobalCache.hpp"
13 : #include "Parallel/Printf/Printf.hpp"
14 : #include "ParallelAlgorithms/ApparentHorizonFinder/Tags.hpp"
15 : #include "Utilities/PrettyType.hpp"
16 : #include "Utilities/TMPL.hpp"
17 :
18 0 : namespace ah::Actions {
19 : /*!
20 : * \brief Simple action to print deadlock info of the horizon finder.
21 : */
22 1 : struct PrintDeadlockAnalysis {
23 : template <typename ParallelComponent, typename DbTags, typename Metavariables,
24 : typename ArrayIndex>
25 0 : static void apply(const db::DataBox<DbTags>& box,
26 : const Parallel::GlobalCache<Metavariables>& /*cache*/,
27 : const ArrayIndex& /*array_index*/,
28 : const std::string& file_name) {
29 : std::stringstream ss{};
30 : ss << std::setprecision(std::numeric_limits<double>::digits10 + 4)
31 : << std::scientific;
32 :
33 : using HorizonMetavars = typename ParallelComponent::horizon_metavars;
34 : const std::string& name = pretty_type::name<HorizonMetavars>();
35 : ss << "Horizon finder " << name << ":\n";
36 :
37 : const auto& completed_times = db::get<ah::Tags::CompletedTimes>(box);
38 : ss << " Completed times: " << completed_times << "\n";
39 :
40 : const auto& current_time_optional = db::get<ah::Tags::CurrentTime>(box);
41 : if (current_time_optional.has_value()) {
42 : ss << " Current time: " << current_time_optional.value() << "\n";
43 : } else {
44 : ss << " No current time set.\n";
45 : }
46 :
47 : const auto& pending_times = db::get<ah::Tags::PendingTimes>(box);
48 : ss << " Pending times: " << pending_times << "\n";
49 :
50 : if (current_time_optional.has_value()) {
51 : const auto& current_time = current_time_optional.value();
52 : const auto& all_storage =
53 : db::get<ah::Tags::Storage<typename HorizonMetavars::frame>>(box);
54 : if (all_storage.contains(current_time)) {
55 : const auto& current_time_storage = all_storage.at(current_time);
56 : const auto& all_volume_variables =
57 : current_time_storage.all_volume_variables;
58 : const auto& current_iteration_storage =
59 : current_time_storage.current_iteration;
60 : const auto& fast_flow = db::get<ah::Tags::FastFlow>(box);
61 :
62 : ss << " Time is ready: " << current_time_storage.time_is_ready << "\n";
63 : ss << " FastFlow iteration: " << fast_flow.current_iteration() << "\n";
64 : ss << " Coordinates are set: "
65 : << current_iteration_storage.block_coord_holders.has_value() << "\n";
66 :
67 : if (current_iteration_storage.block_coord_holders.has_value()) {
68 : ss << " Number of points to interpolate to: "
69 : << current_iteration_storage.block_coord_holders->size() << "\n";
70 : const bool interpolation_is_complete =
71 : current_iteration_storage.interpolation_is_complete();
72 : ss << " Interpolation is complete: " << interpolation_is_complete
73 : << "\n";
74 : if (not interpolation_is_complete) {
75 : ss << " THE HORIZON FINDER IS STUCK IN INTERPOLATION, WHICH "
76 : "LIKELY CAUSED THIS DEADLOCK. It is likely waiting for "
77 : "volume data that will never arrive. See "
78 : "'src/ParallelAlgorithms/ApparentHorizonFinder/Events/"
79 : "FindApparentHorizon.hpp' for possible causes and "
80 : "solutions.\n";
81 : const auto& block_logical_coords =
82 : current_iteration_storage.block_coord_holders.value();
83 : ss << " Missing points (in block-logical coords):\n";
84 : const auto& filled =
85 : current_iteration_storage.indices_interpolated_to_thus_far;
86 : for (size_t i = 0; i < filled.size(); ++i) {
87 : if (not filled[i]) {
88 : ss << " Index " << i << ": " << block_logical_coords[i]
89 : << "\n";
90 : }
91 : }
92 : }
93 : ss << " Intersecting element IDs: "
94 : << current_iteration_storage.intersecting_element_ids << "\n";
95 : ss << " Element order: " << current_time_storage.element_order
96 : << "\n";
97 : ss << " Volume data received from " << all_volume_variables.size()
98 : << " elements:\n";
99 : for (const auto& [element_id, volume_vars_storage] :
100 : all_volume_variables) {
101 : ss << " " << element_id << "\n";
102 : }
103 : }
104 : } else {
105 : ss << " No storage for current time " << current_time << ".\n";
106 : }
107 : }
108 :
109 : Parallel::fprintf(file_name, "%s\n", ss.str());
110 : }
111 : };
112 : } // namespace ah::Actions
|