Arcane  v4.1.1.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
ItemGroupSubPartsByType.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/* ItemGroupSubPartsByType.cc (C) 2000-2025 */
9/* */
10/* Gestion des sous-parties d'un groupe suivant le type de ses éléments. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/core/internal/ItemGroupInternal.h"
15
16#include "arcane/utils/ITraceMng.h"
17
18#include "arcane/core/IItemFamily.h"
19#include "arcane/core/IMesh.h"
20#include "arcane/core/MeshKind.h"
21
22/*---------------------------------------------------------------------------*/
23/*---------------------------------------------------------------------------*/
24
25namespace Arcane
26{
27
28/*---------------------------------------------------------------------------*/
29/*---------------------------------------------------------------------------*/
30
31ItemGroupSubPartsByType::
32ItemGroupSubPartsByType(ItemGroupInternal* igi)
33: m_group_internal(igi)
34{
35 // Regarde si on utilise la version 2 pour ApplyOperationByBasicType
36 if (auto v = Convert::Type<Int32>::tryParseFromEnvironment("ARCANE_APPLYOPERATION_VERSION", true))
37 m_use_v2_for_apply_operation = (v.value() == 2);
38
39 if (auto v = Convert::Type<Int32>::tryParseFromEnvironment("ARCANE_DEBUG_APPLYOPERATION", true))
40 m_is_debug_apply_operation = (v.value() > 0);
41}
42
43/*---------------------------------------------------------------------------*/
44/*---------------------------------------------------------------------------*/
45
46void ItemGroupSubPartsByType::
47_initChildrenByTypeV2()
48{
49 bool is_verbose = m_is_debug_apply_operation;
50 if (is_verbose)
51 m_group_internal->mesh()->traceMng()->info() << "ItemGroupImpl::_initChildrenByTypeV2() name=" << m_group_internal->name();
52
53 Int32 nb_basic_item_type = ItemTypeMng::nbBasicItemType();
54 m_children_by_type_ids.resize(nb_basic_item_type);
55 for (Integer i = 0; i < nb_basic_item_type; ++i) {
56 m_children_by_type_ids[i] = UniqueArray<Int32>{ MemoryUtils::getDefaultDataAllocator() };
57 }
58}
59
60void ItemGroupSubPartsByType::
61_computeChildrenByTypeV2()
62{
63 ItemGroup that_group(m_group_impl);
64 Int32 nb_item = m_group_internal->nbItem();
65 IMesh* mesh = m_group_internal->mesh();
66 ItemTypeMng* type_mng = mesh->itemTypeMng();
67 ITraceMng* trace = mesh->traceMng();
68 bool is_verbose = m_is_debug_apply_operation;
69 if (is_verbose)
70 trace->info() << "ItemGroupImpl::_computeChildrenByTypeV2 for " << m_group_internal->name();
71
72 // Si le maillage est cartésien, on sait que toutes les entités ont le même type
73 if (nb_item > 0 && mesh->meshKind().meshStructure() == eMeshStructure::Cartesian) {
74 ItemInfoListView lv(m_group_internal->m_item_family->itemInfoListView());
75 m_unique_children_type = ItemTypeId{ lv.typeId(m_group_internal->itemsLocalId()[0]) };
76 return;
77 }
78
79 Int32 nb_basic_item_type = ItemTypeMng::nbBasicItemType();
80 m_unique_children_type = ItemTypeId{ IT_NullType };
81
82 UniqueArray<Int32> nb_items_by_type(nb_basic_item_type);
83 nb_items_by_type.fill(0);
84 ENUMERATE_ (Item, iitem, that_group) {
85 Item item = *iitem;
86 Int16 item_type = item.type();
87 if (item_type < nb_basic_item_type)
88 ++nb_items_by_type[item_type];
89 }
90 const String& name = m_group_internal->name();
91 Int32 nb_different_type = 0;
92 for (Int32 i = 0; i < nb_basic_item_type; ++i) {
93 m_children_by_type_ids[i].clear();
94 const Int32 n = nb_items_by_type[i];
95 m_children_by_type_ids[i].reserve(n);
96 if (n > 0)
97 ++nb_different_type;
98 if (is_verbose)
99 trace->info() << "ItemGroupImpl::_computeChildrenByTypeV2 for " << name
100 << " type=" << type_mng->typeName(i) << " nb=" << n;
101 }
102 if (is_verbose)
103 trace->info() << "ItemGroupImpl::_computeChildrenByTypeV2 for " << name
104 << " nb_item=" << nb_item << " nb_different_type=" << nb_different_type;
105
106 // Si nb_different_type == 1, cela signifie qu'il n'y a qu'un seul
107 // type d'entité et on conserve juste ce type, car dans ce cas on passera
108 // directement le groupe en argument de applyOperation().
109 if (nb_item > 0 && nb_different_type == 1) {
110 ItemInfoListView lv(m_group_internal->m_item_family->itemInfoListView());
111 m_unique_children_type = ItemTypeId{ lv.typeId(m_group_internal->itemsLocalId()[0]) };
112 if (is_verbose)
113 trace->info() << "ItemGroupImpl::_computeChildrenByTypeV2 for " << name
114 << " unique_type=" << type_mng->typeName(m_unique_children_type);
115 return;
116 }
117
118 ENUMERATE_ (Item, iitem, that_group) {
119 Item item = *iitem;
120 Integer item_type = item.type();
121 if (item_type < nb_basic_item_type)
122 m_children_by_type_ids[item_type].add(iitem.itemLocalId());
123 }
124
125 for (Int32 i = 0; i < nb_basic_item_type; ++i)
126 applySimdPadding(m_children_by_type_ids[i]);
127}
128
129/*---------------------------------------------------------------------------*/
130/*---------------------------------------------------------------------------*/
131
132} // End namespace Arcane
133
134/*---------------------------------------------------------------------------*/
135/*---------------------------------------------------------------------------*/
#define ENUMERATE_(type, name, group)
Enumérateur générique d'un groupe d'entité
Implémentation de la classe ItemGroupImpl.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Int32 Integer
Type représentant un entier.