Arcane  v4.1.1.0
Documentation utilisateur
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"
46#include "arcane/accelerator/Scan.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
131void MeshEnvironment::
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
183void MeshEnvironment::
184computeNbMatPerCell()
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/*---------------------------------------------------------------------------*/
199/*!
200 * \brief Calcul les infos sur les matériaux.
201 *
202 * Cette méthode est appelée par le MeshMaterialMng et doit être appelée
203 * une fois que les m_items_internal ont été mis à jour et
204 * computeNbMatPerCell() et computeItemListForMaterials() ont été appelées
205 */
206void MeshEnvironment::
207computeMaterialIndexes(ComponentItemInternalData* item_internal_data, RunQueue& queue)
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
229 UniqueArray<Int32> cells_index(platform::getDefaultDataAllocator());
230 cells_index.resize(max_local_id);
231 UniqueArray<Int32> cells_pos(platform::getDefaultDataAllocator());
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
236 UniqueArray<ConstituentItemIndex> cells_env(platform::getDefaultDataAllocator());
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/*---------------------------------------------------------------------------*/
339/*!
340 * \brief Calcul les infos sur les matériaux en mono-matériaux.
341 *
342 * Spécialisation pour le cas où le milieu n'a qu'un matériau.
343 */
344void MeshEnvironment::
345_computeMaterialIndexesMonoMat(ComponentItemInternalData* item_internal_data, RunQueue& queue)
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/*---------------------------------------------------------------------------*/
390/*!
391 * \brief Calcul pour les mailles des matériaux du milieu leur emplacement
392 * dans le tableau d'indexation des variables.
393 */
394void MeshEnvironment::
395computeItemListForMaterials(const ConstituentConnectivityList& connectivity_list)
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
512EnvCell MeshEnvironment::
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::
529findComponentCell(AllEnvCell c) const
530{
531 return findEnvCell(c);
532}
533
534/*---------------------------------------------------------------------------*/
535/*---------------------------------------------------------------------------*/
536
537EnvItemVectorView MeshEnvironment::
538envView() const
539{
540 return { m_non_const_this, variableIndexer()->matvarIndexes(),
541 constituentItemListView(), variableIndexer()->localIds() };
542}
543
544/*---------------------------------------------------------------------------*/
545/*---------------------------------------------------------------------------*/
546
547ComponentItemVectorView MeshEnvironment::
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
565ComponentPurePartItemVectorView MeshEnvironment::
566pureItems() const
567{
568 return m_data._partData()->pureView();
569}
570
571/*---------------------------------------------------------------------------*/
572/*---------------------------------------------------------------------------*/
573
574ComponentImpurePartItemVectorView MeshEnvironment::
575impureItems() const
576{
577 return m_data._partData()->impureView();
578}
579
580/*---------------------------------------------------------------------------*/
581/*---------------------------------------------------------------------------*/
582
583ComponentPartItemVectorView MeshEnvironment::
584partItems(eMatPart part) const
585{
586 return m_data._partData()->partView(part);
587}
588
589/*---------------------------------------------------------------------------*/
590/*---------------------------------------------------------------------------*/
591
592EnvPurePartItemVectorView MeshEnvironment::
593pureEnvItems() const
594{
595 return { m_non_const_this, m_data._partData()->pureView() };
596}
597
598/*---------------------------------------------------------------------------*/
599/*---------------------------------------------------------------------------*/
600
601EnvImpurePartItemVectorView MeshEnvironment::
602impureEnvItems() const
603{
604 return { m_non_const_this, m_data._partData()->impureView() };
605}
606
607/*---------------------------------------------------------------------------*/
608/*---------------------------------------------------------------------------*/
609
610EnvPartItemVectorView MeshEnvironment::
611partEnvItems(eMatPart part) const
612{
613 return { m_non_const_this, m_data._partData()->partView(part) };
614}
615
616/*---------------------------------------------------------------------------*/
617/*---------------------------------------------------------------------------*/
618
619void MeshEnvironment::
620checkValid()
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
635bool MeshEnvironment::
636isMonoMaterial() const
637{
638 bool is_mono_mat = (nbMaterial() == 1 && (cells().size() == totalNbCellMat()));
639 return is_mono_mat;
640}
641
642/*---------------------------------------------------------------------------*/
643/*---------------------------------------------------------------------------*/
644
645Int32 MeshEnvironment::InternalApi::
646variableIndexerIndex() const
647{
648 return variableIndexer()->index();
649}
650
651/*---------------------------------------------------------------------------*/
652/*---------------------------------------------------------------------------*/
653
654Ref<IConstituentItemVectorImpl> MeshEnvironment::InternalApi::
655createItemVectorImpl() const
656{
657 auto* x = new ConstituentItemVectorImpl(m_environment->m_non_const_this);
659}
660
661/*---------------------------------------------------------------------------*/
662/*---------------------------------------------------------------------------*/
663
664Ref<IConstituentItemVectorImpl> MeshEnvironment::InternalApi::
665createItemVectorImpl(ComponentItemVectorView rhs) const
666{
667 auto* x = new ConstituentItemVectorImpl(rhs);
669}
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.
Types et macros pour gérer les boucles sur les accélérateurs.
#define RUNCOMMAND_LOOP1(iter_name, x1,...)
Boucle 1D sur accélérateur avec arguments supplémentaires.
Interface du gestionnaire de traces.
const String & name() const
Nom du groupe.
Definition ItemGroup.h:76
Integer size() const
Nombre d'éléments du groupe.
Definition ItemGroup.h:88
ItemGroupImplInternal * _internalApi() const
API interne à Arcane.
Definition ItemGroup.cc:646
Maille arcane avec info matériaux et milieux.
Vue sur un vecteur sur les entités d'un composant.
Vue sur une partie pure ou partielles des entités d'un composant.
__host__ __device__ Int32 componentId() const
Identifiant du composant dans la liste des composants de ce type.
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.
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.
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.
__host__ __device__ Int32 nbSubItem() const
Nombre de sous-composants.
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.
#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
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.
auto viewOut(MeshVariableScalarRefT< ItemType, DataType > &var)
Vue en écriture.
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
auto viewIn(const MeshVariableScalarRefT< ItemType, DataType > &var)
Vue en lecture.
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.