Arcane  v3.15.0.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>;
50 static constexpr bool IsConst = std::is_const_v<DataType>;
51
52 public:
53
54 using value_type = DataType;
55 using ExtentsType = Extents;
57 using MDIndexType = typename Extents::MDIndexType;
59 using DynamicDimsType = typename Extents::DynamicDimsType;
60 using RemovedFirstExtentsType = typename Extents::RemovedFirstExtentsType;
61
62 // Pour compatibilité. A supprimer pour cohérence avec les autres 'using'
63 using ArrayBoundsIndexType = typename Extents::MDIndexType;
64 using IndexType = typename Extents::MDIndexType;
65
66 public:
67
68 MDSpan() = default;
69 constexpr ARCCORE_HOST_DEVICE MDSpan(DataType* ptr, ArrayExtentsWithOffsetType extents)
70 : m_ptr(ptr)
71 , m_extents(extents)
72 {
73 }
74 constexpr ARCCORE_HOST_DEVICE MDSpan(DataType* ptr, const DynamicDimsType& dims)
75 : m_ptr(ptr)
76 , m_extents(dims)
77 {}
78 // Constructeur MDSpan<const T> à partir d'un MDSpan<T>
79 template <typename X, typename = std::enable_if_t<std::is_same_v<X, UnqualifiedValueType>>>
80 constexpr ARCCORE_HOST_DEVICE MDSpan(const MDSpan<X, Extents>& rhs)
81 : m_ptr(rhs.m_ptr)
82 , m_extents(rhs.m_extents)
83 {}
84 constexpr ARCCORE_HOST_DEVICE MDSpan(SmallSpan<DataType> v) requires(Extents::isDynamic1D() && !IsConst)
85 : m_ptr(v.data())
86 , m_extents(DynamicDimsType(v.size()))
87 {}
88 constexpr ARCCORE_HOST_DEVICE MDSpan(SmallSpan<const DataType> v) requires(Extents::isDynamic1D() && IsConst)
89 : m_ptr(v.data())
90 , m_extents(DynamicDimsType(v.size()))
91 {}
92 constexpr ARCCORE_HOST_DEVICE ThatClass& operator=(SmallSpan<DataType> v) requires(Extents::isDynamic1D() && !IsConst)
93 {
94 m_ptr = v.data();
95 m_extents = DynamicDimsType(v.size());
96 return (*this);
97 }
98 constexpr ARCCORE_HOST_DEVICE ThatClass& operator=(SmallSpan<const DataType> v) requires(Extents::isDynamic1D() && IsConst)
99 {
100 m_ptr = v.data();
101 m_extents = DynamicDimsType(v.size());
102 return (*this);
103 }
104
105 public:
106
107 constexpr ARCCORE_HOST_DEVICE DataType* _internalData() { return m_ptr; }
108 constexpr ARCCORE_HOST_DEVICE const DataType* _internalData() const { return m_ptr; }
109
110 public:
111
112 ArrayExtents<Extents> extents() const
113 {
114 return m_extents.extents();
115 }
116 ArrayExtentsWithOffsetType extentsWithOffset() const
117 {
118 return m_extents;
119 }
120
121 public:
122
124 constexpr ARCCORE_HOST_DEVICE Int32 extent0() const requires(Extents::rank() >= 1) { return m_extents.extent0(); }
126 constexpr ARCCORE_HOST_DEVICE Int32 extent1() const requires(Extents::rank() >= 2) { return m_extents.extent1(); }
128 constexpr ARCCORE_HOST_DEVICE Int32 extent2() const requires(Extents::rank() >= 3) { return m_extents.extent2(); }
130 constexpr ARCCORE_HOST_DEVICE Int32 extent3() const requires(Extents::rank() >= 4) { return m_extents.extent3(); }
131
132 public:
133
135 constexpr ARCCORE_HOST_DEVICE Int64 offset(Int32 i, Int32 j, Int32 k, Int32 l) const requires(Extents::rank() == 4)
136 {
137 return m_extents.offset(i, j, k, l);
138 }
140 constexpr ARCCORE_HOST_DEVICE Int64 offset(Int32 i, Int32 j, Int32 k) const requires(Extents::rank() == 3)
141 {
142 return m_extents.offset(i, j, k);
143 }
145 constexpr ARCCORE_HOST_DEVICE Int64 offset(Int32 i, Int32 j) const requires(Extents::rank() == 2)
146 {
147 return m_extents.offset(i, j);
148 }
150 constexpr ARCCORE_HOST_DEVICE Int64 offset(Int32 i) const requires(Extents::rank() == 1) { return m_extents.offset(i); }
151
153 constexpr ARCCORE_HOST_DEVICE Int64 offset(MDIndexType idx) const
154 {
155 return m_extents.offset(idx);
156 }
157
158 public:
159
161 constexpr ARCCORE_HOST_DEVICE DataType& operator()(Int32 i, Int32 j, Int32 k, Int32 l) const requires(Extents::rank() == 4)
162 {
163 return m_ptr[offset(i, j, k, l)];
164 }
166 ARCCORE_HOST_DEVICE DataType& operator()(Int32 i, Int32 j, Int32 k) const requires(Extents::rank() == 3)
167 {
168 return m_ptr[offset(i, j, k)];
169 }
171 constexpr ARCCORE_HOST_DEVICE DataType& operator()(Int32 i, Int32 j) const requires(Extents::rank() == 2)
172 {
173 return m_ptr[offset(i, j)];
174 }
176 constexpr ARCCORE_HOST_DEVICE DataType& operator()(Int32 i) const requires(Extents::rank() == 1) { return m_ptr[offset(i)]; }
178 constexpr ARCCORE_HOST_DEVICE DataType operator[](Int32 i) const requires(Extents::rank() == 1) { return m_ptr[offset(i)]; }
179
181 constexpr ARCCORE_HOST_DEVICE DataType& operator()(MDIndexType idx) const
182 {
183 return m_ptr[offset(idx)];
184 }
185
186 public:
187
189 constexpr ARCCORE_HOST_DEVICE DataType* ptrAt(Int32 i, Int32 j, Int32 k, Int32 l) const requires(Extents::rank() == 4)
190 {
191 return m_ptr + offset(i, j, k, l);
192 }
194 ARCCORE_HOST_DEVICE DataType* ptrAt(Int32 i, Int32 j, Int32 k) const requires(Extents::rank() == 3)
195 {
196 return m_ptr + offset(i, j, k);
197 }
199 constexpr ARCCORE_HOST_DEVICE DataType* ptrAt(Int32 i, Int32 j) const requires(Extents::rank() == 2)
200 {
201 return m_ptr + offset(i, j);
202 }
204 constexpr ARCCORE_HOST_DEVICE DataType* ptrAt(Int32 i) const requires(Extents::rank() == 1) { return m_ptr + offset(i); }
205
207 constexpr ARCCORE_HOST_DEVICE DataType* ptrAt(MDIndexType idx) const
208 {
209 return m_ptr + offset(idx);
210 }
211
212 public:
213
227 slice(Int32 i) const requires(Extents::rank() >= 2 && std::is_base_of_v<RightLayout, LayoutPolicy>)
228 {
229 auto new_extents = m_extents.extents().removeFirstExtent().dynamicExtents();
230 std::array<Int32, ExtentsType::rank()> indexes = {};
231 indexes[0] = i;
232 DataType* base_ptr = this->ptrAt(MDIndexType(indexes));
234 }
235
236 public:
237
238 constexpr ARCCORE_HOST_DEVICE MDSpan<const DataType, Extents, LayoutPolicy> constSpan() const
239 {
240 return MDSpan<const DataType, Extents, LayoutPolicy>(m_ptr, m_extents);
241 }
242
243 constexpr ARCCORE_HOST_DEVICE MDSpan<const DataType, Extents, LayoutPolicy> constMDSpan() const
244 {
245 return MDSpan<const DataType, Extents, LayoutPolicy>(m_ptr, m_extents);
246 }
247
248 constexpr ARCCORE_HOST_DEVICE Span<DataType> to1DSpan() const
249 {
250 return { m_ptr, m_extents.totalNbElement() };
251 }
252
253 constexpr SmallSpan<DataType> to1DSmallSpan() requires(Extents::rank() == 1)
254 {
255 return { _internalData(), extent0() };
256 }
257 constexpr SmallSpan<const DataType> to1DSmallSpan() const requires(Extents::rank() == 1)
258 {
259 return to1DConstSmallSpan();
260 }
261 constexpr SmallSpan<const DataType> to1DConstSmallSpan() const requires(Extents::rank() == 1)
262 {
263 return { _internalData(), extent0() };
264 }
265
266 private:
267
268 DataType* m_ptr = nullptr;
269 ArrayExtentsWithOffsetType m_extents;
270};
271
272/*---------------------------------------------------------------------------*/
273/*---------------------------------------------------------------------------*/
274
275} // End namespace Arcane
276
277/*---------------------------------------------------------------------------*/
278/*---------------------------------------------------------------------------*/
279
280#endif
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:149
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:204
constexpr ARCCORE_HOST_DEVICE Int64 offset(Int32 i) const
Valeur pour l'élément i.
Definition MDSpan.h:150
constexpr ARCCORE_HOST_DEVICE DataType * ptrAt(MDIndexType idx) const
Pointeur sur la valeur pour l'élément i.
Definition MDSpan.h:207
constexpr ARCCORE_HOST_DEVICE DataType * ptrAt(Int32 i, Int32 j) const
Pointeur sur la valeur pour l'élément i,j.
Definition MDSpan.h:199
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:194
constexpr ARCCORE_HOST_DEVICE Int32 extent3() const
Valeur de la quatrième dimension.
Definition MDSpan.h:130
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:189
constexpr ARCCORE_HOST_DEVICE Int64 offset(MDIndexType idx) const
Valeur pour l'élément idx.
Definition MDSpan.h:153
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:161
constexpr ARCCORE_HOST_DEVICE Int64 offset(Int32 i, Int32 j, Int32 k) const
Valeur pour l'élément i,j,k.
Definition MDSpan.h:140
constexpr ARCCORE_HOST_DEVICE DataType operator[](Int32 i) const
Valeur pour l'élément i.
Definition MDSpan.h:178
constexpr ARCCORE_HOST_DEVICE Int32 extent2() const
Valeur de la troisième dimension.
Definition MDSpan.h:128
constexpr ARCCORE_HOST_DEVICE DataType & operator()(Int32 i, Int32 j) const
Valeur pour l'élément i,j.
Definition MDSpan.h:171
ARCCORE_HOST_DEVICE DataType & operator()(Int32 i, Int32 j, Int32 k) const
Valeur pour l'élément i,j,k.
Definition MDSpan.h:166
constexpr ARCCORE_HOST_DEVICE Int32 extent0() const
Valeur de la première dimension.
Definition MDSpan.h:124
constexpr ARCCORE_HOST_DEVICE Int32 extent1() const
Valeur de la deuxième dimension.
Definition MDSpan.h:126
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:227
constexpr ARCCORE_HOST_DEVICE Int64 offset(Int32 i, Int32 j) const
Valeur pour l'élément i,j.
Definition MDSpan.h:145
constexpr ARCCORE_HOST_DEVICE DataType & operator()(MDIndexType idx) const
Valeur pour l'élément idx.
Definition MDSpan.h:181
constexpr ARCCORE_HOST_DEVICE DataType & operator()(Int32 i) const
Valeur pour l'élément i.
Definition MDSpan.h:176
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:135
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 -*-