Arcane  v4.1.1.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
MeshEnvironment.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 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/* MeshEnvironment.cc (C) 2000-2025 */
9/* */
10/* Milieu d'un maillage. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/NotImplementedException.h"
15#include "arcane/utils/ITraceMng.h"
16#include "arcane/utils/FunctorUtils.h"
17#include "arcane/utils/ArgumentException.h"
18#include "arcane/utils/PlatformUtils.h"
20#include "arcane/utils/ArraySimdPadder.h"
21
22#include "arcane/core/IMesh.h"
23#include "arcane/core/IItemFamily.h"
24#include "arcane/core/VariableBuildInfo.h"
25#include "arcane/core/ItemGroupObserver.h"
26#include "arcane/core/internal/ItemGroupImplInternal.h"
27#include "arcane/core/materials/internal/IMeshMaterialVariableInternal.h"
28#include "arcane/core/materials/internal/IMeshMaterialMngInternal.h"
29
30#include "arcane/materials/IMeshMaterialMng.h"
31#include "arcane/materials/MatItemEnumerator.h"
32#include "arcane/materials/ComponentItemVectorView.h"
33#include "arcane/materials/IMeshMaterialVariable.h"
34#include "arcane/materials/ComponentPartItemVectorView.h"
35
36#include "arcane/materials/internal/MeshEnvironment.h"
37#include "arcane/materials/internal/MeshMaterial.h"
38#include "arcane/materials/internal/ComponentItemListBuilder.h"
39#include "arcane/materials/internal/ComponentItemInternalData.h"
40#include "arcane/materials/internal/ConstituentConnectivityList.h"
41#include "arcane/materials/internal/ConstituentItemVectorImpl.h"
42#include "arcane/materials/internal/MeshComponentPartData.h"
43
44#include "arcane/accelerator/RunQueue.h"
45#include "arcane/accelerator/RunCommandLoop.h"
46#include "arcane/accelerator/Scan.h"
47#include "arcane/accelerator/SpanViews.h"
48
49/*---------------------------------------------------------------------------*/
50/*---------------------------------------------------------------------------*/
51
52namespace Arcane::Materials
53{
54
55/*---------------------------------------------------------------------------*/
56/*---------------------------------------------------------------------------*/
57
58class MeshEnvironmentObserver
59: public TraceAccessor
60, public IItemGroupObserver
61{
62 public:
63
64 MeshEnvironmentObserver(MeshEnvironment* env, ITraceMng* tm)
65 : TraceAccessor(tm)
66 , m_environment(env)
67 {}
68
69 public:
70
71 void executeExtend(const Int32ConstArrayView* info1) override
72 {
73 if (info1) {
74 //info(4) << "EXTEND_ENV " << m_environment->name() << " ids=" << (*info1);
75 if (m_environment->materialMng()->isInMeshMaterialExchange())
76 info() << "EXTEND_ENV_IN_LOADBALANCE " << m_environment->name()
77 << " ids=" << (*info1);
78 }
79 }
80 void executeReduce(const Int32ConstArrayView* info1) override
81 {
82 if (info1) {
83 //info(4) << "REDUCE_ENV " << m_environment->name() << " ids=" << (*info1);
84 if (m_environment->materialMng()->isInMeshMaterialExchange())
85 info() << "REDUCE_ENV_IN_LOADBALANCE " << m_environment->name()
86 << " ids=" << (*info1);
87 }
88 }
89 void executeCompact(const Int32ConstArrayView* info1) override
90 {
91 info(4) << "COMPACT_ENV " << m_environment->name();
92 if (!info1)
93 ARCANE_FATAL("No info available");
94 Int32ConstArrayView old_to_new_ids(*info1);
95 m_environment->notifyLocalIdsChanged(old_to_new_ids);
96 }
97 void executeInvalidate() override
98 {
99 info() << "WARNING: invalidate() is invalid on an environment group! partial values may be corrupted"
100 << " env=" << m_environment->name();
101 }
102 bool needInfo() const override { return true; }
103
104 private:
105
106 MeshEnvironment* m_environment;
107};
108
109/*---------------------------------------------------------------------------*/
110/*---------------------------------------------------------------------------*/
111
112/*---------------------------------------------------------------------------*/
113/*---------------------------------------------------------------------------*/
114
115MeshEnvironment::
116MeshEnvironment(IMeshMaterialMng* mm, const String& name, Int16 env_id)
117: TraceAccessor(mm->traceMng())
118, m_material_mng(mm)
119, m_data(this, name, env_id, mm->_internalApi()->componentItemSharedInfo(LEVEL_ENVIRONMENT), false)
120, m_non_const_this(this)
121, m_internal_api(this)
122{
123}
124
125/*---------------------------------------------------------------------------*/
126/*---------------------------------------------------------------------------*/
127
128/*---------------------------------------------------------------------------*/
129/*---------------------------------------------------------------------------*/
130
132build()
133{
134 IMesh* mesh = m_material_mng->mesh();
135 IItemFamily* cell_family = mesh->cellFamily();
136 String group_name = m_material_mng->name() + "_" + name();
137 CellGroup cells = cell_family->findGroup(group_name, true);
138 cells._internalApi()->setAsConstituentGroup();
139
140 if (m_material_mng->isMeshModificationNotified()) {
141 m_group_observer = new MeshEnvironmentObserver(this, traceMng());
142 cells.internal()->attachObserver(this, m_group_observer);
143 }
144
145 m_data._setItems(cells);
146}
147
148/*---------------------------------------------------------------------------*/
149/*---------------------------------------------------------------------------*/
150
151void MeshEnvironment::
152addMaterial(MeshMaterial* mm)
153{
154 m_materials.add(mm);
155 m_true_materials.add(mm);
156}
157
158/*---------------------------------------------------------------------------*/
159/*---------------------------------------------------------------------------*/
160
161void MeshEnvironment::
162setVariableIndexer(MeshMaterialVariableIndexer* idx)
163{
164 m_data._setVariableIndexer(idx);
165 idx->setCells(m_data.items());
166 idx->setIsEnvironment(true);
167
168 // S'il n'y qu'un matériau, le variable indexer de ce matériau est
169 // aussi 'idx' mais avec un autre groupe associé. Pour que tout soit
170 // cohérent, il faut être sur que ce matériau a aussi le même groupe.
171 // TODO: pour garantir la cohérence, il faudrait supprimer
172 // dans m_data le groupe d'entité.
173 if (m_true_materials.size() == 1)
174 m_true_materials[0]->componentData()->_setItems(m_data.items());
175 m_data._buildPartData();
176 for (MeshMaterial* mat : m_true_materials)
177 mat->componentData()->_buildPartData();
178}
179
180/*---------------------------------------------------------------------------*/
181/*---------------------------------------------------------------------------*/
182
185{
186 info(4) << "ComputeNbMatPerCell env=" << name();
187 Integer nb_mat = m_materials.size();
188 Integer total = 0;
189 for (Integer i = 0; i < nb_mat; ++i) {
190 IMeshMaterial* mat = m_materials[i];
191 CellGroup mat_cells = mat->cells();
192 total += mat_cells.size();
193 }
194 m_total_nb_cell_mat = total;
195}
196
197/*---------------------------------------------------------------------------*/
198/*---------------------------------------------------------------------------*/
208{
209 info(4) << "Compute (V2) indexes for environment name=" << name();
210 const bool is_mono_mat = isMonoMaterial();
211 if (is_mono_mat) {
212 _computeMaterialIndexesMonoMat(item_internal_data, queue);
213 }
214 else
215 _computeMaterialIndexes(item_internal_data, queue);
216}
217
218/*---------------------------------------------------------------------------*/
219/*---------------------------------------------------------------------------*/
220
221void MeshEnvironment::
222_computeMaterialIndexes(ComponentItemInternalData* item_internal_data, RunQueue& queue)
223{
224 IItemFamily* cell_family = cells().itemFamily();
225 Integer max_local_id = cell_family->maxLocalId();
226
227 ComponentItemInternalRange mat_items_internal_range = m_mat_internal_data_range;
228
230 cells_index.resize(max_local_id);
232 cells_pos.resize(max_local_id);
233
234 // TODO: regarder comment supprimer ce tableau cells_env qui n'est normalement pas utile
235 // car on doit pouvoir directement utiliser les m_items_internal
237 cells_env.resize(max_local_id);
238
239 Int32ConstArrayView local_ids = variableIndexer()->localIds();
240 ConstituentItemLocalIdListView constituent_item_list_view = m_data.constituentItemListView();
241 const bool do_old = false;
242 if (do_old) {
243 Integer cell_index = 0;
244 for (Integer z = 0, nb = local_ids.size(); z < nb; ++z) {
245 Int32 lid = local_ids[z];
246 matimpl::ConstituentItemBase env_item = constituent_item_list_view._constituenItemBase(z);
247 Int32 nb_mat = env_item.nbSubItem();
248 cells_index[lid] = cell_index;
249 cell_index += nb_mat;
250 }
251 }
252 else {
253 // Calcul l'indice de la première MatCell pour chaque Cell.
254 Int32 nb_id = local_ids.size();
255 {
256 Accelerator::GenericScanner scanner(queue);
257 auto cells_index_view = viewOut(queue, cells_index);
258
259 auto getter = [=] ARCCORE_HOST_DEVICE(Int32 index) -> Int32 {
260 return constituent_item_list_view._constituenItemBase(index).nbSubItem();
261 };
262 auto setter = [=] ARCCORE_HOST_DEVICE(Int32 index, Int32 value) {
263 Int32 lid = local_ids[index];
264 cells_index_view[lid] = value;
265 };
266 Accelerator::ScannerSumOperator<Int32> op;
267 scanner.applyWithIndexExclusive(nb_id, 0, getter, setter, op, A_FUNCINFO);
268 }
269 }
270 {
271 auto command = makeCommand(queue);
272 auto cells_env_view = viewOut(command, cells_env);
273 auto cells_index_view = viewIn(command, cells_index);
274 auto cells_pos_view = viewOut(command, cells_pos);
275 Int32 nb_id = local_ids.size();
276 command << RUNCOMMAND_LOOP1(iter, nb_id)
277 {
278 auto [z] = iter();
279 Int32 lid = local_ids[z];
280 matimpl::ConstituentItemBase env_item = constituent_item_list_view._constituenItemBase(z);
281 Int32 nb_mat = env_item.nbSubItem();
282 Int32 cell_index = cells_index_view[lid];
283 cells_pos_view[lid] = cell_index;
284 if (nb_mat != 0) {
285 env_item._setFirstSubItem(mat_items_internal_range[cell_index]);
286 }
287 cells_env_view[lid] = env_item.constituentItemIndex();
288 };
289 }
290 {
291 Integer nb_mat = m_true_materials.size();
292 ComponentItemInternalRange mat_item_internal_range = m_mat_internal_data_range;
293 for (Integer i = 0; i < nb_mat; ++i) {
294 MeshMaterial* mat = m_true_materials[i];
295 Int16 mat_id = mat->componentId();
296 const MeshMaterialVariableIndexer* var_indexer = mat->variableIndexer();
297 CellGroup mat_cells = mat->cells();
298 info(4) << "COMPUTE (V2) mat_cells mat=" << mat->name() << " nb_cell=" << mat_cells.size()
299 << " mat_id=" << mat_id << " index=" << var_indexer->index() << " is_async=" << queue.isAsync();
300
301 mat->resizeItemsInternal(var_indexer->nbItem());
302
303 auto command = makeCommand(queue);
304 auto matvar_indexes = viewIn(command, var_indexer->matvarIndexes());
305 auto local_ids = viewIn(command, var_indexer->localIds());
306 SmallSpan<Int32> cells_pos_view(cells_pos);
307 auto cells_env_view = viewIn(command, cells_env);
308 ComponentItemSharedInfo* mat_shared_info = item_internal_data->matSharedInfo();
309 SmallSpan<ConstituentItemIndex> mat_id_list = mat->componentData()->m_constituent_local_id_list.mutableLocalIds();
310 const Int32 nb_id = local_ids.size();
311 Span<Int32> mat_cells_local_id = mat_cells._internalApi()->itemsLocalId();
312 command << RUNCOMMAND_LOOP1(iter, nb_id)
313 {
314 auto [z] = iter();
315 MatVarIndex mvi = matvar_indexes[z];
316 Int32 lid = local_ids[z];
317 Int32 pos = cells_pos_view[lid];
318 ++cells_pos_view[lid];
319 ConstituentItemIndex cii = mat_item_internal_range[pos];
320 matimpl::ConstituentItemBase ref_ii(mat_shared_info, cii);
321 mat_id_list[z] = cii;
322 ref_ii._setSuperAndGlobalItem(cells_env_view[lid], ItemLocalId(lid));
323 ref_ii._setComponent(mat_id);
324 ref_ii._setVariableIndex(mvi);
325 // Le rang 0 met à jour le padding SIMD du groupe associé au matériau
326 if (z == 0)
327 ArraySimdPadder::applySimdPaddingView(mat_cells_local_id);
328 };
329 mat_cells._internalApi()->notifySimdPaddingDone();
330 }
331 }
332 // La RunQueue est asynchrone. Cette barrière est nécessaire pour éviter une
333 // erreur si on utilise le pool mémoire.
334 queue.barrier();
335}
336
337/*---------------------------------------------------------------------------*/
338/*---------------------------------------------------------------------------*/
346{
347 ConstituentItemLocalIdListView constituent_item_list_view = m_data.constituentItemListView();
348
349 MeshMaterial* mat = m_true_materials[0];
350 const Int16 mat_id = mat->componentId();
351 const MeshMaterialVariableIndexer* var_indexer = mat->variableIndexer();
352 CellGroup mat_cells = mat->cells();
353 info(4) << "COMPUTE (V2) mat_cells mat=" << mat->name() << " nb_cell=" << mat_cells.size()
354 << " mat_id=" << mat_id << " index=" << var_indexer->index();
355
356 mat->resizeItemsInternal(var_indexer->nbItem());
357
358 auto command = makeCommand(queue);
359 auto matvar_indexes = viewIn(command, var_indexer->matvarIndexes());
360 auto local_ids = viewIn(command, var_indexer->localIds());
361 ComponentItemSharedInfo* mat_shared_info = item_internal_data->matSharedInfo();
362 ComponentItemInternalRange mat_item_internal_range = m_mat_internal_data_range;
363 SmallSpan<ConstituentItemIndex> mat_id_list = mat->componentData()->m_constituent_local_id_list.mutableLocalIds();
364 const Int32 nb_id = local_ids.size();
365 Span<Int32> mat_cells_local_id = mat_cells._internalApi()->itemsLocalId();
366 command << RUNCOMMAND_LOOP1(iter, nb_id)
367 {
368 auto [z] = iter();
369 MatVarIndex mvi = matvar_indexes[z];
370 const Int32 lid = local_ids[z];
371 const Int32 pos = z;
372 matimpl::ConstituentItemBase env_item = constituent_item_list_view._constituenItemBase(z);
373 ConstituentItemIndex cii = mat_item_internal_range[pos];
374 env_item._setFirstSubItem(cii);
375
376 matimpl::ConstituentItemBase ref_ii(mat_shared_info, cii);
377 mat_id_list[z] = cii;
378 ref_ii._setSuperAndGlobalItem(env_item.constituentItemIndex(), ItemLocalId(lid));
379 ref_ii._setComponent(mat_id);
380 ref_ii._setVariableIndex(mvi);
381 // Le rang 0 met à jour le padding SIMD du groupe associé au matériau
382 if (z == 0)
383 ArraySimdPadder::applySimdPaddingView(mat_cells_local_id);
384 };
385 mat_cells._internalApi()->notifySimdPaddingDone();
386}
387
388/*---------------------------------------------------------------------------*/
389/*---------------------------------------------------------------------------*/
396{
397 info(4) << "ComputeItemListForMaterials (V2)";
398 ConstArrayView<Int16> nb_env_per_cell = connectivity_list.cellsNbEnvironment();
399 const Int16 env_id = componentId();
400 // Calcul pour chaque matériau le nombre de mailles mixtes
401 // TODO: a faire dans MeshMaterialVariableIndexer
402 for (MeshMaterial* mat : m_true_materials) {
403 MeshMaterialVariableIndexer* var_indexer = mat->variableIndexer();
404 CellGroup cells = var_indexer->cells();
405 Integer var_nb_cell = cells.size();
406
407 ComponentItemListBuilderOld list_builder(var_indexer, 0);
408
409 info(4) << "MAT_INDEXER mat=" << mat->name() << " NB_CELL=" << var_nb_cell << " name=" << cells.name();
410 ENUMERATE_CELL (icell, cells) {
411 Int32 lid = icell.itemLocalId();
412 // On ne prend l'indice global que si on est le seul matériau et le seul
413 // milieu de la maille. Sinon, on prend un indice multiple
414 if (nb_env_per_cell[lid] > 1 || connectivity_list.cellNbMaterial(icell, env_id) > 1)
415 list_builder.addPartialItem(lid);
416 else
417 list_builder.addPureItem(lid);
418 }
419
420 if (traceMng()->verbosityLevel() >= 5)
421 info() << "MAT_NB_MULTIPLE_CELL (V2) mat=" << var_indexer->name()
422 << " nb_in_global=" << list_builder.pureMatVarIndexes().size()
423 << " (ids=" << list_builder.pureMatVarIndexes() << ")"
424 << " nb_in_multiple=" << list_builder.partialMatVarIndexes().size()
425 << " (ids=" << list_builder.partialLocalIds() << ")";
426 var_indexer->endUpdate(list_builder);
427 }
428}
429
430/*---------------------------------------------------------------------------*/
431/*---------------------------------------------------------------------------*/
432
433void MeshEnvironment::
434notifyLocalIdsChanged(Int32ConstArrayView old_to_new_ids)
435{
436 // NOTE:
437 // Cette méthode est appelée lorsqu'il y a un compactage du maillage
438 // et le groupe d'entité associé à ce milieu vient d'être compacté.
439 // Comme actuellement il n'y a pas d'observeurs pour l'ajout
440 // ou la suppression de mailles du groupe, il est possible
441 // lorsque cette méthode est appelée que les infos des milieux et
442 // matériaux ne soient pas à jour (par exemple, la liste des local_ids
443 // du m_variable_indexer n'a pas les mêmes valeurs que cells().
444 // Pour l'instant ce n'est pas très grave car tout est écrasé après
445 // chaque modif sur un matériau ou un milieu.
446 // A terme, il faudra prendre cela en compte lorsque l'ajout
447 // où la suppression de mailles matériaux sera optimisée.
448 info(4) << "Changing (V3) local ids references env=" << name();
449 info(4) << "CurrentCells name=" << cells().name()
450 << " n=" << cells().view().localIds().size();
451 info(4) << "MatVarIndex name=" << cells().name()
452 << " n=" << variableIndexer()->matvarIndexes().size();
453 Integer nb_mat = m_true_materials.size();
454 info(4) << "NotifyLocalIdsChanged env=" << name() << " nb_mat=" << nb_mat
455 << " old_to_new_ids.size=" << old_to_new_ids.size();
456
457 // Si le milieu n'a qu'un seul matériau, ils partagent le même variable_indexer
458 // donc il ne faut changer les ids qu'une seule fois. Par contre, le
459 // tableau m_items_internal n'est pas partagé entre le matériau
460 // et le milieu donc il faut recalculer les infos séparément.
461 // Il faut le faire pour le milieu avant de mettre à jour les infos du matériau car
462 // une fois ceci fait la valeur m_variable_indexer->m_local_ids_in_indexes_view
463 // aura changé et il ne sera plus possible de déterminer la correspondance
464 // entre les nouveaux et les anciens localId
465
466 if (nb_mat == 1) {
467 m_data._changeLocalIdsForInternalList(old_to_new_ids);
468 MeshMaterial* true_mat = m_true_materials[0];
469 _changeIds(true_mat->componentData(), old_to_new_ids);
470 }
471 else {
472 // Change les infos des matériaux
473 for (Integer i = 0; i < nb_mat; ++i) {
474 MeshMaterial* true_mat = m_true_materials[i];
475 info(4) << "ChangeIds MAT i=" << i << " MAT=" << true_mat->name();
476 _changeIds(true_mat->componentData(), old_to_new_ids);
477 }
478 // Change les infos du milieu
479 _changeIds(componentData(), old_to_new_ids);
480 }
481
482 // Reconstruit les infos sur les mailles pures et mixtes.
483 // Il faut le faire une fois que tous les valeurs sont à jour.
484 {
485 RunQueue& queue = m_material_mng->_internalApi()->runQueue();
486 for (Integer i = 0; i < nb_mat; ++i) {
487 MeshMaterial* true_mat = m_true_materials[i];
488 true_mat->componentData()->_rebuildPartData(queue);
489 }
490 componentData()->_rebuildPartData(queue);
491 }
492
493 checkValid();
494}
495
496/*---------------------------------------------------------------------------*/
497/*---------------------------------------------------------------------------*/
498
499void MeshEnvironment::
500_changeIds(MeshComponentData* cdata, Int32ConstArrayView old_to_new_ids)
501{
502 info(4) << "ChangeIds() (V4) for name=" << cdata->name();
503 info(4) << "Use new version for ChangeIds()";
504
505 cdata->_changeLocalIdsForInternalList(old_to_new_ids);
506 cdata->variableIndexer()->changeLocalIds(old_to_new_ids);
507}
508
509/*---------------------------------------------------------------------------*/
510/*---------------------------------------------------------------------------*/
511
513findEnvCell(AllEnvCell c) const
514{
515 Int32 env_id = m_data.componentId();
516 ENUMERATE_CELL_ENVCELL (ienvcell, c) {
517 EnvCell ec = *ienvcell;
518 Int32 eid = ec.environmentId();
519 if (eid == env_id)
520 return ec;
521 }
522 return EnvCell();
523}
524
525/*---------------------------------------------------------------------------*/
526/*---------------------------------------------------------------------------*/
527
528ComponentCell MeshEnvironment::
530{
531 return findEnvCell(c);
532}
533
534/*---------------------------------------------------------------------------*/
535/*---------------------------------------------------------------------------*/
536
538envView() const
539{
540 return { m_non_const_this, variableIndexer()->matvarIndexes(),
541 constituentItemListView(), variableIndexer()->localIds() };
542}
543
544/*---------------------------------------------------------------------------*/
545/*---------------------------------------------------------------------------*/
546
548view() const
549{
550 return envView();
551}
552
553/*---------------------------------------------------------------------------*/
554/*---------------------------------------------------------------------------*/
555
556void MeshEnvironment::
557resizeItemsInternal(Integer nb_item)
558{
559 m_data._resizeItemsInternal(nb_item);
560}
561
562/*---------------------------------------------------------------------------*/
563/*---------------------------------------------------------------------------*/
564
566pureItems() const
567{
568 return m_data._partData()->pureView();
569}
570
571/*---------------------------------------------------------------------------*/
572/*---------------------------------------------------------------------------*/
573
575impureItems() const
576{
577 return m_data._partData()->impureView();
578}
579
580/*---------------------------------------------------------------------------*/
581/*---------------------------------------------------------------------------*/
582
584partItems(eMatPart part) const
585{
586 return m_data._partData()->partView(part);
587}
588
589/*---------------------------------------------------------------------------*/
590/*---------------------------------------------------------------------------*/
591
593pureEnvItems() const
594{
595 return { m_non_const_this, m_data._partData()->pureView() };
596}
597
598/*---------------------------------------------------------------------------*/
599/*---------------------------------------------------------------------------*/
600
602impureEnvItems() const
603{
604 return { m_non_const_this, m_data._partData()->impureView() };
605}
606
607/*---------------------------------------------------------------------------*/
608/*---------------------------------------------------------------------------*/
609
611partEnvItems(eMatPart part) const
612{
613 return { m_non_const_this, m_data._partData()->partView(part) };
614}
615
616/*---------------------------------------------------------------------------*/
617/*---------------------------------------------------------------------------*/
618
621{
622 if (!arcaneIsCheck())
623 return;
624
625 m_data.checkValid();
626
627 for (IMeshMaterial* mat : m_materials) {
628 mat->checkValid();
629 }
630}
631
632/*---------------------------------------------------------------------------*/
633/*---------------------------------------------------------------------------*/
634
636isMonoMaterial() const
637{
638 bool is_mono_mat = (nbMaterial() == 1 && (cells().size() == totalNbCellMat()));
639 return is_mono_mat;
640}
641
642/*---------------------------------------------------------------------------*/
643/*---------------------------------------------------------------------------*/
644
650
651/*---------------------------------------------------------------------------*/
652/*---------------------------------------------------------------------------*/
653
660
661/*---------------------------------------------------------------------------*/
662/*---------------------------------------------------------------------------*/
663
670
671/*---------------------------------------------------------------------------*/
672/*---------------------------------------------------------------------------*/
673
674} // End namespace Arcane::Materials
675
676/*---------------------------------------------------------------------------*/
677/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
#define ENUMERATE_CELL(name, group)
Enumérateur générique d'un groupe de mailles.
Fonctions de gestion mémoire et des allocateurs.
#define RUNCOMMAND_LOOP1(iter_name, x1,...)
Boucle 1D sur accélérateur avec arguments supplémentaires.
bool isAsync() const
Indique si la file d'exécution est asynchrone.
Definition RunQueue.cc:320
void barrier() const
Bloque tant que toutes les commandes associées à la file ne sont pas terminées.
Definition RunQueue.cc:159
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Interface d'une famille d'entités.
Definition IItemFamily.h:84
virtual ItemGroup findGroup(const String &name) const =0
Recherche un groupe.
virtual Int32 maxLocalId() const =0
Interface du gestionnaire de traces.
void notifySimdPaddingDone()
Indique que le padding SIMD des entités à été effectué
SmallSpan< Int32 > itemsLocalId()
Liste des localId() des entités du groupe.
const String & name() const
Nom du groupe.
Definition ItemGroup.h:76
ItemVectorView view() const
Vue sur les entités du groupe.
Definition ItemGroup.cc:583
Integer size() const
Nombre d'éléments du groupe.
Definition ItemGroup.h:88
IItemFamily * itemFamily() const
Famille d'entité à laquelle appartient ce groupe (0 pour le group nul)
Definition ItemGroup.h:123
ItemGroupImplInternal * _internalApi() const
API interne à Arcane.
Definition ItemGroup.cc:646
Index d'un Item dans une variable.
Definition ItemLocalId.h:41
Int32ConstArrayView localIds() const
Tableau des numéros locaux des entités.
Maille arcane avec info matériaux et milieux.
Gestion des listes de 'ComponentItemInternal'.
Interval des identifiants des constituants dans la liste des ComponentItemInternal.
Classe d'aide à la construction d'une liste de ComponentItem pour un MeshMaterialVariableIndexer.
void addPureItem(Int32 local_id)
Ajoute l'entité de localId() local_id à la liste des entités pure.
void addPartialItem(Int32 local_id)
Ajoute l'entité de localId() local_id à la liste des entités partielles.
Vue sur un vecteur sur les entités d'un composant.
Vue sur une partie pure ou partielles des entités d'un composant.
Gestion des listes de connectivité des constituants.
Int16 cellNbMaterial(CellLocalId cell_id, Int16 env_id)
Nombre de matériaux de la maille cell_id pour le milieu d'indice env_id.
Index d'une entité constituant dans la liste des entités constituants.
Vue sur une instance de ConstituentItemLocalIdList.
Implémentation de ComponentItemVector.
Maille arcane d'un milieu.
__host__ __device__ Int32 environmentId() const
Identifiant du milieu.
Vue sur un vecteur sur les entités d'un milieu.
Vue sur une partie pure ou partielles des entités d'un milieu.
virtual CellGroup cells() const =0
Groupe des mailles de ce matériau.
Interface du gestionnaire des matériaux et des milieux d'un maillage.
Interface d'un matériau d'un maillage.
Représente un index sur les variables matériaux et milieux.
Données d'un constituant (matériau ou milieu) d'un maillage.
void _changeLocalIdsForInternalList(Int32ConstArrayView old_to_new_ids)
Met à jour les m_items_internal du constituant après changement de la numérotation locale.
ConstituentItemLocalIdList m_constituent_local_id_list
Liste des ConstituentItemIndex pour ce constituant.
bool needInfo() const override
Indique si l'observer aura besoin d'information de transition.
void executeReduce(const Int32ConstArrayView *info1) override
Execute l'action associée à l'extension.
void executeInvalidate() override
Execute l'action associée à l'invalidation.
void executeExtend(const Int32ConstArrayView *info1) override
Execute l'action associée à l'extension.
void executeCompact(const Int32ConstArrayView *info1) override
Éxecute l'action associée au compactage.
MeshMaterialVariableIndexer * variableIndexer() const override
Indexeur pour accéder aux variables partielles.
Ref< IConstituentItemVectorImpl > createItemVectorImpl() const override
Créé une instance de l'implémentation de 'ConstituentItemVectorImpl'.
Int32 variableIndexerIndex() const override
Index pour accéder aux variables partielles.
void _computeMaterialIndexesMonoMat(ComponentItemInternalData *item_internal_data, RunQueue &queue)
Calcul les infos sur les matériaux en mono-matériaux.
IMeshMaterialMng * m_material_mng
Gestionnaire de matériaux.
void checkValid() override
Vérifie que le composant est valide.
void build()
Fonctions publiques mais réservées au IMeshMaterialMng.
ComponentItemVectorView view() const override
Vue associée à ce composant.
ComponentPartItemVectorView partItems(eMatPart part) const override
Vue sur la partie pure ou impure des entités du composant.
ComponentImpurePartItemVectorView impureItems() const override
Vue sur la liste des entités impures (partielles) partielles du composant.
EnvImpurePartItemVectorView impureEnvItems() const override
Vue sur la liste des entités impures (partielles) partielles du milieu.
EnvPartItemVectorView partEnvItems(eMatPart part) const override
Vue sur la partie pure ou impure des entités du milieu.
void computeItemListForMaterials(const ConstituentConnectivityList &connectivity_list)
Calcul pour les mailles des matériaux du milieu leur emplacement dans le tableau d'indexation des var...
void computeMaterialIndexes(ComponentItemInternalData *item_internal_data, RunQueue &queue)
Calcul les infos sur les matériaux.
ComponentCell findComponentCell(AllEnvCell c) const override
Maille de ce composant pour la maille c.
Integer totalNbCellMat() const
Nombre total de mailles pour tous les matériaux.
EnvCell findEnvCell(AllEnvCell c) const override
Maille de ce milieu pour la maille c.
CellGroup cells() const override
Groupe des mailles de ce matériau.
void computeNbMatPerCell()
Recalcule le nombre de mailles par matériau et de mailles totales.
ComponentPurePartItemVectorView pureItems() const override
Vue sur la liste des entités pures (associées à la maille globale) du composant.
Integer nbMaterial() const override
Nombre de matériaux dans le milieu.
EnvPurePartItemVectorView pureEnvItems() const override
Vue sur la liste des entités pures (associées à la maille globale) du milieu.
EnvItemVectorView envView() const override
Vue associée à ce milieu.
Integer m_total_nb_cell_mat
Nombre total de mailles pour tous les matériaux.
ITraceMng * traceMng() override
Gestionnaire de trace associé.
bool isMonoMaterial() const
Indique si le milieu est mono-matériau.
String name() const override
Nom du composant.
void endUpdate(const ComponentItemListBuilderOld &builder)
Fonctions privées mais accessibles aux classes 'friend'.
const String & name() const
Nom de l'indexeur.
Matériau d'un maillage.
String name() const override
Nom du composant.
CellGroup cells() const override
Groupe des mailles de ce matériau.
Informations génériques sur une entité d'un constituant.
__host__ __device__ void _setVariableIndex(MatVarIndex index)
Positionne l'indexeur dans les variables matériaux.
__host__ __device__ Int32 nbSubItem() const
Nombre de sous-composants.
__host__ __device__ void _setFirstSubItem(ConstituentItemIndex first_sub_item)
Positionne le premier sous-composant.
Référence à une instance.
Vue d'un tableau d'éléments de type T.
Definition Span.h:801
Vue d'un tableau d'éléments de type T.
Definition Span.h:633
Chaîne de caractères unicode.
TraceAccessor(ITraceMng *m)
Construit un accesseur via le gestionnaire de trace m.
TraceMessage info() const
Flot pour un message d'information.
Vecteur 1D de données avec sémantique par valeur (style STL).
#define ENUMERATE_CELL_ENVCELL(iname, all_env_cell)
Macro pour itérer sur tous les milieux d'une maille.
ItemGroupT< Cell > CellGroup
Groupe de mailles.
Definition ItemTypes.h:183
RunCommand makeCommand(const RunQueue &run_queue)
Créé une commande associée à la file run_queue.
auto viewOut(const ViewBuildInfo &vbi, CellMaterialVariableScalarRef< DataType > &var)
Vue en écriture pour les variables materiaux scalaire.
auto viewIn(const ViewBuildInfo &vbi, const CellMaterialVariableScalarRef< DataType > &var)
Vue en lecture pour les variables materiaux scalaire.
Active toujours les traces dans les parties Arcane concernant les matériaux.
eMatPart
Partie d'un composant.
IMemoryAllocator * getDefaultDataAllocator()
Allocateur par défaut pour les données.
bool arcaneIsCheck()
Vrai si on est en mode vérification.
Definition Misc.cc:68
Int32 Integer
Type représentant un entier.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:498
std::int16_t Int16
Type entier signé sur 16 bits.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.
std::int32_t Int32
Type entier signé sur 32 bits.