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 <sstream> 8 : #include <string> 9 : #include <vector> 10 : 11 : #include "Parallel/GlobalCache.hpp" 12 : #include "Parallel/Info.hpp" 13 : #include "Utilities/ErrorHandling/Assert.hpp" 14 : #include "Utilities/Numeric.hpp" 15 : #include "Utilities/StdHelpers.hpp" 16 : 17 : namespace domain { 18 : /// Returns a `std::string` with diagnostic information about how elements and 19 : /// grid points are distributed on the nodes and cores. 20 : template <typename Metavariables> 21 1 : std::string diagnostic_info(const size_t total_number_of_blocks, 22 : const Parallel::GlobalCache<Metavariables>& cache, 23 : const std::vector<size_t>& elements_per_core, 24 : const std::vector<size_t>& elements_per_node, 25 : const std::vector<size_t>& grid_points_per_core, 26 : const std::vector<size_t>& grid_points_per_node) { 27 : const size_t total_number_of_elements = 28 : alg::accumulate(elements_per_node, 0_st); 29 : const size_t total_number_of_grid_points = 30 : alg::accumulate(grid_points_per_node, 0_st); 31 : const size_t number_of_cores = Parallel::number_of_procs<size_t>(cache); 32 : const size_t number_of_nodes = Parallel::number_of_nodes<size_t>(cache); 33 : 34 : // Sanity checks 35 : ASSERT(total_number_of_elements == alg::accumulate(elements_per_core, 0_st), 36 : "Number of elements determined from elements_per_core (" 37 : << alg::accumulate(elements_per_core, 0_st) 38 : << ") does not match number of elements determined from " 39 : "elements_per_node (" 40 : << total_number_of_elements << ")."); 41 : ASSERT(total_number_of_grid_points == 42 : alg::accumulate(grid_points_per_core, 0_st), 43 : "Number of grid points determined from grid_points_per_core (" 44 : << alg::accumulate(grid_points_per_core, 0_st) 45 : << ") does not match number of grid points determined from " 46 : "grid points_per_node (" 47 : << total_number_of_grid_points << ")."); 48 : ASSERT(number_of_cores == elements_per_core.size(), 49 : "Number of cores determined from elements_per_core (" 50 : << elements_per_core.size() 51 : << ") does not match number of cores determined from " 52 : "global cache (" 53 : << number_of_cores << ")."); 54 : ASSERT(number_of_cores == grid_points_per_core.size(), 55 : "Number of cores determined from grid_points_per_core (" 56 : << grid_points_per_core.size() 57 : << ") does not match number of cores determined from " 58 : "global cache (" 59 : << number_of_cores << ")."); 60 : ASSERT(number_of_nodes == elements_per_node.size(), 61 : "Number of nodes determined from elements_per_node (" 62 : << elements_per_node.size() 63 : << ") does not match number of nodes determined from " 64 : "global cache (" 65 : << number_of_nodes << ")."); 66 : ASSERT(number_of_nodes == grid_points_per_node.size(), 67 : "Number of nodes determined from grid_points_per_node (" 68 : << grid_points_per_node.size() 69 : << ") does not match number of nodes determined from " 70 : "global cache (" 71 : << number_of_nodes << ")."); 72 : 73 : using ::operator<<; 74 : std::stringstream ss{}; 75 : ss << "----- Domain Info -----\n" 76 : << "Total blocks: " << total_number_of_blocks << "\n" 77 : << "Total elements: " << total_number_of_elements << "\n" 78 : << "Total grid points: " << total_number_of_grid_points << "\n" 79 : << "Number of cores: " << number_of_cores << "\n" 80 : << "Number of nodes: " << number_of_nodes << "\n" 81 : << "Elements per core: " << elements_per_core << "\n" 82 : << "Elements per node: " << elements_per_node << "\n" 83 : << "Grid points per core: " << grid_points_per_core << "\n" 84 : << "Grid points per node: " << grid_points_per_node << "\n" 85 : << "-----------------------\n"; 86 : 87 : return ss.str(); 88 : } 89 : } // namespace domain