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))
126 m_p->m_sub_parts_by_type.setImpl(
this);
134: m_p(new ItemGroupInternal(family,
parent,
name))
136 m_p->m_sub_parts_by_type.setImpl(
this);
144: m_p (new ItemGroupInternal())
146 m_p->m_sub_parts_by_type.setImpl(
this);
173 return m_p->fullName();
182 return m_p->itemsLocalId().size();
191 return m_p->itemsLocalId().empty();
200 return m_p->itemsLocalId();
209 if (m_p->m_transaction_mode)
211 m_p->m_transaction_mode =
true;
220 if (!m_p->m_transaction_mode)
222 m_p->m_transaction_mode =
false;
223 if (m_p->m_need_recompute) {
224 m_p->m_need_recompute =
false;
225 m_p->m_need_invalidate_on_recompute =
false;
226 m_p->notifyInvalidateObservers();
234unguardedItemsLocalId(
const bool self_invalidate)
236 ITraceMng* trace = m_p->m_mesh->traceMng();
238 <<
" with self_invalidate=" << self_invalidate;
240 if (m_p->m_compute_functor && !m_p->m_transaction_mode)
241 ARCANE_FATAL(
"Direct access for computed group in only available during a transaction");
243 _forceInvalidate(self_invalidate);
244 return m_p->mutableItemsLocalId();
253 return m_p->m_parent;
271 return m_p->m_item_family;
289 return m_p->m_is_own;
298 const bool is_own = m_p->m_is_own;
302 if (m_p->m_own_group)
336 m_p->m_own_group = ii;
339 m_p->m_own_group = ii;
355 m_p->m_ghost_group = ii;
367 return checkSharedNull();
371 m_p->m_interface_group = ii;
387 m_p->m_node_group = ii;
403 m_p->m_edge_group = ii;
419 m_p->m_face_group = ii;
435 m_p->m_cell_group = ii;
447 return checkSharedNull();
452 m_p->m_inner_face_group = ii;
464 return checkSharedNull();
469 m_p->m_outer_face_group = ii;
484 return checkSharedNull();
490 m_p->m_active_cell_group = ii;
502 return checkSharedNull();
508 m_p->m_own_active_cell_group = ii;
520 return checkSharedNull();
524 m_p->m_mesh->cellFamily(),
526 m_p->m_level_cell_group[level] = ii;
538 return checkSharedNull();
543 m_p->m_mesh->cellFamily(),
545 m_p->m_own_level_cell_group[level] = ii;
557 return checkSharedNull();
562 m_p->m_active_face_group = ii;
574 return checkSharedNull();
579 m_p->m_own_active_face_group = ii;
590 return checkSharedNull();
595 m_p->m_inner_active_face_group = ii;
607 return checkSharedNull();
612 m_p->m_outer_active_face_group = ii;
623 auto finder = m_p->m_sub_groups.find(sub_name);
624 if (finder != m_p->m_sub_groups.end()) {
625 ARCANE_FATAL(
"Cannot create already existing sub-group ({0}) in group ({1})",
628 ItemGroup ig = family->
createGroup(sub_name,ItemGroup(
this));
631 functor->setGroup(ii);
634 &ItemGroupImpl::_executeInvalidate));
635 m_p->m_sub_groups[sub_name] = ii;
647 auto finder = m_p->m_sub_groups.find(sub_name);
648 if (finder != m_p->m_sub_groups.end()) {
649 return finder->second.get();
653 return checkSharedNull();
663 ITraceMng* trace = m_p->m_mesh->traceMng();
664 if (m_p->m_compute_functor) {
666 <<
name() <<
" : skip computed group";
679 m_p->notifyInvalidateObservers();
684 for(
Integer i=0, is=items_lid.
size(); i<is; ++i ){
686 items_lid[i] = old_to_new_ids[old_id];
689 m_p->updateTimestamp();
696 if (m_p->m_observer_need_info) {
697 m_p->notifyCompactObservers(&old_to_new_ids);
701 std::sort(std::begin(items_lid),std::end(items_lid));
702 m_p->notifyCompactObservers(
nullptr);
714 ITraceMng* msg = m_p->m_mesh->traceMng();
715 msg->
debug(
Trace::High) <<
"ItemGroupImpl::invalidate(force=" << force_recompute <<
")"
716 <<
" name=" <<
name();
720 m_p->updateTimestamp();
721 m_p->setNeedRecompute();
724 m_p->notifyInvalidateObservers();
742 return m_p->itemInfoListView();
751 return m_p->m_is_local_to_sub_domain;
760 m_p->m_is_local_to_sub_domain = v;
769 ARCANE_ASSERT(( (!m_p->m_need_recompute && !
isAllItems()) || (m_p->m_transaction_mode &&
isAllItems()) ),
770 (
"Operation on invalid group"));
771 if (m_p->m_compute_functor && !m_p->m_transaction_mode)
779 if (nb_item_to_add==0)
782 Int32Array& items_lid = m_p->mutableItemsLocalId();
788 Integer nb_items_id = current_size;
789 m_p->m_items_index_in_all_group.resize(m_p->maxLocalId());
790 for(
Integer i=0, is=nb_item_to_add; i<is; ++i ){
791 Int32 local_id = items_local_id[i];
792 items_lid.
add(local_id);
793 m_p->m_items_index_in_all_group[local_id] = nb_items_id+i;
795 nb_added = nb_item_to_add;
797 else if (check_if_present) {
800 presence_checks.
fill(
false);
801 for(
Integer i=0, is=items_lid.
size(); i<is; ++i ){
802 presence_checks[items_lid[i]] =
true;
805 for(
Integer i=0; i<nb_item_to_add; ++i ) {
806 const Integer lid = items_local_id[i];
807 if (!presence_checks[lid]){
811 presence_checks[lid] =
true;
817 nb_added = nb_item_to_add;
824 trace->
info(5) <<
"ItemGroupImpl::addItems() group <" <<
name() <<
"> "
825 <<
" checkpresent=" << check_if_present
826 <<
" nb_current=" << current_size
827 <<
" want_to_add=" << nb_item_to_add
828 <<
" effective_added=" << nb_added;
833 m_p->updateTimestamp();
834 Int32ConstArrayView observation_info(nb_added, items_lid.unguardedBasePointer()+current_size);
835 m_p->notifyExtendObservers(&observation_info);
845 m_p->_removeItems(items_local_id);
854 bool check_if_present)
856 ARCANE_ASSERT(( (!m_p->m_need_recompute && !
isAllItems()) || (m_p->m_transaction_mode &&
isAllItems()) ),
857 (
"Operation on invalid group"));
858 if (m_p->m_compute_functor && !m_p->m_transaction_mode)
868 Int32Array & items_lid = m_p->mutableItemsLocalId();
873 const Integer new_size = m_p->m_item_family->nbItem();
874 items_lid.
resize(new_size);
875 m_p->m_items_index_in_all_group.resize(m_p->maxLocalId());
876 if (new_size==internal_size){
878 for(
Integer i=0; i<internal_size; ++i ){
879 Int32 local_id = internals[i]->localId();
880 items_lid[i] = local_id;
881 m_p->m_items_index_in_all_group[local_id] = i;
886 for(
Integer i=0; i<internal_size; ++i ){
890 items_lid[index] = local_id;
891 m_p->m_items_index_in_all_group[local_id] = index;
896 ARCANE_FATAL(
"Inconsistent number of elements in the generation of the group '{0}' expected={1} present={2}",
897 name(), new_size, index);
902 m_p->updateTimestamp();
906 addItems(added_items_lids,check_if_present);
910 trace->
info(5) <<
"ItemGroupImpl::removeAddItems() group <" <<
name() <<
"> "
911 <<
" old_size=" << m_p->m_item_family->nbItem()
912 <<
" new_size=" <<
size()
913 <<
" nb_removed=" << removed_items_lids.
size()
914 <<
" nb_added=" << added_items_lids.
size();
926 if (m_p->m_compute_functor && !m_p->m_transaction_mode)
931 buf_view.
copy(items_local_id);
932 m_p->updateTimestamp();
933 m_p->m_need_recompute =
false;
935 ITraceMng* trace = m_p->mesh()->traceMng();
937 <<
" size=" <<
size();
943 m_p->notifyInvalidateObservers();
945 m_p->notifyExtendObservers(&items_local_id);
958 std::sort(std::begin(local_ids),std::end(local_ids),*
this);
962 return m_items[lid1].uniqueId() < m_items[lid2].uniqueId();
980 sorter.sort(sorted_lid);
990 m_p->m_is_all_items =
true;
999 return m_p->m_is_all_items;
1005class ItemCheckSuppressedFunctor
1013 bool operator()(
Integer item_lid)
1015 return m_items[item_lid]->isSuppressed();
1029 ITraceMng* trace = m_p->mesh()->traceMng();
1030 if (m_p->m_compute_functor) {
1031 trace->
debug(
Trace::High) <<
"ItemGroupImpl::removeSuppressedItems on " <<
name() <<
" : skip computed group";
1037 Int32Array& items_lid = m_p->mutableItemsLocalId();
1040 for(
Integer i=0; i<current_size; ++i ){
1041 if (items_lid[i]>=nb_item){
1042 trace->
fatal() <<
"ItemGroupImpl::removeSuppressedItems(): bad range "
1043 <<
" name=" <<
name()
1044 <<
" i=" << i <<
" lid=" << items_lid[i]
1045 <<
" max=" << nb_item;
1055 if (m_p->m_observer_need_info){
1056 removed_ids.
reserve(current_size);
1058 for(
Integer i=0; i<current_size; ++i ){
1059 if (!items[items_lid[i]]->isSuppressed()){
1060 items_lid[index] = items_lid[i];
1064 removed_lids.
add(items_lid[i]);
1068 if (new_size!=current_size){
1069 items_lid.
resize(new_size);
1075 auto ibegin = std::begin(items_lid);
1076 auto new_end = std::remove_if(ibegin,std::end(items_lid),f);
1077 new_size = (
Integer)(new_end-ibegin);
1078 items_lid.
resize(new_size);
1083 <<
"> NEW SIZE=" << new_size <<
" OLD=" << current_size;
1088 if (current_size != new_size) {
1089 m_p->updateTimestamp();
1090 m_p->notifyReduceObservers(observation_info);
1091 delete observation_info;
1092 delete observation_info2;
1109_checkNeedUpdate(
bool do_padding)
1115 ItemGroupInternal::CheckNeedUpdateMutex::ScopedLock lock(m_p->m_check_need_update_mutex);
1119 bool has_recompute =
false;
1120 if (m_p->m_need_recompute) {
1121 m_p->m_need_recompute =
false;
1124 if (m_p->m_compute_functor) {
1125 m_p->m_compute_functor->executeFunctor();
1131 if (m_p->m_need_invalidate_on_recompute) {
1132 m_p->m_need_invalidate_on_recompute =
false;
1133 m_p->notifyInvalidateObservers();
1135 has_recompute =
true;
1138 _checkUpdateSimdPadding();
1139 return has_recompute;
1146_checkNeedUpdateNoPadding()
1148 return _checkNeedUpdate(
false);
1155_checkNeedUpdateWithPadding()
1157 return _checkNeedUpdate(
true);
1166 return _checkNeedUpdate(
false);
1173_checkUpdateSimdPadding()
1175 m_p->checkUpdateSimdPadding();
1184 Int32Array& items_lid = m_p->mutableItemsLocalId();
1185 if (!items_lid.
empty())
1187 m_p->updateTimestamp();
1189 m_p->m_need_recompute =
false;
1190 for(
const auto& i : m_p->m_sub_groups )
1192 m_p->notifyInvalidateObservers();
1202 return ItemGroup(m_p->m_parent);
1212 ARCANE_ASSERT((!m_p->m_need_recompute),(
"Operation on invalid group"));
1213 m_p->m_sub_parts_by_type.applyOperation(operation);
1216void ItemGroupSubPartsByType::
1219 bool is_verbose = m_is_debug_apply_operation;
1221 ITraceMng* tm = m_group_internal->mesh()->traceMng();
1223 tm->
info() <<
"applyOperation name=" << m_group_internal->name() <<
" nb_item=" << m_group_internal->nbItem();
1224 if (isUseV2ForApplyOperation()) {
1225 if (m_children_by_type_ids.empty()) {
1226 _initChildrenByTypeV2();
1228 Int64 t = m_group_internal->timestamp();
1230 tm->
info() <<
"applyOperation timestamp=" << t <<
" last=" << m_children_by_type_ids_computed_timestamp;
1231 if (m_children_by_type_ids_computed_timestamp != t) {
1232 _computeChildrenByTypeV2();
1233 m_children_by_type_ids_computed_timestamp = t;
1237 if (m_children_by_type.empty())
1238 _initChildrenByTypeV1();
1240 IItemFamily* family = m_group_internal->m_item_family;
1241 const bool has_only_one_type = (m_unique_children_type != IT_NullType);
1243 tm->
info() <<
"applyOperation has_only_one_type=" << has_only_one_type <<
" value=" << m_unique_children_type;
1246#define APPLY_OPERATION_ON_TYPE(ITEM_TYPE) \
1247 if (isUseV2ForApplyOperation()) { \
1248 Int16 type_id = IT_##ITEM_TYPE; \
1249 Int32ConstArrayView sub_ids = m_children_by_type_ids[type_id]; \
1250 if (has_only_one_type && type_id == m_unique_children_type) \
1251 sub_ids = m_group_internal->itemsLocalId(); \
1252 if (is_verbose && sub_ids.size()>0) \
1253 tm->info() << "Type=" << (int)IT_##ITEM_TYPE << " nb=" << sub_ids.size(); \
1254 if (sub_ids.size()!=0){\
1255 operation->apply##ITEM_TYPE(family->view(sub_ids)); \
1259 ItemGroup group(m_children_by_type[IT_##ITEM_TYPE]); \
1260 if (!group.empty()) \
1261 operation->apply##ITEM_TYPE(group.view()); \
1264 APPLY_OPERATION_ON_TYPE(Vertex);
1265 APPLY_OPERATION_ON_TYPE(Line2);
1266 APPLY_OPERATION_ON_TYPE(Triangle3);
1267 APPLY_OPERATION_ON_TYPE(Quad4);
1268 APPLY_OPERATION_ON_TYPE(Pentagon5);
1269 APPLY_OPERATION_ON_TYPE(Hexagon6);
1270 APPLY_OPERATION_ON_TYPE(Tetraedron4);
1271 APPLY_OPERATION_ON_TYPE(Pyramid5);
1272 APPLY_OPERATION_ON_TYPE(Pentaedron6);
1273 APPLY_OPERATION_ON_TYPE(Hexaedron8);
1274 APPLY_OPERATION_ON_TYPE(Heptaedron10);
1275 APPLY_OPERATION_ON_TYPE(Octaedron12);
1276 APPLY_OPERATION_ON_TYPE(HemiHexa7);
1277 APPLY_OPERATION_ON_TYPE(HemiHexa6);
1278 APPLY_OPERATION_ON_TYPE(HemiHexa5);
1279 APPLY_OPERATION_ON_TYPE(HemiHexa7);
1280 APPLY_OPERATION_ON_TYPE(AntiWedgeLeft6);
1281 APPLY_OPERATION_ON_TYPE(AntiWedgeRight6);
1282 APPLY_OPERATION_ON_TYPE(DiTetra5);
1283 APPLY_OPERATION_ON_TYPE(DualNode);
1284 APPLY_OPERATION_ON_TYPE(DualEdge);
1285 APPLY_OPERATION_ON_TYPE(DualFace);
1286 APPLY_OPERATION_ON_TYPE(DualCell);
1287 APPLY_OPERATION_ON_TYPE(Link);
1289#undef APPLY_OPERATION_ON_TYPE
1298 return !(m_p->m_compute_functor != 0 ||
1299 m_p->m_is_local_to_sub_domain ||
1309 return m_p->timestamp();
1318 auto finder = m_p->m_observers.find(ref);
1319 auto end = m_p->m_observers.end();
1320 if (finder != end) {
1321 delete finder->second;
1322 finder->second = obs;
1326 m_p->m_observers[ref] = obs;
1330 _updateNeedInfoFlag(m_p->m_observer_need_info | obs->
needInfo());
1339 auto finder = m_p->m_observers.find(ref);
1340 auto end = m_p->m_observers.end();
1347 m_p->m_observers.erase(finder);
1349 bool new_observer_need_info =
false;
1350 auto i = m_p->m_observers.begin();
1351 for( ; i != end ; ++i ) {
1353 new_observer_need_info |= obs->
needInfo();
1355 _updateNeedInfoFlag(new_observer_need_info);
1360 if(m_p->m_group_index_table.isUsed() && m_p->m_group_index_table.isUnique()) {
1361 m_p->m_group_index_table.reset();
1362 m_p->m_synchronizer.reset();
1372 return m_p->m_observer_need_info;
1381 delete m_p->m_compute_functor;
1382 m_p->m_compute_functor = functor;
1391 return (m_p->m_compute_functor);
1398_computeChildrenByType()
1400 m_p->m_sub_parts_by_type._computeChildrenByTypeV1();
1406void ItemGroupSubPartsByType::
1407_computeChildrenByTypeV1()
1409 ItemGroup that_group(m_group_impl);
1410 ITraceMng * trace = that_group.mesh()->traceMng();
1411 trace->
debug(
Trace::High) <<
"ItemGroupImpl::_computeChildrenByType for " << m_group_internal->name();
1415 UniqueArray< SharedArray<Int32> > items_by_type(nb_basic_item_type);
1416 for (
Integer i = 0; i < nb_basic_item_type; ++i) {
1417 ItemGroupImpl* impl = m_children_by_type[i];
1418 impl->beginTransaction();
1423 Integer item_type = item.type();
1424 if (item_type<nb_basic_item_type)
1425 items_by_type[item_type].add(iitem.itemLocalId());
1428 for (
Integer i = 0; i < nb_basic_item_type; ++i) {
1431 impl->endTransaction();
1445 ARCANE_UNUSED(info);
1448 m_p->notifyInvalidateObservers();
1457 ARCANE_UNUSED(info);
1460 m_p->notifyInvalidateObservers();
1469 ARCANE_UNUSED(info);
1472 m_p->notifyInvalidateObservers();
1481 m_p->setNeedRecompute();
1482 m_p->notifyInvalidateObservers();
1489_updateNeedInfoFlag(
const bool flag)
1491 if (m_p->m_observer_need_info == flag)
1493 m_p->m_observer_need_info = flag;
1497 parent->detachObserver(
this);
1498 if (m_p->m_observer_need_info) {
1500 &ItemGroupImpl::_executeExtend,
1501 &ItemGroupImpl::_executeReduce,
1502 &ItemGroupImpl::_executeCompact,
1503 &ItemGroupImpl::_executeInvalidate));
1506 &ItemGroupImpl::_executeInvalidate));
1515_forceInvalidate(
const bool self_invalidate)
1519 if (self_invalidate) {
1520 m_p->setNeedRecompute();
1521 m_p->m_need_invalidate_on_recompute =
true;
1524 for(
const auto& i : m_p->m_sub_groups )
1525 i.second->_forceInvalidate(
true);
1537 std::vector<const void*> ptrs;
1538 for(
const auto& i : m_p->m_observers )
1539 ptrs.push_back(i.first);
1540 for(
const void* i : ptrs )
1546 if (m_p->m_is_all_items)
1547 m_p->resetSubGroups();
1550 m_p =
new ItemGroupInternal();
1560 if(!m_p->m_group_index_table.isUsed()) {
1562 ITraceMng* trace = m_p->m_mesh->traceMng();
1563 trace->
debug(
Trace::High) <<
"** CREATION OF LOCAL ID TO INDEX TABLE OF GROUP : " << m_p->m_name;
1564 m_p->m_group_index_table->update();
1566 return m_p->m_group_index_table;
1575 if(!m_p->m_synchronizer.get()) {
1577 ItemGroup this_group(
this);
1579 ITraceMng* trace = m_p->m_mesh->traceMng();
1580 trace->
debug(
Trace::High) <<
"** CREATION OF SYNCHRONIZER OF GROUP : " << m_p->m_name;
1581 m_p->m_synchronizer->compute();
1583 return m_p->m_synchronizer.get();
1592 return m_p->m_synchronizer.get();
1614 ItemUniqueId last_uid = items[items_lid[0]]->uniqueId();
1615 for(
Integer i=1; i<nb_item; ++i ){
1632 if (
this==shared_null){
1633 shared_null =
nullptr;
1645 shared_null =
new ItemGroupImplNull();
1646 shared_null->addRef();
1659 shared_null->removeRef();
1668 return m_p->isContiguous();
1677 m_p->checkIsContiguous();
1686 Int32Array& items_lid = m_p->mutableItemsLocalId();
1699 m_p->mutableItemsLocalId().clear();
1702 if (m_p->variableItemsLocalid())
1703 m_p->variableItemsLocalid()->variable()->shrinkMemory();
1705 m_p->mutableItemsLocalId().shrink();
1707 m_p->applySimdPadding();
1716 return &m_p->m_internal_api;
1724void ItemGroupSubPartsByType::
1725_initChildrenByTypeV1()
1727 IItemFamily* family = m_group_internal->m_item_family;
1730 m_children_by_type.resize(nb_basic_item_type);
1731 for (
Integer i = 0; i < nb_basic_item_type; ++i) {
1735 m_children_by_type[i] = igi;
#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é.
Classe de base d'un élément de maillage.
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.
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.
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.
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.