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"
58 const String& fullName()
const {
return m_name; }
79ItemGroupImpl* ItemGroupImpl::shared_null= 0;
96 , m_function(funcPtr) { }
102 (m_parent->*m_function)();
114ItemGroupImpl* ItemGroupImpl::
130: m_p (new ItemGroupInternal(family,name))
139: m_p(new ItemGroupInternal(family,parent,name))
148: m_p (new ItemGroupInternal())
176 return m_p->fullName();
185 return m_p->itemsLocalId().size();
194 return m_p->itemsLocalId().empty();
203 return m_p->itemsLocalId();
212 if (m_p->m_transaction_mode)
214 m_p->m_transaction_mode =
true;
223 if (!m_p->m_transaction_mode)
225 m_p->m_transaction_mode =
false;
226 if (m_p->m_need_recompute) {
227 m_p->m_need_recompute =
false;
228 m_p->m_need_invalidate_on_recompute =
false;
229 m_p->notifyInvalidateObservers();
237unguardedItemsLocalId(
const bool self_invalidate)
239 ITraceMng* trace = m_p->m_mesh->traceMng();
241 <<
" with self_invalidate=" << self_invalidate;
243 if (m_p->m_compute_functor && !m_p->m_transaction_mode)
244 ARCANE_FATAL(
"Direct access for computed group in only available during a transaction");
246 _forceInvalidate(self_invalidate);
247 return m_p->mutableItemsLocalId();
256 return m_p->m_parent;
274 return m_p->m_item_family;
292 return m_p->m_is_own;
301 const bool is_own = m_p->m_is_own;
305 if (m_p->m_own_group)
339 m_p->m_own_group = ii;
342 m_p->m_own_group = ii;
358 m_p->m_ghost_group = ii;
370 return checkSharedNull();
374 m_p->m_interface_group = ii;
390 m_p->m_node_group = ii;
406 m_p->m_edge_group = ii;
422 m_p->m_face_group = ii;
438 m_p->m_cell_group = ii;
450 return checkSharedNull();
455 m_p->m_inner_face_group = ii;
467 return checkSharedNull();
472 m_p->m_outer_face_group = ii;
487 return checkSharedNull();
493 m_p->m_active_cell_group = ii;
505 return checkSharedNull();
511 m_p->m_own_active_cell_group = ii;
523 return checkSharedNull();
527 m_p->m_mesh->cellFamily(),
529 m_p->m_level_cell_group[level] = ii;
541 return checkSharedNull();
546 m_p->m_mesh->cellFamily(),
548 m_p->m_own_level_cell_group[level] = ii;
560 return checkSharedNull();
565 m_p->m_active_face_group = ii;
577 return checkSharedNull();
582 m_p->m_own_active_face_group = ii;
593 return checkSharedNull();
598 m_p->m_inner_active_face_group = ii;
610 return checkSharedNull();
615 m_p->m_outer_active_face_group = ii;
626 auto finder = m_p->m_sub_groups.find(sub_name);
627 if (finder != m_p->m_sub_groups.end()) {
628 ARCANE_FATAL(
"Cannot create already existing sub-group ({0}) in group ({1})",
634 functor->setGroup(ii);
637 &ItemGroupImpl::_executeInvalidate));
638 m_p->m_sub_groups[sub_name] = ii;
650 auto finder = m_p->m_sub_groups.find(sub_name);
651 if (finder != m_p->m_sub_groups.end()) {
652 return finder->second.get();
656 return checkSharedNull();
666 ITraceMng* trace = m_p->m_mesh->traceMng();
667 if (m_p->m_compute_functor) {
669 <<
name() <<
" : skip computed group";
682 m_p->notifyInvalidateObservers();
687 for( Integer i=0, is=items_lid.
size(); i<is; ++i ){
688 Integer old_id = items_lid[i];
689 items_lid[i] = old_to_new_ids[old_id];
692 m_p->updateTimestamp();
699 if (m_p->m_observer_need_info) {
700 m_p->notifyCompactObservers(&old_to_new_ids);
704 std::sort(std::begin(items_lid),std::end(items_lid));
705 m_p->notifyCompactObservers(
nullptr);
717 ITraceMng* msg = m_p->m_mesh->traceMng();
718 msg->
debug(
Trace::High) <<
"ItemGroupImpl::invalidate(force=" << force_recompute <<
")"
719 <<
" name=" <<
name();
723 m_p->updateTimestamp();
724 m_p->setNeedRecompute();
727 m_p->notifyInvalidateObservers();
745 return m_p->itemInfoListView();
754 return m_p->m_is_local_to_sub_domain;
763 m_p->m_is_local_to_sub_domain = v;
772 ARCANE_ASSERT(( (!m_p->m_need_recompute && !
isAllItems()) || (m_p->m_transaction_mode &&
isAllItems()) ),
773 (
"Operation on invalid group"));
774 if (m_p->m_compute_functor && !m_p->m_transaction_mode)
781 Integer nb_item_to_add = items_local_id.
size();
782 if (nb_item_to_add==0)
785 Int32Array& items_lid = m_p->mutableItemsLocalId();
786 const Integer current_size = items_lid.
size();
787 Integer nb_added = 0;
791 Integer nb_items_id = current_size;
792 m_p->m_items_index_in_all_group.resize(m_p->maxLocalId());
793 for( Integer i=0, is=nb_item_to_add; i<is; ++i ){
794 Int32 local_id = items_local_id[i];
795 items_lid.
add(local_id);
796 m_p->m_items_index_in_all_group[local_id] = nb_items_id+i;
798 nb_added = nb_item_to_add;
800 else if (check_if_present) {
803 presence_checks.
fill(
false);
804 for( Integer i=0, is=items_lid.
size(); i<is; ++i ){
805 presence_checks[items_lid[i]] =
true;
808 for( Integer i=0; i<nb_item_to_add; ++i ) {
809 const Integer lid = items_local_id[i];
810 if (!presence_checks[lid]){
814 presence_checks[lid] =
true;
820 nb_added = nb_item_to_add;
821 MemoryUtils::checkResizeArrayWithCapacity(items_lid,current_size+nb_added,
false);
823 MemoryUtils::copy<Int32>(ptr, items_local_id);
827 trace->
info(5) <<
"ItemGroupImpl::addItems() group <" <<
name() <<
"> "
828 <<
" checkpresent=" << check_if_present
829 <<
" nb_current=" << current_size
830 <<
" want_to_add=" << nb_item_to_add
831 <<
" effective_added=" << nb_added;
836 m_p->updateTimestamp();
837 Int32ConstArrayView observation_info(nb_added, items_lid.unguardedBasePointer()+current_size);
838 m_p->notifyExtendObservers(&observation_info);
848 m_p->_removeItems(items_local_id);
857 bool check_if_present)
859 ARCANE_ASSERT(( (!m_p->m_need_recompute && !
isAllItems()) || (m_p->m_transaction_mode &&
isAllItems()) ),
860 (
"Operation on invalid group"));
861 if (m_p->m_compute_functor && !m_p->m_transaction_mode)
871 Int32Array & items_lid = m_p->mutableItemsLocalId();
875 const Integer internal_size = internals.
size();
876 const Integer new_size = m_p->m_item_family->nbItem();
877 items_lid.
resize(new_size);
878 m_p->m_items_index_in_all_group.resize(m_p->maxLocalId());
879 if (new_size==internal_size){
881 for( Integer i=0; i<internal_size; ++i ){
882 Int32 local_id = internals[i]->localId();
883 items_lid[i] = local_id;
884 m_p->m_items_index_in_all_group[local_id] = i;
889 for( Integer i=0; i<internal_size; ++i ){
892 Int32 local_id = item->
localId();
893 items_lid[index] = local_id;
894 m_p->m_items_index_in_all_group[local_id] = index;
899 ARCANE_FATAL(
"Inconsistent number of elements in the generation of the group '{0}' expected={1} present={2}",
900 name(), new_size, index);
905 m_p->updateTimestamp();
909 addItems(added_items_lids,check_if_present);
913 trace->
info(5) <<
"ItemGroupImpl::removeAddItems() group <" <<
name() <<
"> "
914 <<
" old_size=" << m_p->m_item_family->nbItem()
915 <<
" new_size=" <<
size()
916 <<
" nb_removed=" << removed_items_lids.
size()
917 <<
" nb_added=" << added_items_lids.
size();
929 if (m_p->m_compute_functor && !m_p->m_transaction_mode)
934 buf_view.
copy(items_local_id);
935 m_p->updateTimestamp();
936 m_p->m_need_recompute =
false;
938 ITraceMng* trace = m_p->mesh()->traceMng();
940 <<
" size=" <<
size();
946 m_p->notifyInvalidateObservers();
948 m_p->notifyExtendObservers(&items_local_id);
961 std::sort(std::begin(local_ids),std::end(local_ids),*
this);
963 bool operator()(Int32 lid1,Int32 lid2)
const
983 sorter.sort(sorted_lid);
993 m_p->m_is_all_items =
true;
1002 return m_p->m_is_all_items;
1016 bool operator()(Integer item_lid)
1018 return m_items[item_lid]->isSuppressed();
1032 ITraceMng* trace = m_p->mesh()->traceMng();
1033 if (m_p->m_compute_functor) {
1034 trace->
debug(
Trace::High) <<
"ItemGroupImpl::removeSuppressedItems on " <<
name() <<
" : skip computed group";
1039 Integer nb_item = items.
size();
1040 Int32Array& items_lid = m_p->mutableItemsLocalId();
1041 Integer current_size = items_lid.
size();
1043 for( Integer i=0; i<current_size; ++i ){
1044 if (items_lid[i]>=nb_item){
1045 trace->
fatal() <<
"ItemGroupImpl::removeSuppressedItems(): bad range "
1046 <<
" name=" <<
name()
1047 <<
" i=" << i <<
" lid=" << items_lid[i]
1048 <<
" max=" << nb_item;
1058 if (m_p->m_observer_need_info){
1059 removed_ids.
reserve(current_size);
1061 for( Integer i=0; i<current_size; ++i ){
1062 if (!items[items_lid[i]]->isSuppressed()){
1063 items_lid[index] = items_lid[i];
1067 removed_lids.
add(items_lid[i]);
1071 if (new_size!=current_size){
1072 items_lid.
resize(new_size);
1078 auto ibegin = std::begin(items_lid);
1079 auto new_end = std::remove_if(ibegin,std::end(items_lid),f);
1080 new_size = (Integer)(new_end-ibegin);
1081 items_lid.
resize(new_size);
1086 <<
"> NEW SIZE=" << new_size <<
" OLD=" << current_size;
1091 if (current_size != new_size) {
1092 m_p->updateTimestamp();
1093 m_p->notifyReduceObservers(observation_info);
1094 delete observation_info;
1095 delete observation_info2;
1112_checkNeedUpdate(
bool do_padding)
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();
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 ){
1417 m_p->m_children_by_type_ids[i] = UniqueArray<Int32>{MemoryUtils::getDefaultDataAllocator()};
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);
1460 Int32 nb_item =
size();
1461 IMesh*
mesh = m_p->mesh();
1464 bool is_verbose = m_p->m_is_debug_apply_operation;
1466 trace->info() <<
"ItemGroupImpl::_computeChildrenByTypeV2 for " <<
name();
1469 if (nb_item>0 &&
mesh->
meshKind().meshStructure()==eMeshStructure::Cartesian){
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;
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()) {
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();
1694 Integer nb_item = items_lid.
size();
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();
1754 return m_p->isContigous();
1763 m_p->checkIsContigous();
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.
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 const MeshKind meshKind() const =0
Caractéristiques du maillage.
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 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é
__host__ __device__ ItemUniqueId uniqueId(Int32 local_id) const
uniqueId() de l'entité de numéro local local_id
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.
virtual ~ItemGroupImplNull()
Libére les ressources.
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é
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.
void checkLocalIdsAreContigous() const
Vérifie 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.
bool isContigousLocalIds() const
Indique si les entités du groupe ont des localIds() contigüs.
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.
Groupe d'entités de maillage.
Vue sur une liste pour obtenir des informations sur les entités.
Gestionnaire des types d'entités de 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é.
void addRef() override
Incrémente le compteur de référence.
void removeRef() override
Décrémente le compteur de référence.
bool empty() const
Capacité (nombre d'éléments alloués) du vecteur.
Integer capacity() const
Capacité (nombre d'éléments alloués) du vecteur.
Integer size() const
Nombre d'éléments du vecteur.
Exception lorsqu'un argument est invalide.
Vue modifiable d'un tableau d'un type T.
constexpr Integer size() const noexcept
Retourne la taille du tableau.
void copy(const U ©_array)
Recopie le tableau copy_array dans l'instance.
Classe de base des vecteurs 1D de données.
void reserve(Int64 new_capacity)
Réserve le mémoire pour new_capacity éléments.
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 fill(ConstReferenceType value)
Remplit le tableau avec la valeur value.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
void clear()
Supprime les éléments du tableau.
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Interface du gestionnaire de traces.
virtual TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium)=0
Flot pour un message de debug.
virtual TraceMessage info()=0
Flot pour un message d'information.
virtual TraceMessage fatal()=0
Flot pour un message d'erreur fatale.
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.
Ref< IVariableSynchronizer > createSynchronizerRef(IParallelMng *pm, IItemFamily *family)
Retourne une interface pour synchroniser des variables sur le groupe de la famille family.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
bool arcaneIsCheck()
Vrai si on est en mode vérification.
ConstArrayView< Int32 > Int32ConstArrayView
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.
@ Medium
Niveau moyen (défaut)
Int32 Integer
Type représentant un entier.