2#include <muda/viewer/viewer_base.h>
3#include <muda/ext/field/field_entry_layout.h>
4#include <muda/ext/field/field_entry_base_data.h>
5#include <muda/ext/field/field_entry_core.h>
6#include <muda/ext/field/matrix_map_info.h>
7#include <muda/tools/host_device_config.h>
8#include <muda/ext/eigen/eigen_core_cxx20.h>
12namespace details::field
14 using MatStride = Eigen::Stride<Eigen::Dynamic, Eigen::Dynamic>;
15 template <
typename T, FieldEntryLayout Layout,
int M,
int N>
16 MUDA_GENERIC MatStride make_stride(
const FieldEntryCore& core)
19 if constexpr(M == 1 && N == 1)
21 ret = MatStride{0, 0};
23 else if constexpr(N == 1)
25 auto begin = core.data<T, Layout>(0, 0);
26 auto next = core.data<T, Layout>(0, 1);
27 ret = MatStride{0, next - begin};
31 auto begin = core.data<T, Layout>(0, 0, 0);
32 auto inner_next = core.data<T, Layout>(0, 1, 0);
33 auto outer_next = core.data<T, Layout>(0, 0, 1);
34 ret = MatStride{outer_next - begin, inner_next - begin};
40template <
bool IsConst,
typename T, FieldEntryLayout Layout,
int M,
int N>
46 using MatStride = details::field::MatStride;
48 using ConstMatMap = Eigen::Map<const Eigen::Matrix<T, M, N>, 0, MatStride>;
49 using NonConstMatMap = Eigen::Map<Eigen::Matrix<T, M, N>, 0, MatStride>;
50 using ThisMatMap = std::conditional_t<IsConst, ConstMatMap, NonConstMatMap>;
54 using auto_const_t =
typename Base::template auto_const_t<U>;
69 Base::name(core->name_string_pointer());
71 MUDA_KERNEL_ASSERT(m_offset >= 0 && m_size >= 0 && m_offset + m_size <= total_count(),
72 "FieldEntryViewer[%s:%s]: offset/size indexing out of range, size=%d, offset=%d, size=%d",
79 m_stride = details::field::make_stride<T, Layout, M, N>(*m_core);
86 MUDA_GENERIC T* data(
int i)
const
89 return m_core->template data<T, Layout>(m_offset + i);
92 MUDA_GENERIC T* data(
int i,
int j)
const
96 MUDA_KERNEL_ASSERT(j < shape().x,
97 "FieldEntry[%s:%s]: vector component indexing out of range, shape=(%d, %d), index=%d",
103 return m_core->template data<T, Layout>(m_offset + i, j);
106 MUDA_GENERIC T* data(
int i,
int row_index,
int col_index)
const
110 MUDA_KERNEL_ASSERT(row_index < shape().x && col_index < shape().y,
111 "FieldEntry[%s:%s]: vector component indexing out of range, shape=(%d,%d), index=(%d,%d)",
118 return m_core->template data<T, Layout>(m_offset + i, row_index, col_index);
122 MUDA_GENERIC
auto layout_info()
const {
return m_core->layout_info(); }
123 MUDA_GENERIC
auto layout()
const {
return m_core->layout(); }
124 MUDA_GENERIC
auto offset()
const {
return m_offset; }
125 MUDA_GENERIC
auto size()
const {
return m_size; }
126 MUDA_GENERIC
auto total_count()
const {
return m_core->count(); }
127 MUDA_GENERIC
auto elem_byte_size()
const
129 return m_core->elem_byte_size();
131 MUDA_GENERIC
auto shape()
const {
return m_core->shape(); }
132 MUDA_GENERIC
auto struct_stride()
const {
return m_core->struct_stride(); }
133 MUDA_GENERIC
auto entry_name()
const {
return m_core->name(); }
136 MUDA_INLINE MUDA_GENERIC
void check_index(
int i)
const
138 MUDA_KERNEL_ASSERT(i < m_size,
139 "FieldEntryViewer[%s:%s]: indexing out of range, index=%d, size=%d, offset=%d, entry_total_count=%d",
145 this->total_count());
154template <
bool IsConst,
typename T, FieldEntryLayout Layout,
int M,
int N>
155class FieldEntryViewerBase;
156template <
typename T, FieldEntryLayout Layout,
int M,
int N>
157class FieldEntryViewer;
158template <
typename T, FieldEntryLayout Layout,
int M,
int N>
159class CFieldEntryViewer;
163#include "details/entry_viewers/field_entry_viewer_matrix.inl"
164#include "details/entry_viewers/field_entry_viewer_vector.inl"
165#include "details/entry_viewers/field_entry_viewer_scalar.inl"
Definition field_entry_viewer.h:42
Definition host_device_config.h:12
Definition viewer_base.h:18