Arcane  v3.14.10.0
Documentation développeur
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/*---------------------------------------------------------------------------*/
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/*---------------------------------------------------------------------------*/
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;
98 ConstituentItemIndex* m_first_sub_constituent_item_id_data = nullptr;
100 Int16* m_component_id_data = nullptr;
102 Int16* m_nb_sub_constituent_item_data = nullptr;
104 Int32* m_global_item_local_id_data = nullptr;
106 ConstituentItemIndex* m_super_component_item_local_id_data = nullptr;
108 MatVarIndex* m_var_index_data = nullptr;
109};
110
111/*---------------------------------------------------------------------------*/
112/*---------------------------------------------------------------------------*/
123class ARCANE_CORE_EXPORT ComponentItemSharedInfo
125{
126 friend class ComponentItemInternalData;
127 friend class CellComponentCellEnumerator;
128 friend class ConstituentItemLocalIdList;
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
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
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);
247 ConstArrayView<IMeshComponent*> m_components;
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/*---------------------------------------------------------------------------*/
271class ARCANE_CORE_EXPORT ConstituentItemBase
272{
280
284
285 private:
286
288 : m_constituent_item_index(id)
289 , m_shared_info(shared_info)
290 {
291 }
292
293 public:
294
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
307 ARCCORE_HOST_DEVICE Int32 componentId() const
308 {
309 return m_shared_info->_componentId(m_constituent_item_index);
310 }
311
313 inline ARCCORE_HOST_DEVICE constexpr bool null() const
314 {
315 return m_constituent_item_index.isNull();
316 }
317
324 inline IMeshComponent* component() const
325 {
326 return m_shared_info->_component(m_constituent_item_index);
327 }
328
330 ARCCORE_HOST_DEVICE Int32 nbSubItem() const
331 {
332 return m_shared_info->_nbSubConstituent(m_constituent_item_index);
333 }
334
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
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
368 ARCCORE_HOST_DEVICE inline void _setVariableIndex(MatVarIndex index)
369 {
370 m_shared_info->_setVarIndex(m_constituent_item_index, index);
371 }
372
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
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
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
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
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
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
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 }
518 {
519 return (m_ids.data() == rhs.m_ids.data());
520 }
521 friend bool operator==(const ConstituentItemLocalIdListView& a,
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,
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.
Index d'un Item dans une variable.
Definition ItemLocalId.h:40
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Vue sur une liste de mailles avec infos sur les milieux.
Maille arcane avec info matériaux et milieux.
Informations sur les valeurs des milieux.
Definition AllEnvData.h:44
Enumérateur sur les constituants d'une maille.
Enumérateur sur une partie des mailles d'un composant (matériau ou milieu)
Représente un composant d'une maille multi-matériau.
Gestion des listes de 'ComponentItemInternal'.
ConstituentItemIndex * m_first_sub_constituent_item_id_data
Id de la première entité sous-constituant.
ConstituentItemIndex * m_super_component_item_local_id_data
Id de l'entité sous-constituant parente.
Informations partagées sur les 'ComponentItem'.
static ComponentItemSharedInfo null_shared_info
Pour l'entité nulle.
Int64 _componentUniqueId(ConstituentItemIndex id) const
Numéro unique de l'entité component.
Vue sur un vecteur sur les entités d'un composant.
Enumérateur sur une sous-partie (pure ou partielle) d'un sous-ensemble des mailles d'un composant (ma...
Vue sur une partie pure ou partielles des entités d'un composant.
Index d'une entité constituant dans la liste des entités constituants.
Vue sur une instance de ConstituentItemLocalIdList.
bool _isSamePointerData(const ConstituentItemLocalIdListView &rhs) const
Pour les tests, vérifie que les vues pointent vers les mêmes données.
Liste d'indices locaux pour les 'ComponentItemInternal'.
Implémentation de ComponentItemVector.
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.
Données d'un constituant (matériau ou milieu) d'un maillage.
Données d'une partie (pure ou partielle) d'un constituant.
Implémentation d'un gestion des matériaux.
Informations générique sur une entité d'un constituant.
ARCCORE_HOST_DEVICE Int32 componentId() const
Identifiant du composant.
ARCCORE_HOST_DEVICE constexpr bool null() const
Indique s'il s'agit de la maille nulle.
ARCCORE_HOST_DEVICE ConstituentItemIndex _firstSubItemLocalId() const
Première entité sous-composant.
ARCCORE_HOST_DEVICE void _setFirstSubItem(ConstituentItemIndex first_sub_item)
Positionne le premier sous-composant.
ARCCORE_HOST_DEVICE Int32 nbSubItem() const
Nombre de sous-composants.
ARCCORE_HOST_DEVICE void _setVariableIndex(MatVarIndex index)
Positionne l'indexeur dans les variables matériaux.
ARCCORE_HOST_DEVICE matimpl::ConstituentItemBase _superItemBase() const
Composant supérieur (0 si aucun)
ARCCORE_HOST_DEVICE MatVarIndex variableIndex() const
Indexeur dans les variables matériaux.
ARCCORE_HOST_DEVICE void _setNbSubItem(Int16 nb_sub_item)
Positionne le nombre de sous-composants.
Int64 componentUniqueId() const
Numéro unique de l'entité component.
impl::ItemBase globalItemBase() const
Entité globale correspondante.
Active toujours les traces dans les parties Arcane concernant les matériaux.