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.