Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
core/materials/ComponentItemInternal.h
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/* ComponentItemInternal.h (C) 2000-2024 */
9/* */
10/* Partie interne d'une maille multi-matériau. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_CORE_MATERIALS_COMPONENTITEMINTERNAL_H
13#define ARCANE_CORE_MATERIALS_COMPONENTITEMINTERNAL_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/core/ItemInternal.h"
18#include "arcane/core/Item.h"
19#include "arcane/core/materials/MatVarIndex.h"
20
21/*---------------------------------------------------------------------------*/
22/*---------------------------------------------------------------------------*/
23
24namespace Arcane::Materials
25{
26class MeshEnvironment;
27class MeshComponentData;
28class AllEnvData;
29class MeshMaterialMng;
30class ComponentItemInternalData;
31
32namespace matimpl
33{
34 class ConstituentItemBase;
35}
36
37/*---------------------------------------------------------------------------*/
38/*---------------------------------------------------------------------------*/
39/*!
40 * \internal
41 * \brief Index d'une entité constituant dans la liste des entités constituants.
42 *
43 * L'index est propre à chaque type d'entité consituant (AllEnvCell, EnvCell, MatCell).
44 * La liste est gérée par ComponentIemtInternalData.
45 */
46class ARCANE_CORE_EXPORT ConstituentItemIndex
47{
48 public:
49
50 ConstituentItemIndex() = default;
51 explicit ARCCORE_HOST_DEVICE constexpr ConstituentItemIndex(Int32 id)
52 : m_id(id)
53 {}
54 ARCCORE_HOST_DEVICE constexpr Int32 localId() const { return m_id; }
55 ARCCORE_HOST_DEVICE friend constexpr bool operator==(ConstituentItemIndex a,
57 {
58 return a.m_id == b.m_id;
59 }
60 ARCCORE_HOST_DEVICE friend constexpr bool operator!=(ConstituentItemIndex a,
62 {
63 return a.m_id != b.m_id;
64 }
65 ARCANE_CORE_EXPORT friend std::ostream&
66 operator<<(std::ostream& o, const ConstituentItemIndex& id);
67
68 ARCCORE_HOST_DEVICE constexpr bool isNull() const { return m_id == (-1); }
69
70 private:
71
72 Int32 m_id = -1;
73};
74
75/*---------------------------------------------------------------------------*/
76/*---------------------------------------------------------------------------*/
77/*!
78 * \brief Conteneur pour les données des constituants.
79 */
80class ARCANE_CORE_EXPORT ComponentItemSharedInfoStorageView
81{
82 // Les champs de cette classe sont des tableaux dont la taille est
83 // \a m_storage_size et qui peuvent être indexés par une entité nulle
84 // (ConstituentItemIndex==(-1)).
85 // Le conteneur est géré par ComponenItemInternalData.
86 // Seuls ComponentItemSharedInfo et ComponenItemInternalData
87 // doivent accéder aux champs de cette classe
88
89 // TODO: Utiliser stockage avec un seul élément pour le nullComponent
90
91 friend class ComponentItemInternalData;
92 friend class ComponentItemSharedInfo;
93
94 private:
95
96 Int32 m_storage_size = 0;
97 //! Id de la première entité sous-constituant
98 ConstituentItemIndex* m_first_sub_constituent_item_id_data = nullptr;
99 //! Index du constituant (IMeshComponent)
100 Int16* m_component_id_data = nullptr;
101 //! Nombre d'entités sous-constituant
102 Int16* m_nb_sub_constituent_item_data = nullptr;
103 //! localId() de l'entité globale associée
104 Int32* m_global_item_local_id_data = nullptr;
105 //! Id de l'entité sous-constituant parente
106 ConstituentItemIndex* m_super_component_item_local_id_data = nullptr;
107 //! MatVarIndex de l'entité
108 MatVarIndex* m_var_index_data = nullptr;
109};
110
111/*---------------------------------------------------------------------------*/
112/*---------------------------------------------------------------------------*/
113/*!
114 * \internal
115 * \brief Informations partagées sur les 'ComponentItem'.
116 *
117 * Il y a 3 instances de cette classe : une pour les AllEnvCell, une pour les
118 * EnvCell et une pour les MatCell. Ces instances sont gérées par la classe
119 * ComponentItemInternalData. Il est possible de conserver un pointeur sur
120 * les intances de cette classe car ils sont valides durant toute la vie
121 * d'un MeshMaterialMng.
122 */
123class ARCANE_CORE_EXPORT ComponentItemSharedInfo
125{
126 friend class ComponentItemInternalData;
127 friend class CellComponentCellEnumerator;
128 friend class ConstituentItemLocalIdList;
129 friend class ConstituentItemLocalIdListView;
130 friend matimpl::ConstituentItemBase;
131 friend class ComponentCell;
132 friend class CellToAllEnvCellConverter;
133 friend class AllEnvCellVectorView;
134 friend class ConstituentItemVectorImpl;
135
136 static const int MAT_INDEX_OFFSET = 10;
137
138 private:
139
140 //! Pour l'entité nulle
141 static ComponentItemSharedInfo null_shared_info;
142 static ComponentItemSharedInfo* null_shared_info_pointer;
143 static ComponentItemSharedInfo* _nullInstance() { return null_shared_info_pointer; }
144 static void _setNullInstance();
145
146 private:
147
148 inline constexpr matimpl::ConstituentItemBase _item(ConstituentItemIndex id);
149 inline ARCCORE_HOST_DEVICE ConstituentItemIndex _firstSubConstituentLocalId(ConstituentItemIndex id) const
150 {
151 ARCCORE_CHECK_RANGE(id.localId(), -1, m_storage_size);
152 return m_first_sub_constituent_item_id_data[id.localId()];
153 }
154 inline ARCCORE_HOST_DEVICE void
155 _setFirstSubConstituentLocalId(ConstituentItemIndex id, ConstituentItemIndex first_id)
156 {
157 ARCCORE_CHECK_RANGE(id.localId(), -1, m_storage_size);
158 m_first_sub_constituent_item_id_data[id.localId()] = first_id;
159 }
160 inline ARCCORE_HOST_DEVICE Int16 _nbSubConstituent(ConstituentItemIndex id) const
161 {
162 ARCCORE_CHECK_RANGE(id.localId(), -1, m_storage_size);
163 return m_nb_sub_constituent_item_data[id.localId()];
164 }
165 ARCCORE_HOST_DEVICE inline void _setNbSubConstituent(ConstituentItemIndex id, Int16 n)
166 {
167 ARCCORE_CHECK_RANGE(id.localId(), -1, m_storage_size);
168 m_nb_sub_constituent_item_data[id.localId()] = n;
169 }
170 inline ARCCORE_HOST_DEVICE Int16 _componentId(ConstituentItemIndex id) const
171 {
172 ARCCORE_CHECK_RANGE(id.localId(), -1, m_storage_size);
173 return m_component_id_data[id.localId()];
174 }
175 ARCCORE_HOST_DEVICE inline void _setComponentId(ConstituentItemIndex id, Int16 component_id)
176 {
177 ARCCORE_CHECK_RANGE(id.localId(), -1, m_storage_size);
178 m_component_id_data[id.localId()] = component_id;
179 }
180 IMeshComponent* _component(ConstituentItemIndex id) const
181 {
182 return m_components[_componentId(id)];
183 }
184 impl::ItemBase _globalItemBase(ConstituentItemIndex id) const
185 {
186 ARCCORE_CHECK_RANGE(id.localId(), -1, m_storage_size);
187 return impl::ItemBase(m_global_item_local_id_data[id.localId()], m_item_shared_info);
188 }
189 ARCCORE_HOST_DEVICE Int32 _globalItemId(ConstituentItemIndex id) const
190 {
191 ARCCORE_CHECK_RANGE(id.localId(), -1, m_storage_size);
192 return m_global_item_local_id_data[id.localId()];
193 }
194 ARCCORE_HOST_DEVICE void _setGlobalItem(ConstituentItemIndex id, ItemLocalId global_item_lid)
195 {
196 ARCCORE_CHECK_RANGE(id.localId(), -1, m_storage_size);
197 m_global_item_local_id_data[id.localId()] = global_item_lid.localId();
198 }
199 ARCCORE_HOST_DEVICE inline matimpl::ConstituentItemBase _superItemBase(ConstituentItemIndex id) const;
200
201 ARCCORE_HOST_DEVICE void _setSuperItem(ConstituentItemIndex id, ConstituentItemIndex super_id)
202 {
203 ARCCORE_CHECK_RANGE(id.localId(), -1, m_storage_size);
204 m_super_component_item_local_id_data[id.localId()] = super_id;
205 }
206 inline ARCCORE_HOST_DEVICE matimpl::ConstituentItemBase _subItemBase(ConstituentItemIndex id, Int32 sub_index) const;
207
208 ARCCORE_HOST_DEVICE MatVarIndex _varIndex(ConstituentItemIndex id)
209 {
210 ARCCORE_CHECK_RANGE(id.localId(), -1, m_storage_size);
211 return m_var_index_data[id.localId()];
212 }
213 ARCCORE_HOST_DEVICE void _setVarIndex(ConstituentItemIndex id, MatVarIndex mv_index)
214 {
215 ARCCORE_CHECK_RANGE(id.localId(), -1, m_storage_size);
216 m_var_index_data[id.localId()] = mv_index;
217 }
218
219 //! Numéro unique de l'entité component
220 Int64 _componentUniqueId(ConstituentItemIndex id) const
221 {
222 // TODO: Vérifier que arrayIndex() ne dépasse pas (1<<MAT_INDEX_OFFSET)
223 impl::ItemBase item_base(_globalItemBase(id));
224 return (Int64)m_var_index_data[id.localId()].arrayIndex() + ((Int64)item_base.uniqueId() << MAT_INDEX_OFFSET);
225 }
226
227 ARCCORE_HOST_DEVICE void _reset(ConstituentItemIndex id)
228 {
229 Int32 local_id = id.localId();
230 ARCCORE_CHECK_RANGE(local_id, -1, m_storage_size);
231
232 m_var_index_data[local_id].reset();
233 m_first_sub_constituent_item_id_data[local_id] = {};
234 m_nb_sub_constituent_item_data[local_id] = 0;
235 m_component_id_data[local_id] = -1;
236 m_global_item_local_id_data[local_id] = NULL_ITEM_LOCAL_ID;
237 m_super_component_item_local_id_data[local_id] = {};
238 }
239
240 private:
241
242 // NOTE : Cette classe est partagée avec le wrapper C#
243 // Toute modification de la structure interne doit être reportée
244 // dans la structure C# correspondante
245 ItemSharedInfo* m_item_shared_info = ItemSharedInfo::nullInstance();
246 Int16 m_level = (-1);
248 ComponentItemSharedInfo* m_super_component_item_shared_info = null_shared_info_pointer;
249 ComponentItemSharedInfo* m_sub_component_item_shared_info = null_shared_info_pointer;
250};
251
252/*---------------------------------------------------------------------------*/
253/*---------------------------------------------------------------------------*/
254
255}
256
257namespace Arcane::Materials::matimpl
258{
259
260/*---------------------------------------------------------------------------*/
261/*---------------------------------------------------------------------------*/
262/*!
263 * \internal
264 * \brief Informations générique sur une entité d'un constituant.
265 *
266 * Cette classe est le pendant de ItemInternal pour la gestion des matériaux
267 * et des milieux. Elle ne doit en principe pas être utilisée directement, sauf
268 * par les classes de Arcane. Il vaut mieux utiliser les
269 * classes ComponentCell, MatCell, EnvCell ou AllEnvCell.
270 */
271class ARCANE_CORE_EXPORT ConstituentItemBase
272{
277 friend Arcane::Materials::AllEnvData;
278 friend Arcane::Materials::MeshMaterialMng;
280
281 friend Arcane::Materials::MeshEnvironment;
282 friend Arcane::Materials::MeshComponentData;
283 friend Arcane::Materials::ComponentItemInternalData;
284
285 private:
286
287 ARCCORE_HOST_DEVICE constexpr ConstituentItemBase(ComponentItemSharedInfo* shared_info, ConstituentItemIndex id)
288 : m_constituent_item_index(id)
289 , m_shared_info(shared_info)
290 {
291 }
292
293 public:
294
295 //! Indexeur dans les variables matériaux
296 ARCCORE_HOST_DEVICE MatVarIndex variableIndex() const
297 {
298 return m_shared_info->_varIndex(m_constituent_item_index);
299 }
300
301 ARCCORE_HOST_DEVICE ConstituentItemIndex constituentItemIndex() const
302 {
303 return m_constituent_item_index;
304 }
305
306 //! Identifiant du composant
307 ARCCORE_HOST_DEVICE Int32 componentId() const
308 {
309 return m_shared_info->_componentId(m_constituent_item_index);
310 }
311
312 //! Indique s'il s'agit de la maille nulle.
313 inline ARCCORE_HOST_DEVICE constexpr bool null() const
314 {
315 return m_constituent_item_index.isNull();
316 }
317
318 /*!
319 * \brief Composant associé.
320 *
321 * Cet appel n'est valide que pour les mailles matériaux ou milieux. Si on souhaite
322 * un appel valide pour toutes les 'ComponentItem', il faut utiliser componentId().
323 */
324 inline IMeshComponent* component() const
325 {
326 return m_shared_info->_component(m_constituent_item_index);
327 }
328
329 //! Nombre de sous-composants.
330 ARCCORE_HOST_DEVICE Int32 nbSubItem() const
331 {
332 return m_shared_info->_nbSubConstituent(m_constituent_item_index);
333 }
334
335 //! Entité globale correspondante.
336 inline impl::ItemBase globalItemBase() const
337 {
338 return m_shared_info->_globalItemBase(m_constituent_item_index);
339 }
340
341 inline ARCCORE_HOST_DEVICE constexpr Int32 level() const
342 {
343 return m_shared_info->m_level;
344 }
345
346 //! Numéro unique de l'entité component
347 inline Int64 componentUniqueId() const
348 {
349 return m_shared_info->_componentUniqueId(m_constituent_item_index);
350 }
351
352 public:
353
354 ARCCORE_HOST_DEVICE constexpr friend bool
355 operator==(const ConstituentItemBase& a, const ConstituentItemBase& b)
356 {
357 return ((a.m_constituent_item_index == b.m_constituent_item_index) && (a.m_shared_info == b.m_shared_info));
358 }
359 ARCCORE_HOST_DEVICE constexpr friend bool
360 operator!=(const ConstituentItemBase& a, const ConstituentItemBase& b)
361 {
362 return !(a == b);
363 }
364
365 private:
366
367 //! Positionne l'indexeur dans les variables matériaux.
368 ARCCORE_HOST_DEVICE inline void _setVariableIndex(MatVarIndex index)
369 {
370 m_shared_info->_setVarIndex(m_constituent_item_index, index);
371 }
372
373 //! Composant supérieur (0 si aucun)
374 ARCCORE_HOST_DEVICE inline matimpl::ConstituentItemBase _superItemBase() const;
375
376 ARCCORE_HOST_DEVICE inline void _setSuperAndGlobalItem(ConstituentItemIndex cii, ItemLocalId ii)
377 {
378 m_shared_info->_setSuperItem(m_constituent_item_index, cii);
379 m_shared_info->_setGlobalItem(m_constituent_item_index, ii);
380 }
381
382 ARCCORE_HOST_DEVICE inline void _setGlobalItem(ItemLocalId ii)
383 {
384 m_shared_info->_setGlobalItem(m_constituent_item_index, ii);
385 }
386
387 //! Première entité sous-composant.
388 inline ARCCORE_HOST_DEVICE ConstituentItemIndex _firstSubItemLocalId() const
389 {
390 return m_shared_info->_firstSubConstituentLocalId(m_constituent_item_index);
391 }
392
393 inline ARCCORE_HOST_DEVICE matimpl::ConstituentItemBase _subItemBase(Int32 i) const;
394
395 //! Positionne le nombre de sous-composants.
396 ARCCORE_HOST_DEVICE void _setNbSubItem(Int16 nb_sub_item)
397 {
398 m_shared_info->_setNbSubConstituent(m_constituent_item_index, nb_sub_item);
399 }
400
401 //! Positionne le premier sous-composant.
402 ARCCORE_HOST_DEVICE void _setFirstSubItem(ConstituentItemIndex first_sub_item)
403 {
404 m_shared_info->_setFirstSubConstituentLocalId(m_constituent_item_index, first_sub_item);
405 }
406
407 ARCCORE_HOST_DEVICE void _setComponent(Int16 component_id)
408 {
409 m_shared_info->_setComponentId(m_constituent_item_index, component_id);
410 }
411
412 private:
413
414 ConstituentItemIndex m_constituent_item_index;
415 ComponentItemSharedInfo* m_shared_info = ComponentItemSharedInfo::null_shared_info_pointer;
416};
417
418/*---------------------------------------------------------------------------*/
419/*---------------------------------------------------------------------------*/
420
421} // namespace Arcane::Materials::matimpl
422
423/*---------------------------------------------------------------------------*/
424/*---------------------------------------------------------------------------*/
425
426namespace Arcane::Materials
427{
428
429/*---------------------------------------------------------------------------*/
430/*---------------------------------------------------------------------------*/
431
432inline constexpr matimpl::ConstituentItemBase ComponentItemSharedInfo::
433_item(ConstituentItemIndex id)
434{
435 return matimpl::ConstituentItemBase(this,id);
436}
437
438ARCCORE_HOST_DEVICE inline matimpl::ConstituentItemBase ComponentItemSharedInfo::
439_superItemBase(ConstituentItemIndex id) const
440{
441 ARCCORE_CHECK_RANGE(id.localId(), -1, m_storage_size);
442 ConstituentItemIndex super_local_id(m_super_component_item_local_id_data[id.localId()]);
443 return m_super_component_item_shared_info->_item(super_local_id);
444}
445
446inline ARCCORE_HOST_DEVICE matimpl::ConstituentItemBase ComponentItemSharedInfo::
447_subItemBase(ConstituentItemIndex id,Int32 sub_index) const
448{
449 ARCCORE_CHECK_RANGE(id.localId(), -1, m_storage_size);
450 ConstituentItemIndex lid(m_first_sub_constituent_item_id_data[id.localId()].localId() + sub_index);
451 return m_sub_component_item_shared_info->_item(lid);
452}
453
454/*---------------------------------------------------------------------------*/
455/*---------------------------------------------------------------------------*/
456
457inline ARCCORE_HOST_DEVICE matimpl::ConstituentItemBase matimpl::ConstituentItemBase::
458_superItemBase() const
459{
460 return m_shared_info->_superItemBase(m_constituent_item_index);
461}
462
463inline ARCCORE_HOST_DEVICE matimpl::ConstituentItemBase matimpl::ConstituentItemBase::
464_subItemBase(Int32 i) const
465{
466 return m_shared_info->_subItemBase(m_constituent_item_index, i);
467}
468
469/*---------------------------------------------------------------------------*/
470/*---------------------------------------------------------------------------*/
471
472/*!
473 * \internal
474 * \brief Vue sur une instance de ConstituentItemLocalIdList.
475 *
476 * Les instances de ces classes sont notamment utilisées pour les énumérateurs
477 * sur les constituants.
478 */
479class ARCANE_CORE_EXPORT ConstituentItemLocalIdListView
480{
481 friend class ConstituentItemLocalIdList;
482 friend class ComponentItemVectorView;
483 friend class MeshComponentPartData;
484 friend class ComponentPartItemVectorView;
485 friend class ComponentPartCellEnumerator;
486 friend class ComponentCellEnumerator;
487 friend class MeshEnvironment;
488
489 private:
490
491 ConstituentItemLocalIdListView() = default;
492 ConstituentItemLocalIdListView(ComponentItemSharedInfo* shared_info,
493 ConstArrayView<ConstituentItemIndex> ids)
494 : m_component_shared_info(shared_info)
495 , m_ids(ids)
496 {
497#ifdef ARCANE_CHECK
498 _checkCoherency();
499#endif
500 }
501
502 private:
503
504 ARCCORE_HOST_DEVICE matimpl::ConstituentItemBase _constituenItemBase(Int32 index) const
505 {
506 return m_component_shared_info->_item(m_ids[index]);
507 }
508 MatVarIndex _matVarIndex(Int32 index) const
509 {
510 return m_component_shared_info->_varIndex(m_ids[index]);
511 }
512 ConstituentItemLocalIdListView _subView(Int32 begin, Int32 size) const
513 {
514 return { m_component_shared_info, m_ids.subView(begin, size) };
515 }
516 //! Pour les tests, vérifie que les vues pointent vers les mêmes données
517 bool _isSamePointerData(const ConstituentItemLocalIdListView& rhs) const
518 {
519 return (m_ids.data() == rhs.m_ids.data());
520 }
521 friend bool operator==(const ConstituentItemLocalIdListView& a,
522 const ConstituentItemLocalIdListView& b)
523 {
524 bool t1 = a.m_component_shared_info == b.m_component_shared_info;
525 bool t2 = a.m_ids == b.m_ids;
526 return (t1 && t2);
527 }
528 friend bool operator!=(const ConstituentItemLocalIdListView& a,
529 const ConstituentItemLocalIdListView& b)
530 {
531 return (!(a == b));
532 }
533
534 private:
535
536 // NOTE: Cette classe est wrappé directement en C#.
537 // Si on modifie les champs de cette classe il faut modifier le type correspondant
538 // dans le wrappeur.
539 ComponentItemSharedInfo* m_component_shared_info = nullptr;
540 ConstArrayView<ConstituentItemIndex> m_ids;
541
542 private:
543
544 void _checkCoherency() const;
545};
546
547/*---------------------------------------------------------------------------*/
548/*---------------------------------------------------------------------------*/
549
550} // End namespace Arcane::Materials
551
552/*---------------------------------------------------------------------------*/
553/*---------------------------------------------------------------------------*/
554
555#endif
Classe de base pour les entités du maillage.
ItemUniqueId uniqueId() const
Numéro unique de l'entité
Index d'un Item dans une variable.
Definition ItemLocalId.h:40
Maille arcane avec info matériaux et milieux.
Enumérateur sur les constituants d'une maille.
Représente un composant d'une maille multi-matériau.
Maille arcane d'un milieu.
Interface d'un composant (matériau ou milieu) d'un maillage.
Représente un matériau d'une maille multi-matériau.
Représente un index sur les variables matériaux et milieux.
Vue constante d'un tableau de type T.
Active toujours les traces dans les parties Arcane concernant les matériaux.
std::ostream & operator<<(std::ostream &ostr, eItemKind item_kind)
Opérateur de sortie sur un flot.