Arcane  v3.16.0.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-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/* MeshEnvironment.cc (C) 2000-2024 */
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();
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}
333
334/*---------------------------------------------------------------------------*/
335/*---------------------------------------------------------------------------*/
336/*!
337 * \brief Calcul les infos sur les matériaux en mono-matériaux.
338 *
339 * Spécialisation pour le cas où le milieu n'a qu'un matériau.
340 */
341void MeshEnvironment::
342_computeMaterialIndexesMonoMat(ComponentItemInternalData* item_internal_data, RunQueue& queue)
343{
344 ConstituentItemLocalIdListView constituent_item_list_view = m_data.constituentItemListView();
345
346 MeshMaterial* mat = m_true_materials[0];
347 const Int16 mat_id = mat->componentId();
348 const MeshMaterialVariableIndexer* var_indexer = mat->variableIndexer();
349 CellGroup mat_cells = mat->cells();
350 info(4) << "COMPUTE (V2) mat_cells mat=" << mat->name() << " nb_cell=" << mat_cells.size()
351 << " mat_id=" << mat_id << " index=" << var_indexer->index();
352
353 mat->resizeItemsInternal(var_indexer->nbItem());
354
355 auto command = makeCommand(queue);
356 auto matvar_indexes = viewIn(command, var_indexer->matvarIndexes());
357 auto local_ids = viewIn(command, var_indexer->localIds());
358 ComponentItemSharedInfo* mat_shared_info = item_internal_data->matSharedInfo();
359 ComponentItemInternalRange mat_item_internal_range = m_mat_internal_data_range;
360 SmallSpan<ConstituentItemIndex> mat_id_list = mat->componentData()->m_constituent_local_id_list.mutableLocalIds();
361 const Int32 nb_id = local_ids.size();
362 Span<Int32> mat_cells_local_id = mat_cells._internalApi()->itemsLocalId();
363 command << RUNCOMMAND_LOOP1(iter, nb_id)
364 {
365 auto [z] = iter();
366 MatVarIndex mvi = matvar_indexes[z];
367 const Int32 lid = local_ids[z];
368 const Int32 pos = z;
369 matimpl::ConstituentItemBase env_item = constituent_item_list_view._constituenItemBase(z);
370 ConstituentItemIndex cii = mat_item_internal_range[pos];
371 env_item._setFirstSubItem(cii);
372
373 matimpl::ConstituentItemBase ref_ii(mat_shared_info, cii);
374 mat_id_list[z] = cii;
375 ref_ii._setSuperAndGlobalItem(env_item.constituentItemIndex(), ItemLocalId(lid));
376 ref_ii._setComponent(mat_id);
377 ref_ii._setVariableIndex(mvi);
378 // Le rang 0 met à jour le padding SIMD du groupe associé au matériau
379 if (z == 0)
380 ArraySimdPadder::applySimdPaddingView(mat_cells_local_id);
381 };
382 mat_cells._internalApi()->notifySimdPaddingDone();
383}
384
385/*---------------------------------------------------------------------------*/
386/*---------------------------------------------------------------------------*/
387/*!
388 * \brief Calcul pour les mailles des matériaux du milieu leur emplacement
389 * dans le tableau d'indexation des variables.
390 */
391void MeshEnvironment::
392computeItemListForMaterials(const ConstituentConnectivityList& connectivity_list)
393{
394 info(4) << "ComputeItemListForMaterials (V2)";
395 ConstArrayView<Int16> nb_env_per_cell = connectivity_list.cellsNbEnvironment();
396 const Int16 env_id = componentId();
397 // Calcul pour chaque matériau le nombre de mailles mixtes
398 // TODO: a faire dans MeshMaterialVariableIndexer
399 for (MeshMaterial* mat : m_true_materials) {
400 MeshMaterialVariableIndexer* var_indexer = mat->variableIndexer();
401 CellGroup cells = var_indexer->cells();
402 Integer var_nb_cell = cells.size();
403
404 ComponentItemListBuilderOld list_builder(var_indexer, 0);
405
406 info(4) << "MAT_INDEXER mat=" << mat->name() << " NB_CELL=" << var_nb_cell << " name=" << cells.name();
407 ENUMERATE_CELL (icell, cells) {
408 Int32 lid = icell.itemLocalId();
409 // On ne prend l'indice global que si on est le seul matériau et le seul
410 // milieu de la maille. Sinon, on prend un indice multiple
411 if (nb_env_per_cell[lid] > 1 || connectivity_list.cellNbMaterial(icell, env_id) > 1)
412 list_builder.addPartialItem(lid);
413 else
414 list_builder.addPureItem(lid);
415 }
416
417 if (traceMng()->verbosityLevel() >= 5)
418 info() << "MAT_NB_MULTIPLE_CELL (V2) mat=" << var_indexer->name()
419 << " nb_in_global=" << list_builder.pureMatVarIndexes().size()
420 << " (ids=" << list_builder.pureMatVarIndexes() << ")"
421 << " nb_in_multiple=" << list_builder.partialMatVarIndexes().size()
422 << " (ids=" << list_builder.partialLocalIds() << ")";
423 var_indexer->endUpdate(list_builder);
424 }
425}
426
427/*---------------------------------------------------------------------------*/
428/*---------------------------------------------------------------------------*/
429
430void MeshEnvironment::
431notifyLocalIdsChanged(Int32ConstArrayView old_to_new_ids)
432{
433 // NOTE:
434 // Cette méthode est appelée lorsqu'il y a un compactage du maillage
435 // et le groupe d'entité associé à ce milieu vient d'être compacté.
436 // Comme actuellement il n'y a pas d'observeurs pour l'ajout
437 // ou la suppression de mailles du groupe, il est possible
438 // lorsque cette méthode est appelée que les infos des milieux et
439 // matériaux ne soient pas à jour (par exemple, la liste des local_ids
440 // du m_variable_indexer n'a pas les mêmes valeurs que cells().
441 // Pour l'instant ce n'est pas très grave car tout est écrasé après
442 // chaque modif sur un matériau ou un milieu.
443 // A terme, il faudra prendre cela en compte lorsque l'ajout
444 // où la suppression de mailles matériaux sera optimisée.
445 info(4) << "Changing (V3) local ids references env=" << name();
446 info(4) << "CurrentCells name=" << cells().name()
447 << " n=" << cells().view().localIds().size();
448 info(4) << "MatVarIndex name=" << cells().name()
449 << " n=" << variableIndexer()->matvarIndexes().size();
450 Integer nb_mat = m_true_materials.size();
451 info(4) << "NotifyLocalIdsChanged env=" << name() << " nb_mat=" << nb_mat
452 << " old_to_new_ids.size=" << old_to_new_ids.size();
453
454 // Si le milieu n'a qu'un seul matériau, ils partagent le même variable_indexer
455 // donc il ne faut changer les ids qu'une seule fois. Par contre, le
456 // tableau m_items_internal n'est pas partagé entre le matériau
457 // et le milieu donc il faut recalculer les infos séparément.
458 // Il faut le faire pour le milieu avant de mettre à jour les infos du matériau car
459 // une fois ceci fait la valeur m_variable_indexer->m_local_ids_in_indexes_view
460 // aura changé et il ne sera plus possible de déterminer la correspondance
461 // entre les nouveaux et les anciens localId
462
463 if (nb_mat == 1) {
464 m_data._changeLocalIdsForInternalList(old_to_new_ids);
465 MeshMaterial* true_mat = m_true_materials[0];
466 _changeIds(true_mat->componentData(), old_to_new_ids);
467 }
468 else {
469 // Change les infos des matériaux
470 for (Integer i = 0; i < nb_mat; ++i) {
471 MeshMaterial* true_mat = m_true_materials[i];
472 info(4) << "ChangeIds MAT i=" << i << " MAT=" << true_mat->name();
473 _changeIds(true_mat->componentData(), old_to_new_ids);
474 }
475 // Change les infos du milieu
476 _changeIds(componentData(), old_to_new_ids);
477 }
478
479 // Reconstruit les infos sur les mailles pures et mixtes.
480 // Il faut le faire une fois que tous les valeurs sont à jour.
481 {
482 RunQueue& queue = m_material_mng->_internalApi()->runQueue();
483 for (Integer i = 0; i < nb_mat; ++i) {
484 MeshMaterial* true_mat = m_true_materials[i];
485 true_mat->componentData()->_rebuildPartData(queue);
486 }
487 componentData()->_rebuildPartData(queue);
488 }
489
490 checkValid();
491}
492
493/*---------------------------------------------------------------------------*/
494/*---------------------------------------------------------------------------*/
495
496void MeshEnvironment::
497_changeIds(MeshComponentData* cdata, Int32ConstArrayView old_to_new_ids)
498{
499 info(4) << "ChangeIds() (V4) for name=" << cdata->name();
500 info(4) << "Use new version for ChangeIds()";
501
502 cdata->_changeLocalIdsForInternalList(old_to_new_ids);
503 cdata->variableIndexer()->changeLocalIds(old_to_new_ids);
504}
505
506/*---------------------------------------------------------------------------*/
507/*---------------------------------------------------------------------------*/
508
509EnvCell MeshEnvironment::
510findEnvCell(AllEnvCell c) const
511{
512 Int32 env_id = m_data.componentId();
513 ENUMERATE_CELL_ENVCELL (ienvcell, c) {
514 EnvCell ec = *ienvcell;
515 Int32 eid = ec.environmentId();
516 if (eid == env_id)
517 return ec;
518 }
519 return EnvCell();
520}
521
522/*---------------------------------------------------------------------------*/
523/*---------------------------------------------------------------------------*/
524
525ComponentCell MeshEnvironment::
526findComponentCell(AllEnvCell c) const
527{
528 return findEnvCell(c);
529}
530
531/*---------------------------------------------------------------------------*/
532/*---------------------------------------------------------------------------*/
533
534EnvItemVectorView MeshEnvironment::
535envView() const
536{
537 return { m_non_const_this, variableIndexer()->matvarIndexes(),
538 constituentItemListView(), variableIndexer()->localIds() };
539}
540
541/*---------------------------------------------------------------------------*/
542/*---------------------------------------------------------------------------*/
543
544ComponentItemVectorView MeshEnvironment::
545view() const
546{
547 return envView();
548}
549
550/*---------------------------------------------------------------------------*/
551/*---------------------------------------------------------------------------*/
552
553void MeshEnvironment::
554resizeItemsInternal(Integer nb_item)
555{
556 m_data._resizeItemsInternal(nb_item);
557}
558
559/*---------------------------------------------------------------------------*/
560/*---------------------------------------------------------------------------*/
561
562ComponentPurePartItemVectorView MeshEnvironment::
563pureItems() const
564{
565 return m_data._partData()->pureView();
566}
567
568/*---------------------------------------------------------------------------*/
569/*---------------------------------------------------------------------------*/
570
571ComponentImpurePartItemVectorView MeshEnvironment::
572impureItems() const
573{
574 return m_data._partData()->impureView();
575}
576
577/*---------------------------------------------------------------------------*/
578/*---------------------------------------------------------------------------*/
579
580ComponentPartItemVectorView MeshEnvironment::
581partItems(eMatPart part) const
582{
583 return m_data._partData()->partView(part);
584}
585
586/*---------------------------------------------------------------------------*/
587/*---------------------------------------------------------------------------*/
588
589EnvPurePartItemVectorView MeshEnvironment::
590pureEnvItems() const
591{
592 return { m_non_const_this, m_data._partData()->pureView() };
593}
594
595/*---------------------------------------------------------------------------*/
596/*---------------------------------------------------------------------------*/
597
598EnvImpurePartItemVectorView MeshEnvironment::
599impureEnvItems() const
600{
601 return { m_non_const_this, m_data._partData()->impureView() };
602}
603
604/*---------------------------------------------------------------------------*/
605/*---------------------------------------------------------------------------*/
606
607EnvPartItemVectorView MeshEnvironment::
608partEnvItems(eMatPart part) const
609{
610 return { m_non_const_this, m_data._partData()->partView(part) };
611}
612
613/*---------------------------------------------------------------------------*/
614/*---------------------------------------------------------------------------*/
615
616void MeshEnvironment::
617checkValid()
618{
619 if (!arcaneIsCheck())
620 return;
621
622 m_data.checkValid();
623
624 for (IMeshMaterial* mat : m_materials) {
625 mat->checkValid();
626 }
627}
628
629/*---------------------------------------------------------------------------*/
630/*---------------------------------------------------------------------------*/
631
632bool MeshEnvironment::
633isMonoMaterial() const
634{
635 bool is_mono_mat = (nbMaterial() == 1 && (cells().size() == totalNbCellMat()));
636 return is_mono_mat;
637}
638
639/*---------------------------------------------------------------------------*/
640/*---------------------------------------------------------------------------*/
641
642Int32 MeshEnvironment::InternalApi::
643variableIndexerIndex() const
644{
645 return variableIndexer()->index();
646}
647
648/*---------------------------------------------------------------------------*/
649/*---------------------------------------------------------------------------*/
650
651Ref<IConstituentItemVectorImpl> MeshEnvironment::InternalApi::
652createItemVectorImpl() const
653{
654 auto* x = new ConstituentItemVectorImpl(m_environment->m_non_const_this);
656}
657
658/*---------------------------------------------------------------------------*/
659/*---------------------------------------------------------------------------*/
660
661Ref<IConstituentItemVectorImpl> MeshEnvironment::InternalApi::
662createItemVectorImpl(ComponentItemVectorView rhs) const
663{
664 auto* x = new ConstituentItemVectorImpl(rhs);
666}
667
668/*---------------------------------------------------------------------------*/
669/*---------------------------------------------------------------------------*/
670
671} // End namespace Arcane::Materials
672
673/*---------------------------------------------------------------------------*/
674/*---------------------------------------------------------------------------*/
#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 sur accélérateur avec arguments supplémentaires pour les réductions.
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:645
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
Execute 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
RunCommand makeCommand(const RunQueue &run_queue)
Créé une commande associée à la file run_queue.
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:569
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.