Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
utils/NumArray.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/* NumArray.h (C) 2000-2024 */
9/* */
10/* Tableaux multi-dimensionnel pour les types numériques. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_UTILS_NUMARRAY_H
13#define ARCANE_UTILS_NUMARRAY_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/MDSpan.h"
18#include "arcane/utils/MDDim.h"
19#include "arcane/utils/NumArrayContainer.h"
20#include "arcane/utils/ArcaneCxx20.h"
21#include "arcane/utils/String.h"
22
23/*---------------------------------------------------------------------------*/
24/*---------------------------------------------------------------------------*/
25
26namespace Arcane
27{
28
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
49template <typename DataType, typename Extents, typename LayoutPolicy>
52{
53 public:
54
55 using ExtentsType = Extents;
57 using DynamicDimsType = typename ExtentsType::DynamicDimsType;
61 using ArrayBoundsIndexType = typename MDSpanType::ArrayBoundsIndexType;
62 using value_type = DataType;
64
65 using ConstSpanType ARCANE_DEPRECATED_REASON("Use 'ConstMDSpanType' instead") = ConstMDSpanType;
66 using SpanType ARCANE_DEPRECATED_REASON("Use 'MDSpanType' instead") = MDSpanType;
67
68 public:
69
71 static constexpr int rank() { return Extents::rank(); }
72
73 public:
74
77 {
79 }
80
82 explicit NumArray(DynamicDimsType extents)
83 {
85 }
86
88 NumArray(const DynamicDimsType& extents, eMemoryRessource r)
89 : m_data(r)
90 {
92 }
95 : m_data(r)
96 {
98 }
99
101 NumArray(Int32 dim1_size, Int32 dim2_size,
102 Int32 dim3_size, Int32 dim4_size) requires(Extents::nb_dynamic == 4)
103 : ThatClass(DynamicDimsType(dim1_size, dim2_size, dim3_size, dim4_size))
104 {
105 }
106
108 NumArray(Int32 dim1_size, Int32 dim2_size,
109 Int32 dim3_size, Int32 dim4_size, eMemoryRessource r) requires(Extents::nb_dynamic == 4)
110 : ThatClass(DynamicDimsType(dim1_size, dim2_size, dim3_size, dim4_size), r)
111 {
112 }
113
115 NumArray(Int32 dim1_size, Int32 dim2_size, Int32 dim3_size) requires(Extents::nb_dynamic == 3)
116 : ThatClass(DynamicDimsType(dim1_size, dim2_size, dim3_size))
117 {
118 }
120 NumArray(Int32 dim1_size, Int32 dim2_size, Int32 dim3_size, eMemoryRessource r) requires(Extents::nb_dynamic == 3)
121 : ThatClass(DynamicDimsType(dim1_size, dim2_size, dim3_size), r)
122 {
123 }
124
126 NumArray(Int32 dim1_size, Int32 dim2_size) requires(Extents::nb_dynamic == 2)
127 : ThatClass(DynamicDimsType(dim1_size, dim2_size))
128 {
129 }
131 NumArray(Int32 dim1_size, Int32 dim2_size, eMemoryRessource r) requires(Extents::nb_dynamic == 2)
132 : ThatClass(DynamicDimsType(dim1_size, dim2_size), r)
133 {
134 }
135
137 explicit NumArray(Int32 dim1_size) requires(Extents::nb_dynamic == 1)
138 : ThatClass(DynamicDimsType(dim1_size))
139 {
140 }
142 NumArray(Int32 dim1_size, eMemoryRessource r) requires(Extents::nb_dynamic == 1)
143 : ThatClass(DynamicDimsType(dim1_size), r)
144 {
145 }
146
153 NumArray(Int32 dim1_size, Int32 dim2_size, std::initializer_list<DataType> alist)
154 requires(Extents::is_full_dynamic() && Extents::rank() == 2)
155 : NumArray(dim1_size, dim2_size)
156 {
157 this->m_data.copyInitializerList(alist);
158 }
159
161 NumArray(Int32 dim1_size, std::initializer_list<DataType> alist)
162 requires(Extents::is_full_dynamic() && Extents::rank() == 1)
163 : NumArray(dim1_size)
164 {
165 this->m_data.copyInitializerList(alist);
166 }
167
170 requires(Extents::is_full_dynamic() && Extents::rank() == 1)
171 : NumArray(v.size())
172 {
173 this->m_data.copy(v);
174 }
175
178 requires(Extents::is_full_dynamic() && Extents::rank() == 1)
179 : NumArray(arcaneCheckArraySize(v.size()))
180 {
181 this->m_data.copy(v);
182 }
183
184 NumArray(const ThatClass& rhs)
185 : m_span(rhs.m_span)
186 , m_data(rhs.m_data)
187 , m_total_nb_element(rhs.m_total_nb_element)
188 {
189 _updateSpanPointerFromData();
190 }
191
192 NumArray(ThatClass&& rhs)
193 : m_span(rhs.m_span)
194 , m_data(std::move(rhs.m_data))
195 , m_total_nb_element(rhs.m_total_nb_element)
196 {
197 }
198
199 ThatClass& operator=(ThatClass&&) = default;
200
209 {
210 if (&rhs == this)
211 return (*this);
212 eMemoryRessource r = memoryRessource();
213 eMemoryRessource rhs_r = rhs.memoryRessource();
214 if (rhs_r != r)
215 m_data = ArrayWrapper(rhs_r);
216 this->copy(rhs);
217 return (*this);
218 }
219
228 {
229 m_data.swap(rhs.m_data);
230 std::swap(m_span, rhs.m_span);
231 std::swap(m_total_nb_element, rhs.m_total_nb_element);
232 }
233
234 public:
235
237 constexpr Int64 totalNbElement() const { return m_total_nb_element; }
239 static constexpr Int32 nbDimension() { return Extents::rank(); }
241 ArrayExtents<Extents> extents() const { return m_span.extents(); }
242 ArrayExtentsWithOffset<Extents, LayoutPolicy> extentsWithOffset() const
243 {
244 return m_span.extentsWithOffset();
245 }
246 Int64 capacity() const { return m_data.capacity(); }
247 eMemoryRessource memoryRessource() const { return m_data.memoryRessource(); }
249 Span<std::byte> bytes() { return asWritableBytes(to1DSpan()); }
251 Span<const std::byte> bytes() const { return asBytes(to1DSpan()); }
252
254 IMemoryAllocator* memoryAllocator() const { return m_data.allocator(); }
255
261 void setDebugName(const String& str) { m_data.setDebugName(str); }
262
264 String debugName() { return m_data.debugName(); }
265
266 public:
267
269 constexpr Int32 dim1Size() const requires(Extents::rank() >= 1) { return m_span.extent0(); }
271 constexpr Int32 dim2Size() const requires(Extents::rank() >= 2) { return m_span.extent1(); }
273 constexpr Int32 dim3Size() const requires(Extents::rank() >= 3) { return m_span.extent2(); }
275 constexpr Int32 dim4Size() const requires(Extents::rank() >= 4) { return m_span.extent3(); }
276
278 constexpr Int32 extent0() const requires(Extents::rank() >= 1) { return m_span.extent0(); }
280 constexpr Int32 extent1() const requires(Extents::rank() >= 2) { return m_span.extent1(); }
282 constexpr Int32 extent2() const requires(Extents::rank() >= 3) { return m_span.extent2(); }
284 constexpr Int32 extent3() const requires(Extents::rank() >= 4) { return m_span.extent3(); }
285
286 public:
287
294 void resize(Int32 dim1_size, Int32 dim2_size, Int32 dim3_size, Int32 dim4_size) requires(Extents::nb_dynamic == 4)
295 {
296 this->resize(DynamicDimsType(dim1_size, dim2_size, dim3_size, dim4_size));
297 }
298
299 void resize(Int32 dim1_size, Int32 dim2_size, Int32 dim3_size) requires(Extents::nb_dynamic == 3)
300 {
301 this->resize(DynamicDimsType(dim1_size, dim2_size, dim3_size));
302 }
303
304 void resize(Int32 dim1_size, Int32 dim2_size) requires(Extents::nb_dynamic == 2)
305 {
306 this->resize(DynamicDimsType(dim1_size, dim2_size));
307 }
308
309 void resize(Int32 dim1_size) requires(Extents::nb_dynamic == 1)
310 {
311 this->resize(DynamicDimsType(dim1_size));
312 }
313
314 void resize(const DynamicDimsType& dims)
315 {
316 m_span.m_extents = dims;
317 _resize();
318 }
320
321 public:
322
329 void fill(const DataType& v)
330 {
331 _checkHost(memoryRessource());
332 m_data.fill(v);
333 }
340 void fill(const DataType& v, SmallSpan<const Int32> indexes, RunQueue* queue)
341 {
342 m_data.fill(v, indexes, queue);
343 }
344
348 void fill(const DataType& v, RunQueue* queue)
349 {
350 m_data.fill(v, queue);
351 }
352
353 public:
354
361 void copy(ConstMDSpanType rhs) { copy(rhs, nullptr); }
362
369 void copy(const ThatClass& rhs) { copy(rhs, nullptr); }
370
380 {
381 _resizeAndCopy(rhs, eMemoryRessource::Unknown, queue);
382 }
383
392 void copy(const ThatClass& rhs, RunQueue* queue)
393 {
394 _resizeAndCopy(rhs.constMDSpan(), rhs.memoryRessource(), queue);
395 }
396
397 public:
398
400 DataType& operator[](Int32 i) requires(Extents::rank() == 1) { return m_span(i); }
402 DataType operator[](Int32 i) const requires(Extents::rank() == 1) { return m_span(i); }
403
404 public:
405
407 DataType operator()(Int32 i, Int32 j, Int32 k, Int32 l) const requires(Extents::rank() == 4)
408 {
409 return m_span(i, j, k, l);
410 }
412 DataType& operator()(Int32 i, Int32 j, Int32 k, Int32 l) requires(Extents::rank() == 4)
413 {
414 return m_span(i, j, k, l);
415 }
416
418 DataType operator()(Int32 i, Int32 j, Int32 k) const requires(Extents::rank() == 3)
419 {
420 return m_span(i, j, k);
421 }
423 DataType& operator()(Int32 i, Int32 j, Int32 k) requires(Extents::rank() == 3)
424 {
425 return m_span(i, j, k);
426 }
427
429 DataType operator()(Int32 i, Int32 j) const requires(Extents::rank() == 2)
430 {
431 return m_span(i, j);
432 }
434 DataType& operator()(Int32 i, Int32 j) requires(Extents::rank() == 2)
435 {
436 return m_span(i, j);
437 }
439 DataType operator()(Int32 i) const requires(Extents::rank() == 1) { return m_span(i); }
441 DataType& operator()(Int32 i) requires(Extents::rank() == 1) { return m_span(i); }
442
443 public:
444
446 const DataType& operator()(ArrayBoundsIndexType idx) const
447 {
448 return m_span(idx);
449 }
451 DataType& operator()(ArrayBoundsIndexType idx)
452 {
453 return m_span(idx);
454 }
455
456 public:
457
458 // TODO: rendre obsolète
460 ARCANE_DEPRECATED_REASON("Y2023: Use operator() instead")
461 DataType& s(Int32 i, Int32 j, Int32 k, Int32 l) requires(Extents::rank() == 4)
462 {
463 return m_span(i, j, k, l);
464 }
466 ARCANE_DEPRECATED_REASON("Y2023: Use operator() instead")
467 DataType& s(Int32 i, Int32 j, Int32 k) requires(Extents::rank() == 3)
468 {
469 return m_span(i, j, k);
470 }
472 ARCANE_DEPRECATED_REASON("Y2023: Use operator() instead")
473 DataType& s(Int32 i, Int32 j) requires(Extents::rank() == 2)
474 {
475 return m_span(i, j);
476 }
478 ARCANE_DEPRECATED_REASON("Y2023: Use operator() instead")
479 DataType& s(Int32 i) requires(Extents::rank() == 1) { return m_span(i); }
480
482 ARCANE_DEPRECATED_REASON("Y2023: Use operator() instead")
483 DataType& s(ArrayBoundsIndexType idx)
484 {
485 return m_span(idx);
486 }
487
488 public:
489
491 ARCANE_DEPRECATED_REASON("Y2024: Use mdspan() instead")
492 MDSpanType span() { return m_span; }
493
495 ARCANE_DEPRECATED_REASON("Y2024: Use mdspan() instead")
496 ConstMDSpanType span() const { return m_span.constMDSpan(); }
497
499 ARCANE_DEPRECATED_REASON("Y2024: Use constMDSpan() instead")
500 ConstMDSpanType constSpan() const { return m_span.constMDSpan(); }
501
503 MDSpanType mdspan() { return m_span; }
504
506 ConstMDSpanType mdspan() const { return m_span.constMDSpan(); }
507
509 ConstMDSpanType constMDSpan() const { return m_span.constMDSpan(); }
510
512 Span<const DataType> to1DSpan() const { return m_span.to1DSpan(); }
513
515 Span<DataType> to1DSpan() { return m_span.to1DSpan(); }
516
518 constexpr operator MDSpanType() { return this->mdspan(); }
520 constexpr operator ConstMDSpanType() const { return this->constMDSpan(); }
521
523 constexpr operator SmallSpan<DataType>() requires(Extents::rank() == 1) { return this->to1DSpan().smallView(); }
525 constexpr operator SmallSpan<const DataType>() const requires(Extents::rank() == 1) { return this->to1DSpan().constSmallView(); }
526
528 constexpr SmallSpan<DataType> to1DSmallSpan() requires(Extents::rank() == 1) { return m_span.to1DSmallSpan(); }
530 constexpr SmallSpan<const DataType> to1DSmallSpan() const requires(Extents::rank() == 1) { return m_span.to1DSmallSpan(); }
532 constexpr SmallSpan<const DataType> to1DConstSmallSpan() const requires(Extents::rank() == 1) { return m_span.to1DConstSmallSpan(); }
533
534 public:
535
537 DataType* _internalData() { return m_span._internalData(); }
538
539 private:
540
541 MDSpanType m_span;
542 ArrayWrapper m_data;
543 Int64 m_total_nb_element = 0;
544
545 private:
546
547 void _updateSpanPointerFromData()
548 {
549 m_span.m_ptr = m_data.to1DSpan().data();
550 }
551
552 void _resizeAndCopy(ConstMDSpanType rhs, eMemoryRessource input_ressource, RunQueue* queue)
553 {
554 this->resize(rhs.extents().dynamicExtents());
555 m_data.copyOnly(rhs.to1DSpan(), input_ressource, queue);
556 _updateSpanPointerFromData();
557 }
558
560 void _resize()
561 {
562 m_total_nb_element = m_span.extents().totalNbElement();
563 m_data.resize(m_total_nb_element);
564 _updateSpanPointerFromData();
565 }
566
575 {
576 if constexpr (ExtentsType::nb_dynamic == 0) {
577 resize(DynamicDimsType());
578 }
579 }
580};
581
582/*---------------------------------------------------------------------------*/
583/*---------------------------------------------------------------------------*/
584
585} // End namespace Arcane
586
587/*---------------------------------------------------------------------------*/
588/*---------------------------------------------------------------------------*/
589
590#endif
File d'exécution pour un accélérateur.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
constexpr ARCCORE_HOST_DEVICE Int32 extent3() const
Valeur de la quatrième dimension.
Definition MDSpan.h:108
constexpr ARCCORE_HOST_DEVICE Int32 extent2() const
Valeur de la troisième dimension.
Definition MDSpan.h:106
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
Tableaux multi-dimensionnels pour les types numériques accessibles sur accélérateurs.
DataType operator()(Int32 i) const
Valeur pour l'élément i.
void copy(const ThatClass &rhs, RunQueue *queue)
Copie dans l'instance les valeurs de rhs via la file queue.
void fill(const DataType &v, SmallSpan< const Int32 > indexes, RunQueue *queue)
Remplit via la file queue, les valeurs du tableau d'indices données par indexes par la valeur v .
constexpr Int32 extent0() const
Valeur de la première dimension.
Span< const DataType > to1DSpan() const
Vue 1D constante sur l'instance.
Span< std::byte > bytes()
Vue sous forme d'octets.
DataType & s(Int32 i, Int32 j, Int32 k, Int32 l)
Positionne la valeur pour l'élément i,j,k,l.
DataType & operator()(Int32 i, Int32 j)
Positionne la valeur pour l'élément i,j.
constexpr SmallSpan< const DataType > to1DConstSmallSpan() const
Vue constante 1D sur l'instance (uniquement si rank == 1)
constexpr Int32 dim4Size() const
Valeur de la quatrième dimension.
DataType & operator()(Int32 i)
Positionne la valeur pour l'élément i.
NumArray(Int32 dim1_size, Int32 dim2_size, Int32 dim3_size)
Construit un tableau avec 3 valeurs dynamiques.
void swap(ThatClass &rhs)
Échange les données avec rhs.
void copy(const ThatClass &rhs)
Copie dans l'instance les valeurs de rhs.
MDSpanType span()
Vue multi-dimension sur l'instance.
Span< DataType > to1DSpan()
Vue 1D sur l'instance.
static constexpr int rank()
Nombre de dimensions du tableau.
DataType * _internalData()
DataType operator()(Int32 i, Int32 j) const
Valeur pour l'élément i,j.
NumArray(Int32 dim1_size, Int32 dim2_size)
Construit un tableau avec 2 valeurs dynamiques.
constexpr Int32 dim3Size() const
Valeur de la troisième dimension.
NumArray(eMemoryRessource r)
Créé un tableau vide utilisant la ressource mémoire r.
MDSpanType mdspan()
Vue multi-dimension sur l'instance.
constexpr SmallSpan< DataType > to1DSmallSpan()
Vue 1D sur l'instance (uniquement si rank == 1)
ThatClass & operator=(const ThatClass &rhs)
Opérateur de recopie.
NumArray(Span< const DataType > v)
Construit une instance à partir d'une vue (uniquement tableaux 1D dynamiques)
DataType operator()(Int32 i, Int32 j, Int32 k) const
Valeur pour l'élément i,j,k.
DataType & operator()(Int32 i, Int32 j, Int32 k)
Positionne la valeur pour l'élément i,j,k.
DataType & operator[](Int32 i)
Récupère une référence pour l'élément i.
void copy(ConstMDSpanType rhs)
Copie dans l'instance les valeurs de rhs.
void _resize()
Redimensionne le tableau à partir des valeurs de m_span.extents()
String debugName()
Nom de debug (nul si aucun nom spécifié)
Span< const std::byte > bytes() const
Vue constante forme d'octets.
IMemoryAllocator * memoryAllocator() const
Allocateur mémoire associé
DataType & operator()(ArrayBoundsIndexType idx)
Référence modifiable l'élément idx.
ConstMDSpanType mdspan() const
Vue constante multi-dimension sur l'instance.
NumArray(Int32 dim1_size, eMemoryRessource r)
Construit un tableau avec 1 valeur dynamique.
constexpr SmallSpan< const DataType > to1DSmallSpan() const
Vue constante 1D sur l'instance (uniquement si rank == 1)
const DataType & operator()(ArrayBoundsIndexType idx) const
Référence constante pour l'élément idx.
NumArray(Int32 dim1_size, Int32 dim2_size, Int32 dim3_size, Int32 dim4_size)
Construit un tableau avec 4 valeurs dynamiques.
NumArray(Int32 dim1_size, Int32 dim2_size, eMemoryRessource r)
Construit un tableau avec 2 valeurs dynamiques.
void fill(const DataType &v)
Remplit les valeurs du tableau par v.
constexpr Int32 extent1() const
Valeur de la deuxième dimension.
static constexpr Int32 nbDimension()
Nombre de dimensions.
void _resizeInit()
Allocation éventuelle lors de l'initialisation.
constexpr Int32 dim1Size() const
Valeur de la première dimension.
NumArray(SmallSpan< const DataType > v)
Construit une instance à partir d'une vue (uniquement tableaux 1D dynamiques)
NumArray(const DynamicDimsType &extents, eMemoryRessource r)
Construit un tableau en spécifiant directement la liste des dimensions.
NumArray()
Construit un tableau vide.
DataType operator()(Int32 i, Int32 j, Int32 k, Int32 l) const
Valeur pour l'élément i,j,k,l.
void fill(const DataType &v, RunQueue *queue)
Remplit les éléments de l'instance la valeur v.
constexpr Int32 extent3() const
Valeur de la quatrième dimension.
NumArray(Int32 dim1_size, Int32 dim2_size, Int32 dim3_size, Int32 dim4_size, eMemoryRessource r)
Construit un tableau avec 4 valeurs dynamiques.
constexpr Int32 dim2Size() const
Valeur de la deuxième dimension.
ConstMDSpanType constSpan() const
Vue constante multi-dimension sur l'instance.
NumArray(Int32 dim1_size)
Construit un tableau avec 1 valeur dynamique.
void setDebugName(const String &str)
Positionne le nom du tableau pour les informations de debug.
ConstMDSpanType constMDSpan() const
Vue constante multi-dimension sur l'instance.
void resize(Int32 dim1_size, Int32 dim2_size, Int32 dim3_size, Int32 dim4_size)
Modifie la taille du tableau.
constexpr Int32 extent2() const
Valeur de la troisième dimension.
NumArray(Int32 dim1_size, Int32 dim2_size, std::initializer_list< DataType > alist)
Construit un tableau à partir de valeurs prédéfinies (tableaux 2D dynamiques).
NumArray(Int32 dim1_size, Int32 dim2_size, Int32 dim3_size, eMemoryRessource r)
Construit un tableau avec 3 valeurs dynamiques.
void copy(ConstMDSpanType rhs, RunQueue *queue)
Copie dans l'instance les valeurs de rhs via la file queue.
NumArray(DynamicDimsType extents)
Construit un tableau en spécifiant directement la liste des dimensions.
DataType & operator()(Int32 i, Int32 j, Int32 k, Int32 l)
Positionne la valeur pour l'élément i,j,k,l.
ArrayExtents< Extents > extents() const
Valeurs des dimensions.
DataType operator[](Int32 i) const
Valeur pour l'élément i.
NumArray(Int32 dim1_size, std::initializer_list< DataType > alist)
Construit un tableau à partir de valeurs prédéfinies (uniquement tableaux 1D dynamiques)
constexpr Int64 totalNbElement() const
Nombre total d'éléments du tableau.
Implémentation commune à pour NumArray.
Container pour la classe NumArray.
void fill(const DataType &v, SmallSpan< const Int32 > indexes, RunQueue *queue)
Remplit les indices données par indexes avec la valeur v.
void setDebugName(const String &name)
Positionne le nom du tableau pour les informations de debug.
String debugName() const
Nom de debug (nul si aucun nom spécifié)
Integer capacity() const
Capacité (nombre d'éléments alloués) du vecteur.
constexpr view_type smallView()
Vue constante sur cette vue.
Definition Span.h:270
constexpr ConstArrayView< value_type > constSmallView() const
Vue constante sur cette vue.
Definition Span.h:279
Chaîne de caractères unicode.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
eMemoryRessource
Liste des ressources mémoire disponibles.
@ Unknown
Valeur inconnue ou non initialisée.
Integer arcaneCheckArraySize(unsigned long long size)
Vérifie que size peut être converti dans un 'Integer' pour servir de taille à un tableau....