Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
MDSpan.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* MDSpan.h (C) 2000-2024 */
9/* */
10/* Vue sur un tableaux multi-dimensionnel pour les types numériques. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_UTILS_MDSPAN_H
13#define ARCANE_UTILS_MDSPAN_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/ArrayExtents.h"
18#include "arcane/utils/ArrayBounds.h"
19#include "arcane/utils/NumericTraits.h"
20#include "arcane/utils/ArrayLayout.h"
21#include "arcane/utils/ArcaneCxx20.h"
22
23/*---------------------------------------------------------------------------*/
24/*---------------------------------------------------------------------------*/
25
26namespace Arcane
27{
28
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
42template <typename DataType, typename Extents, typename LayoutPolicy>
43class MDSpan
44{
45 using UnqualifiedValueType = std::remove_cv_t<DataType>;
46 friend class NumArray<UnqualifiedValueType, Extents, LayoutPolicy>;
47 // Pour que MDSpan<const T> ait accès à MDSpan<T>
48 friend class MDSpan<const UnqualifiedValueType, Extents, LayoutPolicy>;
49
50 public:
51
52 using value_type = DataType;
53 using ExtentsType = Extents;
55 using MDIndexType = typename Extents::MDIndexType;
57 using DynamicDimsType = typename Extents::DynamicDimsType;
58 using RemovedFirstExtentsType = typename Extents::RemovedFirstExtentsType;
59
60 // Pour compatibilité. A supprimer pour cohérence avec les autres 'using'
61 using ArrayBoundsIndexType = typename Extents::MDIndexType;
62 using IndexType = typename Extents::MDIndexType;
63
64 public:
65
66 MDSpan() = default;
67 constexpr ARCCORE_HOST_DEVICE MDSpan(DataType* ptr, ArrayExtentsWithOffsetType extents)
68 : m_ptr(ptr)
69 , m_extents(extents)
70 {
71 }
72 constexpr ARCCORE_HOST_DEVICE MDSpan(DataType* ptr, const DynamicDimsType& dims)
73 : m_ptr(ptr)
74 , m_extents(dims)
75 {}
76 // Constructeur MDSpan<const T> à partir d'un MDSpan<T>
77 template <typename X, typename = std::enable_if_t<std::is_same_v<X, UnqualifiedValueType>>>
78 constexpr ARCCORE_HOST_DEVICE MDSpan(const MDSpan<X, Extents>& rhs)
79 : m_ptr(rhs.m_ptr)
80 , m_extents(rhs.m_extents)
81 {}
82
83 public:
84
85 constexpr ARCCORE_HOST_DEVICE DataType* _internalData() { return m_ptr; }
86 constexpr ARCCORE_HOST_DEVICE const DataType* _internalData() const { return m_ptr; }
87
88 public:
89
90 ArrayExtents<Extents> extents() const
91 {
92 return m_extents.extents();
93 }
94 ArrayExtentsWithOffsetType extentsWithOffset() const
95 {
96 return m_extents;
97 }
98
99 public:
100
102 constexpr ARCCORE_HOST_DEVICE Int32 extent0() const requires(Extents::rank() >= 1) { return m_extents.extent0(); }
104 constexpr ARCCORE_HOST_DEVICE Int32 extent1() const requires(Extents::rank() >= 2) { return m_extents.extent1(); }
106 constexpr ARCCORE_HOST_DEVICE Int32 extent2() const requires(Extents::rank() >= 3) { return m_extents.extent2(); }
108 constexpr ARCCORE_HOST_DEVICE Int32 extent3() const requires(Extents::rank() >= 4) { return m_extents.extent3(); }
109
110 public:
111 public:
112
114 constexpr ARCCORE_HOST_DEVICE Int64 offset(Int32 i, Int32 j, Int32 k, Int32 l) const requires(Extents::rank() == 4)
115 {
116 return m_extents.offset(i, j, k, l);
117 }
119 constexpr ARCCORE_HOST_DEVICE Int64 offset(Int32 i, Int32 j, Int32 k) const requires(Extents::rank() == 3)
120 {
121 return m_extents.offset(i, j, k);
122 }
124 constexpr ARCCORE_HOST_DEVICE Int64 offset(Int32 i, Int32 j) const requires(Extents::rank() == 2)
125 {
126 return m_extents.offset(i, j);
127 }
129 constexpr ARCCORE_HOST_DEVICE Int64 offset(Int32 i) const requires(Extents::rank() == 1) { return m_extents.offset(i); }
130
132 constexpr ARCCORE_HOST_DEVICE Int64 offset(MDIndexType idx) const
133 {
134 return m_extents.offset(idx);
135 }
136
137 public:
138
140 constexpr ARCCORE_HOST_DEVICE DataType& operator()(Int32 i, Int32 j, Int32 k, Int32 l) const requires(Extents::rank() == 4)
141 {
142 return m_ptr[offset(i, j, k, l)];
143 }
145 ARCCORE_HOST_DEVICE DataType& operator()(Int32 i, Int32 j, Int32 k) const requires(Extents::rank() == 3)
146 {
147 return m_ptr[offset(i, j, k)];
148 }
150 constexpr ARCCORE_HOST_DEVICE DataType& operator()(Int32 i, Int32 j) const requires(Extents::rank() == 2)
151 {
152 return m_ptr[offset(i, j)];
153 }
155 constexpr ARCCORE_HOST_DEVICE DataType& operator()(Int32 i) const requires(Extents::rank() == 1) { return m_ptr[offset(i)]; }
157 constexpr ARCCORE_HOST_DEVICE DataType operator[](Int32 i) const requires(Extents::rank() == 1) { return m_ptr[offset(i)]; }
158
160 constexpr ARCCORE_HOST_DEVICE DataType& operator()(MDIndexType idx) const
161 {
162 return m_ptr[offset(idx)];
163 }
164
165 public:
166
168 constexpr ARCCORE_HOST_DEVICE DataType* ptrAt(Int32 i, Int32 j, Int32 k, Int32 l) const requires(Extents::rank() == 4)
169 {
170 return m_ptr + offset(i, j, k, l);
171 }
173 ARCCORE_HOST_DEVICE DataType* ptrAt(Int32 i, Int32 j, Int32 k) const requires(Extents::rank() == 3)
174 {
175 return m_ptr + offset(i, j, k);
176 }
178 constexpr ARCCORE_HOST_DEVICE DataType* ptrAt(Int32 i, Int32 j) const requires(Extents::rank() == 2)
179 {
180 return m_ptr + offset(i, j);
181 }
183 constexpr ARCCORE_HOST_DEVICE DataType* ptrAt(Int32 i) const requires(Extents::rank() == 1) { return m_ptr + offset(i); }
184
186 constexpr ARCCORE_HOST_DEVICE DataType* ptrAt(MDIndexType idx) const
187 {
188 return m_ptr + offset(idx);
189 }
190
191 public:
192
206 slice(Int32 i) const requires(Extents::rank() >= 2 && std::is_base_of_v<RightLayout, LayoutPolicy>)
207 {
208 auto new_extents = m_extents.extents().removeFirstExtent().dynamicExtents();
209 std::array<Int32, ExtentsType::rank()> indexes = {};
210 indexes[0] = i;
211 DataType* base_ptr = this->ptrAt(MDIndexType(indexes));
213 }
214
215 public:
216
217 constexpr ARCCORE_HOST_DEVICE MDSpan<const DataType, Extents, LayoutPolicy> constSpan() const
218 {
219 return MDSpan<const DataType, Extents, LayoutPolicy>(m_ptr, m_extents);
220 }
221
222 constexpr ARCCORE_HOST_DEVICE MDSpan<const DataType, Extents, LayoutPolicy> constMDSpan() const
223 {
224 return MDSpan<const DataType, Extents, LayoutPolicy>(m_ptr, m_extents);
225 }
226
227 constexpr ARCCORE_HOST_DEVICE Span<DataType> to1DSpan() const
228 {
229 return { m_ptr, m_extents.totalNbElement() };
230 }
231
232 constexpr SmallSpan<DataType> to1DSmallSpan() requires(Extents::rank() == 1)
233 {
234 return { _internalData(), extent0() };
235 }
236 constexpr SmallSpan<const DataType> to1DSmallSpan() const requires(Extents::rank() == 1)
237 {
238 return to1DConstSmallSpan();
239 }
240 constexpr SmallSpan<const DataType> to1DConstSmallSpan() const requires(Extents::rank() == 1)
241 {
242 return { _internalData(), extent0() };
243 }
244
245 private:
246
247 DataType* m_ptr = nullptr;
248 ArrayExtentsWithOffsetType m_extents;
249};
250
251/*---------------------------------------------------------------------------*/
252/*---------------------------------------------------------------------------*/
253
254} // End namespace Arcane
255
256/*---------------------------------------------------------------------------*/
257/*---------------------------------------------------------------------------*/
258
259#endif
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Classe de base des vues multi-dimensionnelles.
Definition MDSpan.h:44
constexpr ARCCORE_HOST_DEVICE DataType * ptrAt(Int32 i) const
Pointeur sur la valeur pour l'élément i.
Definition MDSpan.h:183
constexpr ARCCORE_HOST_DEVICE Int64 offset(Int32 i) const
Valeur pour l'élément i.
Definition MDSpan.h:129
constexpr ARCCORE_HOST_DEVICE DataType * ptrAt(MDIndexType idx) const
Pointeur sur la valeur pour l'élément i.
Definition MDSpan.h:186
constexpr ARCCORE_HOST_DEVICE DataType * ptrAt(Int32 i, Int32 j) const
Pointeur sur la valeur pour l'élément i,j.
Definition MDSpan.h:178
ARCCORE_HOST_DEVICE DataType * ptrAt(Int32 i, Int32 j, Int32 k) const
Pointeur sur la valeur pour l'élément i,j,k.
Definition MDSpan.h:173
constexpr ARCCORE_HOST_DEVICE Int32 extent3() const
Valeur de la quatrième dimension.
Definition MDSpan.h:108
constexpr ARCCORE_HOST_DEVICE DataType * ptrAt(Int32 i, Int32 j, Int32 k, Int32 l) const
Pointeur sur la valeur pour l'élément i,j,k.
Definition MDSpan.h:168
constexpr ARCCORE_HOST_DEVICE Int64 offset(MDIndexType idx) const
Valeur pour l'élément idx.
Definition MDSpan.h:132
constexpr ARCCORE_HOST_DEVICE DataType & operator()(Int32 i, Int32 j, Int32 k, Int32 l) const
Valeur pour l'élément i,j,k,l.
Definition MDSpan.h:140
constexpr ARCCORE_HOST_DEVICE Int64 offset(Int32 i, Int32 j, Int32 k) const
Valeur pour l'élément i,j,k.
Definition MDSpan.h:119
constexpr ARCCORE_HOST_DEVICE DataType operator[](Int32 i) const
Valeur pour l'élément i.
Definition MDSpan.h:157
constexpr ARCCORE_HOST_DEVICE Int32 extent2() const
Valeur de la troisième dimension.
Definition MDSpan.h:106
constexpr ARCCORE_HOST_DEVICE DataType & operator()(Int32 i, Int32 j) const
Valeur pour l'élément i,j.
Definition MDSpan.h:150
ARCCORE_HOST_DEVICE DataType & operator()(Int32 i, Int32 j, Int32 k) const
Valeur pour l'élément i,j,k.
Definition MDSpan.h:145
constexpr ARCCORE_HOST_DEVICE Int32 extent0() const
Valeur de la première dimension.
Definition MDSpan.h:102
constexpr ARCCORE_HOST_DEVICE Int32 extent1() const
Valeur de la deuxième dimension.
Definition MDSpan.h:104
ARCCORE_HOST_DEVICE MDSpan< DataType, RemovedFirstExtentsType, LayoutPolicy > slice(Int32 i) const
Retourne une vue de dimension (N-1) à partir de l'élément d'indice i.
Definition MDSpan.h:206
constexpr ARCCORE_HOST_DEVICE Int64 offset(Int32 i, Int32 j) const
Valeur pour l'élément i,j.
Definition MDSpan.h:124
constexpr ARCCORE_HOST_DEVICE DataType & operator()(MDIndexType idx) const
Valeur pour l'élément idx.
Definition MDSpan.h:160
constexpr ARCCORE_HOST_DEVICE DataType & operator()(Int32 i) const
Valeur pour l'élément i.
Definition MDSpan.h:155
constexpr ARCCORE_HOST_DEVICE Int64 offset(Int32 i, Int32 j, Int32 k, Int32 l) const
Valeur pour l'élément i,j,k,l.
Definition MDSpan.h:114
Tableaux multi-dimensionnels pour les types numériques accessibles sur accélérateurs.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-