Arcane  v3.15.0.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ConstituentItemBase.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/* ConstituentItemBase.h (C) 2000-2024 */
9/* */
10/* Informations génériques sur une entité d'un constituant. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_CORE_MATERIALS_CONSTITUENTITEMBASE_H
13#define ARCANE_CORE_MATERIALS_CONSTITUENTITEMBASE_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/core/ItemInternal.h"
18#include "arcane/core/Item.h"
19#include "arcane/core/materials/ConstituentItemLocalId.h"
20#include "arcane/core/materials/ComponentItemInternal.h"
21
22/*---------------------------------------------------------------------------*/
23/*---------------------------------------------------------------------------*/
24
25namespace Arcane::Materials::matimpl
26{
27
28/*---------------------------------------------------------------------------*/
29/*---------------------------------------------------------------------------*/
30/*!
31 * \internal
32 * \brief Informations génériques sur une entité d'un constituant.
33 *
34 * Cette classe est le pendant de ItemInternal pour la gestion des matériaux
35 * et des milieux. Elle ne doit en principe pas être utilisée directement, sauf
36 * par les classes de Arcane. Il vaut mieux utiliser les
37 * classes ComponentCell, MatCell, EnvCell ou AllEnvCell.
38 */
39class ARCANE_CORE_EXPORT ConstituentItemBase
40{
41 friend ComponentCell;
42 friend AllEnvCell;
43 friend EnvCell;
44 friend MatCell;
45 friend AllEnvData;
46 friend MeshMaterialMng;
48
49 friend MeshEnvironment;
50 friend MeshComponentData;
51 friend ComponentItemInternalData;
52
53 private:
54
55 ARCCORE_HOST_DEVICE constexpr ConstituentItemBase(ComponentItemSharedInfo* shared_info, ConstituentItemIndex id)
56 : m_constituent_item_index(id)
57 , m_shared_info(shared_info)
58 {
59 }
60
61 public:
62
63 //! Indexeur dans les variables matériaux
64 ARCCORE_HOST_DEVICE MatVarIndex variableIndex() const
65 {
66 return m_shared_info->_varIndex(m_constituent_item_index);
67 }
68
69 ARCCORE_HOST_DEVICE ConstituentItemIndex constituentItemIndex() const
70 {
71 return m_constituent_item_index;
72 }
73
74 //! Identifiant du composant
75 ARCCORE_HOST_DEVICE Int32 componentId() const
76 {
77 return m_shared_info->_componentId(m_constituent_item_index);
78 }
79
80 //! Indique s'il s'agit de la maille nulle.
81 inline ARCCORE_HOST_DEVICE constexpr bool null() const
82 {
83 return m_constituent_item_index.isNull();
84 }
85
86 /*!
87 * \brief Composant associé.
88 *
89 * Cet appel n'est valide que pour les mailles matériaux ou milieux. Si on souhaite
90 * un appel valide pour toutes les 'ComponentItem', il faut utiliser componentId().
91 */
92 inline IMeshComponent* component() const
93 {
94 return m_shared_info->_component(m_constituent_item_index);
95 }
96
97 //! Nombre de sous-composants.
98 ARCCORE_HOST_DEVICE Int32 nbSubItem() const
99 {
100 return m_shared_info->_nbSubConstituent(m_constituent_item_index);
101 }
102
103 //! Entité globale correspondante.
105 {
106 return m_shared_info->_globalItemBase(m_constituent_item_index);
107 }
108
109 inline ARCCORE_HOST_DEVICE constexpr Int32 level() const
110 {
111 return m_shared_info->m_level;
112 }
113
114 //! Numéro unique de l'entité component
115 inline Int64 componentUniqueId() const
116 {
117 return m_shared_info->_componentUniqueId(m_constituent_item_index);
118 }
119
120 public:
121
122 ARCCORE_HOST_DEVICE constexpr friend bool
123 operator==(const ConstituentItemBase& a, const ConstituentItemBase& b)
124 {
125 return ((a.m_constituent_item_index == b.m_constituent_item_index) && (a.m_shared_info == b.m_shared_info));
126 }
127 ARCCORE_HOST_DEVICE constexpr friend bool
128 operator!=(const ConstituentItemBase& a, const ConstituentItemBase& b)
129 {
130 return !(a == b);
131 }
132
133 private:
134
135 //! Positionne l'indexeur dans les variables matériaux.
136 ARCCORE_HOST_DEVICE inline void _setVariableIndex(MatVarIndex index)
137 {
138 m_shared_info->_setVarIndex(m_constituent_item_index, index);
139 }
140
141 //! Composant supérieur (0 si aucun)
142 ARCCORE_HOST_DEVICE inline matimpl::ConstituentItemBase _superItemBase() const;
143
144 ARCCORE_HOST_DEVICE inline void _setSuperAndGlobalItem(ConstituentItemIndex cii, ItemLocalId ii)
145 {
146 m_shared_info->_setSuperItem(m_constituent_item_index, cii);
147 m_shared_info->_setGlobalItem(m_constituent_item_index, ii);
148 }
149
150 ARCCORE_HOST_DEVICE inline void _setGlobalItem(ItemLocalId ii)
151 {
152 m_shared_info->_setGlobalItem(m_constituent_item_index, ii);
153 }
154
155 //! Première entité sous-composant.
156 inline ARCCORE_HOST_DEVICE ConstituentItemIndex _firstSubItemLocalId() const
157 {
158 return m_shared_info->_firstSubConstituentLocalId(m_constituent_item_index);
159 }
160
161 inline ARCCORE_HOST_DEVICE matimpl::ConstituentItemBase _subItemBase(Int32 i) const;
162
163 //! Positionne le nombre de sous-composants.
164 ARCCORE_HOST_DEVICE void _setNbSubItem(Int16 nb_sub_item)
165 {
166 m_shared_info->_setNbSubConstituent(m_constituent_item_index, nb_sub_item);
167 }
168
169 //! Positionne le premier sous-composant.
170 ARCCORE_HOST_DEVICE void _setFirstSubItem(ConstituentItemIndex first_sub_item)
171 {
172 m_shared_info->_setFirstSubConstituentLocalId(m_constituent_item_index, first_sub_item);
173 }
174
175 ARCCORE_HOST_DEVICE void _setComponent(Int16 component_id)
176 {
177 m_shared_info->_setComponentId(m_constituent_item_index, component_id);
178 }
179
180 private:
181
182 ConstituentItemIndex m_constituent_item_index;
183 ComponentItemSharedInfo* m_shared_info = ComponentItemSharedInfo::null_shared_info_pointer;
184};
185
186/*---------------------------------------------------------------------------*/
187/*---------------------------------------------------------------------------*/
188
189} // namespace Arcane::Materials::matimpl
190
191/*---------------------------------------------------------------------------*/
192/*---------------------------------------------------------------------------*/
193
194namespace Arcane::Materials
195{
196
197/*---------------------------------------------------------------------------*/
198/*---------------------------------------------------------------------------*/
199
200inline constexpr matimpl::ConstituentItemBase ComponentItemSharedInfo::
201_item(ConstituentItemIndex id)
202{
203 return matimpl::ConstituentItemBase(this,id);
204}
205
206ARCCORE_HOST_DEVICE inline matimpl::ConstituentItemBase ComponentItemSharedInfo::
207_superItemBase(ConstituentItemIndex id) const
208{
209 ARCCORE_CHECK_RANGE(id.localId(), -1, m_storage_size);
210 ConstituentItemIndex super_local_id(m_super_component_item_local_id_data[id.localId()]);
211 return m_super_component_item_shared_info->_item(super_local_id);
212}
213
214inline ARCCORE_HOST_DEVICE matimpl::ConstituentItemBase ComponentItemSharedInfo::
215_subItemBase(ConstituentItemIndex id,Int32 sub_index) const
216{
217 ARCCORE_CHECK_RANGE(id.localId(), -1, m_storage_size);
218 ConstituentItemIndex lid(m_first_sub_constituent_item_id_data[id.localId()].localId() + sub_index);
219 return m_sub_component_item_shared_info->_item(lid);
220}
221
222/*---------------------------------------------------------------------------*/
223/*---------------------------------------------------------------------------*/
224
225inline ARCCORE_HOST_DEVICE matimpl::ConstituentItemBase matimpl::ConstituentItemBase::
226_superItemBase() const
227{
228 return m_shared_info->_superItemBase(m_constituent_item_index);
229}
230
231inline ARCCORE_HOST_DEVICE matimpl::ConstituentItemBase matimpl::ConstituentItemBase::
232_subItemBase(Int32 i) const
233{
234 return m_shared_info->_subItemBase(m_constituent_item_index, i);
235}
236
237/*---------------------------------------------------------------------------*/
238/*---------------------------------------------------------------------------*/
239
240/*!
241 * \internal
242 * \brief Vue sur une instance de ConstituentItemLocalIdList.
243 *
244 * Les instances de ces classes sont notamment utilisées pour les énumérateurs
245 * sur les constituants.
246 */
247class ARCANE_CORE_EXPORT ConstituentItemLocalIdListView
248{
249 friend class ConstituentItemLocalIdList;
250 friend class ComponentItemVectorView;
251 friend class MeshComponentPartData;
252 friend class ComponentPartItemVectorView;
253 friend class ComponentPartCellEnumerator;
254 friend class ComponentCellEnumerator;
255 friend class MeshEnvironment;
256
257 private:
258
259 ConstituentItemLocalIdListView() = default;
260 ConstituentItemLocalIdListView(ComponentItemSharedInfo* shared_info,
261 ConstArrayView<ConstituentItemIndex> ids)
262 : m_component_shared_info(shared_info)
263 , m_ids(ids)
264 {
265#ifdef ARCANE_CHECK
266 _checkCoherency();
267#endif
268 }
269
270 private:
271
272 ARCCORE_HOST_DEVICE matimpl::ConstituentItemBase _constituenItemBase(Int32 index) const
273 {
274 return m_component_shared_info->_item(m_ids[index]);
275 }
276 MatVarIndex _matVarIndex(Int32 index) const
277 {
278 return m_component_shared_info->_varIndex(m_ids[index]);
279 }
280 ConstituentItemLocalIdListView _subView(Int32 begin, Int32 size) const
281 {
282 return { m_component_shared_info, m_ids.subView(begin, size) };
283 }
284 //! Pour les tests, vérifie que les vues pointent vers les mêmes données
285 bool _isSamePointerData(const ConstituentItemLocalIdListView& rhs) const
286 {
287 return (m_ids.data() == rhs.m_ids.data());
288 }
289 friend bool operator==(const ConstituentItemLocalIdListView& a,
290 const ConstituentItemLocalIdListView& b)
291 {
292 bool t1 = a.m_component_shared_info == b.m_component_shared_info;
293 bool t2 = a.m_ids == b.m_ids;
294 return (t1 && t2);
295 }
296 friend bool operator!=(const ConstituentItemLocalIdListView& a,
297 const ConstituentItemLocalIdListView& b)
298 {
299 return (!(a == b));
300 }
301
302 private:
303
304 // NOTE: Cette classe est wrappé directement en C#.
305 // Si on modifie les champs de cette classe il faut modifier le type correspondant
306 // dans le wrappeur.
307 ComponentItemSharedInfo* m_component_shared_info = nullptr;
308 ConstArrayView<ConstituentItemIndex> m_ids;
309
310 private:
311
312 void _checkCoherency() const;
313};
314
315/*---------------------------------------------------------------------------*/
316/*---------------------------------------------------------------------------*/
317
318} // End namespace Arcane::Materials
319
320/*---------------------------------------------------------------------------*/
321/*---------------------------------------------------------------------------*/
322
323#endif
Classe de base pour les entités du maillage.
Maille arcane avec info matériaux et milieux.
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.
__host__ __device__ MatVarIndex variableIndex() const
Indexeur dans les variables matériaux.
IMeshComponent * component() const
Composant associé.
__host__ __device__ constexpr bool null() const
Indique s'il s'agit de la maille nulle.
__host__ __device__ Int32 componentId() const
Identifiant du composant.
__host__ __device__ Int32 nbSubItem() const
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.