14#include "arcane/core/internal/ItemGroupInternal.h"
16#include "arcane/utils/PlatformUtils.h"
17#include "arcane/utils/ITraceMng.h"
18#include "arcane/utils/ArrayUtils.h"
19#include "arcane/utils/ArgumentException.h"
20#include "arcane/utils/Convert.h"
22#include "arcane/core/ItemGroupObserver.h"
23#include "arcane/core/IItemFamily.h"
24#include "arcane/core/IMesh.h"
25#include "arcane/core/ItemPrinter.h"
26#include "arcane/core/MeshPartInfo.h"
28#include "arcane/core/internal/IDataInternal.h"
42, m_sub_parts_by_type(this)
51ItemGroupInternal(IItemFamily* family,
const String& name)
53, m_mesh(family->mesh())
54, m_item_family(family)
55, m_variable_name(String(
"GROUP_") + family->name() + name)
57, m_kind(family->itemKind())
59, m_sub_parts_by_type(this)
68ItemGroupInternal(IItemFamily* family, ItemGroupImpl* parent,
const String& name)
70, m_mesh(parent->mesh())
71, m_item_family(family)
73, m_variable_name(String(
"GROUP_") + m_item_family->name() + name)
75, m_kind(family->itemKind())
77, m_sub_parts_by_type(this)
90 for (
const auto& i : m_observers) {
93 delete m_variable_items_local_id;
94 delete m_compute_functor;
100void ItemGroupInternal::
104 m_full_name = m_item_family->fullName() +
"_" + m_name;
108 if (m_mesh && !m_parent) {
109 int property = IVariable::PSubDomainDepend | IVariable::PPrivate;
110 VariableBuildInfo vbi(m_mesh, m_variable_name, property);
112 m_items_local_id = &m_variable_items_local_id->_internalTrueData()->_internalDeprecatedValue();
117 if (
auto v = Convert::Type<Int32>::tryParseFromEnvironment(
"ARCANE_CHECK_SIMDPADDING",
true)) {
118 m_is_check_simd_padding = (v.value() > 0);
119 m_is_print_check_simd_padding = (v.value() > 1);
122 if (
auto v = Convert::Type<Int32>::tryParseFromEnvironment(
"ARCANE_PRINT_APPLYSIMDPADDING",
true)) {
123 m_is_print_apply_simd_padding = (v.value() > 0);
124 m_is_print_stack_apply_simd_padding = (v.value() > 1);
127 if (
auto v = Convert::Type<Int32>::tryParseFromEnvironment(
"ARCANE_USE_LOCK_FOR_ITEMGROUP_UPDATE",
true)) {
129 m_check_need_update_mutex.create();
140 return m_item_family->itemsInternal();
141 return m_mesh->itemsInternal(m_kind);
147Int32 ItemGroupInternal::
150 return m_item_family->maxLocalId();
156ItemInfoListView ItemGroupInternal::
157itemInfoListView()
const
160 return m_item_family->itemInfoListView();
161 return m_mesh->itemFamily(m_kind)->itemInfoListView();
167void ItemGroupInternal::
171 ARCANE_FATAL(
"Call to _resetSubGroups() is only valid for group of AllItems");
173 m_own_group =
nullptr;
174 m_ghost_group =
nullptr;
175 m_interface_group =
nullptr;
176 m_node_group =
nullptr;
177 m_edge_group =
nullptr;
178 m_face_group =
nullptr;
179 m_cell_group =
nullptr;
180 m_inner_face_group =
nullptr;
181 m_outer_face_group =
nullptr;
182 m_active_cell_group =
nullptr;
183 m_own_active_cell_group =
nullptr;
184 m_active_face_group =
nullptr;
185 m_own_active_face_group =
nullptr;
186 m_inner_active_face_group =
nullptr;
187 m_outer_active_face_group =
nullptr;
188 m_level_cell_group.clear();
189 m_own_level_cell_group.clear();
190 m_sub_parts_by_type.clear();
191 m_sub_groups.clear();
197void ItemGroupInternal::
198notifyExtendObservers(
const Int32ConstArrayView* info)
200 ARCANE_ASSERT((!m_need_recompute || m_is_all_items), (
"Operation on invalid group"));
201 for (
const auto& i : m_observers) {
202 IItemGroupObserver* obs = i.second;
203 obs->executeExtend(info);
205 if (m_group_index_table.isUsed())
206 m_group_index_table->update();
212void ItemGroupInternal::
213notifyReduceObservers(
const Int32ConstArrayView* info)
215 ARCANE_ASSERT((!m_need_recompute || m_is_all_items), (
"Operation on invalid group"));
216 for (
const auto& i : m_observers) {
217 IItemGroupObserver* obs = i.second;
218 obs->executeReduce(info);
220 if (m_group_index_table.isUsed())
221 m_group_index_table->update();
227void ItemGroupInternal::
228notifyCompactObservers(
const Int32ConstArrayView* info)
230 ARCANE_ASSERT((!m_need_recompute || m_is_all_items), (
"Operation on invalid group"));
231 for (
const auto& i : m_observers) {
232 IItemGroupObserver* obs = i.second;
233 obs->executeCompact(info);
235 if (m_group_index_table.isUsed())
236 m_group_index_table->compact(info);
242void ItemGroupInternal::
243notifyInvalidateObservers()
245#ifndef NO_USER_WARNING
246#warning "(HP) Assertion need fix"
250 for (
const auto& i : m_observers) {
251 IItemGroupObserver* obs = i.second;
252 obs->executeInvalidate();
254 if (m_group_index_table.isUsed())
255 m_group_index_table->update();
264void ItemGroupInternal::
267 m_is_contiguous =
false;
270 m_is_contiguous =
false;
273 Int32 first_lid = lids[0];
276 for (Integer i = 0, n = lids.size(); i < n; ++i) {
277 if (lids[i] != (first_lid + i)) {
283 m_is_contiguous =
true;
289void ItemGroupInternal::
292 if (m_is_print_apply_simd_padding) {
294 if (m_is_print_stack_apply_simd_padding)
295 stack = String(
" stack=") + platform::getStackTrace();
296 ITraceMng* tm = m_item_family->traceMng();
297 tm->info() <<
"ApplySimdPadding group_name=" << m_name << stack;
301 m_internal_api.notifySimdPaddingDone();
302 Arcane::applySimdPadding(mutableItemsLocalId());
332void ItemGroupInternal::
333checkUpdateSimdPadding()
335 if (m_simd_timestamp >= timestamp()) {
337 if (m_is_check_simd_padding) {
338 if (m_is_print_check_simd_padding && m_item_family) {
339 ITraceMng* tm = m_item_family->traceMng();
340 tm->info() <<
"check padding name=" << fullName()
341 <<
" timestamp=" << timestamp()
342 <<
" simd_timestamp=" << m_simd_timestamp
343 <<
" size=" << mutableItemsLocalId().size()
344 <<
" capacity=" << mutableItemsLocalId().capacity();
346 ArrayUtils::checkSimdPadding(itemsLocalId());
350 this->applySimdPadding();
356void ItemGroupInternal::
357_removeItems(SmallSpan<const Int32> items_local_id)
359 if (!((!m_need_recompute && !isAllItems()) || (m_transaction_mode && isAllItems())))
362 if (m_compute_functor && !m_transaction_mode)
363 ARCANE_FATAL(
"Cannot remove items on computed group ({0})", name());
365 IMesh* amesh = mesh();
367 throw ArgumentException(A_FUNCINFO,
"null group");
369 ITraceMng* trace = amesh->traceMng();
370 if (isOwn() && amesh->meshPartInfo().nbPart() != 1)
371 ARCANE_THROW(NotSupportedException,
"Cannot remove items if isOwn() is true");
373 Int32 nb_item_to_remove = items_local_id.size();
376 UniqueArray<Int32> removed_local_ids;
378 if (nb_item_to_remove != 0) {
380 Int32Array& items_lid = mutableItemsLocalId();
381 const Int32 old_size = items_lid.size();
382 bool has_removed =
false;
391 for (Integer i = 0, n = nb_item_to_remove; i < n; ++i) {
392 Int32 removed_local_id = items_local_id[i];
393 Int32 index = m_items_index_in_all_group[removed_local_id];
395 Int32 moved_local_id = items_lid[nb_item];
396 items_lid[index] = moved_local_id;
397 m_items_index_in_all_group[moved_local_id] = index;
399 items_lid.resize(nb_item);
406 UniqueArray<bool> remove_flags(maxLocalId(),
false);
407 for (Int32 i = 0; i < nb_item_to_remove; ++i)
408 remove_flags[items_local_id[i]] =
true;
411 Int32 next_index = 0;
412 for (Int32 i = 0; i < old_size; ++i) {
413 Int32 lid = items_lid[i];
414 if (remove_flags[lid]) {
415 removed_local_ids.add(lid);
418 items_lid[next_index] = lid;
421 if (next_index != old_size) {
423 items_lid.resize(next_index);
430 trace->info(5) <<
"ItemGroupImpl::removeItems() group <" << name() <<
"> "
431 <<
" old_size=" << old_size
432 <<
" new_size=" << nbItem()
433 <<
" removed?=" << has_removed;
439 notifyReduceObservers(&observation_info);
445void ItemGroupInternal::
448 ITraceMng* msg = mesh()->traceMng();
449 if (m_need_recompute && m_compute_functor) {
450 msg->debug(Trace::High) <<
"ItemGroupImpl::checkValid on " << name() <<
" : skip group to recompute";
457 UniqueArray<bool> presence_checks(maxLocalId());
458 presence_checks.fill(0);
462 Integer items_size = items.size();
465 for (Integer i = 0, is = items_lid.size(); i < is; ++i) {
467 if (lid >= items_size) {
469 msg->error() <<
"Wrong local index lid=" << lid <<
" max=" << items_size
470 <<
" var_max_size=" << maxLocalId();
475 ItemInternal* item = items[lid];
476 if (item->isSuppressed()) {
478 msg->error() <<
"Item " << ItemPrinter(item) <<
" in group "
479 << name() <<
" does not exist anymore";
483 if (presence_checks[lid]) {
485 msg->error() <<
"Item " << ItemPrinter(item) <<
" in group "
486 << name() <<
" was found twice or more";
490 presence_checks[lid] =
true;
493 for (Integer i = 0, n = items_lid.size(); i < n; ++i) {
494 Int32 local_id = items_lid[i];
495 Int32 index_in_all_group = m_items_index_in_all_group[local_id];
496 if (index_in_all_group != i) {
498 msg->error() << A_FUNCINFO
500 <<
": incoherence between 'local_id' and index in the group 'All' "
502 <<
" local_id=" << local_id
503 <<
" index=" << index_in_all_group;
510 String parent_name =
"none";
512 parent_name = m_parent->name();
513 ARCANE_FATAL(
"Error in group name='{0}' parent='{1}' nb_error={2}",
514 name(), parent_name, nb_error);
521void ItemGroupInternal::
522_notifyDirectRemoveItems(SmallSpan<const Int32> removed_ids, Int32 nb_remaining)
524 mutableItemsLocalId().resize(nb_remaining);
531 notifyReduceObservers(&observation_info);
540void ItemGroupImplInternal::
541setAsConstituentGroup()
543 m_p->m_is_constituent_group =
true;
549SmallSpan<Int32> ItemGroupImplInternal::
552 return m_p->itemsLocalId();
558void ItemGroupImplInternal::
559notifyDirectRemoveItems(SmallSpan<const Int32> removed_ids, Int32 nb_remaining)
561 m_p->_notifyDirectRemoveItems(removed_ids, nb_remaining);
567void ItemGroupImplInternal::
568notifySimdPaddingDone()
570 m_p->m_simd_timestamp = m_p->timestamp();
576void ItemGroupImplInternal::
577setMemoryRessourceForItemLocalId(eMemoryRessource mem)
581 VariableUtils::experimentalChangeAllocator(v->variable(), mem);
#define ARCANE_THROW(exception_class,...)
Macro for throwing an exception with formatting.
#define ARCANE_FATAL(...)
Macro throwing a FatalErrorException.
Utility functions for variables.
VariableRefArrayT< Int32 > VariableArrayInt32
Array variable of 32-bit integer type.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
bool arcaneIsCheck()
True if running in check mode.
Int32 Integer
Type representing an integer.
ConstArrayView< Int32 > Int32ConstArrayView
C equivalent of a 1D array of 32-bit integers.
ConstArrayView< ItemInternal * > ItemInternalList
Type of the internal list of entities.
const char * itemKindName(eItemKind kind)
Entity kind name.
Array< Int32 > Int32Array
Dynamic one-dimensional array of 32-bit integers.