14#include "arcane/core/ItemGroupImpl.h" 
   16#include "arcane/utils/String.h" 
   17#include "arcane/utils/ITraceMng.h" 
   18#include "arcane/utils/ArgumentException.h" 
   20#include "arcane/core/ItemGroupObserver.h" 
   21#include "arcane/core/IItemFamily.h" 
   22#include "arcane/core/ItemGroup.h" 
   23#include "arcane/core/IMesh.h" 
   24#include "arcane/core/MeshPartInfo.h" 
   25#include "arcane/core/MeshKind.h" 
   26#include "arcane/core/ItemPrinter.h" 
   27#include "arcane/core/IItemOperationByBasicType.h" 
   28#include "arcane/core/ItemGroupComputeFunctor.h" 
   29#include "arcane/core/IVariableSynchronizer.h" 
   30#include "arcane/core/ParallelMngUtils.h" 
   31#include "arcane/core/internal/ItemGroupInternal.h" 
   45class ItemGroupImplNull
 
   56  const String& fullName()
 const { 
return m_name; }
 
 
   78class ItemGroupImplItemGroupComputeFunctor
 
   79: 
public ItemGroupComputeFunctor
 
   87  ItemGroupImplItemGroupComputeFunctor(
ItemGroupImpl* parent, FuncPtr funcPtr)
 
   88  : ItemGroupComputeFunctor()
 
   90  , m_function(funcPtr) { }
 
   96    (m_parent->*m_function)();
 
 
 
  108ItemGroupImpl* ItemGroupImpl::
 
  124: m_p (new ItemGroupInternal(family,
name))
 
 
  133: m_p(new ItemGroupInternal(family,
parent,
name))
 
 
  142: m_p (new ItemGroupInternal())
 
 
  170  return m_p->fullName();
 
 
  179  return m_p->itemsLocalId().size();
 
 
  188  return m_p->itemsLocalId().empty();
 
 
  197  return m_p->itemsLocalId();
 
 
  206  if (m_p->m_transaction_mode)
 
  208  m_p->m_transaction_mode = 
true;
 
 
  217  if (!m_p->m_transaction_mode)
 
  219  m_p->m_transaction_mode = 
false;
 
  220  if (m_p->m_need_recompute) {
 
  221    m_p->m_need_recompute = 
false;
 
  222    m_p->m_need_invalidate_on_recompute = 
false;
 
  223    m_p->notifyInvalidateObservers();
 
 
  231unguardedItemsLocalId(
const bool self_invalidate)
 
  233  ITraceMng* trace = m_p->m_mesh->traceMng();
 
  235                              << 
" with self_invalidate=" << self_invalidate;
 
  237  if (m_p->m_compute_functor && !m_p->m_transaction_mode)
 
  238    ARCANE_FATAL(
"Direct access for computed group in only available during a transaction");
 
  240  _forceInvalidate(self_invalidate);
 
  241  return m_p->mutableItemsLocalId();
 
  250  return m_p->m_parent;
 
 
  268  return m_p->m_item_family;
 
 
  286  return m_p->m_is_own;
 
 
  295  const bool is_own = m_p->m_is_own;
 
  299    if (m_p->m_own_group)
 
 
  333      m_p->m_own_group = ii;
 
  336      m_p->m_own_group = ii;
 
 
  352    m_p->m_ghost_group = ii;
 
 
  364    return checkSharedNull();
 
  368    m_p->m_interface_group = ii;
 
  384    m_p->m_node_group = ii;
 
 
  400    m_p->m_edge_group = ii;
 
 
  416    m_p->m_face_group = ii;
 
 
  432    m_p->m_cell_group = ii;
 
 
  444    return checkSharedNull();
 
  449    m_p->m_inner_face_group = ii;
 
 
  461    return checkSharedNull();
 
  466    m_p->m_outer_face_group = ii;
 
 
  481    return checkSharedNull();
 
  487    m_p->m_active_cell_group = ii;
 
 
  499    return checkSharedNull();
 
  505    m_p->m_own_active_cell_group = ii;
 
 
  517    return checkSharedNull();
 
  521                        m_p->m_mesh->cellFamily(),
 
  523    m_p->m_level_cell_group[level] = ii;
 
 
  535    return checkSharedNull();
 
  540                        m_p->m_mesh->cellFamily(),
 
  542    m_p->m_own_level_cell_group[level] = ii;
 
 
  554    return checkSharedNull();
 
  559    m_p->m_active_face_group = ii;
 
 
  571    return checkSharedNull();
 
  576    m_p->m_own_active_face_group = ii;
 
 
  587    return checkSharedNull();
 
  592    m_p->m_inner_active_face_group = ii;
 
 
  604    return checkSharedNull();
 
  609    m_p->m_outer_active_face_group = ii;
 
 
  620  auto finder = m_p->m_sub_groups.find(sub_name);
 
  621  if (finder != m_p->m_sub_groups.end()) {
 
  622    ARCANE_FATAL(
"Cannot create already existing sub-group ({0}) in group ({1})",
 
  625  ItemGroup ig = family->
createGroup(sub_name,ItemGroup(
this));
 
  628  functor->setGroup(ii);
 
  631                                          &ItemGroupImpl::_executeInvalidate));
 
  632  m_p->m_sub_groups[sub_name] = ii;
 
 
  644  auto finder = m_p->m_sub_groups.find(sub_name);
 
  645  if (finder != m_p->m_sub_groups.end()) {
 
  646    return finder->second.get();
 
  650    return checkSharedNull();
 
 
  660  ITraceMng* trace = m_p->m_mesh->traceMng();
 
  661  if (m_p->m_compute_functor) {
 
  663                              << 
name() << 
" : skip computed group";
 
  676    m_p->notifyInvalidateObservers();
 
  681  for( 
Integer i=0, is=items_lid.
size(); i<is; ++i ){
 
  683    items_lid[i] = old_to_new_ids[old_id];
 
  686  m_p->updateTimestamp();
 
  693  if (m_p->m_observer_need_info) {
 
  694    m_p->notifyCompactObservers(&old_to_new_ids);
 
  698    std::sort(std::begin(items_lid),std::end(items_lid));
 
  699    m_p->notifyCompactObservers(
nullptr);
 
 
  711  ITraceMng* msg = m_p->m_mesh->traceMng();
 
  712  msg->
debug(
Trace::High) << 
"ItemGroupImpl::invalidate(force=" << force_recompute << 
")" 
  713                          << 
" name=" << 
name();
 
  717  m_p->updateTimestamp();
 
  718  m_p->setNeedRecompute();
 
  721  m_p->notifyInvalidateObservers();
 
 
  739  return m_p->itemInfoListView();
 
 
  748  return m_p->m_is_local_to_sub_domain;
 
 
  757  m_p->m_is_local_to_sub_domain = v;
 
 
  766  ARCANE_ASSERT(( (!m_p->m_need_recompute && !
isAllItems()) || (m_p->m_transaction_mode && 
isAllItems()) ),
 
  767    (
"Operation on invalid group"));
 
  768  if (m_p->m_compute_functor && !m_p->m_transaction_mode)
 
  776  if (nb_item_to_add==0)
 
  779  Int32Array& items_lid = m_p->mutableItemsLocalId();
 
  785    Integer nb_items_id = current_size;
 
  786    m_p->m_items_index_in_all_group.resize(m_p->maxLocalId());
 
  787    for( 
Integer i=0, is=nb_item_to_add; i<is; ++i ){
 
  788      Int32 local_id = items_local_id[i];
 
  789      items_lid.
add(local_id);
 
  790      m_p->m_items_index_in_all_group[local_id] = nb_items_id+i;
 
  792    nb_added = nb_item_to_add;
 
  794  else if (check_if_present) {
 
  797    presence_checks.
fill(
false);
 
  798    for( 
Integer i=0, is=items_lid.
size(); i<is; ++i ){
 
  799      presence_checks[items_lid[i]] = 
true;
 
  802    for( 
Integer i=0; i<nb_item_to_add; ++i ) {
 
  803      const Integer lid = items_local_id[i];
 
  804      if (!presence_checks[lid]){
 
  808        presence_checks[lid] = 
true;
 
  814    nb_added = nb_item_to_add;
 
  821    trace->
info(5) << 
"ItemGroupImpl::addItems() group <" << 
name() << 
"> " 
  822                   << 
" checkpresent=" << check_if_present
 
  823                   << 
" nb_current=" << current_size
 
  824                   << 
" want_to_add=" << nb_item_to_add
 
  825                   << 
" effective_added=" << nb_added;
 
  830    m_p->updateTimestamp();
 
  831    Int32ConstArrayView observation_info(nb_added, items_lid.unguardedBasePointer()+current_size);
 
  832    m_p->notifyExtendObservers(&observation_info);
 
 
  842  m_p->_removeItems(items_local_id);
 
 
  851               bool check_if_present)
 
  853  ARCANE_ASSERT(( (!m_p->m_need_recompute && !
isAllItems()) || (m_p->m_transaction_mode && 
isAllItems()) ),
 
  854                (
"Operation on invalid group"));
 
  855  if (m_p->m_compute_functor && !m_p->m_transaction_mode)
 
  865  Int32Array & items_lid = m_p->mutableItemsLocalId();
 
  870    const Integer new_size = m_p->m_item_family->nbItem();
 
  871    items_lid.
resize(new_size);
 
  872    m_p->m_items_index_in_all_group.resize(m_p->maxLocalId());
 
  873    if (new_size==internal_size){
 
  875      for( 
Integer i=0; i<internal_size; ++i ){
 
  876        Int32 local_id = internals[i]->localId();
 
  877        items_lid[i] = local_id;
 
  878        m_p->m_items_index_in_all_group[local_id] = i;
 
  883      for( 
Integer i=0; i<internal_size; ++i ){
 
  887          items_lid[index] = local_id;
 
  888          m_p->m_items_index_in_all_group[local_id] = index;
 
  893        ARCANE_FATAL(
"Inconsistent number of elements in the generation of the group '{0}' expected={1} present={2}",
 
  894                     name(), new_size, index);
 
  899    m_p->updateTimestamp();
 
  903    addItems(added_items_lids,check_if_present);
 
  907    trace->
info(5) << 
"ItemGroupImpl::removeAddItems() group <" << 
name() << 
"> " 
  908                   << 
" old_size=" << m_p->m_item_family->nbItem()
 
  909                   << 
" new_size=" << 
size()
 
  910                   << 
" nb_removed=" << removed_items_lids.
size()
 
  911                   << 
" nb_added=" << added_items_lids.
size();
 
 
  923  if (m_p->m_compute_functor && !m_p->m_transaction_mode)
 
  928  buf_view.
copy(items_local_id);
 
  929  m_p->updateTimestamp();
 
  930  m_p->m_need_recompute = 
false;
 
  932    ITraceMng* trace = m_p->mesh()->traceMng();
 
  934                              << 
" size=" << 
size();
 
  940    m_p->notifyInvalidateObservers();
 
  942    m_p->notifyExtendObservers(&items_local_id);
 
 
  955    std::sort(std::begin(local_ids),std::end(local_ids),*
this);
 
  959    return m_items[lid1].uniqueId() < m_items[lid2].uniqueId();
 
 
  977  sorter.sort(sorted_lid);
 
 
  987  m_p->m_is_all_items = 
true;
 
  996  return m_p->m_is_all_items;
 
 
 1002class ItemCheckSuppressedFunctor
 
 1010  bool operator()(
Integer item_lid)
 
 1012      return m_items[item_lid]->isSuppressed();
 
 
 1026  ITraceMng* trace = m_p->mesh()->traceMng();
 
 1027  if (m_p->m_compute_functor) {
 
 1028    trace->
debug(
Trace::High) << 
"ItemGroupImpl::removeSuppressedItems on " << 
name() << 
" : skip computed group";
 
 1034  Int32Array& items_lid = m_p->mutableItemsLocalId();
 
 1037    for( 
Integer i=0; i<current_size; ++i ){
 
 1038      if (items_lid[i]>=nb_item){
 
 1039        trace->
fatal() << 
"ItemGroupImpl::removeSuppressedItems(): bad range " 
 1040                       << 
" name=" << 
name()
 
 1041                       << 
" i=" << i << 
" lid=" << items_lid[i]
 
 1042                       << 
" max=" << nb_item;
 
 1052  if (m_p->m_observer_need_info){
 
 1053    removed_ids.
reserve(current_size); 
 
 1055    for( 
Integer i=0; i<current_size; ++i ){
 
 1056      if (!items[items_lid[i]]->isSuppressed()){
 
 1057        items_lid[index] = items_lid[i];
 
 1061        removed_lids.
add(items_lid[i]);
 
 1065    if (new_size!=current_size){
 
 1066      items_lid.
resize(new_size);
 
 1072    auto ibegin = std::begin(items_lid);
 
 1073    auto new_end = std::remove_if(ibegin,std::end(items_lid),f);
 
 1074    new_size = (
Integer)(new_end-ibegin);
 
 1075    items_lid.
resize(new_size);
 
 1080                              << 
"> NEW SIZE=" << new_size << 
" OLD=" << current_size;
 
 1085  if (current_size != new_size) {
 
 1086    m_p->updateTimestamp();
 
 1087    m_p->notifyReduceObservers(observation_info);
 
 1088    delete observation_info;
 
 1089    delete observation_info2;
 
 
 1106_checkNeedUpdate(
bool do_padding)
 
 1112  ItemGroupInternal::CheckNeedUpdateMutex::ScopedLock lock(m_p->m_check_need_update_mutex);
 
 1116  bool has_recompute = 
false;
 
 1117  if (m_p->m_need_recompute) {
 
 1118    m_p->m_need_recompute = 
false;
 
 1121    if (m_p->m_compute_functor) {
 
 1122      m_p->m_compute_functor->executeFunctor();
 
 1128    if (m_p->m_need_invalidate_on_recompute) {     
 
 1129      m_p->m_need_invalidate_on_recompute = 
false; 
 
 1130      m_p->notifyInvalidateObservers();            
 
 1132    has_recompute = 
true;
 
 1135    _checkUpdateSimdPadding();
 
 1136  return has_recompute;
 
 1143_checkNeedUpdateNoPadding()
 
 1145  return _checkNeedUpdate(
false);
 
 1152_checkNeedUpdateWithPadding()
 
 1154  return _checkNeedUpdate(
true);
 
 1163  return _checkNeedUpdate(
false);
 
 
 1170_checkUpdateSimdPadding()
 
 1172  m_p->checkUpdateSimdPadding();
 
 1181  Int32Array& items_lid = m_p->mutableItemsLocalId();
 
 1182  if (!items_lid.
empty())
 
 1184    m_p->updateTimestamp();
 
 1186  m_p->m_need_recompute = 
false;
 
 1187  for( 
const auto& i : m_p->m_sub_groups )
 
 1189  m_p->notifyInvalidateObservers();
 
 
 1199    return ItemGroup(m_p->m_parent);
 
 
 1209  ARCANE_ASSERT((!m_p->m_need_recompute),(
"Operation on invalid group"));
 
 1210  bool is_verbose = m_p->m_is_debug_apply_operation;
 
 1212  ITraceMng* tm = m_p->mesh()->traceMng();
 
 1214    tm->
info() << 
"applyOperation name=" << 
name() << 
" nb_item=" << 
size();
 
 1215  if (m_p->isUseV2ForApplyOperation()){
 
 1216    if (m_p->m_children_by_type_ids.empty()){
 
 1217      _initChildrenByTypeV2();
 
 1219    Int64 t = m_p->timestamp();
 
 1221      tm->
info() << 
"applyOperation timestamp=" << t << 
" last=" << m_p->m_children_by_type_ids_computed_timestamp;
 
 1222    if (m_p->m_children_by_type_ids_computed_timestamp != t){
 
 1223      _computeChildrenByTypeV2();
 
 1224      m_p->m_children_by_type_ids_computed_timestamp = t;
 
 1228    if (m_p->m_children_by_type.empty())
 
 1229      _initChildrenByType();
 
 1232  const bool has_only_one_type = (m_p->m_unique_children_type != IT_NullType);
 
 1234    tm->
info() << 
"applyOperation has_only_one_type=" << has_only_one_type << 
" value=" << m_p->m_unique_children_type;
 
 1237#define APPLY_OPERATION_ON_TYPE(ITEM_TYPE)      \ 
 1238  if (m_p->isUseV2ForApplyOperation()){\ 
 1239    Int16 type_id = IT_##ITEM_TYPE;\ 
 1240    Int32ConstArrayView sub_ids = m_p->m_children_by_type_ids[type_id]; \ 
 1241    if (has_only_one_type && type_id==m_p->m_unique_children_type)\ 
 1242      sub_ids = itemsLocalId(); \ 
 1243    if (is_verbose && sub_ids.size()>0)                                   \ 
 1244      tm->info() << "Type=" << (int)IT_##ITEM_TYPE << " nb=" << sub_ids.size(); \ 
 1245    if (sub_ids.size()!=0){\ 
 1246      operation->apply##ITEM_TYPE(family->view(sub_ids)); \ 
 1250    ItemGroup group(m_p->m_children_by_type[IT_##ITEM_TYPE]); \ 
 1251    if (!group.empty())                                       \ 
 1252      operation->apply##ITEM_TYPE(group.view());              \ 
 1255  APPLY_OPERATION_ON_TYPE(Vertex);
 
 1256  APPLY_OPERATION_ON_TYPE(Line2);
 
 1257  APPLY_OPERATION_ON_TYPE(Triangle3);
 
 1258  APPLY_OPERATION_ON_TYPE(Quad4);
 
 1259  APPLY_OPERATION_ON_TYPE(Pentagon5);
 
 1260  APPLY_OPERATION_ON_TYPE(Hexagon6);
 
 1261  APPLY_OPERATION_ON_TYPE(Tetraedron4);
 
 1262  APPLY_OPERATION_ON_TYPE(Pyramid5);
 
 1263  APPLY_OPERATION_ON_TYPE(Pentaedron6);
 
 1264  APPLY_OPERATION_ON_TYPE(Hexaedron8);
 
 1265  APPLY_OPERATION_ON_TYPE(Heptaedron10);
 
 1266  APPLY_OPERATION_ON_TYPE(Octaedron12);
 
 1267  APPLY_OPERATION_ON_TYPE(HemiHexa7);
 
 1268  APPLY_OPERATION_ON_TYPE(HemiHexa6);
 
 1269  APPLY_OPERATION_ON_TYPE(HemiHexa5);
 
 1270  APPLY_OPERATION_ON_TYPE(HemiHexa7);
 
 1271  APPLY_OPERATION_ON_TYPE(AntiWedgeLeft6);
 
 1272  APPLY_OPERATION_ON_TYPE(AntiWedgeRight6);
 
 1273  APPLY_OPERATION_ON_TYPE(DiTetra5);
 
 1274  APPLY_OPERATION_ON_TYPE(DualNode);
 
 1275  APPLY_OPERATION_ON_TYPE(DualEdge);
 
 1276  APPLY_OPERATION_ON_TYPE(DualFace);
 
 1277  APPLY_OPERATION_ON_TYPE(DualCell);
 
 1278  APPLY_OPERATION_ON_TYPE(Link);
 
 1280#undef APPLY_OPERATION_ON_TYPE 
 
 1289  return !(m_p->m_compute_functor != 0 ||
 
 1290           m_p->m_is_local_to_sub_domain ||
 
 
 1300  return m_p->timestamp();
 
 
 1309  auto finder = m_p->m_observers.find(ref);
 
 1310  auto end = m_p->m_observers.end();
 
 1311  if (finder != end) {
 
 1312    delete finder->second;
 
 1313    finder->second = obs;
 
 1317    m_p->m_observers[ref] = obs;
 
 1321  _updateNeedInfoFlag(m_p->m_observer_need_info | obs->
needInfo());
 
 
 1330  auto finder = m_p->m_observers.find(ref);
 
 1331  auto end = m_p->m_observers.end();
 
 1338  m_p->m_observers.erase(finder);
 
 1340  bool new_observer_need_info = 
false;
 
 1341  auto i = m_p->m_observers.begin();
 
 1342  for( ; i != end ; ++i ) {
 
 1344    new_observer_need_info |= obs->
needInfo();
 
 1346  _updateNeedInfoFlag(new_observer_need_info);
 
 1351  if(m_p->m_group_index_table.isUsed() && m_p->m_group_index_table.isUnique()) {
 
 1352    m_p->m_group_index_table.reset();
 
 1353    m_p->m_synchronizer.reset();
 
 
 1363  return m_p->m_observer_need_info;
 
 
 1372  delete m_p->m_compute_functor;
 
 1373  m_p->m_compute_functor = functor;
 
 
 1382  return (m_p->m_compute_functor);
 
 
 1389_initChildrenByType()
 
 1394  m_p->m_children_by_type.resize(nb_basic_item_type);
 
 1395  for( 
Integer i=0; i<nb_basic_item_type; ++i ){
 
 1400    m_p->m_children_by_type[i] = igi;
 
 1408_initChildrenByTypeV2()
 
 1410  bool is_verbose = m_p->m_is_debug_apply_operation;
 
 1412    m_p->mesh()->traceMng()->info() << 
"ItemGroupImpl::_initChildrenByTypeV2() name=" << 
name();
 
 1415  m_p->m_children_by_type_ids.resize(nb_basic_item_type);
 
 1416  for( 
Integer i=0; i<nb_basic_item_type; ++i ){
 
 1425_computeChildrenByType()
 
 1427  ItemGroup that_group(
this);
 
 1428  ITraceMng * trace = that_group.mesh()->traceMng();
 
 1433  UniqueArray< SharedArray<Int32> > items_by_type(nb_basic_item_type);
 
 1434  for( 
Integer i=0; i<nb_basic_item_type; ++i ){
 
 1436    impl->beginTransaction();
 
 1440    const Item& item = *iitem;
 
 1441    Integer item_type = item.type();
 
 1442    if (item_type<nb_basic_item_type)
 
 1443      items_by_type[item_type].add(iitem.itemLocalId());
 
 1446  for( 
Integer i=0; i<nb_basic_item_type; ++i ){
 
 1448    impl->setItems(items_by_type[i]);
 
 1449    impl->endTransaction();
 
 1457_computeChildrenByTypeV2()
 
 1459  ItemGroup that_group(
this);
 
 1461  IMesh* 
mesh = m_p->mesh();
 
 1462  ItemTypeMng* type_mng = 
mesh->itemTypeMng();
 
 1463  ITraceMng* trace = 
mesh->traceMng();
 
 1464  bool is_verbose = m_p->m_is_debug_apply_operation;
 
 1466    trace->info() << 
"ItemGroupImpl::_computeChildrenByTypeV2 for " << 
name();
 
 1470    ItemInfoListView lv(m_p->m_item_family->itemInfoListView());
 
 1471    m_p->m_unique_children_type = ItemTypeId{lv.typeId(m_p->itemsLocalId()[0])};
 
 1476  m_p->m_unique_children_type = ItemTypeId{IT_NullType};
 
 1478  UniqueArray<Int32> nb_items_by_type(nb_basic_item_type);
 
 1479  nb_items_by_type.fill(0);
 
 1482    Int16 item_type = item.type();
 
 1483    if (item_type<nb_basic_item_type)
 
 1484      ++nb_items_by_type[item_type];
 
 1487  Int32 nb_different_type = 0;
 
 1488  for( 
Int32 i=0; i<nb_basic_item_type; ++i ){
 
 1489    m_p->m_children_by_type_ids[i].clear();
 
 1490    const Int32 n = nb_items_by_type[i];
 
 1491    m_p->m_children_by_type_ids[i].reserve(n);
 
 1493      ++nb_different_type;
 
 1495      trace->info() << 
"ItemGroupImpl::_computeChildrenByTypeV2 for " << 
name()
 
 1496                    << 
" type=" << type_mng->typeName(i) << 
" nb=" << n;
 
 1499    trace->info() << 
"ItemGroupImpl::_computeChildrenByTypeV2 for " << 
name()
 
 1500                  << 
" nb_item=" << nb_item << 
" nb_different_type=" << nb_different_type;
 
 1505  if (nb_item>0 && nb_different_type==1){
 
 1506    ItemInfoListView lv(m_p->m_item_family->itemInfoListView());
 
 1507    m_p->m_unique_children_type = ItemTypeId{lv.typeId(m_p->itemsLocalId()[0])};
 
 1509      trace->info() << 
"ItemGroupImpl::_computeChildrenByTypeV2 for " << 
name()
 
 1510                    << 
" unique_type=" << type_mng->typeName(m_p->m_unique_children_type);
 
 1516    Integer item_type = item.type();
 
 1517    if (item_type<nb_basic_item_type)
 
 1518      m_p->m_children_by_type_ids[item_type].add(iitem.itemLocalId());
 
 1521  for( 
Int32 i=0; i<nb_basic_item_type; ++i )
 
 1522    applySimdPadding(m_p->m_children_by_type_ids[i]);
 
 1531  ARCANE_UNUSED(info);
 
 1534  m_p->notifyInvalidateObservers();
 
 1543  ARCANE_UNUSED(info);
 
 1546  m_p->notifyInvalidateObservers();
 
 1555  ARCANE_UNUSED(info);
 
 1558  m_p->notifyInvalidateObservers();
 
 1567  m_p->setNeedRecompute();
 
 1568  m_p->notifyInvalidateObservers();
 
 1575_updateNeedInfoFlag(
const bool flag)
 
 1577  if (m_p->m_observer_need_info == flag)
 
 1579  m_p->m_observer_need_info = flag;
 
 1583    parent->detachObserver(
this);
 
 1584    if (m_p->m_observer_need_info) {
 
 1586                                                        &ItemGroupImpl::_executeExtend,
 
 1587                                                        &ItemGroupImpl::_executeReduce,
 
 1588                                                        &ItemGroupImpl::_executeCompact,
 
 1589                                                        &ItemGroupImpl::_executeInvalidate));
 
 1592                                                        &ItemGroupImpl::_executeInvalidate));
 
 1601_forceInvalidate(
const bool self_invalidate)
 
 1605  if (self_invalidate) {
 
 1606    m_p->setNeedRecompute();
 
 1607    m_p->m_need_invalidate_on_recompute = 
true;
 
 1610  for( 
const auto& i :  m_p->m_sub_groups )
 
 1611    i.second->_forceInvalidate(
true);
 
 1623    std::vector<const void*> ptrs;
 
 1624    for( 
const auto& i : m_p->m_observers )
 
 1625      ptrs.push_back(i.first);
 
 1626    for( 
const void* i : ptrs )
 
 1632  if (m_p->m_is_all_items)
 
 1633    m_p->resetSubGroups();
 
 1636    m_p = 
new ItemGroupInternal();
 
 
 1646  if(!m_p->m_group_index_table.isUsed()) {
 
 1648    ITraceMng* trace =  m_p->m_mesh->traceMng();
 
 1649    trace->
debug(
Trace::High) << 
"** CREATION OF LOCAL ID TO INDEX TABLE OF GROUP : " << m_p->m_name;
 
 1650    m_p->m_group_index_table->update();
 
 1652  return m_p->m_group_index_table;
 
 
 1661  if(!m_p->m_synchronizer.get()) {
 
 1663    ItemGroup this_group(
this);
 
 1665    ITraceMng* trace =  m_p->m_mesh->traceMng();
 
 1666    trace->
debug(
Trace::High) << 
"** CREATION OF SYNCHRONIZER OF GROUP : " << m_p->m_name;
 
 1667    m_p->m_synchronizer->compute();
 
 1669  return m_p->m_synchronizer.get();
 
 
 1678  return m_p->m_synchronizer.get();
 
 
 1700  ItemUniqueId last_uid = items[items_lid[0]]->uniqueId();
 
 1701  for( 
Integer i=1; i<nb_item; ++i ){
 
 
 1718  if (
this==shared_null){
 
 1719    shared_null = 
nullptr;
 
 1731    shared_null = 
new ItemGroupImplNull();
 
 1732    shared_null->addRef();
 
 1745    shared_null->removeRef();
 
 1754  return m_p->isContiguous();
 
 
 1763  m_p->checkIsContiguous();
 
 
 1772  Int32Array& items_lid = m_p->mutableItemsLocalId();
 
 
 1785    m_p->mutableItemsLocalId().clear();
 
 1788  if (m_p->variableItemsLocalid())
 
 1789    m_p->variableItemsLocalid()->variable()->shrinkMemory();
 
 1791    m_p->mutableItemsLocalId().shrink();
 
 1793  m_p->applySimdPadding();
 
 
 1802  return &m_p->m_internal_api;
 
 
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Integer capacity() const
Capacité (nombre d'éléments alloués) du vecteur.
Integer size() const
Nombre d'éléments du vecteur.
bool empty() const
Capacité (nombre d'éléments alloués) du vecteur.
Exception lorsqu'un argument est invalide.
void copy(const U ©_array)
Recopie le tableau copy_array dans l'instance.
constexpr Integer size() const noexcept
Retourne la taille du tableau.
void fill(ConstReferenceType value)
Remplit le tableau avec la valeur value.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
void clear()
Supprime les éléments du tableau.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
void reserve(Int64 new_capacity)
Réserve le mémoire pour new_capacity éléments.
ArrayView< T > subView(Int64 abegin, Integer asize)
Sous-vue à partir de l'élément abegin et contenant asize éléments.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Interface d'une famille d'entités.
virtual ItemGroup createGroup(const String &name, Int32ConstArrayView local_ids, bool do_override=false)=0
Créé un groupe d'entités de nom name contenant les entités local_ids.
virtual IMesh * mesh() const =0
Maillage associé
virtual bool needInfo() const =0
Indique si l'observer aura besoin d'information de transition.
Interface d'un opérateur sur des entités rangées par type.
virtual ITraceMng * traceMng()=0
Gestionnaire de message associé
virtual ItemTypeMng * itemTypeMng() const =0
Gestionnaire de types d'entités associé
virtual const MeshPartInfo & meshPartInfo() const =0
Informations sur les parties du maillage.
Interface du gestionnaire de parallélisme pour un sous-domaine.
Interface du gestionnaire de traces.
virtual TraceMessage fatal()=0
Flot pour un message d'erreur fatale.
virtual TraceMessage info()=0
Flot pour un message d'information.
virtual TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium)=0
Flot pour un message de debug.
Interface d'un service de synchronisation de variable.
bool isSuppressed() const
Vrai si l'entité est supprimée.
Int32 localId() const
Numéro local (au sous-domaine) de l'entité
Fonctor pour le calcul des éléments d'un groupe.
void executeFunctor() override
Exécute la méthode associé
const String & name() const
Retourne le nom du groupe.
void removeItems(Int32ConstArrayView items_local_id, bool check_if_present)
Supprime les entités items_local_id du groupe.
bool checkNeedUpdate()
Réactualise le groupe si nécessaire.
ItemGroupImpl * activeCellGroup()
AMR.
void removeAddItems(Int32ConstArrayView removed_local_id, Int32ConstArrayView added_local_id, bool check_if_present)
Supprime et ajoute les entités removed_local_id et added_local_id du groupe.
ItemGroupImplInternal * _internalApi() const
API interne à Arcane.
void setItems(Int32ConstArrayView items_local_id)
Positionne les entités du groupe à items_local_id.
void setOwn(bool v)
Positionne la propriété de groupe local ou non.
Int64 timestamp() const
Retourne le temps du groupe. Ce temps est incrémenté après chaque modification.
ItemInternalList itemsInternal() const
Liste des entités sur lesquelles s'appuie le groupe.
void endTransaction()
Termine une transaction.
void invalidate(bool force_recompute)
Invalide le groupe.
ItemGroupImpl * nodeGroup()
Groupe des noeuds des éléments de ce groupe.
void addItems(Int32ConstArrayView items_local_id, bool check_if_present)
Ajoute les entités de numéros locaux items_local_id.
bool isAllItems() const
Indique si le groupe est celui de toutes les entités.
ItemGroupImpl * parent() const
Groupe parent (0 si aucun)
ItemGroupImpl * cellGroup()
Groupe des mailles des éléments de ce groupe.
ItemGroupImpl * innerFaceGroup()
Groupe des faces internes des éléments de ce groupe.
eItemKind itemKind() const
Genre du groupe. Il s'agit du genre de ses éléments.
ItemGroupImpl * createSubGroup(const String &suffix, IItemFamily *family, ItemGroupComputeFunctor *functor)
Crée un sous-groupe calculé
void checkLocalIdsAreContiguous() const
Vérifie si les entités du groupe ont des localIds() contigüs.
virtual ~ItemGroupImpl()
Libère les ressources.
ItemGroupImpl * edgeGroup()
Groupe des arêtes des éléments de ce groupe.
bool null() const
Retourne true si le groupe est nul.
void clear()
Supprime les entités du groupe.
ItemGroupImpl * faceGroup()
Groupe des faces des éléments de ce groupe.
void destroy()
Détruit le groupe. Après cet appel, le groupe devient un groupe nul.
void setLocalToSubDomain(bool v)
Positionne le booléen indiquant si le groupe est local au sous-domaine.
void removeSuppressedItems()
Supprime du groupe les entités dont le flag isSuppressed() est vrai.
const String & fullName() const
Nom complet du groupe (avec maillage + famille)
ItemGroupImpl * ownGroup()
Groupe des entité propres des entités de ce groupe.
IMesh * mesh() const
Maillage auquel appartient le groupe (0 pour le groupe nul).
bool checkIsSorted() const
Vérifie et retourne si le groupe est trié par uniqueId() croissants.
void checkValid()
Vérifie que le groupe est valide.
IVariableSynchronizer * synchronizer()
Synchronizer du groupe.
Integer size() const
Nombre d'entités du groupe.
Int32ConstArrayView itemsLocalId() const
Liste des numéros locaux des entités de ce groupe.
bool needSynchronization() const
Indique si le groupe a structurellement besoin d'une synchro parallèle.
ItemGroupImpl * ownActiveCellGroup()
Groupe des mailles propres actives de ce groupe.
SharedPtrT< GroupIndexTable > localIdToIndex()
Table des local ids vers une position pour toutes les entités du groupe.
ItemInfoListView itemInfoListView() const
Liste des entités sur lesquelles s'appuie le groupe.
void attachObserver(const void *ref, IItemGroupObserver *obs)
Attache un observer.
ItemGroupImpl * outerActiveFaceGroup()
Groupe des faces externes actives des éléments de ce groupe.
void detachObserver(const void *ref)
Détache un observer.
IItemFamily * itemFamily() const
Familly à laquelle appartient le groupe (ou 0 si aucune)
bool isLocalToSubDomain() const
AMR OFF.
ItemGroupImpl * ghostGroup()
Items in the group not owned by the subdomain.
ItemGroupImpl * ownLevelCellGroup(const Integer &level)
Groupe des mailles propres actives de ce groupe.
Int64 capacity() const
Nombre d'éléments alloués.
bool isContiguousLocalIds() const
Indique si les entités du groupe ont des localIds() contigüs.
ItemGroupImpl * innerActiveFaceGroup()
Groupe des faces internes actives des éléments de ce groupe.
void applyOperation(IItemOperationByBasicType *operation)
Applique l'opération operation sur les entités du groupe.
void beginTransaction()
Débute une transaction.
ItemGroupImpl * levelCellGroup(const Integer &level)
Groupe des mailles actives de ce groupe.
bool hasComputeFunctor() const
Indique si le groupe est calculé
bool hasSynchronizer()
Indique si ce groupe possède un synchroniser.
bool hasInfoObserver() const
Indique si le contenu de ce groupe est observé.
void setComputeFunctor(IFunctor *functor)
Définit une fonction de calcul de groupe.
ItemGroupImpl * ownActiveFaceGroup()
Groupe des faces externes actives des éléments de ce groupe.
bool isOwn() const
Retourne si le groupe contient uniquement des éléments propres au sous-domaine.
ItemGroupImpl()
Construit un groupe nul.
ItemGroup parentGroup()
Groupe parent.
bool empty() const
Vrai si le groupe est vide.
ItemGroupImpl * activeFaceGroup()
Groupe des faces actives propres au domaine.
const String & name() const
Nom du groupe.
ItemGroupImpl * outerFaceGroup()
Groupe des faces externes des éléments de ce groupe.
void shrinkMemory()
Limite au maximum la mémoire utilisée par le groupe.
ItemGroupImpl * findSubGroup(const String &suffix)
Accède à un sous-groupe calculé
void changeIds(Int32ConstArrayView old_to_new_ids)
Change les indices des entités du groupe.
Vue sur une liste pour obtenir des informations sur les entités.
Gestionnaire des types d'entités d'un maillage.
static Integer nbBasicItemType()
nombre de types disponibles
String typeName(Integer id) const
Nom du type correspondant au numéro id.
Identifiant unique d'une entité.
Vue d'un tableau d'éléments de type T.
Chaîne de caractères unicode.
Vecteur 1D de données avec sémantique par valeur (style STL).
ItemGroupT< Cell > CellGroup
Groupe de mailles.
ItemGroupT< Face > FaceGroup
Groupe de faces.
ItemGroupT< Edge > EdgeGroup
Groupe d'arêtes.
ItemGroupT< Node > NodeGroup
Groupe de noeuds.
IMemoryAllocator * getDefaultDataAllocator()
Allocateur par défaut pour les données.
Int32 checkResizeArrayWithCapacity(Array< DataType > &array, Int64 new_size, bool force_resize)
Redimensionne un tableau en ajoutant une réserve de mémoire.
void copy(MutableMemoryView destination, eMemoryResource destination_mem, ConstMemoryView source, eMemoryResource source_mem, const RunQueue *queue=nullptr)
Copie de source vers destination en utilisant la file queue.
Ref< IVariableSynchronizer > createSynchronizerRef(IParallelMng *pm, IItemFamily *family)
Retourne une interface pour synchroniser des variables sur le groupe de la famille family.
@ Medium
Niveau moyen (défaut)
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
bool arcaneIsCheck()
Vrai si on est en mode vérification.
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
@ Cartesian
Maillage cartésien.
ConstArrayView< ItemInternal * > ItemInternalList
Type de la liste interne des entités.
UniqueArray< Int32 > Int32UniqueArray
Tableau dynamique à une dimension d'entiers 32 bits.
ArrayView< Int32 > Int32ArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
eItemKind
Genre d'entité de maillage.
@ IK_Node
Entité de maillage de genre noeud.
@ IK_Cell
Entité de maillage de genre maille.
@ IK_Face
Entité de maillage de genre face.
@ IK_Edge
Entité de maillage de genre arête.
std::int16_t Int16
Type entier signé sur 16 bits.
IItemGroupObserver * newItemGroupObserverT(T *object, typename IItemGroupObserver::FuncTraits< T >::FuncPtr funcptr)
Utilitaire pour création simplifié de ItemGroupObserverT.
Array< Int32 > Int32Array
Tableau dynamique à une dimension d'entiers 32 bits.
std::int32_t Int32
Type entier signé sur 32 bits.