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::
126 m_p->m_sub_parts_by_type.setImpl(
this);
136 m_p->m_sub_parts_by_type.setImpl(
this);
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();
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");
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();
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);
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();
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);
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;
770 (
"Operation on invalid group"));
771 if (
m_p->m_compute_functor && !
m_p->m_transaction_mode)
779 if (nb_item_to_add==0)
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();
835 m_p->notifyExtendObservers(&observation_info);
845 m_p->_removeItems(items_local_id);
854 bool check_if_present)
857 (
"Operation on invalid group"));
858 if (
m_p->m_compute_functor && !
m_p->m_transaction_mode)
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;
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();
1030 if (
m_p->m_compute_functor) {
1031 trace->
debug(
Trace::High) <<
"ItemGroupImpl::removeSuppressedItems on " <<
name() <<
" : skip computed group";
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)
1119 bool has_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()
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;
1223 tm->
info() <<
"applyOperation name=" << m_group_internal->name() <<
" nb_item=" << m_group_internal->nbItem();
1224 if (isUseV2ForApplyOperation()) {
1226 _initChildrenByTypeV2();
1228 Int64 t = m_group_internal->timestamp();
1232 _computeChildrenByTypeV2();
1238 _initChildrenByTypeV1();
1240 IItemFamily* family = m_group_internal->m_item_family;
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;
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();
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);
1400 m_p->m_sub_parts_by_type._computeChildrenByTypeV1();
1406void ItemGroupSubPartsByType::
1407_computeChildrenByTypeV1()
1410 ITraceMng * trace = that_group.mesh()->traceMng();
1411 trace->
debug(
Trace::High) <<
"ItemGroupImpl::_computeChildrenByType for " << m_group_internal->name();
1416 for (
Integer i = 0; i < nb_basic_item_type; ++i) {
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) {
1430 impl->setItems(items_by_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();
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) {
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();
1560 if(!
m_p->m_group_index_table.isUsed()) {
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);
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;
1646 shared_null->addRef();
1659 shared_null->removeRef();
1668 return m_p->isContiguous();
1677 m_p->checkIsContiguous();
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()
1731 for (
Integer i = 0; i < nb_basic_item_type; ++i) {
#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(const DataType &data)
Remplissage du tableau.
void clear()
Supprime les éléments du tableau.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
ArrayView< T > subView(Int64 abegin, Integer asize)
Sous-vue à partir de l'élément abegin et contenant asize éléments.
void reserve(Int64 new_capacity)
Réserve le mémoire pour new_capacity éléments.
const T * unguardedBasePointer() const
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Classe de base d'une table de hachage entre les items d'un groupe et leurs positions dans la table.
virtual void executeFunctor()=0
Exécute la méthode associé
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.
API interne à Arcane de ItemGroupImpl.
void executeFunctor() override
Exécute la méthode associé
const String & name() const
Retourne le nom du groupe.
Implémentation d'un groupe d'entités de maillage.
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.
void _executeExtend(const Int32ConstArrayView *info)
Invalidation des sous-groupes.
ItemGroupImpl * parent() const
Groupe parent (0 si aucun)
Int32Array & unguardedItemsLocalId(const bool self_invalidate=true)
Liste des numéros locaux des entités de ce groupe.
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 setIsAllItems()
Indique à ce groupe qu'il s'agit du groupe de toutes les entités de la famille.
void _executeReduce(const Int32ConstArrayView *info)
Invalidation des sous-groupes.
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.
void _updateNeedInfoFlag(const bool flag)
Mise à jour forcée du flag d'information de restructuration.
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)
void _executeInvalidate()
Invalidation des sous-groupes.
virtual void deleteMe()
Notification de SharedReference indiquant qu'il faut détruire l'instance.
void _executeCompact(const Int32ConstArrayView *info)
Invalidation des sous-groupes.
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.
static void _buildSharedNull()
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.
void _forceInvalidate(const bool self_invalidate)
Invalidate forcée récursive.
ItemGroupInternal * m_p
Implémentation du groupe.
static void _destroySharedNull()
ItemGroupImpl * activeFaceGroup()
Groupe des faces actives propres au domaine.
const String & name() const
Nom du groupe.
void _computeChildrenByType()
Méthode de calcul des sous-groupes par type.
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.
Implémentation de la classe ItemGroupImpl.
ItemGroupImpl * m_interface_group
Items on the boundary of two subdomains.
bool m_need_invalidate_on_recompute
Vrai si l'on doit activer les invalidate observers en cas de recalcul.
bool m_need_recompute
Vrai si le groupe doit être recalculé
void checkUpdateSimdPadding()
Remplit les derniers éléments du groupe pour avoir un vecteur SIMD complet.
IItemFamily * m_item_family
Famille associée.
IFunctor * m_compute_functor
Fonction de calcul du groupe.
CheckNeedUpdateMutex m_check_need_update_mutex
Mutex pour protéger la mise à jour.
ItemGroupImpl * m_group_impl
A supprimer quand la version V1 sera supprimée.
UniqueArray< UniqueArray< Int32 > > m_children_by_type_ids
Liste des localId() par type d'entité.
Int64 m_children_by_type_ids_computed_timestamp
Timestamp indiquant quand a été calculé la liste des ids des enfants.
UniqueArray< ItemGroupImpl * > m_children_by_type
Liste des fils de ce groupe par type d'entité.
ItemTypeId m_unique_children_type
Indique le type des entités du groupe.
Groupe d'entités de maillage.
ItemGroupImpl * internal() const
Retourne l'implémentation du groupe.
Vue sur une liste pour obtenir des informations sur les entités.
Structure interne d'une entité de maillage.
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é.
Exception lorsqu'une opération n'est pas supportée.
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.
ARCCORE_COMMON_EXPORT 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.