Arcane  4.2.1.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 public:
42
43 using NumVectorType = NumVector<DataType, Size>;
44
45 private:
46
47 using BasicType = typename DataTypeTraitsT<DataType>::BasicType;
48 using AddedFirstLastExtentsType = typename Extents::template AddedFirstLastExtentsType<DynExtent, Size>;
49 using AddedFirstExtentsType = typename Extents::template AddedFirstExtentsType<DynExtent>;
50 using BaseClass = MeshMDVariableRefBaseT<ItemType, DataType, AddedFirstLastExtentsType>;
51 static_assert(Extents::rank() >= 0 && Extents::rank() <= 2, "Only Extents of rank 0, 1 or 2 are implemented");
52 static_assert(std::is_same_v<DataType, BasicType>, "DataType should be a basic type (Real, Int32, Int64, ... )");
53
54 public:
55
56 using ItemLocalIdType = typename ItemType::LocalIdType;
57 using ReferenceType = DataViewGetterSetter<NumVectorType>;
58 using ConstReferenceType = DataViewGetter<NumVectorType>;
60 static constexpr int nb_dynamic = Extents::nb_dynamic;
61
62 public:
63
64 explicit MeshVectorMDVariableRefT(const VariableBuildInfo& b)
65 : BaseClass(b)
66 {}
67
68 public:
69
70 //! \name Opérations pour la variable de dimension MDDim0
71 ///@{
72 //! Accède aux données pour la lecture/écriture
73 ReferenceType operator()(ItemLocalIdType id)
74 requires(Extents::rank() == 0)
75 {
76 return ReferenceType(m_vector_mdspan.ptrAt(id.localId()));
77 }
78
79 //! Accède aux données en lecture
80 ConstReferenceType operator()(ItemLocalIdType id) const
81 requires(Extents::rank() == 0)
82 {
83 return ConstReferenceType(m_vector_mdspan.ptrAt(id.localId()));
84 }
85 ///@}
86
87 //! \name Opérations pour la variable de dimension MDDim1
88 ///@{
89 //! Accède aux données pour la lecture/écriture
90 ReferenceType operator()(ItemLocalIdType id, Int32 i1)
91 requires(Extents::rank() == 1)
92 {
93 return ReferenceType(m_vector_mdspan.ptrAt(id.localId(), i1));
94 }
95
96 //! Accède aux données en lecture
97 ConstReferenceType operator()(ItemLocalIdType id, Int32 i1) const
98 requires(Extents::rank() == 1)
99 {
100 return ConstReferenceType(m_vector_mdspan.ptrAt(id.localId(), i1));
101 }
102 ///@}
103
104 //! \name Opérations pour la variable de dimension MDDim2
105 ///@{
106 //! Accède aux données pour la lecture/écriture
107 ReferenceType operator()(ItemLocalIdType id, Int32 i1, Int32 i2)
108 requires(Extents::rank() == 2)
109 {
110 return ReferenceType(m_vector_mdspan.ptrAt(id.localId(), i1, i2));
111 }
112
113 //! Accède aux données en lecture
114 ConstReferenceType operator()(ItemLocalIdType id, Int32 i1, Int32 i2) const
115 requires(Extents::rank() == 2)
116 {
117 return ConstReferenceType(m_vector_mdspan.ptrAt(id.localId(), i1, i2));
118 }
119 ///@}
120
121 /*!
122 * \brief Change la forme des données.
123 *
124 * Le nombre d'éléments dans \a dims doit correspondre au nombre de valeurs dynamiques
125 * dans \a Extents.
126 */
127 void reshape(std::array<Int32, Extents::nb_dynamic> dims)
128 {
129 std::array<Int32, nb_dynamic + 1> full_dims;
130 // Nous ajoutons 'Size' à la fin des dimensions.
131 for (int i = 0; i < nb_dynamic; ++i)
132 full_dims[i] = dims[i];
133 full_dims[nb_dynamic] = Size;
134 ArrayShape shape(full_dims);
135 this->m_underlying_var.resizeAndReshape(shape);
136 }
137
138 protected:
139
140 void updateFromInternal() override
141 {
143 // Positionne la valeur de m_vector_mdspan.
144 // Elle aura les mêmes dimensions que m_mdspan, sauf que nous
145 // retirons la dernière dimension et changeons le type
146 // de 'DataType' à 'NumVector<DataType,Size>'.
147 DataType* v = this->m_mdspan.to1DSpan().data();
148 NumVectorType* nv = reinterpret_cast<NumVectorType*>(v);
149 m_vector_mdspan = MDSpanType(nv, this->m_mdspan.extents().dynamicExtents());
150 }
151
152 private:
153
154 MDSpanType m_vector_mdspan;
155};
156
157/*---------------------------------------------------------------------------*/
158/*---------------------------------------------------------------------------*/
159
160} // namespace Arcane
161
162/*---------------------------------------------------------------------------*/
163/*---------------------------------------------------------------------------*/
164
165#endif
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.
void reshape(std::array< Int32, Extents::nb_dynamic > dims)
Change la forme des données.
ReferenceType operator()(ItemLocalIdType id, Int32 i1)
ConstReferenceType operator()(ItemLocalIdType id, Int32 i1, Int32 i2) const
Accède aux données en lecture.
ConstReferenceType operator()(ItemLocalIdType id) const
Accède aux données en lecture.
void updateFromInternal() override
Mise à jour à partir de la partie interne.
ConstReferenceType operator()(ItemLocalIdType id, Int32 i1) const
Accède aux données en lecture.
ReferenceType operator()(ItemLocalIdType id, Int32 i1, Int32 i2)
ReferenceType operator()(ItemLocalIdType id)
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.