Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
core/materials/MatItemEnumerator.h
Aller à la documentation de ce fichier.
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/* MatItemEnumerator.h (C) 2000-2024 */
9/* */
10/* Enumérateurs sur les mailles materiaux. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_CORE_MATERIALS_MATITEMENUMERATOR_H
13#define ARCANE_CORE_MATERIALS_MATITEMENUMERATOR_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
22#include "arcane/utils/FatalErrorException.h"
23
24#include "arcane/core/materials/MatItem.h"
25#include "arcane/core/materials/IEnumeratorTracer.h"
26
27#include "arcane/EnumeratorTraceWrapper.h"
28
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
32#ifdef ARCANE_COMPONENT_arcane_materials
33#ifndef ARCANE_TRACE_ENUMERATOR
34#define ARCANE_TRACE_ENUMERATOR
35#endif
36#endif
37
38/*---------------------------------------------------------------------------*/
39/*---------------------------------------------------------------------------*/
40
41namespace Arcane::Materials
42{
43
44/*---------------------------------------------------------------------------*/
45/*---------------------------------------------------------------------------*/
46
47class MatCellVector;
48class EnvCellVector;
49class ComponentItemVector;
50class ComponentItemVectorView;
51class ComponentPartItemVectorView;
52class MatItemVectorView;
53class EnvItemVectorView;
54
55// Les 4 classes suivantes servent uniquement pour spécialiser
56// ComponentItemEnumeratorTraitsT
57class MatPartCell {};
58class EnvPartCell {};
61
62template<typename T> class ComponentItemEnumeratorTraitsT;
63
64/*---------------------------------------------------------------------------*/
65/*---------------------------------------------------------------------------*/
73class ARCANE_CORE_EXPORT AllEnvCellVectorView
74{
75 friend class MeshMaterialMng;
76
77 protected:
78
81 : m_local_ids(local_ids)
82 , m_shared_info(shared_info)
83 {
84 }
85
86 public:
87
89 constexpr ARCCORE_HOST_DEVICE Integer size() const { return m_local_ids.size(); }
90
91 // \i ème maille du vecteur
92 ARCCORE_HOST_DEVICE AllEnvCell operator[](Integer index) const
93 {
94 return AllEnvCell(m_shared_info->_item(ConstituentItemIndex(m_local_ids[index])));
95 }
96
97 // localId() de la \i ème maille du vecteur
98 ARCCORE_HOST_DEVICE Int32 localId(Integer index) const { return m_local_ids[index]; }
99
100 private:
101
102 Int32ConstArrayView m_local_ids;
103 ComponentItemSharedInfo* m_shared_info = nullptr;
104};
105
106/*---------------------------------------------------------------------------*/
107/*---------------------------------------------------------------------------*/
111class ARCANE_CORE_EXPORT ComponentCellEnumerator
112{
113 friend class EnumeratorTracer;
114
115 protected:
116
118
119 public:
120
121 static ComponentCellEnumerator create(IMeshComponent* component);
122 static ComponentCellEnumerator create(const ComponentItemVector& v);
124
125 public:
126
127 void operator++()
128 {
129 ++m_index;
130#ifdef ARCANE_CHECK
131 if (m_index<m_size)
132 _check();
133#endif
134 }
135 bool hasNext() const { return m_index<m_size; }
136
137 ComponentCell operator*() const
138 {
139 return ComponentCell(m_constituent_list_view._constituenItemBase(m_index));
140 }
141
142 Integer index() const { return m_index; }
143 MatVarIndex _varIndex() const { return m_matvar_indexes[m_index]; }
144
145 operator ComponentItemLocalId() const
146 {
147 return ComponentItemLocalId(m_matvar_indexes[m_index]);
148 }
149
150 protected:
151
152 Int32 _varArrayIndex() const { return m_matvar_indexes[m_index].arrayIndex(); }
153 Int32 _varValueIndex() const { return m_matvar_indexes[m_index].valueIndex(); }
154
155 protected:
156
157 void _check() const
158 {
159 MatVarIndex mvi = m_constituent_list_view._matVarIndex(m_index);
160 Int32 i_var_array_index = mvi.arrayIndex();
161 Int32 mv_array_index = _varArrayIndex();
163 ARCANE_FATAL("Bad 'var_array_index' in ComponentCell matvar='{0}' registered='{1}' index={2}",
164 mvi,m_matvar_indexes[m_index],m_index);
165 Int32 i_var_value_index = mvi.valueIndex();
166 Int32 mv_value_index = _varValueIndex();
168 ARCANE_FATAL("Bad 'var_value_index' for ComponentCell matvar='{0}' registered='{1}' index={2}",
169 mvi,m_matvar_indexes[m_index],m_index);
170 }
171
172 protected:
173
174 Int32 m_index;
175 Int32 m_size;
176 ConstituentItemLocalIdListView m_constituent_list_view;
177 ConstArrayView<MatVarIndex> m_matvar_indexes;
178 IMeshComponent* m_component;
179
180 protected:
181
182 matimpl::ConstituentItemBase _currentConstituentItemBase() const
183 {
184 return m_constituent_list_view._constituenItemBase(m_index);
185 }
186};
187
188/*---------------------------------------------------------------------------*/
189/*---------------------------------------------------------------------------*/
193class ARCANE_CORE_EXPORT MatCellEnumerator
195{
196 protected:
197
200 {
201 }
202
203 public:
204
205 static MatCellEnumerator create(IMeshMaterial* mat);
206 static MatCellEnumerator create(const MatCellVector& miv);
207 static MatCellEnumerator create(MatItemVectorView v);
208
209 public:
210
211 MatCell operator*() const
212 {
213#ifdef ARCANE_CHECK
214 _check();
215#endif
216 return MatCell(_currentConstituentItemBase());
217 }
218
219 private:
220};
221
222/*---------------------------------------------------------------------------*/
223/*---------------------------------------------------------------------------*/
227class ARCANE_CORE_EXPORT EnvCellEnumerator
229{
230 protected:
231
234 {
235 }
236
237 public:
238
239 static EnvCellEnumerator create(IMeshEnvironment* mat);
240 static EnvCellEnumerator create(const EnvCellVector& miv);
241 static EnvCellEnumerator create(EnvItemVectorView v);
242
243 public:
244
245 EnvCell operator*() const
246 {
247#ifdef ARCANE_CHECK
248 _check();
249#endif
250 return EnvCell(_currentConstituentItemBase());
251 }
252};
253
254/*---------------------------------------------------------------------------*/
255/*---------------------------------------------------------------------------*/
260class ARCANE_CORE_EXPORT ComponentPartCellEnumerator
261{
262 protected:
263
265
266 public:
267
270
271 public:
272
273 void operator++()
274 {
275 ++m_index;
276 }
277 bool hasNext() const { return m_index<m_size; }
278
279 MatVarIndex _varIndex() const { return MatVarIndex(m_var_idx,m_value_indexes[m_index]); }
280
281 operator ComponentItemLocalId() const
282 {
283 return ComponentItemLocalId(_varIndex());
284 }
285
286 ComponentCell operator*() const
287 {
288 return ComponentCell(m_constituent_list_view._constituenItemBase(m_item_indexes[m_index]));
289 }
290
291 protected:
292
293 Integer m_index;
294 Integer m_size;
295 Integer m_var_idx;
296 Integer m_base_index;
297 Int32ConstArrayView m_value_indexes;
298 Int32ConstArrayView m_item_indexes;
299 ConstituentItemLocalIdListView m_constituent_list_view;
300 IMeshComponent* m_component;
301
302 protected:
303
304 matimpl::ConstituentItemBase _currentConstituentItemBase() const
305 {
306 return m_constituent_list_view._constituenItemBase(m_item_indexes[m_index]);
307 }
308};
309
310/*---------------------------------------------------------------------------*/
311/*---------------------------------------------------------------------------*/
315class ARCANE_CORE_EXPORT MatPartCellEnumerator
317{
318 public:
320 public:
322 static MatPartCellEnumerator create(IMeshMaterial* mat,eMatPart part);
323 public:
324
325 MatCell operator*() const
326 {
327 return MatCell(_currentConstituentItemBase());
328 }
329};
330
331/*---------------------------------------------------------------------------*/
332/*---------------------------------------------------------------------------*/
336class ARCANE_CORE_EXPORT EnvPartCellEnumerator
338{
339 public:
341 public:
344 public:
345
346 EnvCell operator*() const
347 {
348 return EnvCell(_currentConstituentItemBase());
349 }
350};
351
352/*---------------------------------------------------------------------------*/
353/*---------------------------------------------------------------------------*/
357class ARCANE_CORE_EXPORT CellGenericEnumerator
358{
359 public:
360 static EnvCellEnumerator create(IMeshEnvironment* env);
361 static EnvCellEnumerator create(const EnvCellVector& ecv);
362 static EnvCellEnumerator create(EnvItemVectorView v);
363
364 static MatCellEnumerator create(IMeshMaterial* mat);
365 static MatCellEnumerator create(const MatCellVector& miv);
366 static MatCellEnumerator create(MatItemVectorView v);
367
368 static CellEnumerator create(CellVectorView v);
369 static CellEnumerator create(const CellGroup& v);
370};
371
372/*---------------------------------------------------------------------------*/
373/*---------------------------------------------------------------------------*/
377class ARCANE_CORE_EXPORT AllEnvCellEnumerator
378{
379 friend class EnumeratorTracer;
380 protected:
382 : m_index(0), m_size(items.size()), m_items(items) { }
383 public:
384 static AllEnvCellEnumerator create(AllEnvCellVectorView items);
385 static AllEnvCellEnumerator create(IMeshMaterialMng* mng,const CellGroup& group);
386 static AllEnvCellEnumerator create(IMeshMaterialMng* mng,const CellVectorView& view);
387 static AllEnvCellEnumerator create(IMeshBlock* block);
388 public:
389 void operator++() { ++m_index; }
390 bool hasNext() const { return m_index<m_size; }
391 AllEnvCell operator*() { return m_items[m_index]; }
392 Integer index() const { return m_index; }
393 public:
394 Integer m_index;
395 Integer m_size;
396 AllEnvCellVectorView m_items;
397};
398
399/*---------------------------------------------------------------------------*/
400/*---------------------------------------------------------------------------*/
404class ARCANE_CORE_EXPORT ComponentEnumerator
405{
406 friend class EnumeratorTracer;
407
408 public:
409
411
412 public:
413
414 bool hasNext() const { return m_index<m_size; }
415 void operator++() { ++m_index; }
416 IMeshComponent* operator*() const { return m_components[m_index]; }
417
418 private:
419
421 Integer m_index;
422 Integer m_size;
423};
424
425/*---------------------------------------------------------------------------*/
426/*---------------------------------------------------------------------------*/
430class ARCANE_CORE_EXPORT MatEnumerator
431{
432 public:
433
437
438 public:
439
440 bool hasNext() const { return m_index<m_size; }
441 void operator++() { ++m_index; }
442 IMeshMaterial* operator*() const { return m_mats[m_index]; }
443
444 private:
445
447 Integer m_index;
448 Integer m_size;
449};
450
451/*---------------------------------------------------------------------------*/
452/*---------------------------------------------------------------------------*/
456class ARCANE_CORE_EXPORT EnvEnumerator
457{
458 public:
459
463
464 public:
465
466 bool hasNext() const { return m_index<m_size; }
467 void operator++() { ++m_index; }
468 IMeshEnvironment* operator*() const { return m_envs[m_index]; }
469
470 private:
471
473 Integer m_index;
474 Integer m_size;
475};
476
477/*---------------------------------------------------------------------------*/
478/*---------------------------------------------------------------------------*/
479
480template<>
486template<>
492template<>
498template<>
504template<>
510template<>
516template<>
522
523/*---------------------------------------------------------------------------*/
524/*---------------------------------------------------------------------------*/
525
526#if defined(ARCANE_TRACE_ENUMERATOR)
527#define A_TRACE_COMPONENT(_EnumeratorClassName) \
528 ::Arcane::EnumeratorTraceWrapper< ::Arcane::Materials::_EnumeratorClassName, ::Arcane::Materials::IEnumeratorTracer >
529#else
530#define A_TRACE_COMPONENT(_EnumeratorClassName) \
531 ::Arcane::Materials::_EnumeratorClassName
532#endif
533
534#define A_ENUMERATE_COMPONENTCELL(_EnumeratorClassName,iname,...) \
535 for( A_TRACE_COMPONENT(_EnumeratorClassName) iname(Arcane::Materials::_EnumeratorClassName::create(__VA_ARGS__) A_TRACE_ENUMERATOR_WHERE); iname.hasNext(); ++iname )
536
537#define A_ENUMERATE_COMPONENT(_EnumeratorClassName,iname,container) \
538 for( A_TRACE_COMPONENT(_EnumeratorClassName) iname((::Arcane::Materials::_EnumeratorClassName)(container) A_TRACE_ENUMERATOR_WHERE); iname.hasNext(); ++iname )
539
540#define A_ENUMERATE_CELL_COMPONENTCELL(_EnumeratorClassName,iname,component_cell) \
541 for( ::Arcane::Materials::_EnumeratorClassName iname((::Arcane::Materials::_EnumeratorClassName)(component_cell)); iname.hasNext(); ++iname )
542
543/*---------------------------------------------------------------------------*/
544/*---------------------------------------------------------------------------*/
545
554#define ENUMERATE_COMPONENTITEM(enumerator_class_name,iname,...) \
555 A_ENUMERATE_COMPONENTCELL(ComponentItemEnumeratorTraitsT<enumerator_class_name>::EnumeratorType,iname,__VA_ARGS__)
556
557/*---------------------------------------------------------------------------*/
558/*---------------------------------------------------------------------------*/
559
570#define ENUMERATE_ALLENVCELL(iname,...) \
571 for( A_TRACE_COMPONENT(AllEnvCellEnumerator) iname( ::Arcane::Materials::AllEnvCellEnumerator::create(__VA_ARGS__) ); iname.hasNext(); ++iname )
572
579#define ENUMERATE_MATCELL(iname,mat) \
580 A_ENUMERATE_COMPONENTCELL(MatCellEnumerator,iname,mat)
581
588#define ENUMERATE_ENVCELL(iname,env) \
589 A_ENUMERATE_COMPONENTCELL(EnvCellEnumerator,iname,env)
590
597#define ENUMERATE_COMPONENTCELL(iname,component) \
598 A_ENUMERATE_COMPONENTCELL(ComponentCellEnumerator,iname,component)
599
607#define ENUMERATE_COMPONENT(icomponent,container) \
608 A_ENUMERATE_COMPONENT(ComponentEnumerator,icomponent,container)
609
619#define ENUMERATE_MAT(imat,container) \
620 A_ENUMERATE_COMPONENT(MatEnumerator,imat,container)
621
631#define ENUMERATE_ENV(ienv,container) \
632 A_ENUMERATE_COMPONENT(EnvEnumerator,ienv,container)
633
640#define ENUMERATE_CELL_COMPONENTCELL(iname,component_cell) \
641 A_ENUMERATE_CELL_COMPONENTCELL(CellComponentCellEnumerator,iname,component_cell)
642
649#define ENUMERATE_CELL_MATCELL(iname,env_cell) \
650 A_ENUMERATE_CELL_COMPONENTCELL(CellMatCellEnumerator,iname,env_cell)
651
658#define ENUMERATE_CELL_ENVCELL(iname,all_env_cell) \
659 A_ENUMERATE_CELL_COMPONENTCELL(CellEnvCellEnumerator,iname,all_env_cell)
660
661/*---------------------------------------------------------------------------*/
662/*---------------------------------------------------------------------------*/
663
672#define ENUMERATE_GENERIC_CELL(iname,mat_or_env_or_group) \
673 for( auto iname = ::Arcane::Materials::CellGenericEnumerator::create(mat_or_env_or_group); iname.hasNext(); ++iname )
674
675/*---------------------------------------------------------------------------*/
676/*---------------------------------------------------------------------------*/
677
678} // End namespace Arcane::Materials
679
680/*---------------------------------------------------------------------------*/
681/*---------------------------------------------------------------------------*/
682
683#endif
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Enumérateur SIMD sur une sous-partie (pure ou partielle) d'un sous-ensemble des mailles d'un composan...
Vue sur un tableau typé d'entités.
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.
constexpr ARCCORE_HOST_DEVICE Integer size() const
Nombre d'éléments.
Maille arcane avec info matériaux et milieux.
Enumérateur sur les mailles d'un milieu.
Enumérateur sur une partie des mailles d'un composant (matériau ou milieu)
Représente un composant d'une maille multi-matériau.
Index d'un Item matériaux dans une variable.
Informations partagées sur les 'ComponentItem'.
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.
Enumérateur sur les mailles d'un milieu.
Vecteur sur les entités d'un milieu.
Maille arcane d'un milieu.
Vue sur un vecteur sur les entités d'un milieu.
Enumérateur sur les entités pures ou impures d'un milieu.
Vue sur une partie pure ou partielles des entités d'un milieu.
Interface d'un bloc d'un maillage.
Interface d'un composant (matériau ou milieu) d'un maillage.
Interface du gestionnaire des matériaux et des milieux d'un maillage.
Interface d'un matériau d'un maillage.
Enumérateur sur une partie des mailles d'un seul matériau.
Vecteur sur les entités d'un matériau.
Représente un matériau d'une maille multi-matériau.
Vue sur un vecteur sur les entités d'un matériau.
Enumérateur les entités pures ou impures d'un matériau.
Vue sur une partie pure ou partielles des entités d'un matériau.
Représente un index sur les variables matériaux et milieux.
Implémentation d'un gestion des matériaux.
Informations générique sur une entité d'un constituant.
Vue constante d'un tableau de type T.
Active toujours les traces dans les parties Arcane concernant les matériaux.
eMatPart
Partie d'un composant.