Mallard 0.8.0
Unstructured, GPU accelerated, high-order finite volume CFD solver
Mallard website
Loading...
Searching...
No Matches
common_debug_helpers.h
Go to the documentation of this file.
1
12#ifndef COMMON_DEBUG_HELPERS_H
13#define COMMON_DEBUG_HELPERS_H
14
15#include <iostream>
16#include <vector>
17#include <iomanip>
18
19#include <Kokkos_Core.hpp>
20
21// Recursive function to print the elements of a Kokkos view
22template <typename T>
23void print_view_recursive(const T* data, const std::vector<size_t>& extents, std::ostream& os,
24 std::vector<size_t>& indices, size_t dim, const std::vector<size_t>& strides) {
25 if (dim == extents.size()) {
26 // Base case: compute flat index and print element
27 size_t flat_index = 0;
28 for (size_t i = 0; i < indices.size(); ++i) {
30 }
31 os << std::setw(6) << data[flat_index]; // Align output for readability
32 } else {
33 // Recursive case: iterate through the current dimension
34 for (size_t i = 0; i < extents[dim]; ++i) {
35 indices[dim] = i;
36 if (dim < extents.size() - 1) {
37 for (size_t j = 0; j < dim; ++j) {
38 os << " "; // Indent for subdimensions
39 }
40 os << std::setw(5) << i;
41 }
43 if (dim < extents.size() - 1) {
44 os << "\n";
45 }
46 }
47 }
48}
49
50// Pretty-printing function for Kokkos views
51template <typename ViewType>
52void print_view(const ViewType& view, std::ostream& os = std::cout) {
53 static_assert(Kokkos::is_view<ViewType>::value, "Input must be a Kokkos view");
54
55 if (view.size() == 0) {
56 os << "[] (Empty view)\n";
57 return;
58 }
59
60 // Extract raw data pointer
61 const auto* data = view.data();
62
63 // Gather extents and strides for all dimensions
64 std::vector<size_t> extents(view.rank());
65 std::vector<size_t> strides(view.rank());
66 view.stride(strides.data());
67 for (size_t i = 0; i < view.rank(); ++i) {
68 extents[i] = view.extent(i);
69 }
70
71 // Determine layout
72 std::string layout = (std::is_same<typename ViewType::array_layout, Kokkos::LayoutRight>::value)
73 ? "Kokkos::LayoutRight"
74 : "Kokkos::LayoutLeft";
75
76 // Print metadata
77 os << "View Metadata:\n";
78 os << " Rank: " << view.rank() << "\n";
79 os << " Extents: [";
80 for (size_t i = 0; i < extents.size(); ++i) {
81 if (i > 0) {
82 os << ", ";
83 }
84 os << extents[i];
85 }
86 os << "]\n";
87 os << " Strides: [";
88 for (size_t i = 0; i < strides.size(); ++i) {
89 if (i > 0) {
90 os << ", ";
91 }
92 os << strides[i];
93 }
94 os << "]\n";
95 os << " Layout: " << layout << "\n";
96
97 // Print the view
98 os << "View Elements:\n";
99 os << "Dim" << view.rank() - 1 << ":";
100 if (view.rank() > 1) {
101 for (size_t i = 0; i < view.rank() - 2; ++i) {
102 os << " ";
103 }
104 }
105 for (size_t i = 0; i < extents[view.rank() - 1]; ++i) {
106 os << std::setw(6) << i;
107 }
108 os << "\n";
109 for (size_t i = 0; i < view.rank() - 1; ++i) {
110 os << "Dim" << i << " ";
111 }
112 os << "\n";
113 std::vector<size_t> indices(view.rank(), 0);
115 os << "\n";
116}
117
118#endif // COMMON_DEBUG_HELPERS_H
void print_view_recursive(const T *data, const std::vector< size_t > &extents, std::ostream &os, std::vector< size_t > &indices, size_t dim, const std::vector< size_t > &strides)
Definition common_debug_helpers.h:23
void print_view(const ViewType &view, std::ostream &os=std::cout)
Definition common_debug_helpers.h:52
KOKKOS_INLINE_FUNCTION rtype dot(const rtype *a, const rtype *b)
Compute the dot product of two arrays.
Definition common_math.h:32
TeamLayout layout
Definition teno_setup.cpp:1813