12#ifndef ARCANE_CORE_MESHMDVARIABLEREF_H
13#define ARCANE_CORE_MESHMDVARIABLEREF_H
17#include "arcane/utils/ArrayLayout.h"
18#include "arcane/utils/ArrayShape.h"
19#include "arcane/utils/MDSpan.h"
21#include "arcane/core/DataView.h"
23#include "arcane/core/MeshVariableArrayRef.h"
24#include "arcane/core/datatype/DataTypeTraits.h"
45template <
typename ItemType,
typename DataType>
46class MeshMDVariableRefWrapperT
49 template <
typename _ItemType,
typename _DataType,
typename _Extents>
55 using VariableType =
typename BaseClass::PrivatePartType;
56 using ValueDataType =
typename VariableType::ValueDataType;
67 ValueDataType* trueData() {
return this->m_private_part->trueData(); }
68 const ValueDataType* trueData()
const {
return this->m_private_part->trueData(); }
72 this->m_private_part->fillShape(shape_with_item);
94template <
typename ItemType,
typename DataType,
typename Extents>
95class MeshMDVariableRefBaseT
102 using ItemLocalIdType =
typename ItemType::LocalIdType;
103 using FullExtentsType = Extents;
109 , m_underlying_var(b)
111 _internalInit(m_underlying_var.variable());
124 const Int32 nb_rank = Extents::rank();
127 m_underlying_var.fillShape(shape_with_item);
130 m_mdspan = MDSpanType(m_underlying_var.trueData()->view().data(), new_extents);
146template <
typename ItemType,
typename DataType,
typename Extents>
147class MeshMDVariableRefT
148:
public MeshMDVariableRefBaseT<ItemType, DataType, typename Extents::template AddedFirstExtentsType<DynExtent>>
150 using AddedFirstExtentsType =
typename Extents::template AddedFirstExtentsType<DynExtent>;
152 static_assert(Extents::rank() >= 0 && Extents::rank() <= 3,
"Only Extents of rank 0, 1, 2 or 3 are implemented");
153 static_assert(std::is_same_v<DataType,BasicType>,
"DataType should be a basic type (Real, Int32, Int64, ... )");
157 using BaseClass = MeshMDVariableRefBaseT<ItemType, DataType, AddedFirstExtentsType>;
158 using ItemLocalIdType =
typename ItemType::LocalIdType;
159 static constexpr int nb_dynamic = Extents::nb_dynamic;
169 template <
typename X = Extents,
typename = std::enable_if_t<X::rank() == 0,
void>>
170 DataType& operator()(ItemLocalIdType
id)
172 return this->m_mdspan(
id.localId());
175 template <
typename X = Extents,
typename = std::enable_if_t<X::rank() == 0,
void>>
176 const DataType& operator()(ItemLocalIdType
id)
const
178 return this->m_mdspan(
id.localId());
182 template <
typename X = Extents,
typename = std::enable_if_t<X::rank() == 1,
void>>
183 DataType& operator()(ItemLocalIdType
id,
Int32 i1)
185 return this->m_mdspan(
id.localId(), i1);
188 template <
typename X = Extents,
typename = std::enable_if_t<X::rank() == 1,
void>>
189 const DataType& operator()(ItemLocalIdType
id,
Int32 i1)
const
191 return this->m_mdspan(
id.localId(), i1);
194 template <
typename X = Extents,
typename = std::enable_if_t<X::rank() == 2,
void>>
195 DataType& operator()(ItemLocalIdType
id,
Int32 i1,
Int32 i2)
197 return this->m_mdspan(
id.localId(), i1, i2);
200 template <
typename X = Extents,
typename = std::enable_if_t<X::rank() == 2,
void>>
201 const DataType& operator()(ItemLocalIdType
id,
Int32 i1,
Int32 i2)
const
203 return this->m_mdspan(
id.localId(), i1, i2);
206 template <
typename X = Extents,
typename = std::enable_if_t<X::rank() == 3,
void>>
209 return this->m_mdspan(
id.localId(), i, j, k);
212 template <
typename X = Extents,
typename = std::enable_if_t<X::rank() == 3,
void>>
213 const DataType& operator()(ItemLocalIdType
id,
Int32 i,
Int32 j,
Int32 k)
const
215 return this->m_mdspan(
id.localId(), i, j, k);
224 void reshape(std::array<Int32, Extents::nb_dynamic> dims)
227 this->m_underlying_var.resizeAndReshape(shape);
238template <
typename ItemType,
typename DataType,
int Size,
typename Extents>
239class MeshVectorMDVariableRefT
240:
public MeshMDVariableRefBaseT<ItemType, DataType, typename Extents::template AddedFirstLastExtentsType<DynExtent, Size>>
249 using AddedFirstLastExtentsType =
typename Extents::template AddedFirstLastExtentsType<DynExtent, Size>;
250 using AddedFirstExtentsType =
typename Extents::template AddedFirstExtentsType<DynExtent>;
251 using BaseClass = MeshMDVariableRefBaseT<ItemType, DataType, AddedFirstLastExtentsType>;
252 static_assert(Extents::rank() >= 0 && Extents::rank() <= 2,
"Only Extents of rank 0, 1 or 2 are implemented");
253 static_assert(std::is_same_v<DataType, BasicType>,
"DataType should be a basic type (Real, Int32, Int64, ... )");
257 using ItemLocalIdType =
typename ItemType::LocalIdType;
261 static constexpr int nb_dynamic = Extents::nb_dynamic;
272 template <
typename X = Extents,
typename = std::enable_if_t<X::rank() == 0,
void>>
275 return ReferenceType(m_vector_mdspan.ptrAt(
id.localId()));
279 template <
typename X = Extents,
typename = std::enable_if_t<X::rank() == 0,
void>>
282 return ConstReferenceType(m_vector_mdspan.ptrAt(
id.localId()));
286 template <
typename X = Extents,
typename = std::enable_if_t<X::rank() == 1,
void>>
289 return ReferenceType(m_vector_mdspan.ptrAt(
id.localId(), i1));
293 template <
typename X = Extents,
typename = std::enable_if_t<X::rank() == 1,
void>>
296 return ConstReferenceType(m_vector_mdspan.ptrAt(
id.localId(), i1));
300 template <
typename X = Extents,
typename = std::enable_if_t<X::rank() == 2,
void>>
303 return ReferenceType(m_vector_mdspan.ptrAt(
id.localId(), i1, i2));
307 template <
typename X = Extents,
typename = std::enable_if_t<X::rank() == 2,
void>>
310 return ConstReferenceType(m_vector_mdspan.ptrAt(
id.localId(), i1, i2));
319 void reshape(std::array<Int32, Extents::nb_dynamic> dims)
321 std::array<Int32, nb_dynamic + 1> full_dims;
323 for (
int i = 0; i < nb_dynamic; ++i)
324 full_dims[i] = dims[i];
325 full_dims[nb_dynamic] = Size;
327 this->m_underlying_var.resizeAndReshape(shape);
339 DataType* v = this->m_mdspan.to1DSpan().data();
340 NumVectorType* nv =
reinterpret_cast<NumVectorType*
>(v);
341 m_vector_mdspan = MDSpanType(nv, this->m_mdspan.extents().dynamicExtents());
346 MDSpanType m_vector_mdspan;
356template <
typename ItemType,
typename DataType,
int Row,
int Column,
typename Extents>
357class MeshMatrixMDVariableRefT
358:
public MeshMDVariableRefBaseT<ItemType, DataType, typename Extents::template AddedFirstLastLastExtentsType<DynExtent, Row, Column>>
367 using AddedFirstLastLastExtentsType =
typename Extents::template AddedFirstLastLastExtentsType<DynExtent, Row, Column>;
368 using AddedFirstExtentsType =
typename Extents::template AddedFirstExtentsType<DynExtent>;
369 using BaseClass = MeshMDVariableRefBaseT<ItemType, DataType, AddedFirstLastLastExtentsType>;
370 static_assert(Extents::rank() >= 0 && Extents::rank() <= 1,
"Only Extents of rank 0 or 1 are implemented");
371 static_assert(std::is_same_v<DataType, BasicType>,
"DataType should be a basic type (Real, Int32, Int64, ... )");
375 using ItemLocalIdType =
typename ItemType::LocalIdType;
379 static constexpr int nb_dynamic = Extents::nb_dynamic;
389 template <
typename X = Extents,
typename = std::enable_if_t<X::rank() == 0,
void>>
390 ReferenceType operator()(ItemLocalIdType
id)
392 return ReferenceType(m_matrix_mdspan.ptrAt(
id.localId()));
395 template <
typename X = Extents,
typename = std::enable_if_t<X::rank() == 0,
void>>
396 ConstReferenceType operator()(ItemLocalIdType
id)
const
398 return ReferenceType(m_matrix_mdspan.ptrAt(
id.localId()));
401 template <
typename X = Extents,
typename = std::enable_if_t<X::rank() == 1,
void>>
402 ReferenceType operator()(ItemLocalIdType
id,
Int32 i1)
404 return ReferenceType(m_matrix_mdspan.ptrAt(
id.localId(), i1));
407 template <
typename X = Extents,
typename = std::enable_if_t<X::rank() == 1,
void>>
408 ConstReferenceType operator()(ItemLocalIdType
id,
Int32 i1)
const
410 return ReferenceType(m_matrix_mdspan.ptrAt(
id.localId(), i1));
419 void reshape(std::array<Int32, Extents::nb_dynamic> dims)
421 std::array<Int32, nb_dynamic + 2> full_dims;
423 for (
int i = 0; i < nb_dynamic; ++i)
424 full_dims[i] = dims[i];
425 full_dims[nb_dynamic] = Row;
426 full_dims[nb_dynamic + 1] = Column;
428 this->m_underlying_var.resizeAndReshape(shape);
440 DataType* v = this->m_mdspan.to1DSpan().data();
441 NumMatrixType* nv =
reinterpret_cast<NumMatrixType*
>(v);
442 m_matrix_mdspan = MDSpanType(nv, this->m_mdspan.extents().dynamicExtents());
447 MDSpanType m_matrix_mdspan;
__host__ static __device__ ArrayExtentsBase< Extents > fromSpan(SmallSpan< const Int32 > extents)
Construit une instance à partir des valeurs données dans extents.
void setNbDimension(Int32 nb_value)
Positionne le rang de la forme.
SmallSpan< const Int32 > dimensions() const
Valeurs de chaque dimension.
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.
Classe de base gérant une variable multi-dimension sur une entité du maillage.
UnderlyingVariableType & underlyingVariable()
Variable sous-jacente associée.
void updateFromInternal() override
Mise à jour à partir de la partie interne.
ArrayShape fullShape() const
Forme complète (statique + dynamique) de la variable.
void reshape(std::array< Int32, Extents::nb_dynamic > dims)
Change la forme de la donnée.
void reshape(std::array< Int32, Extents::nb_dynamic > dims)
Change la forme de la donnée.
void updateFromInternal() override
Mise à jour à partir de la partie interne.
Variable tableau sur un type d'entité du maillage.
MeshVariableArrayRefT(const VariableBuildInfo &b)
MeshVariableRef(const VariableBuildInfo &vb)
Construit une référence liée au module module.
void reshape(std::array< Int32, Extents::nb_dynamic > dims)
Change la forme de la donnée.
ConstReferenceType operator()(ItemLocalIdType id, Int32 i1) const
Accède à la donnée en lecture.
ReferenceType operator()(ItemLocalIdType id, Int32 i1)
Accède à la donnée en lecture/écriture.
ConstReferenceType operator()(ItemLocalIdType id, Int32 i1, Int32 i2) const
Accède à la donnée en lecture.
ReferenceType operator()(ItemLocalIdType id)
Accède à la donnée en lecture/écriture.
void updateFromInternal() override
Mise à jour à partir de la partie interne.
ConstReferenceType operator()(ItemLocalIdType id) const
Accède à la donnée en lecture.
ReferenceType operator()(ItemLocalIdType id, Int32 i1, Int32 i2)
Accède à la donnée en lecture/écriture.
Petite matrice de taille fixe contenant RowSize lignes et ColumnSize colonnes.
Petit vecteur de taille fixe de N données numériques.
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.