Arcane  v3.15.0.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
ConstituentItemSharedInfo.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/* ConstituentItemSharedInfo.h (C) 2000-2024 */
9/* */
10/* Informations partagées pour les structures de 'ConstituentItem' */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_CORE_MATERIALS_CONSTITUENTITEMSHAREDINFO_H
13#define ARCANE_CORE_MATERIALS_CONSTITUENTITEMSHAREDINFO_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/core/ItemInternal.h"
18#include "arcane/core/Item.h"
19#include "arcane/core/materials/ConstituentItemLocalId.h"
20
21/*---------------------------------------------------------------------------*/
22/*---------------------------------------------------------------------------*/
23
24namespace Arcane::Materials
25{
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
36class ARCANE_CORE_EXPORT ConstituentItemIndex
37{
38 public:
39
40 ConstituentItemIndex() = default;
41 explicit ARCCORE_HOST_DEVICE constexpr ConstituentItemIndex(Int32 id)
42 : m_id(id)
43 {}
44 ARCCORE_HOST_DEVICE constexpr Int32 localId() const { return m_id; }
45 ARCCORE_HOST_DEVICE friend constexpr bool operator==(ConstituentItemIndex a,
47 {
48 return a.m_id == b.m_id;
49 }
50 ARCCORE_HOST_DEVICE friend constexpr bool operator!=(ConstituentItemIndex a,
52 {
53 return a.m_id != b.m_id;
54 }
55 ARCANE_CORE_EXPORT friend std::ostream&
56 operator<<(std::ostream& o, const ConstituentItemIndex& id);
57
58 ARCCORE_HOST_DEVICE constexpr bool isNull() const { return m_id == (-1); }
59
60 private:
61
62 Int32 m_id = -1;
63};
64
65/*---------------------------------------------------------------------------*/
66/*---------------------------------------------------------------------------*/
70class ARCANE_CORE_EXPORT ComponentItemSharedInfoStorageView
71{
72 // Les champs de cette classe sont des tableaux dont la taille est
73 // \a m_storage_size et qui peuvent être indexés par une entité nulle
74 // (ConstituentItemIndex==(-1)).
75 // Le conteneur est géré par ComponenItemInternalData.
76 // Seuls ComponentItemSharedInfo et ComponenItemInternalData
77 // doivent accéder aux champs de cette classe
78
79 // TODO: Utiliser stockage avec un seul élément pour le nullComponent
80
81 friend class ComponentItemInternalData;
83
84 private:
85
86 Int32 m_storage_size = 0;
88 ConstituentItemIndex* m_first_sub_constituent_item_id_data = nullptr;
90 Int16* m_component_id_data = nullptr;
92 Int16* m_nb_sub_constituent_item_data = nullptr;
94 Int32* m_global_item_local_id_data = nullptr;
96 ConstituentItemIndex* m_super_component_item_local_id_data = nullptr;
98 MatVarIndex* m_var_index_data = nullptr;
99};
100
101/*---------------------------------------------------------------------------*/
102/*---------------------------------------------------------------------------*/
113class ARCANE_CORE_EXPORT ConstituentItemSharedInfo
115{
121 friend ConstituentItem;
125
126 static const int MAT_INDEX_OFFSET = 10;
127
128 private:
129
132 static ComponentItemSharedInfo* null_shared_info_pointer;
133 static ComponentItemSharedInfo* _nullInstance() { return null_shared_info_pointer; }
134 static void _setNullInstance();
135
136 private:
137
138 inline constexpr matimpl::ConstituentItemBase _item(ConstituentItemIndex id);
139 inline ARCCORE_HOST_DEVICE ConstituentItemIndex _firstSubConstituentLocalId(ConstituentItemIndex id) const
140 {
141 ARCCORE_CHECK_RANGE(id.localId(), -1, m_storage_size);
142 return m_first_sub_constituent_item_id_data[id.localId()];
143 }
144 inline ARCCORE_HOST_DEVICE void
145 _setFirstSubConstituentLocalId(ConstituentItemIndex id, ConstituentItemIndex first_id)
146 {
147 ARCCORE_CHECK_RANGE(id.localId(), -1, m_storage_size);
148 m_first_sub_constituent_item_id_data[id.localId()] = first_id;
149 }
150 inline ARCCORE_HOST_DEVICE Int16 _nbSubConstituent(ConstituentItemIndex id) const
151 {
152 ARCCORE_CHECK_RANGE(id.localId(), -1, m_storage_size);
153 return m_nb_sub_constituent_item_data[id.localId()];
154 }
155 ARCCORE_HOST_DEVICE inline void _setNbSubConstituent(ConstituentItemIndex id, Int16 n)
156 {
157 ARCCORE_CHECK_RANGE(id.localId(), -1, m_storage_size);
158 m_nb_sub_constituent_item_data[id.localId()] = n;
159 }
160 inline ARCCORE_HOST_DEVICE Int16 _componentId(ConstituentItemIndex id) const
161 {
162 ARCCORE_CHECK_RANGE(id.localId(), -1, m_storage_size);
163 return m_component_id_data[id.localId()];
164 }
165 ARCCORE_HOST_DEVICE inline void _setComponentId(ConstituentItemIndex id, Int16 component_id)
166 {
167 ARCCORE_CHECK_RANGE(id.localId(), -1, m_storage_size);
168 m_component_id_data[id.localId()] = component_id;
169 }
170 IMeshComponent* _component(ConstituentItemIndex id) const
171 {
172 return m_components[_componentId(id)];
173 }
174 impl::ItemBase _globalItemBase(ConstituentItemIndex id) const
175 {
176 ARCCORE_CHECK_RANGE(id.localId(), -1, m_storage_size);
177 return impl::ItemBase(m_global_item_local_id_data[id.localId()], m_item_shared_info);
178 }
179 ARCCORE_HOST_DEVICE Int32 _globalItemId(ConstituentItemIndex id) const
180 {
181 ARCCORE_CHECK_RANGE(id.localId(), -1, m_storage_size);
182 return m_global_item_local_id_data[id.localId()];
183 }
184 ARCCORE_HOST_DEVICE void _setGlobalItem(ConstituentItemIndex id, ItemLocalId global_item_lid)
185 {
186 ARCCORE_CHECK_RANGE(id.localId(), -1, m_storage_size);
187 m_global_item_local_id_data[id.localId()] = global_item_lid.localId();
188 }
189 ARCCORE_HOST_DEVICE inline matimpl::ConstituentItemBase _superItemBase(ConstituentItemIndex id) const;
190
191 ARCCORE_HOST_DEVICE void _setSuperItem(ConstituentItemIndex id, ConstituentItemIndex super_id)
192 {
193 ARCCORE_CHECK_RANGE(id.localId(), -1, m_storage_size);
194 m_super_component_item_local_id_data[id.localId()] = super_id;
195 }
196 inline ARCCORE_HOST_DEVICE matimpl::ConstituentItemBase _subItemBase(ConstituentItemIndex id, Int32 sub_index) const;
197
198 ARCCORE_HOST_DEVICE MatVarIndex _varIndex(ConstituentItemIndex id)
199 {
200 ARCCORE_CHECK_RANGE(id.localId(), -1, m_storage_size);
201 return m_var_index_data[id.localId()];
202 }
203 ARCCORE_HOST_DEVICE void _setVarIndex(ConstituentItemIndex id, MatVarIndex mv_index)
204 {
205 ARCCORE_CHECK_RANGE(id.localId(), -1, m_storage_size);
206 m_var_index_data[id.localId()] = mv_index;
207 }
208
211 {
212 // TODO: Vérifier que arrayIndex() ne dépasse pas (1<<MAT_INDEX_OFFSET)
213 impl::ItemBase item_base(_globalItemBase(id));
214 return (Int64)m_var_index_data[id.localId()].arrayIndex() + ((Int64)item_base.uniqueId() << MAT_INDEX_OFFSET);
215 }
216
217 ARCCORE_HOST_DEVICE void _reset(ConstituentItemIndex id)
218 {
219 Int32 local_id = id.localId();
220 ARCCORE_CHECK_RANGE(local_id, -1, m_storage_size);
221
222 m_var_index_data[local_id].reset();
223 m_first_sub_constituent_item_id_data[local_id] = {};
224 m_nb_sub_constituent_item_data[local_id] = 0;
225 m_component_id_data[local_id] = -1;
226 m_global_item_local_id_data[local_id] = NULL_ITEM_LOCAL_ID;
227 m_super_component_item_local_id_data[local_id] = {};
228 }
229
230 private:
231
232 // NOTE : Cette classe est partagée avec le wrapper C#
233 // Toute modification de la structure interne doit être reportée
234 // dans la structure C# correspondante
235 ItemSharedInfo* m_item_shared_info = ItemSharedInfo::nullInstance();
236 Int16 m_level = (-1);
237 ConstArrayView<IMeshComponent*> m_components;
238 ComponentItemSharedInfo* m_super_component_item_shared_info = null_shared_info_pointer;
239 ComponentItemSharedInfo* m_sub_component_item_shared_info = null_shared_info_pointer;
240};
241
242/*---------------------------------------------------------------------------*/
243/*---------------------------------------------------------------------------*/
244
245} // End namespace Arcane::Materials
246
247/*---------------------------------------------------------------------------*/
248/*---------------------------------------------------------------------------*/
249
250#include "arcane/core/materials/ConstituentItemBase.h"
251
252/*---------------------------------------------------------------------------*/
253/*---------------------------------------------------------------------------*/
254
255#endif
Classe de base pour les entités du maillage.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:149
Vue sur une liste de mailles avec infos sur les milieux.
Enumérateur sur les constituants d'une maille.
Gestion des listes de 'ComponentItemInternal'.
Conteneur pour les données des constituants.
Index d'une entité constituant dans la liste des entités constituants.
Vue sur une instance de ConstituentItemLocalIdList.
Liste d'indices locaux pour les 'ComponentItemInternal'.
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.
Implémentation de ComponentItemVector.
Représente un composant d'une maille multi-matériau.
Représente un index sur les variables matériaux et milieux.
Informations génériques sur une entité d'un constituant.
Active toujours les traces dans les parties Arcane concernant les matériaux.