Arcane  v3.15.3.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
VariableViews.h
Aller à la documentation de ce fichier.
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/* VariableViews.h (C) 2000-2024 */
9/* */
10/* Gestion des vues sur les variables pour les accélérateurs. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_ACCELERATOR_VARIABLEVIEWS_H
13#define ARCANE_ACCELERATOR_VARIABLEVIEWS_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/ArcaneCxx20.h"
18
21#include "arcane/core/ItemLocalId.h"
23#include "arcane/core/GroupIndexTable.h"
24
25#include "arcane/accelerator/core/ViewBuildInfo.h"
26#include "arcane/accelerator/AcceleratorGlobal.h"
28
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
31
32/*---------------------------------------------------------------------------*/
33/*---------------------------------------------------------------------------*/
34
35// TODO: Faire les vues en ReadWrite pour les accesseurs SIMD
36
37namespace Arcane::Accelerator
38{
39template <typename DataType> class View1DGetterSetter;
40
41/*---------------------------------------------------------------------------*/
42/*---------------------------------------------------------------------------*/
43/*!
44 * \brief Classe de base des vues sur les variables.
45 */
46class ARCANE_ACCELERATOR_EXPORT VariableViewBase
47{
48 public:
49
51};
52
53/*---------------------------------------------------------------------------*/
54/*---------------------------------------------------------------------------*/
55/*!
56 * \brief Classe pour accéder à un tableau 1D d'une vue en lecture/écriture.
57 */
58template <typename DataType>
60{
61 // Pour accéder à m_data;
62 friend class View1DGetterSetter<DataType>;
63
64 public:
65
66 using ValueType = DataType;
69 : m_data(data)
70 {}
71 ARCCORE_HOST_DEVICE DataViewSetter<DataType> operator[](Int32 index) const
72 {
73 return DataViewSetter<DataType>(m_data.ptrAt(index));
74 }
75 ARCCORE_HOST_DEVICE DataViewSetter<DataType> operator()(Int32 index) const
76 {
77 return DataViewSetter<DataType>(m_data.ptrAt(index));
78 }
79 DataTypeReturnReference& operator=(const View1DSetter<DataType>& rhs) = delete;
80
81 public:
82
84 {
85 m_data.copy(rhs);
86 }
87
88 private:
89
91};
92
93/*---------------------------------------------------------------------------*/
94/*---------------------------------------------------------------------------*/
95/*!
96 * \brief Classe pour accéder à un tableau 1D d'une vue en lecture/écriture.
97 */
98template <typename DataType>
100: public View1DSetter<DataType>
101{
102 using View1DSetter<DataType>::m_data;
103
104 public:
105
106 using ValueType = DataType;
108
109 public:
110
113 {}
114 DataTypeReturnReference& operator=(const View1DGetterSetter<DataType>& rhs) = delete;
115
116 public:
117
118 ARCCORE_HOST_DEVICE DataViewGetterSetter<DataType> operator[](Int32 index) const
119 {
120 return DataViewGetterSetter<DataType>(m_data.ptrAt(index));
121 }
122
123 public:
124
125 ARCCORE_HOST_DEVICE SmallSpan<DataType> value() const { return m_data; }
126 ARCCORE_HOST_DEVICE operator SmallSpan<DataType>() { return m_data; }
127 ARCCORE_HOST_DEVICE operator SmallSpan<const DataType>() const { return m_data; }
128 ARCCORE_HOST_DEVICE operator Span<DataType>() { return { m_data.data(), m_data.size() }; }
129 ARCCORE_HOST_DEVICE operator Span<const DataType>() const { return { m_data.data(), m_data.size() }; }
130};
131
132/*---------------------------------------------------------------------------*/
133/*---------------------------------------------------------------------------*/
134/*!
135 * \brief Vue en écriture sur une variable scalaire du maillage.
136 */
137template <typename _ItemType, typename _Accessor, typename _IndexerType, bool _HasSimd>
139: public VariableViewBase
140{
141 using Accessor = _Accessor;
142
143 public:
144
145 using ItemType = _ItemType;
147 using DataType = typename _Accessor::ValueType;
148 using DataTypeReturnReference = DataType&;
149
150 public:
151
153 : VariableViewBase(command, var)
154 , m_values(v.data())
155 , m_size(v.size())
156 {}
157
158 //! Opérateur d'accès vectoriel avec indirection.
160 {
161 return SimdSetter<DataType>(m_values, simd_item.simdLocalIds());
162 }
163
164 //! Opérateur d'accès vectoriel sans indirection.
169
170 //! Opérateur d'accès pour l'entité \a item
172 {
173 ARCANE_CHECK_AT(item.asInt32(), m_size);
174 return Accessor(this->m_values + item.asInt32());
175 }
176
177 //! Opérateur d'accès pour l'entité \a item
179 {
180 ARCANE_CHECK_AT(item.asInt32(), m_size);
181 return Accessor(this->m_values + item.asInt32());
182 }
183
184 //! Opérateur d'accès pour l'entité \a item
186 {
187 ARCANE_CHECK_AT(item.asInt32(), m_size);
188 return Accessor(this->m_values + item.asInt32());
189 }
190
191 //! Positionne la valeur pour l'entité \a item à \a v
192 ARCCORE_HOST_DEVICE void setValue(IndexerType item, const DataType& v) const
193 {
194 ARCANE_CHECK_AT(item.asInt32(), m_size);
195 this->m_values[item.asInt32()] = v;
196 }
197
198 private:
199
200 DataType* m_values;
201 Int32 m_size;
202};
203
204/*---------------------------------------------------------------------------*/
205/*---------------------------------------------------------------------------*/
206/*!
207 * \brief Vue en écriture sur une variable scalaire du maillage.
208 */
209template <typename _ItemType, typename _Accessor>
211: public VariableViewBase
212{
213 public:
214
215 using DataType = typename _Accessor::ValueType;
216 using Accessor = _Accessor;
217 using ItemType = _ItemType;
218 using IndexerType = typename ItemTraitsT<_ItemType>::LocalIdType;
219 using DataTypeReturnReference = DataType&;
220
221 public:
222
224 : VariableViewBase(command, var)
225 , m_values(v.data())
226 , m_size(v.size())
227 {}
228
229 //! Opérateur d'accès vectoriel avec indirection.
231 {
232 return SimdSetter<DataType>(m_values, simd_item.simdLocalIds());
233 }
234
235 //! Opérateur d'accès vectoriel sans indirection.
240
241 //! Opérateur d'accès pour l'entité \a item
243 {
244 ARCANE_CHECK_AT(item.asInt32(), m_size);
245 return Accessor(this->m_values + item.asInt32());
246 }
247
248 //! Opérateur d'accès pour l'entité \a item
250 {
251 ARCANE_CHECK_AT(item.asInt32(), m_size);
252 return Accessor(this->m_values + item.asInt32());
253 }
254
255 //! Opérateur d'accès pour l'entité \a item
256 ARCCORE_HOST_DEVICE Accessor value(IndexerType item) const
257 {
258 ARCANE_CHECK_AT(item.asInt32(), m_size);
259 return Accessor(this->m_values + item.asInt32());
260 }
261
262 //! Positionne la valeur pour l'entité \a item à \a v
263 ARCCORE_HOST_DEVICE void setValue(IndexerType item, const DataType& v) const
264 {
265 ARCANE_CHECK_AT(item.asInt32(), m_size);
266 this->m_values[item.asInt32()] = v;
267 }
268
269 private:
270
271 DataType* m_values;
272 Int32 m_size;
273};
274
275/*---------------------------------------------------------------------------*/
276/*---------------------------------------------------------------------------*/
277/*!
278 * \brief Vue en écriture sur une variable partielle scalaire du maillage.
279 */
280template <typename _ItemType, typename _Accessor>
282: public VariableViewBase
283{
284 public:
285
286 using DataType = typename _Accessor::ValueType;
287 using Accessor = _Accessor;
288 using ItemType = _ItemType;
290 using DataTypeReturnReference = DataType&;
291 using ItemLocalIdType = typename ItemTraitsT<_ItemType>::LocalIdType;
292
293 public:
294
297 : VariableViewBase(command, var)
298 , m_values(v.data())
299 , m_size(v.size())
300 , m_table_view(table_view)
301 {}
302
303 //! Opérateur d'accès pour l'entité \a item
305 {
306 ARCANE_CHECK_AT(item.asInt32(), m_size);
307 return Accessor(this->m_values + item.asInt32());
308 }
309
310 //! Opérateur d'accès pour l'entité \a item
312 {
313 ARCANE_CHECK_AT(item.asInt32(), m_size);
314 return Accessor(this->m_values + item.asInt32());
315 }
316
317 //! Opérateur d'accès pour l'entité \a item
319 {
320 ARCANE_CHECK_AT(item.asInt32(), m_size);
321 return Accessor(this->m_values + item.asInt32());
322 }
323
324 //! Positionne la valeur pour l'entité \a item à \a v
325 ARCCORE_HOST_DEVICE void setValue(IndexerType item, const DataType& v) const
326 {
327 ARCANE_CHECK_AT(item.asInt32(), m_size);
328 this->m_values[item.asInt32()] = v;
329 }
330
331 public:
332
333 //! Opérateur d'accès pour l'entité de numéro local \a lid
335 {
336 Int32 index = _toIndex(lid);
337 ARCANE_CHECK_AT(index, m_size);
338 return Accessor(m_values + index);
339 }
340
341 //! Opérateur d'accès pour l'entité de numéro local \a lid
343 {
344 Int32 index = _toIndex(lid);
345 ARCANE_CHECK_AT(index, m_size);
346 return Accessor(m_values + index);
347 }
348
349 //! Opérateur d'accès pour l'entité de numéro local \a lid
350 ARCCORE_HOST_DEVICE Accessor value(ItemLocalIdType lid) const
351 {
352 Int32 index = _toIndex(lid);
353 ARCANE_CHECK_AT(index, m_size);
354 return Accessor(m_values + index);
355 }
356
357 //! Positionne la valeur pour l'entité de numéro local \a lid à \a v
358 ARCCORE_HOST_DEVICE void setValue(ItemLocalIdType lid, const DataType& v) const
359 {
360 Int32 index = _toIndex(lid);
361 ARCANE_CHECK_AT(index, m_size);
362 this->m_values[index] = v;
363 }
364
365 private:
366
367 ARCCORE_HOST_DEVICE Int32 _toIndex(ItemLocalIdType lid) const
368 {
369 return m_table_view[lid];
370 }
371
372 private:
373
374 DataType* m_values;
375 Int32 m_size;
376 GroupIndexTableView m_table_view;
377};
378
379/*---------------------------------------------------------------------------*/
380/*---------------------------------------------------------------------------*/
381
382/*---------------------------------------------------------------------------*/
383/*---------------------------------------------------------------------------*/
384/*!
385 * \brief Vue en lecture sur une variable scalaire du maillage.
386 */
387template <typename _ItemType, typename _DataType>
389: public VariableViewBase
390{
391 public:
392
393 using ItemType = _ItemType;
394 using DataType = _DataType;
395 using IndexerType = typename ItemTraitsT<_ItemType>::LocalIdType;
396
397 public:
398
400 : VariableViewBase(command, var)
401 , m_values(v)
402 {
403 }
404
405 public:
406
407 //! Opérateur d'accès vectoriel avec indirection.
410 {
411 typedef typename SimdTypeTraits<DataType>::SimdType SimdType;
412 return SimdType(m_values.data(), simd_item.simdLocalIds());
413 }
414
415 //! Opérateur d'accès vectoriel avec indirection.
418 {
419 typedef typename SimdTypeTraits<DataType>::SimdType SimdType;
420 return SimdType(m_values.data() + simd_item.baseLocalId());
421 }
422
423 //! Opérateur d'accès pour l'entité \a item
424 ARCCORE_HOST_DEVICE const DataType& operator[](IndexerType item) const
425 {
426 return this->m_values[item.asInt32()];
427 }
428
429 //! Opérateur d'accès pour l'entité \a item
430 ARCCORE_HOST_DEVICE const DataType& operator()(IndexerType item) const
431 {
432 return this->m_values[item.asInt32()];
433 }
434
435 //! Opérateur d'accès pour l'entité \a item
436 ARCCORE_HOST_DEVICE const DataType& value(IndexerType item) const
437 {
438 return this->m_values[item.asInt32()];
439 }
440
441 private:
442
444};
445
446/*---------------------------------------------------------------------------*/
447/*---------------------------------------------------------------------------*/
448/*!
449 * \brief Vue en lecture sur une variable partielle scalaire du maillage.
450 */
451template <typename _ItemType, typename _DataType>
453: public VariableViewBase
454{
455 public:
456
457 using ItemType = _ItemType;
458 using DataType = _DataType;
460 using ItemLocalIdType = typename ItemTraitsT<_ItemType>::LocalIdType;
461
462 public:
463
466 : VariableViewBase(command, var)
467 , m_values(v)
468 , m_table_view(table_view)
469 {}
470
471 public:
472
473 //! Opérateur d'accès pour l'entité \a item
475 {
476 return m_values[item.asInt32()];
477 }
478
479 //! Opérateur d'accès pour l'entité \a item
481 {
482 return m_values[item.asInt32()];
483 }
484
485 //! Opérateur d'accès pour l'entité \a item
487 {
488 return m_values[item.asInt32()];
489 }
490
491 //! Opérateur d'accès pour l'entité \a item
492 ARCCORE_HOST_DEVICE const DataType& operator[](ItemLocalIdType lid) const
493 {
494 return m_values[_toIndex(lid)];
495 }
496
497 //! Opérateur d'accès pour l'entité \a item
498 ARCCORE_HOST_DEVICE const DataType& operator()(ItemLocalIdType lid) const
499 {
500 return m_values[_toIndex(lid)];
501 }
502
503 //! Opérateur d'accès pour l'entité \a item
504 ARCCORE_HOST_DEVICE const DataType& value(ItemLocalIdType lid) const
505 {
506 return m_values[_toIndex(lid)];
507 }
508
509 private:
510
511 ARCCORE_HOST_DEVICE Int32 _toIndex(ItemLocalIdType lid) const
512 {
513 return m_table_view[lid];
514 }
515
516 private:
517
519 GroupIndexTableView m_table_view;
520};
521
522/*---------------------------------------------------------------------------*/
523/*---------------------------------------------------------------------------*/
524
525/*---------------------------------------------------------------------------*/
526/*---------------------------------------------------------------------------*/
527/*!
528 * \brief Vue en lecture sur une variable partielle tableau du maillage.
529 */
530template <typename _ItemType, typename _DataType>
532: public VariableViewBase
533{
534 public:
535
536 using ItemType = _ItemType;
537 using DataType = _DataType;
539 using ItemLocalIdType = typename ItemTraitsT<_ItemType>::LocalIdType;
540
541 public:
542
545 : VariableViewBase(command, var)
546 , m_values(v)
547 , m_table_view(table_view)
548 {}
549
550 //! Opérateur d'accès pour l'entité \a item
552 {
553 return this->m_values[i.asInt32()];
554 }
555
556 //! Opérateur d'accès pour l'entité \a item
558 {
559 return m_values[_toIndex(lid)];
560 }
561
562 //! Opérateur d'accès pour la \a i-ème valeur de l'entité \a item
564 {
565 return m_values[item.asInt32()][i];
566 }
567
568 //! Opérateur d'accès pour la \a i-ème valeur de l'entité \a item
569 ARCCORE_HOST_DEVICE const DataType& operator()(ItemLocalIdType lid, Int32 i) const
570 {
571 return m_values[_toIndex(lid)][i];
572 }
573
574 //! Opérateur d'accès pour l'entité \a item
576 {
577 return m_values[i.asInt32()];
578 }
579
580 //! Opérateur d'accès pour l'entité \a item
582 {
583 return m_values[_toIndex(lid)];
584 }
585
586 protected:
587
588 ARCCORE_HOST_DEVICE Int32 _toIndex(ItemLocalIdType lid) const
589 {
590 return m_table_view[lid];
591 }
592
593 private:
594
596 GroupIndexTableView m_table_view;
597};
598
599/*---------------------------------------------------------------------------*/
600/*---------------------------------------------------------------------------*/
601/*!
602 * \brief Vue en lecture sur une variable tableau du maillage.
603 */
604template <typename _ItemType, typename _DataType>
606: public VariableViewBase
607{
608 private:
609
610 using IndexerType = typename ItemTraitsT<_ItemType>::LocalIdType;
611
612 public:
613
614 using DataType = _DataType;
615
616 public:
617
619 : VariableViewBase(command, var)
620 , m_values(v)
621 {}
622
623 public:
624
625 //! Opérateur d'accès pour l'entité \a item
627 {
628 return this->m_values[i.asInt32()];
629 }
630
631 //! Opérateur d'accès pour la \a i-ème valeur de l'entité \a item
632 ARCCORE_HOST_DEVICE const DataType& operator()(IndexerType item, Int32 i) const
633 {
634 return this->m_values[item.asInt32()][i];
635 }
636
637 //! Opérateur d'accès pour l'entité \a item
639 {
640 return this->m_values[i.asInt32()];
641 }
642
643 private:
644
646};
647
648/*---------------------------------------------------------------------------*/
649/*---------------------------------------------------------------------------*/
650
651/*---------------------------------------------------------------------------*/
652/*---------------------------------------------------------------------------*/
653/*!
654 * \brief Vue en écriture sur une variable tableau du maillage.
655 */
656template <typename _ItemType, typename _Accessor, typename _Indexer>
658: public VariableViewBase
659{
660 private:
661
662 using ItemType = _ItemType;
663 using Accessor = _Accessor;
664 using IndexerType = _Indexer;
665 using DataType = typename Accessor::ValueType;
666 using DataTypeReturnType = typename Accessor::DataTypeReturnReference;
667
668 public:
669
671 : VariableViewBase(command, var)
672 , m_values(v)
673 {}
674
675 //! Opérateur d'accès pour l'entité \a item
676 ARCCORE_HOST_DEVICE DataTypeReturnType operator[](IndexerType item) const
677 {
678 return DataTypeReturnType(this->m_values[item.asInt32()]);
679 }
680
681 //! Opérateur d'accès pour la \a i-ème valeur de l'entité \a item
682 ARCCORE_HOST_DEVICE DataType& operator()(IndexerType item, Int32 i) const
683 {
684 return this->m_values[item.asInt32()][i];
685 }
686
687 //! Opérateur d'accès pour l'entité \a item
689 {
690 return DataTypeReturnType(this->m_values[item.asInt32()]);
691 }
692
693 private:
694
695 SmallSpan2<DataType> m_values;
696};
697
698/*---------------------------------------------------------------------------*/
699/*---------------------------------------------------------------------------*/
700/*!
701 * \brief Vue en écriture sur une variable tableau du maillage.
702 */
703template <typename _ItemType, typename _Accessor>
705: public VariableViewBase
706{
707 public:
708
709 using ItemType = _ItemType;
710 using Accessor = _Accessor;
711 using IndexerType = typename ItemTraitsT<_ItemType>::LocalIdType;
712 using DataType = typename Accessor::ValueType;
713 using DataTypeReturnType = typename Accessor::DataTypeReturnReference;
714
715 public:
716
718 : VariableViewBase(command, var)
719 , m_values(v)
720 {}
721
722 //! Opérateur d'accès pour l'entité \a item
723 ARCCORE_HOST_DEVICE DataTypeReturnType operator[](IndexerType item) const
724 {
725 return DataTypeReturnType(this->m_values[item.asInt32()]);
726 }
727
728 //! Opérateur d'accès pour la \a i-ème valeur de l'entité \a item
729 ARCCORE_HOST_DEVICE DataType& operator()(IndexerType item, Int32 i) const
730 {
731 return this->m_values[item.asInt32()][i];
732 }
733
734 //! Opérateur d'accès pour l'entité \a item
736 {
737 return DataTypeReturnType(this->m_values[item.asInt32()]);
738 }
739
740 private:
741
742 SmallSpan2<DataType> m_values;
743};
744
745/*---------------------------------------------------------------------------*/
746/*---------------------------------------------------------------------------*/
747/*!
748 * \brief Vue en écriture sur une variable partielle tableau du maillage.
749 */
750template <typename _ItemType, typename _Accessor>
752: public VariableViewBase
753{
754 public:
755
756 using ItemType = _ItemType;
757 using Accessor = _Accessor;
759 using DataType = typename Accessor::ValueType;
760 using DataTypeReturnType = typename Accessor::DataTypeReturnReference;
761 using ItemLocalIdType = typename ItemTraitsT<_ItemType>::LocalIdType;
762
763 public:
764
767 : VariableViewBase(command, var)
768 , m_values(v)
769 , m_table_view(table_view)
770 {}
771
772 public:
773
774 //! Opérateur d'accès pour l'entité \a item
775 ARCCORE_HOST_DEVICE DataTypeReturnType operator[](IndexerType item) const
776 {
777 return DataTypeReturnType(m_values[item.asInt32()]);
778 }
779
780 //! Opérateur d'accès pour la \a i-ème valeur de l'entité \a item
781 ARCCORE_HOST_DEVICE DataType& operator()(IndexerType item, Int32 i) const
782 {
783 return m_values[item.asInt32()][i];
784 }
785
786 //! Opérateur d'accès pour l'entité \a item
788 {
789 return DataTypeReturnType(m_values[item.asInt32()]);
790 }
791
792 public:
793
794 //! Opérateur d'accès pour l'entité de numéro local \a lid
795 ARCCORE_HOST_DEVICE DataTypeReturnType operator[](ItemLocalIdType lid) const
796 {
797 return DataTypeReturnType(m_values[_toIndex(lid)]);
798 }
799
800 //! Opérateur d'accès pour l'entité de numéro local \a lid
801 ARCCORE_HOST_DEVICE DataType& operator()(ItemLocalIdType lid, Int32 i) const
802 {
803 return m_values[_toIndex(lid)][i];
804 }
805
806 //! Opérateur d'accès pour la \a i-ème valeur de l'entité \a item
808 {
809 return DataTypeReturnType(m_values[_toIndex(lid)]);
810 }
811
812 private:
813
814 ARCCORE_HOST_DEVICE Int32 _toIndex(ItemLocalIdType lid) const
815 {
816 return m_table_view[lid];
817 }
818
819 private:
820
821 SmallSpan2<DataType> m_values;
822 GroupIndexTableView m_table_view;
823};
824
825/*---------------------------------------------------------------------------*/
826/*---------------------------------------------------------------------------*/
827/*!
828 * \brief Vue en écriture sur une variable scalaire de type 'RealN' du maillage.
829 *
830 * Cette classe spécialise les vues modifiable pour les réels 'Real2', 'Real3',
831 * 'Real2x2' et 'Real3x3'. La spécialisation s'assure qu'on ne puisse pas
832 * modifier uniquement une composante de ces vecteurs de réels. Par exemple:
833 *
834 * \code
835 * VariableNodeReal3View force_view = ...;
836 * Node node = ...;
837 *
838 * // OK:
839 * force_view[node] = Real3(x,y,z);
840 *
841 * // Interdit:
842 * // force_view[node].x = ...;
843 *
844 * \endcode
845 */
846template <typename _ItemType, typename _Accessor>
848: public VariableViewBase
849{
850 public:
851
852 using ItemType = _ItemType;
853 using Accessor = _Accessor;
854 using IndexerType = typename ItemTraitsT<_ItemType>::LocalIdType;
855 using DataType = typename _Accessor::ValueType;
856 using DataTypeReturnReference = DataType&;
857
858 public:
859
860 //! Construit la vue
862 : VariableViewBase(command, var)
863 , m_values(v.data())
864 , m_size(v.size())
865 {}
866
867 //! Opérateur d'accès vectoriel avec indirection.
869 {
870 return SimdSetter<DataType>(m_values, simd_item.simdLocalIds());
871 }
872
873 //! Opérateur d'accès vectoriel avec indirection.
875 {
876 return SimdSetter<DataType>(m_values, simd_item.simdLocalIds());
877 }
878
879 //! Opérateur d'accès vectoriel sans indirection.
884
885 //! Opérateur d'accès vectoriel sans indirection.
890
891 //! Opérateur d'accès pour l'entité \a item
893 {
894 ARCANE_CHECK_AT(item.asInt32(), m_size);
895 return Accessor(m_values + item.asInt32());
896 }
897
898 //! Opérateur d'accès pour l'entité \a item
900 {
901 ARCANE_CHECK_AT(item.asInt32(), m_size);
902 return Accessor(m_values + item.asInt32());
903 }
904
905 //! Opérateur d'accès pour l'entité \a item
906 ARCCORE_HOST_DEVICE Accessor value(IndexerType item) const
907 {
908 ARCANE_CHECK_AT(item.asInt32(), m_size);
909 return Accessor(m_values + item.asInt32());
910 }
911
912 //! Positionne la valeur pour l'entité \a item à \a v
913 ARCCORE_HOST_DEVICE void setValue(IndexerType item, const DataType& v) const
914 {
915 ARCANE_CHECK_AT(item.asInt32(), m_size);
916 this->m_values[item.asInt32()] = v;
917 }
918
919 private:
920
921 DataType* m_values;
922 Int32 m_size;
923};
924
925/*---------------------------------------------------------------------------*/
926/*---------------------------------------------------------------------------*/
927
928template <typename _ItemType, typename _Accessor>
930: public VariableViewBase
931{
932 public:
933
934 using ItemType = _ItemType;
935 using Accessor = _Accessor;
937 using DataType = typename _Accessor::ValueType;
938 using DataTypeReturnReference = DataType&;
939 using ItemLocalIdType = typename ItemTraitsT<_ItemType>::LocalIdType;
940
941 public:
942
943 //! Construit la vue
946 : VariableViewBase(command, var)
947 , m_values(v.data())
948 , m_size(v.size())
949 , m_table_view(table_view)
950 {}
951
952 public:
953
954 //! Opérateur d'accès pour l'entité \a item
956 {
957 ARCANE_CHECK_AT(item.asInt32(), m_size);
958 return Accessor(this->m_values + item.asInt32());
959 }
960
961 //! Opérateur d'accès pour l'entité \a item
963 {
964 ARCANE_CHECK_AT(item.asInt32(), m_size);
965 return Accessor(this->m_values + item.asInt32());
966 }
967
968 //! Opérateur d'accès pour l'entité \a item
970 {
971 ARCANE_CHECK_AT(item.asInt32(), m_size);
972 return Accessor(this->m_values + item.asInt32());
973 }
974
975 //! Positionne la valeur pour l'entité \a item à \a v
976 ARCCORE_HOST_DEVICE void setValue(IndexerType item, const DataType& v) const
977 {
978 ARCANE_CHECK_AT(item.asInt32(), m_size);
979 this->m_values[item.asInt32()] = v;
980 }
981
982 public:
983
984 //! Opérateur d'accès pour l'entité \a item
986 {
987 Int32 index = _toIndex(lid);
988 ARCANE_CHECK_AT(index, m_size);
989 return Accessor(m_values + index);
990 }
991
992 //! Opérateur d'accès pour l'entité \a item
994 {
995 Int32 index = _toIndex(lid);
996 ARCANE_CHECK_AT(index, m_size);
997 return Accessor(m_values + index);
998 }
999
1000 //! Opérateur d'accès pour l'entité \a item
1001 ARCCORE_HOST_DEVICE Accessor value(ItemLocalIdType lid) const
1002 {
1003 Int32 index = _toIndex(lid);
1004 ARCANE_CHECK_AT(index, m_size);
1005 return Accessor(m_values + index);
1006 }
1007
1008 //! Positionne la valeur pour l'entité \a item à \a v
1009 ARCCORE_HOST_DEVICE void setValue(ItemLocalIdType lid, const DataType& v) const
1010 {
1011 Int32 index = _toIndex(lid);
1012 ARCANE_CHECK_AT(index, m_size);
1013 m_values[index] = v;
1014 }
1015
1016 private:
1017
1018 ARCCORE_HOST_DEVICE Int32 _toIndex(ItemLocalIdType lid) const
1019 {
1020 return m_table_view[lid];
1021 }
1022
1023 private:
1024
1025 DataType* m_values = nullptr;
1026 Int32 m_size = 0;
1027 GroupIndexTableView m_table_view;
1028};
1029
1030/*---------------------------------------------------------------------------*/
1031/*---------------------------------------------------------------------------*/
1032
1033/*---------------------------------------------------------------------------*/
1034/*---------------------------------------------------------------------------*/
1035/*!
1036 * \brief Vue en écriture.
1037 */
1038template <typename ItemType, typename DataType> auto
1040{
1041 using Accessor = DataViewSetter<DataType>;
1042 return ItemVariableScalarOutViewT<ItemType, Accessor>(command, var.variable(), var.asArray());
1043}
1044
1045/*!
1046 * \brief Vue en écriture.
1047 */
1048template <typename ItemType, typename DataType> auto
1050{
1051 using Accessor = DataViewSetter<DataType>;
1053 return ViewType(command, var.variable(), var.asArray(), var.tableView());
1054}
1055
1056/*!
1057 * \brief Vue en écriture.
1058 */
1059template <typename ItemType> auto
1061{
1062 using Accessor = DataViewSetter<Real3>;
1063 return ItemVariableRealNScalarOutViewT<ItemType, Accessor>(command, var.variable(), var.asArray());
1064}
1065
1066/*!
1067 * \brief Vue en écriture.
1068 */
1069template <typename ItemType> auto
1071{
1072 using Accessor = DataViewSetter<Real3>;
1074 return ViewType(command, var.variable(), var.asArray(), var.tableView());
1075}
1076
1077/*!
1078 * \brief Vue en écriture.
1079 */
1080template <typename ItemType> auto
1082{
1083 using Accessor = DataViewSetter<Real2>;
1084 return ItemVariableRealNScalarOutViewT<ItemType, Accessor>(command, var.variable(), var.asArray());
1085}
1086
1087/*!
1088 * \brief Vue en écriture.
1089 */
1090template <typename ItemType> auto
1092{
1093 using Accessor = DataViewSetter<Real2>;
1095 return ViewType(command, var.variable(), var.asArray(), var.tableView());
1096}
1097
1098/*!
1099 * \brief Vue en écriture.
1100 */
1101template <typename ItemType, typename DataType> auto
1103{
1104 using Accessor = View1DSetter<DataType>;
1105 return ItemVariableArrayOutViewT<ItemType, Accessor>(command, var.variable(), var.asArray());
1106}
1107
1108/*!
1109 * \brief Vue en écriture.
1110 */
1111template <typename ItemType, typename DataType> auto
1113{
1114 using Accessor = View1DSetter<DataType>;
1116 return ViewType(command, var.variable(), var.asArray(), var.tableView());
1117}
1118
1119/*---------------------------------------------------------------------------*/
1120/*---------------------------------------------------------------------------*/
1121/*!
1122 * \brief Vue en lecture/écriture.
1123 */
1124template <typename ItemType, typename DataType> auto
1126{
1127 using Accessor = DataViewGetterSetter<DataType>;
1128 return ItemVariableScalarOutViewT<ItemType, Accessor>(command, var.variable(), var.asArray());
1129}
1130
1131/*!
1132 * \brief Vue en lecture/écriture.
1133 */
1134template <typename ItemType, typename DataType> auto
1140
1141/*!
1142 * \brief Vue en lecture/écriture.
1143 */
1144template <typename ItemType> auto
1146{
1147 using Accessor = DataViewGetterSetter<Real3>;
1148 return ItemVariableRealNScalarOutViewT<ItemType, Accessor>(command, var.variable(), var.asArray());
1149}
1150
1151/*!
1152 * \brief Vue en lecture/écriture.
1153 */
1154template <typename ItemType> auto
1156{
1157 using Accessor = DataViewGetterSetter<Real3>;
1159 return ViewType(command, var.variable(), var.asArray(), var.tableView());
1160}
1161
1162/*!
1163 * \brief Vue en lecture/écriture.
1164 */
1165template <typename ItemType> auto
1167{
1168 using Accessor = DataViewGetterSetter<Real2>;
1169 return ItemVariableRealNScalarOutViewT<ItemType, Accessor>(command, var.variable(), var.asArray());
1170}
1171
1172/*!
1173 * \brief Vue en lecture/écriture.
1174 */
1175template <typename ItemType> auto
1177{
1178 using Accessor = DataViewGetterSetter<Real2>;
1180 return ViewType(command, var.variable(), var.asArray(), var.tableView());
1181}
1182
1183/*!
1184 * \brief Vue en lecture/écriture.
1185 */
1186template <typename ItemType, typename DataType> auto
1188{
1189 using Accessor = View1DGetterSetter<DataType>;
1190 return ItemVariableArrayOutViewT<ItemType, Accessor>(command, var.variable(), var.asArray());
1191}
1192
1193/*!
1194 * \brief Vue en lecture/écriture.
1195 */
1196template <typename ItemType, typename DataType> auto
1198{
1199 using Accessor = View1DGetterSetter<DataType>;
1201 return ViewType(command, var.variable(), var.asArray(), var.tableView());
1202}
1203
1204/*---------------------------------------------------------------------------*/
1205/*---------------------------------------------------------------------------*/
1206/*!
1207 * \brief Vue en lecture.
1208 */
1209template <typename ItemType, typename DataType> auto
1211{
1212 return ItemPartialVariableScalarInViewT<ItemType, DataType>(command, var.variable(), var.asArray(), var.tableView());
1213}
1214
1215/*!
1216 * \brief Vue en lecture.
1217 */
1218template <typename ItemType, typename DataType> auto
1220{
1221 return ItemVariableScalarInViewT<ItemType, DataType>(command, var.variable(), var.asArray());
1222}
1223
1224/*!
1225 * \brief Vue en lecture.
1226 */
1227template <typename ItemType, typename DataType> auto
1229{
1230 return ItemPartialVariableArrayInViewT<ItemType, DataType>(command, var.variable(), var.asArray(), var.tableView());
1231}
1232
1233/*!
1234 * \brief Vue en lecture.
1235 */
1236template <typename ItemType, typename DataType> auto
1238{
1239 return ItemVariableArrayInViewT<ItemType, DataType>(command, var.variable(), var.asArray());
1240}
1241
1242/*---------------------------------------------------------------------------*/
1243/*---------------------------------------------------------------------------*/
1244
1251
1258
1265
1272
1279
1286
1293
1294/*---------------------------------------------------------------------------*/
1295/*---------------------------------------------------------------------------*/
1296
1303
1310
1317
1324
1331
1338
1345
1346/*---------------------------------------------------------------------------*/
1347/*---------------------------------------------------------------------------*/
1348
1349} // End namespace Arcane::Accelerator
1350
1351/*---------------------------------------------------------------------------*/
1352/*---------------------------------------------------------------------------*/
1353
1354#endif
Déclarations de types sur les entités.
Vue en lecture sur une variable partielle tableau du maillage.
__host__ __device__ const DataType & operator()(IndexerType item, Int32 i) const
Opérateur d'accès pour la i-ème valeur de l'entité item.
__host__ __device__ const SmallSpan< const DataType > operator[](IndexerType i) const
Opérateur d'accès pour l'entité item.
__host__ __device__ const SmallSpan< const DataType > operator[](ItemLocalIdType lid) const
Opérateur d'accès pour l'entité item.
__host__ __device__ const SmallSpan< const DataType > value(ItemLocalIdType lid) const
Opérateur d'accès pour l'entité item.
__host__ __device__ const DataType & operator()(ItemLocalIdType lid, Int32 i) const
Opérateur d'accès pour la i-ème valeur de l'entité item.
__host__ __device__ const SmallSpan< const DataType > value(IndexerType i) const
Opérateur d'accès pour l'entité item.
Vue en écriture sur une variable partielle tableau du maillage.
__host__ __device__ DataTypeReturnType operator[](ItemLocalIdType lid) const
Opérateur d'accès pour l'entité de numéro local lid.
__host__ __device__ DataTypeReturnType operator[](IndexerType item) const
Opérateur d'accès pour l'entité item.
__host__ __device__ SmallSpan< DataType > value(IndexerType item) const
Opérateur d'accès pour l'entité item.
__host__ __device__ SmallSpan< DataType > value(ItemLocalIdType lid) const
Opérateur d'accès pour la i-ème valeur de l'entité item.
__host__ __device__ DataType & operator()(ItemLocalIdType lid, Int32 i) const
Opérateur d'accès pour l'entité de numéro local lid.
__host__ __device__ DataType & operator()(IndexerType item, Int32 i) const
Opérateur d'accès pour la i-ème valeur de l'entité item.
__host__ __device__ void setValue(IndexerType item, const DataType &v) const
Positionne la valeur pour l'entité item à v.
__host__ __device__ Accessor operator[](IndexerType item) const
Opérateur d'accès pour l'entité item.
__host__ __device__ void setValue(ItemLocalIdType lid, const DataType &v) const
Positionne la valeur pour l'entité item à v.
__host__ __device__ Accessor value(ItemLocalIdType lid) const
Opérateur d'accès pour l'entité item.
__host__ __device__ Accessor operator()(ItemLocalIdType lid) const
Opérateur d'accès pour l'entité item.
__host__ __device__ Accessor operator[](ItemLocalIdType lid) const
Opérateur d'accès pour l'entité item.
ItemPartialVariableRealNScalarOutViewT(const ViewBuildInfo &command, IVariable *var, SmallSpan< DataType > v, GroupIndexTableView table_view)
Construit la vue.
__host__ __device__ Accessor operator()(IndexerType item) const
Opérateur d'accès pour l'entité item.
__host__ __device__ Accessor value(IndexerType item) const
Opérateur d'accès pour l'entité item.
Vue en lecture sur une variable partielle scalaire du maillage.
__host__ __device__ const DataType & operator()(ItemLocalIdType lid) const
Opérateur d'accès pour l'entité item.
__host__ __device__ const DataType & operator[](IndexerType item) const
Opérateur d'accès pour l'entité item.
__host__ __device__ const DataType & value(IndexerType item) const
Opérateur d'accès pour l'entité item.
__host__ __device__ const DataType & value(ItemLocalIdType lid) const
Opérateur d'accès pour l'entité item.
__host__ __device__ const DataType & operator[](ItemLocalIdType lid) const
Opérateur d'accès pour l'entité item.
__host__ __device__ const DataType & operator()(IndexerType item) const
Opérateur d'accès pour l'entité item.
Vue en écriture sur une variable partielle scalaire du maillage.
__host__ __device__ Accessor operator[](IndexerType item) const
Opérateur d'accès pour l'entité item.
__host__ __device__ void setValue(ItemLocalIdType lid, const DataType &v) const
Positionne la valeur pour l'entité de numéro local lid à v.
__host__ __device__ Accessor operator()(IndexerType item) const
Opérateur d'accès pour l'entité item.
__host__ __device__ Accessor value(ItemLocalIdType lid) const
Opérateur d'accès pour l'entité de numéro local lid.
__host__ __device__ Accessor value(IndexerType item) const
Opérateur d'accès pour l'entité item.
__host__ __device__ void setValue(IndexerType item, const DataType &v) const
Positionne la valeur pour l'entité item à v.
__host__ __device__ Accessor operator()(ItemLocalIdType lid) const
Opérateur d'accès pour l'entité de numéro local lid.
__host__ __device__ Accessor operator[](ItemLocalIdType lid) const
Opérateur d'accès pour l'entité de numéro local lid.
Vue en lecture sur une variable tableau du maillage.
__host__ __device__ const SmallSpan< const DataType > operator[](IndexerType i) const
Opérateur d'accès pour l'entité item.
__host__ __device__ const SmallSpan< const DataType > value(IndexerType i) const
Opérateur d'accès pour l'entité item.
__host__ __device__ const DataType & operator()(IndexerType item, Int32 i) const
Opérateur d'accès pour la i-ème valeur de l'entité item.
Vue en écriture sur une variable tableau du maillage.
__host__ __device__ DataTypeReturnType operator[](IndexerType item) const
Opérateur d'accès pour l'entité item.
__host__ __device__ SmallSpan< DataType > value(IndexerType item) const
Opérateur d'accès pour l'entité item.
__host__ __device__ DataType & operator()(IndexerType item, Int32 i) const
Opérateur d'accès pour la i-ème valeur de l'entité item.
Vue en écriture sur une variable tableau du maillage.
__host__ __device__ DataTypeReturnType operator[](IndexerType item) const
Opérateur d'accès pour l'entité item.
__host__ __device__ SmallSpan< DataType > value(IndexerType item) const
Opérateur d'accès pour l'entité item.
__host__ __device__ DataType & operator()(IndexerType item, Int32 i) const
Opérateur d'accès pour la i-ème valeur de l'entité item.
Vue en écriture sur une variable scalaire de type 'RealN' du maillage.
ItemVariableRealNScalarOutViewT(const ViewBuildInfo &command, IVariable *var, SmallSpan< DataType > v)
Construit la vue.
SimdDirectSetter< DataType > operator()(SimdItemDirectIndexT< ItemType > simd_item) const
Opérateur d'accès vectoriel sans indirection.
SimdDirectSetter< DataType > operator[](SimdItemDirectIndexT< ItemType > simd_item) const
Opérateur d'accès vectoriel sans indirection.
__host__ __device__ Accessor operator()(IndexerType item) const
Opérateur d'accès pour l'entité item.
__host__ __device__ Accessor value(IndexerType item) const
Opérateur d'accès pour l'entité item.
SimdSetter< DataType > operator()(SimdItemIndexT< ItemType > simd_item) const
Opérateur d'accès vectoriel avec indirection.
__host__ __device__ Accessor operator[](IndexerType item) const
Opérateur d'accès pour l'entité item.
__host__ __device__ void setValue(IndexerType item, const DataType &v) const
Positionne la valeur pour l'entité item à v.
SimdSetter< DataType > operator[](SimdItemIndexT< ItemType > simd_item) const
Opérateur d'accès vectoriel avec indirection.
Vue en lecture sur une variable scalaire du maillage.
SimdTypeTraits< DataType >::SimdType operator[](SimdItemIndexT< ItemType > simd_item) const
Opérateur d'accès vectoriel avec indirection.
__host__ __device__ const DataType & operator[](IndexerType item) const
Opérateur d'accès pour l'entité item.
__host__ __device__ const DataType & operator()(IndexerType item) const
Opérateur d'accès pour l'entité item.
SimdTypeTraits< DataType >::SimdType operator[](SimdItemDirectIndexT< ItemType > simd_item) const
Opérateur d'accès vectoriel avec indirection.
__host__ __device__ const DataType & value(IndexerType item) const
Opérateur d'accès pour l'entité item.
Vue en écriture sur une variable scalaire du maillage.
__host__ __device__ void setValue(IndexerType item, const DataType &v) const
Positionne la valeur pour l'entité item à v.
__host__ __device__ Accessor value(IndexerType item) const
Opérateur d'accès pour l'entité item.
__host__ __device__ Accessor operator()(IndexerType item) const
Opérateur d'accès pour l'entité item.
SimdSetter< DataType > operator[](SimdItemIndexT< ItemType > simd_item) const
Opérateur d'accès vectoriel avec indirection.
SimdDirectSetter< DataType > operator[](SimdItemDirectIndexT< ItemType > simd_item) const
Opérateur d'accès vectoriel sans indirection.
__host__ __device__ Accessor operator[](IndexerType item) const
Opérateur d'accès pour l'entité item.
Vue en écriture sur une variable scalaire du maillage.
__host__ __device__ Accessor value(IndexerType item) const
Opérateur d'accès pour l'entité item.
SimdSetter< DataType > operator[](SimdItemIndexT< ItemType > simd_item) const
Opérateur d'accès vectoriel avec indirection.
__host__ __device__ void setValue(IndexerType item, const DataType &v) const
Positionne la valeur pour l'entité item à v.
__host__ __device__ Accessor operator()(IndexerType item) const
Opérateur d'accès pour l'entité item.
__host__ __device__ Accessor operator[](IndexerType item) const
Opérateur d'accès pour l'entité item.
SimdDirectSetter< DataType > operator[](SimdItemDirectIndexT< ItemType > simd_item) const
Opérateur d'accès vectoriel sans indirection.
Classe de base des vues sur les variables.
Classe pour accéder à un tableau 1D d'une vue en lecture/écriture.
Classe pour accéder à un tableau 1D d'une vue en lecture/écriture.
Informations pour construire une vue pour les données sur accélérateur.
Référence à une instance.
constexpr __host__ __device__ pointer data() const noexcept
Pointeur sur le début de la vue.
Definition Span.h:419
constexpr __host__ __device__ pointer ptrAt(SizeType index) const
Addresse du index-ème élément.
Definition Span.h:240
__host__ __device__ void copy(const U &copy_array)
Recopie le tableau copy_array dans l'instance.
Definition Span.h:357
Espace de nom pour l'utilisation des accélérateurs.
auto viewInOut(const ViewBuildInfo &vbi, CellMaterialVariableScalarRef< DataType > &var)
Vue en lecture/écriture pour les variables materiaux scalaire.
auto viewOut(const ViewBuildInfo &vbi, CellMaterialVariableScalarRef< DataType > &var)
Vue en écriture pour les variables materiaux scalaire.
auto viewIn(const ViewBuildInfo &vbi, const CellMaterialVariableScalarRef< DataType > &var)
Vue en lecture pour les variables materiaux scalaire.