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];
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)
297 tm->
info() <<
"ApplySimdPadding group_name=" <<
m_name << stack;
301 m_internal_api.notifySimdPaddingDone();
302 Arcane::applySimdPadding(mutableItemsLocalId());
332void ItemGroupInternal::
333checkUpdateSimdPadding()
340 tm->
info() <<
"check padding name=" << fullName()
341 <<
" timestamp=" << timestamp()
343 <<
" size=" << mutableItemsLocalId().size()
344 <<
" capacity=" << mutableItemsLocalId().capacity();
346 ArrayUtils::checkSimdPadding(itemsLocalId());
356void ItemGroupInternal::
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());
373 Int32 nb_item_to_remove = items_local_id.
size();
378 if (nb_item_to_remove != 0) {
380 Int32Array& items_lid = mutableItemsLocalId();
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;
552 return m_p->itemsLocalId();
558void ItemGroupImplInternal::
561 m_p->_notifyDirectRemoveItems(removed_ids, nb_remaining);
567void ItemGroupImplInternal::
568notifySimdPaddingDone()
570 m_p->m_simd_timestamp = m_p->timestamp();
576void ItemGroupImplInternal::
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.
Integer size() const
Number of elements in the vector.
Exception when an argument is invalid.
void resize(Int64 s)
Changes the number of elements in the array to s.
void add(ConstReferenceType val)
Adds element val to the end of the array.
constexpr Integer size() const noexcept
Number of elements in the array.
constexpr bool empty() const noexcept
true if the array is empty (size()==0)
virtual ITraceMng * traceMng()=0
Associated message manager.
virtual const MeshPartInfo & meshPartInfo() const =0
Mesh part information.
virtual TraceMessage info()=0
Stream for an information message.
bool m_is_check_simd_padding
True if the localIds are consecutive.
void applySimdPadding()
Apply padding for vectorization.
IItemFamily * m_item_family
Associated family.
Int64 m_simd_timestamp
Time of the last modification for SIMD info calculation.
String m_name
Name of the group.
Exception when an operation is not supported.
View of an array of elements of type T.
constexpr __host__ __device__ SizeType size() const noexcept
Returns the size of the array.
Unicode character string.
1D data vector with value semantics (STL style).
IVariable * variable() const
Associated variable.
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.
Arcane::eMemoryResource eMemoryRessource
Typedef for the historical Arcane version (with 2's').
Array< Int32 > Int32Array
Dynamic one-dimensional array of 32-bit integers.
std::int32_t Int32
Signed integer type of 32 bits.