Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
MeshMDVariableRef.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 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/* MeshMDVariableRef.h (C) 2000-2022 */
9/* */
10/* Classe gérant une variable multi-dimension sur une entité du maillage. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_MESHMDVARIABLEREF_H
13#define ARCANE_MESHMDVARIABLEREF_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/ArrayLayout.h"
18#include "arcane/utils/ArrayShape.h"
19#include "arcane/utils/MDSpan.h"
20
21#include "arcane/DataView.h"
22
23#include "arcane/MeshVariableArrayRef.h"
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27
28/*
29 * ATTENTION:
30 *
31 * Toutes les classes de ce fichier sont expérimentales et l'API n'est pas
32 * figée. A NE PAS UTILISER EN DEHORS DE ARCANE.
33 */
34
35/*---------------------------------------------------------------------------*/
36/*---------------------------------------------------------------------------*/
37
38namespace Arcane::impl
39{
40
41/*---------------------------------------------------------------------------*/
42/*---------------------------------------------------------------------------*/
43
44template <typename ItemType, typename DataType>
46: public MeshVariableArrayRefT<ItemType, DataType>
47{
48 template <typename _ItemType, typename _DataType, typename _Extents>
50
51 public:
52
54 using VariableType = typename BaseClass::PrivatePartType;
55 using ValueDataType = typename VariableType::ValueDataType;
56
57 private:
58
60 : BaseClass(vbi)
61 {
62 }
63
64 private:
65
66 ValueDataType* trueData() { return this->m_private_part->trueData(); }
67 const ValueDataType* trueData() const { return this->m_private_part->trueData(); }
68
69 void fillShape(ArrayShape& shape_with_item)
70 {
71 this->m_private_part->fillShape(shape_with_item);
72 }
73};
74
75/*---------------------------------------------------------------------------*/
76/*---------------------------------------------------------------------------*/
77
78} // namespace Arcane::impl
79
80/*---------------------------------------------------------------------------*/
81/*---------------------------------------------------------------------------*/
82
83namespace Arcane
84{
85
86/*---------------------------------------------------------------------------*/
87/*---------------------------------------------------------------------------*/
88/*!
89 * \brief Classe de base gérant une variable multi-dimension sur une entité du maillage.
90 *
91 * \warning API en cours de définition. Ne pas utiliser en dehors de Arcane.
92 */
93template <typename ItemType, typename DataType, typename Extents>
95: public MeshVariableRef
96{
97 public:
98
101 using ItemLocalIdType = typename ItemType::LocalIdType;
102 using FullExtentsType = Extents;
103
104 public:
105
108 , m_underlying_var(b)
109 {
110 _internalInit(m_underlying_var.variable());
111 }
112
113 //! Variable sous-jacente associée.
114 UnderlyingVariableType& underlyingVariable() { return m_underlying_var; }
115
116 //! Forme complète (statique + dynamique) de la variable.
117 ArrayShape fullShape() const { return m_underlying_var.trueData()->shape(); }
118
119 protected:
120
121 void updateFromInternal() override
122 {
123 const Int32 nb_rank = Extents::rank();
124 ArrayShape shape_with_item;
125 shape_with_item.setNbDimension(nb_rank);
126 m_underlying_var.fillShape(shape_with_item);
127
129 m_mdspan = MDSpanType(m_underlying_var.trueData()->view().data(), new_extents);
130 }
131
132 protected:
133
135 MDSpanType m_mdspan;
136};
137
138/*---------------------------------------------------------------------------*/
139/*---------------------------------------------------------------------------*/
140/*!
141 * \brief Classe gérant une variable multi-dimension sur une entité du maillage.
142 *
143 * \warning API en cours de définition. Ne pas utiliser en dehors de Arcane.
144 */
145template <typename ItemType, typename DataType, typename Extents>
147: public MeshMDVariableRefBaseT<ItemType, DataType, typename Extents::template AddedFirstExtentsType<DynExtent>>
148{
149 using AddedFirstExtentsType = typename Extents::template AddedFirstExtentsType<DynExtent>;
150 using BasicType = typename DataTypeTraitsT<DataType>::BasicType;
151 static_assert(Extents::rank() >= 0 && Extents::rank() <= 3, "Only Extents of rank 0, 1, 2 or 3 are implemented");
152 static_assert(std::is_same_v<DataType,BasicType>,"DataType should be a basic type (Real, Int32, Int64, ... )");
153
154 public:
155
157 using ItemLocalIdType = typename ItemType::LocalIdType;
158 static constexpr int nb_dynamic = Extents::nb_dynamic;
159
160 public:
161
162 explicit MeshMDVariableRefT(const VariableBuildInfo& b)
163 : BaseClass(b)
164 {}
165
166 public:
167
168 template <typename X = Extents, typename = std::enable_if_t<X::rank() == 0, void>>
169 DataType& operator()(ItemLocalIdType id)
170 {
171 return this->m_mdspan(id.localId());
172 }
173
174 template <typename X = Extents, typename = std::enable_if_t<X::rank() == 0, void>>
175 const DataType& operator()(ItemLocalIdType id) const
176 {
177 return this->m_mdspan(id.localId());
178 }
179
180
181 template <typename X = Extents, typename = std::enable_if_t<X::rank() == 1, void>>
182 DataType& operator()(ItemLocalIdType id, Int32 i1)
183 {
184 return this->m_mdspan(id.localId(), i1);
185 }
186
187 template <typename X = Extents, typename = std::enable_if_t<X::rank() == 1, void>>
188 const DataType& operator()(ItemLocalIdType id, Int32 i1) const
189 {
190 return this->m_mdspan(id.localId(), i1);
191 }
192
193 template <typename X = Extents, typename = std::enable_if_t<X::rank() == 2, void>>
194 DataType& operator()(ItemLocalIdType id, Int32 i1, Int32 i2)
195 {
196 return this->m_mdspan(id.localId(), i1, i2);
197 }
198
199 template <typename X = Extents, typename = std::enable_if_t<X::rank() == 2, void>>
200 const DataType& operator()(ItemLocalIdType id, Int32 i1, Int32 i2) const
201 {
202 return this->m_mdspan(id.localId(), i1, i2);
203 }
204
205 template <typename X = Extents, typename = std::enable_if_t<X::rank() == 3, void>>
206 DataType& operator()(ItemLocalIdType id, Int32 i, Int32 j, Int32 k)
207 {
208 return this->m_mdspan(id.localId(), i, j, k);
209 }
210
211 template <typename X = Extents, typename = std::enable_if_t<X::rank() == 3, void>>
212 const DataType& operator()(ItemLocalIdType id, Int32 i, Int32 j, Int32 k) const
213 {
214 return this->m_mdspan(id.localId(), i, j, k);
215 }
216
217 /*!
218 * \brief Change la forme de la donnée.
219 *
220 * Le nombre d'éléments de \a dims doit correspondre aux nombre de valeurs
221 * dynamiques de \a Extents.
222 */
223 void reshape(std::array<Int32, Extents::nb_dynamic> dims)
224 {
225 ArrayShape shape(dims);
226 this->m_underlying_var.resizeAndReshape(shape);
227 }
228};
229
230/*---------------------------------------------------------------------------*/
231/*---------------------------------------------------------------------------*/
232/*!
233 * \brief Classe gérant une variable multi-dimension de type 'NumVector' sur une entité du maillage.
234 *
235 * \warning API en cours de définition. Ne pas utiliser en dehors de Arcane.
236 */
237template <typename ItemType, typename DataType, int Size, typename Extents>
238class MeshVectorMDVariableRefT
239: public MeshMDVariableRefBaseT<ItemType, DataType, typename Extents::template AddedFirstLastExtentsType<DynExtent, Size>>
240{
241 public:
242
243 using NumVectorType = NumVector<DataType, Size>;
244
245 private:
246
247 using BasicType = typename DataTypeTraitsT<DataType>::BasicType;
248 using AddedFirstLastExtentsType = typename Extents::template AddedFirstLastExtentsType<DynExtent, Size>;
249 using AddedFirstExtentsType = typename Extents::template AddedFirstExtentsType<DynExtent>;
250 using BaseClass = MeshMDVariableRefBaseT<ItemType, DataType, AddedFirstLastExtentsType>;
251 static_assert(Extents::rank() >= 0 && Extents::rank() <= 2, "Only Extents of rank 0, 1 or 2 are implemented");
252 static_assert(std::is_same_v<DataType, BasicType>, "DataType should be a basic type (Real, Int32, Int64, ... )");
253
254 public:
255
256 using ItemLocalIdType = typename ItemType::LocalIdType;
257 using ReferenceType = DataViewGetterSetter<NumVectorType>;
258 using ConstReferenceType = DataViewGetter<NumVectorType>;
259 using MDSpanType = MDSpan<NumVectorType, AddedFirstExtentsType, RightLayout>;
260 static constexpr int nb_dynamic = Extents::nb_dynamic;
261
262 public:
263
264 explicit MeshVectorMDVariableRefT(const VariableBuildInfo& b)
265 : BaseClass(b)
266 {}
267
268 public:
269
270 //! Accède à la donnée en lecture/écriture
271 template <typename X = Extents, typename = std::enable_if_t<X::rank() == 0, void>>
272 ReferenceType operator()(ItemLocalIdType id)
273 {
274 return ReferenceType(m_vector_mdspan.ptrAt(id.localId()));
275 }
276
277 //! Accède à la donnée en lecture
278 template <typename X = Extents, typename = std::enable_if_t<X::rank() == 0, void>>
279 ConstReferenceType operator()(ItemLocalIdType id) const
280 {
281 return ConstReferenceType(m_vector_mdspan.ptrAt(id.localId()));
282 }
283
284 //! Accède à la donnée en lecture/écriture
285 template <typename X = Extents, typename = std::enable_if_t<X::rank() == 1, void>>
286 ReferenceType operator()(ItemLocalIdType id, Int32 i1)
287 {
288 return ReferenceType(m_vector_mdspan.ptrAt(id.localId(), i1));
289 }
290
291 //! Accède à la donnée en lecture
292 template <typename X = Extents, typename = std::enable_if_t<X::rank() == 1, void>>
293 ConstReferenceType operator()(ItemLocalIdType id, Int32 i1) const
294 {
295 return ConstReferenceType(m_vector_mdspan.ptrAt(id.localId(), i1));
296 }
297
298 //! Accède à la donnée en lecture/écriture
299 template <typename X = Extents, typename = std::enable_if_t<X::rank() == 2, void>>
300 ReferenceType operator()(ItemLocalIdType id, Int32 i1, Int32 i2)
301 {
302 return ReferenceType(m_vector_mdspan.ptrAt(id.localId(), i1, i2));
303 }
304
305 //! Accède à la donnée en lecture
306 template <typename X = Extents, typename = std::enable_if_t<X::rank() == 2, void>>
307 ConstReferenceType operator()(ItemLocalIdType id, Int32 i1, Int32 i2) const
308 {
309 return ConstReferenceType(m_vector_mdspan.ptrAt(id.localId(), i1, i2));
310 }
311
312 /*!
313 * \brief Change la forme de la donnée.
314 *
315 * Le nombre d'éléments de \a dims doit correspondre aux nombre de valeurs
316 * dynamiques de \a Extents.
317 */
318 void reshape(std::array<Int32, Extents::nb_dynamic> dims)
319 {
320 std::array<Int32, nb_dynamic + 1> full_dims;
321 // On ajoute 'Size' à la fin des dimensions.
322 for (int i = 0; i < nb_dynamic; ++i)
323 full_dims[i] = dims[i];
324 full_dims[nb_dynamic] = Size;
325 ArrayShape shape(full_dims);
326 this->m_underlying_var.resizeAndReshape(shape);
327 }
328
329 protected:
330
331 void updateFromInternal() override
332 {
333 BaseClass::updateFromInternal();
334 // Positionne la valeur de m_vector_mdspan.
335 // Il aura les mêmes dimensions que m_mdspan sauf qu'on
336 // enlève la dernière dimension et qu'on change le type
337 // de 'DataType' en 'NumVector<DataType,Size>.
338 DataType* v = this->m_mdspan.to1DSpan().data();
339 NumVectorType* nv = reinterpret_cast<NumVectorType*>(v);
340 m_vector_mdspan = MDSpanType(nv, this->m_mdspan.extents().dynamicExtents());
341 }
342
343 private:
344
345 MDSpanType m_vector_mdspan;
346};
347
348/*---------------------------------------------------------------------------*/
349/*---------------------------------------------------------------------------*/
350/*!
351 * \brief Classe gérant une variable multi-dimension de type 'NumMatrix' sur une entité du maillage.
352 *
353 * \warning API en cours de définition. Ne pas utiliser en dehors de Arcane.
354 */
355template <typename ItemType, typename DataType, int Row, int Column, typename Extents>
356class MeshMatrixMDVariableRefT
357: public MeshMDVariableRefBaseT<ItemType, DataType, typename Extents::template AddedFirstLastLastExtentsType<DynExtent, Row, Column>>
358{
359 public:
360
361 using NumMatrixType = NumMatrix<DataType, Row, Column>;
362
363 private:
364
365 using BasicType = typename DataTypeTraitsT<DataType>::BasicType;
366 using AddedFirstLastLastExtentsType = typename Extents::template AddedFirstLastLastExtentsType<DynExtent, Row, Column>;
367 using AddedFirstExtentsType = typename Extents::template AddedFirstExtentsType<DynExtent>;
368 using BaseClass = MeshMDVariableRefBaseT<ItemType, DataType, AddedFirstLastLastExtentsType>;
369 static_assert(Extents::rank() >= 0 && Extents::rank() <= 1, "Only Extents of rank 0 or 1 are implemented");
370 static_assert(std::is_same_v<DataType, BasicType>, "DataType should be a basic type (Real, Int32, Int64, ... )");
371
372 public:
373
374 using ItemLocalIdType = typename ItemType::LocalIdType;
375 using ReferenceType = DataViewGetterSetter<NumMatrixType>;
376 using ConstReferenceType = DataViewGetter<NumMatrixType>;
377 using MDSpanType = MDSpan<NumMatrixType, AddedFirstExtentsType, RightLayout>;
378 static constexpr int nb_dynamic = Extents::nb_dynamic;
379
380 public:
381
382 explicit MeshMatrixMDVariableRefT(const VariableBuildInfo& b)
383 : BaseClass(b)
384 {}
385
386 public:
387
388 template <typename X = Extents, typename = std::enable_if_t<X::rank() == 0, void>>
389 ReferenceType operator()(ItemLocalIdType id)
390 {
391 return ReferenceType(m_matrix_mdspan.ptrAt(id.localId()));
392 }
393
394 template <typename X = Extents, typename = std::enable_if_t<X::rank() == 0, void>>
395 ConstReferenceType operator()(ItemLocalIdType id) const
396 {
397 return ReferenceType(m_matrix_mdspan.ptrAt(id.localId()));
398 }
399
400 template <typename X = Extents, typename = std::enable_if_t<X::rank() == 1, void>>
401 ReferenceType operator()(ItemLocalIdType id, Int32 i1)
402 {
403 return ReferenceType(m_matrix_mdspan.ptrAt(id.localId(), i1));
404 }
405
406 template <typename X = Extents, typename = std::enable_if_t<X::rank() == 1, void>>
407 ConstReferenceType operator()(ItemLocalIdType id, Int32 i1) const
408 {
409 return ReferenceType(m_matrix_mdspan.ptrAt(id.localId(), i1));
410 }
411
412 /*!
413 * \brief Change la forme de la donnée.
414 *
415 * Le nombre d'éléments de \a dims doit correspondre aux nombre de valeurs
416 * dynamiques de \a Extents.
417 */
418 void reshape(std::array<Int32, Extents::nb_dynamic> dims)
419 {
420 std::array<Int32, nb_dynamic + 2> full_dims;
421 // On ajoute 'Row' et 'Column' à la fin des dimensions.
422 for (int i = 0; i < nb_dynamic; ++i)
423 full_dims[i] = dims[i];
424 full_dims[nb_dynamic] = Row;
425 full_dims[nb_dynamic + 1] = Column;
426 ArrayShape shape(full_dims);
427 this->m_underlying_var.resizeAndReshape(shape);
428 }
429
430 protected:
431
432 void updateFromInternal() override
433 {
434 BaseClass::updateFromInternal();
435 // Positionne la valeur de m_vector_mdspan.
436 // Il aura les mêmes dimensions que m_mdspan sauf qu'on
437 // enlève la dernière dimension et qu'on change le type
438 // de 'DataType' en 'NumMatrix<DataType,Row,Column>.
439 DataType* v = this->m_mdspan.to1DSpan().data();
440 NumMatrixType* nv = reinterpret_cast<NumMatrixType*>(v);
441 m_matrix_mdspan = MDSpanType(nv, this->m_mdspan.extents().dynamicExtents());
442 }
443
444 private:
445
446 MDSpanType m_matrix_mdspan;
447};
448
449/*---------------------------------------------------------------------------*/
450/*---------------------------------------------------------------------------*/
451
452} // namespace Arcane
453
454/*---------------------------------------------------------------------------*/
455/*---------------------------------------------------------------------------*/
456
457#endif
__host__ static __device__ ArrayExtentsBase< Extents > fromSpan(SmallSpan< const Int32 > extents)
Construit une instance à partir des valeurs données dans extents.
Forme d'un tableau.
Definition ArrayShape.h:40
void setNbDimension(Int32 nb_value)
Positionne le rang de la forme.
Definition ArrayShape.cc:39
SmallSpan< const Int32 > dimensions() const
Valeurs de chaque dimension.
Definition ArrayShape.h:54
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.
Classe gérant une variable multi-dimension sur une entité du maillage.
void reshape(std::array< Int32, Extents::nb_dynamic > dims)
Change la forme de la donnée.
Variable tableau sur un type d'entité du maillage.
Classe de base d'une variable sur des entités du maillage.
Paramètres nécessaires à la construction d'une variable.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-