Arcane  4.2.3.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
MeshVectorMDVariableRef.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 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/* MeshVectorMDVariableRef.h (C) 2000-2026 */
9/* */
10/* Variable 'NumVector' multidimensionnelle sur une entité de maillage. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_CORE_MESHVECTORMDVARIABLEREF_H
13#define ARCANE_CORE_MESHVECTORMDVARIABLEREF_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/NumVector.h"
18
19#include "arcane/core/DataView.h"
20#include "arcane/core/MeshMDVariableRef.h"
21
22/*---------------------------------------------------------------------------*/
23/*---------------------------------------------------------------------------*/
24
25namespace Arcane
26{
27
28/*---------------------------------------------------------------------------*/
29/*---------------------------------------------------------------------------*/
30/*!
31 * \brief Classe gérant une variable de type NumVector multidimensionnelle sur une entité de maillage.
32 *
33 * \warning Vous devez appeler la méthode reshape() avant d'utiliser ce type de variables.
34 *
35 * Pour plus d'informations, voir \ref arcanedoc_core_types_axl_md_variable_use.
36 */
37template <typename ItemType, typename DataType_, int Size, typename Extents>
38class MeshVectorMDVariableRefT
39: public MeshMDVariableRefBaseT<ItemType, DataType_, typename Extents::template AddedFirstLastExtentsType<DynExtent, Size>>
40{
41 // Pour accéder à m_matrix_mdspan
42 friend class Arcane::Accelerator::MeshVectorMDVariableInOutView<ItemType, DataType_, Size, Extents>;
43 friend class Arcane::Accelerator::MeshVectorMDVariableInView<ItemType, DataType_, Size, Extents>;
44
45 public:
46
47 using DataType = DataType_;
48 using NumVectorType = NumVector<DataType, Size>;
49
50 private:
51
52 using BasicType = typename DataTypeTraitsT<DataType>::BasicType;
53 using AddedFirstLastExtentsType = typename Extents::template AddedFirstLastExtentsType<DynExtent, Size>;
54 using AddedFirstExtentsType = typename Extents::template AddedFirstExtentsType<DynExtent>;
55 using BaseClass = MeshMDVariableRefBaseT<ItemType, DataType, AddedFirstLastExtentsType>;
56 static_assert(Extents::rank() >= 0 && Extents::rank() <= 2, "Only Extents of rank 0, 1 or 2 are implemented");
57 static_assert(std::is_same_v<DataType, BasicType>, "DataType should be a basic type (Real, Int32, Int64, ... )");
58
59 public:
60
61 using ItemLocalIdType = typename ItemType::LocalIdType;
62 using ReferenceType = DataViewGetterSetter<NumVectorType>;
63 using ConstReferenceType = DataViewGetter<NumVectorType>;
65 static constexpr int nb_dynamic = Extents::nb_dynamic;
66
67 public:
68
69 explicit MeshVectorMDVariableRefT(const VariableBuildInfo& b)
70 : BaseClass(b)
71 {}
72
73 public:
74
75 //! \name Opérations pour la variable de dimension MDDim0
76 ///@{
77 //! Accède aux données pour la lecture/écriture
78 ReferenceType operator()(ItemLocalIdType id)
79 requires(Extents::rank() == 0)
80 {
81 return ReferenceType(m_vector_mdspan.ptrAt(id.localId()));
82 }
83
84 //! Accède aux données en lecture
85 ConstReferenceType operator()(ItemLocalIdType id) const
86 requires(Extents::rank() == 0)
87 {
88 return ConstReferenceType(m_vector_mdspan.ptrAt(id.localId()));
89 }
90 ///@}
91
92 //! \name Opérations pour la variable de dimension MDDim1
93 ///@{
94 //! Accède aux données pour la lecture/écriture
95 ReferenceType operator()(ItemLocalIdType id, Int32 i1)
96 requires(Extents::rank() == 1)
97 {
98 return ReferenceType(m_vector_mdspan.ptrAt(id.localId(), i1));
99 }
100
101 //! Accède aux données en lecture
102 ConstReferenceType operator()(ItemLocalIdType id, Int32 i1) const
103 requires(Extents::rank() == 1)
104 {
105 return ConstReferenceType(m_vector_mdspan.ptrAt(id.localId(), i1));
106 }
107 ///@}
108
109 //! \name Opérations pour la variable de dimension MDDim2
110 ///@{
111 //! Accède aux données pour la lecture/écriture
112 ReferenceType operator()(ItemLocalIdType id, Int32 i1, Int32 i2)
113 requires(Extents::rank() == 2)
114 {
115 return ReferenceType(m_vector_mdspan.ptrAt(id.localId(), i1, i2));
116 }
117
118 //! Accède aux données en lecture
119 ConstReferenceType operator()(ItemLocalIdType id, Int32 i1, Int32 i2) const
120 requires(Extents::rank() == 2)
121 {
122 return ConstReferenceType(m_vector_mdspan.ptrAt(id.localId(), i1, i2));
123 }
124 ///@}
125
126 /*!
127 * \brief Change la forme des données.
128 *
129 * Le nombre d'éléments dans \a dims doit correspondre au nombre de valeurs dynamiques
130 * dans \a Extents.
131 */
132 void reshape(std::array<Int32, Extents::nb_dynamic> dims)
133 {
134 std::array<Int32, nb_dynamic + 1> full_dims;
135 // Nous ajoutons 'Size' à la fin des dimensions.
136 for (int i = 0; i < nb_dynamic; ++i)
137 full_dims[i] = dims[i];
138 full_dims[nb_dynamic] = Size;
139 ArrayShape shape(full_dims);
140 this->m_underlying_var.resizeAndReshape(shape);
141 }
142
143 protected:
144
145 void updateFromInternal() override
146 {
148 // Positionne la valeur de m_vector_mdspan.
149 // Elle aura les mêmes dimensions que m_mdspan, sauf que nous
150 // retirons la dernière dimension et changeons le type
151 // de 'DataType' à 'NumVector<DataType,Size>'.
152 DataType* v = this->m_mdspan.to1DSpan().data();
153 NumVectorType* nv = reinterpret_cast<NumVectorType*>(v);
154 m_vector_mdspan = MDSpanType(nv, this->m_mdspan.extents().dynamicExtents());
155 }
156
157 private:
158
159 MDSpanType m_vector_mdspan;
160};
161
162/*---------------------------------------------------------------------------*/
163/*---------------------------------------------------------------------------*/
164
165} // namespace Arcane
166
167/*---------------------------------------------------------------------------*/
168/*---------------------------------------------------------------------------*/
169
170#endif
Vue en lecture/écriture de variable vectorielle multidimensionnelle sur un élément de maillage.
Vue en lecture seule de variable vectorielle multidimensionnelle sur un élément de maillage.
Forme d'un tableau.
Definition ArrayShape.h:40
Classe pour accéder à un élément d'une vue en lecture/écriture.
Classe pour accéder à un élément d'une vue en lecture.
Classe de base des vues multi-dimensionnelles.
ReferenceType operator()(ItemLocalIdType id, Int32 i1)
ConstReferenceType operator()(ItemLocalIdType id) const
Accède aux données en lecture.
ReferenceType operator()(ItemLocalIdType id, Int32 i1, Int32 i2)
void updateFromInternal() override
Mise à jour à partir de la partie interne.
void reshape(std::array< Int32, Extents::nb_dynamic > dims)
Change la forme des données.
ConstReferenceType operator()(ItemLocalIdType id, Int32 i1, Int32 i2) const
Accède aux données en lecture.
ReferenceType operator()(ItemLocalIdType id)
ConstReferenceType operator()(ItemLocalIdType id, Int32 i1) const
Accède aux données en lecture.
Petit vecteur de taille fixe de points de données numériques de taille Size.
Paramètres nécessaires à la construction d'une variable.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
std::int32_t Int32
Type entier signé sur 32 bits.