Skip to content

Commit 1bfdcb7

Browse files
Merge pull request #2022 from arcaneframework/dev/gg-add-experimental-functions-to-change-uniqueid
Add experimental functions to change unique ids of items
2 parents 6f7ed28 + 66781d1 commit 1bfdcb7

6 files changed

+102
-9
lines changed

arcane/src/arcane/core/IItemFamily.h

+13
Original file line numberDiff line numberDiff line change
@@ -684,6 +684,19 @@ class ARCANE_CORE_EXPORT IItemFamily
684684
//! Evènement pour l'ajout et la suppression d'entité
685685
virtual EventObservableView<const ItemFamilyItemListChangedEventArgs&> itemListChangedEvent() = 0;
686686

687+
public:
688+
689+
/*!
690+
* \brief Change le numéro unique de l'entité.
691+
*
692+
* \warning Cette méthode est expérimentale.
693+
* \warning Modifier le uniqueId d'une entité peut engendrer des incohérences
694+
* dans le maillage et la numérotation. Il est préférable de n'appeler cette méthode
695+
* que sur les entités qui ne sont pas associées à d'autres (par exemple les noeuds qu'on vient
696+
* de créer).
697+
*/
698+
virtual void experimentalChangeUniqueId(ItemLocalId local_id,ItemUniqueId unique_id) =0;
699+
687700
public:
688701

689702
/*!

arcane/src/arcane/core/IMeshUtilities.h

+10
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,16 @@ class ARCANE_CORE_EXPORT IMeshUtilities
221221
*/
222222
virtual void mergeNodes(Int32ConstArrayView nodes_local_id,
223223
Int32ConstArrayView nodes_to_merge_local_id) =0;
224+
225+
/*!
226+
* \brief Recalcule les uniqueId() des arêtes, faces et mailles en fonction
227+
* des uniqueId() des noeuds.
228+
*
229+
* \warning Cette méthode est expérimentale et ne doit être utilisée que
230+
* dans Arcane. Elle suppose que les uniqueId() des entités sont construit
231+
* à partir de generateHashUniqueId().
232+
*/
233+
virtual void recomputeItemsUniqueIdFromNodesUniqueId() =0;
224234
};
225235

226236
/*---------------------------------------------------------------------------*/

arcane/src/arcane/mesh/ItemFamily.cc

+20
Original file line numberDiff line numberDiff line change
@@ -2483,6 +2483,26 @@ itemListChangedEvent()
24832483
/*---------------------------------------------------------------------------*/
24842484
/*---------------------------------------------------------------------------*/
24852485

2486+
void ItemFamily::
2487+
experimentalChangeUniqueId(ItemLocalId local_id,ItemUniqueId unique_id)
2488+
{
2489+
ItemInternal* iitem = _itemInternal(local_id);
2490+
Int64 old_uid = iitem->uniqueId();
2491+
if (old_uid==unique_id)
2492+
return;
2493+
//MutableItemBase item_base(local_id,m_common_item_shared_info);
2494+
iitem->setUniqueId(unique_id);
2495+
2496+
if (m_infos->hasUniqueIdMap()){
2497+
ItemInternalMap& item_map = itemsMap();
2498+
item_map.remove(old_uid);
2499+
item_map.add(unique_id,iitem);
2500+
}
2501+
}
2502+
2503+
/*---------------------------------------------------------------------------*/
2504+
/*---------------------------------------------------------------------------*/
2505+
24862506
void ItemFamily::
24872507
_addSourceConnectivity(IIncrementalItemSourceConnectivity* c)
24882508
{

arcane/src/arcane/mesh/ItemFamily.h

+1
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,7 @@ class ARCANE_MESH_EXPORT ItemFamily
269269

270270
void addGhostItems(Int64ConstArrayView unique_ids, Int32ArrayView items, Int32ConstArrayView owners) override;
271271
EventObservableView<const ItemFamilyItemListChangedEventArgs&> itemListChangedEvent() override;
272+
void experimentalChangeUniqueId(ItemLocalId local_id,ItemUniqueId unique_id) override;
272273

273274
IItemFamilyPolicyMng* policyMng() override { return m_policy_mng; }
274275
Properties* properties() override { return m_properties; }

arcane/src/arcane/mesh/UnstructuredMeshUtilities.cc

+48-2
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
#include "arcane/utils/StringBuilder.h"
2424
#include "arcane/utils/CheckedConvert.h"
2525
#include "arcane/utils/PlatformUtils.h"
26-
26+
#include "arcane/utils/SmallArray.h"
2727
#include "arcane/utils/NotImplementedException.h"
2828

2929
#include "arcane/IMesh.h"
@@ -833,11 +833,57 @@ computeAndSetOwnersForFaces()
833833
owner_builder.computeFacesOwner();
834834
}
835835

836+
836837
/*---------------------------------------------------------------------------*/
837838
/*---------------------------------------------------------------------------*/
839+
namespace
840+
{
841+
void _recomputeUniqueIds(IItemFamily* family)
842+
{
843+
ITraceMng* tm = family->traceMng();
844+
eItemKind ik = family->itemKind();
845+
SmallArray<Int64> unique_ids;
846+
ENUMERATE_ (ItemWithNodes, iitem, family->allItems()) {
847+
ItemWithNodes item = *iitem;
848+
Int32 index = 0;
849+
unique_ids.resize(item.nbNode());
850+
for (Node node : item.nodes()) {
851+
unique_ids[index] = node.uniqueId();
852+
++index;
853+
}
854+
Int64 new_uid = MeshUtils::generateHashUniqueId(unique_ids);
855+
//if (ik==IK_Face)
856+
//tm->info() << "Face uid=" << item.uniqueId() << " nb_node=" << item.nbNode()
857+
// << " node0=" << item.node(0).uniqueId() << " node1=" << item.node(1).uniqueId();
858+
item.mutableItemBase().setUniqueId(new_uid);
859+
}
860+
family->notifyItemsUniqueIdChanged();
861+
}
862+
} // namespace
838863

839-
} // End namespace Arcane
864+
/*---------------------------------------------------------------------------*/
865+
/*---------------------------------------------------------------------------*/
866+
867+
void UnstructuredMeshUtilities::
868+
recomputeItemsUniqueIdFromNodesUniqueId()
869+
{
870+
IMesh* mesh = m_mesh;
871+
ARCANE_CHECK_POINTER(mesh);
872+
ITraceMng* tm = mesh->traceMng();
873+
874+
tm->info() << "Calling RecomputeItemsUniqueIdFromNodesUniqueId()";
875+
// D'abord indiquer que les noeuds ont changés pour éventuellement
876+
// remettre à jour l'orientation des faces.
877+
mesh->nodeFamily()->notifyItemsUniqueIdChanged();
878+
_recomputeUniqueIds(mesh->edgeFamily());
879+
_recomputeUniqueIds(mesh->faceFamily());
880+
_recomputeUniqueIds(mesh->cellFamily());
881+
}
840882

841883
/*---------------------------------------------------------------------------*/
842884
/*---------------------------------------------------------------------------*/
843885

886+
} // End namespace Arcane
887+
888+
/*---------------------------------------------------------------------------*/
889+
/*---------------------------------------------------------------------------*/

arcane/src/arcane/mesh/UnstructuredMeshUtilities.h

+10-7
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
/*---------------------------------------------------------------------------*/
1616

1717
#include "arcane/utils/TraceAccessor.h"
18+
1819
#include "arcane/core/IMeshUtilities.h"
1920

2021
/*---------------------------------------------------------------------------*/
@@ -79,12 +80,12 @@ class UnstructuredMeshUtilities
7980

8081
Real3 computeDirection(const NodeGroup& node_group,
8182
const VariableNodeReal3& nodes_coord,
82-
Real3* n1,Real3* n2) override;
83+
Real3* n1, Real3* n2) override;
8384

84-
void computeAdjency(ItemPairGroup adjency_array,eItemKind link_kind,
85+
void computeAdjency(ItemPairGroup adjency_array, eItemKind link_kind,
8586
Integer nb_layer) override;
8687

87-
bool writeToFile(const String& file_name,const String& service_name) override;
88+
bool writeToFile(const String& file_name, const String& service_name) override;
8889

8990
void partitionAndExchangeMeshWithReplication(IMeshPartitionerBase* partitioner,
9091
bool initial_partition) override;
@@ -95,22 +96,24 @@ class UnstructuredMeshUtilities
9596
void computeAndSetOwnersForNodes() override;
9697
void computeAndSetOwnersForFaces() override;
9798

99+
void recomputeItemsUniqueIdFromNodesUniqueId() override;
100+
98101
private:
99102

100-
IMesh* m_mesh;
101-
BasicItemPairGroupComputeFunctor* m_compute_adjacency_functor;
103+
IMesh* m_mesh = nullptr;
104+
BasicItemPairGroupComputeFunctor* m_compute_adjacency_functor = nullptr;
102105

103106
private:
104107

105108
Real3 _round(Real3 value);
106-
Real3 _broadcastFarthestNode(Real distance,const Node& node,
109+
Real3 _broadcastFarthestNode(Real distance, const Node& node,
107110
const VariableNodeReal3& nodes_coord);
108111
};
109112

110113
/*---------------------------------------------------------------------------*/
111114
/*---------------------------------------------------------------------------*/
112115

113-
}
116+
} // namespace Arcane
114117

115118
/*---------------------------------------------------------------------------*/
116119
/*---------------------------------------------------------------------------*/

0 commit comments

Comments
 (0)