29
29
#include " arcane/parallel/BitonicSortT.H"
30
30
31
31
#include " arcane/mesh/ItemInternalMap.h"
32
+ #include " arcane/mesh/NodeFamily.h"
32
33
#include " arcane/mesh/DynamicMesh.h"
33
34
35
+ #include < unordered_set>
36
+
34
37
/* ---------------------------------------------------------------------------*/
35
38
/* ---------------------------------------------------------------------------*/
36
39
@@ -110,11 +113,12 @@ class ItemsOwnerBuilderImpl
110
113
111
114
public:
112
115
113
- explicit ItemsOwnerBuilderImpl (DynamicMesh * mesh);
116
+ explicit ItemsOwnerBuilderImpl (IMesh * mesh);
114
117
115
118
public:
116
119
117
120
void computeFacesOwner ();
121
+ void computeNodesOwner ();
118
122
119
123
private:
120
124
@@ -195,10 +199,13 @@ class ItemsOwnerBuilderImpl::ItemOwnerInfoSortTraits
195
199
/* ---------------------------------------------------------------------------*/
196
200
197
201
ItemsOwnerBuilderImpl::
198
- ItemsOwnerBuilderImpl (DynamicMesh * mesh)
202
+ ItemsOwnerBuilderImpl (IMesh * mesh)
199
203
: TraceAccessor(mesh->traceMng ())
200
- , m_mesh(mesh)
201
204
{
205
+ DynamicMesh* dm = dynamic_cast <DynamicMesh*>(mesh);
206
+ if (!dm)
207
+ ARCANE_FATAL (" Mesh is not an instance of 'DynamicMesh'" );
208
+ m_mesh = dm;
202
209
if (auto v = Convert::Type<Int32>::tryParseFromEnvironment (" ARCANE_ITEMS_OWNER_BUILDER_IMPL_DEBUG_LEVEL" , true ))
203
210
m_verbose_level = v.value ();
204
211
}
@@ -209,6 +216,8 @@ ItemsOwnerBuilderImpl(DynamicMesh* mesh)
209
216
void ItemsOwnerBuilderImpl::
210
217
computeFacesOwner ()
211
218
{
219
+ m_items_owner_info.clear ();
220
+
212
221
IParallelMng* pm = m_mesh->parallelMng ();
213
222
const Int32 my_rank = pm->commRank ();
214
223
ItemInternalMap& faces_map = m_mesh->facesMap ();
@@ -253,6 +262,78 @@ computeFacesOwner()
253
262
face_family.notifyItemsOwnerChanged ();
254
263
}
255
264
265
+ /* ---------------------------------------------------------------------------*/
266
+ /* ---------------------------------------------------------------------------*/
267
+
268
+ void ItemsOwnerBuilderImpl::
269
+ computeNodesOwner ()
270
+ {
271
+ m_items_owner_info.clear ();
272
+
273
+ IParallelMng* pm = m_mesh->parallelMng ();
274
+ const Int32 my_rank = pm->commRank ();
275
+ ItemInternalMap& faces_map = m_mesh->facesMap ();
276
+ ItemInternalMap& nodes_map = m_mesh->nodesMap ();
277
+ NodeFamily& node_family = m_mesh->trueNodeFamily ();
278
+
279
+ info () << " ** BEGIN ComputeNodesOwner nb_node=" << nodes_map.count ();
280
+
281
+ // Place par défaut tous les noeuds dans ce sous-domaine
282
+ nodes_map.eachItem ([&](Node node) {
283
+ node.mutableItemBase ().setOwner (my_rank, my_rank);
284
+ });
285
+
286
+ // Parcours toutes les faces.
287
+ // Ne garde que celles qui sont frontières ou dont les propriétaires des
288
+ // deux mailles de part et d'autre sont différents de notre sous-domaine.
289
+ // UniqueArray<Int32> faces_to_add;
290
+ // faces_map.eachItem([&](Face face) {
291
+ // Int32 nb_cell = face.nbCell();
292
+ // if (nb_cell == 1)
293
+ // faces_to_add.add(face.localId());
294
+ // });
295
+ // info() << "ItemsOwnerBuilder: NB_FACE_TO_ADD=" << faces_to_add.size();
296
+ const Int32 verbose_level = m_verbose_level;
297
+
298
+ // Ajoute tous les noeuds des faces frontières.
299
+ std::unordered_set<Int32> done_nodes;
300
+
301
+ FaceInfoListView faces (m_mesh->faceFamily ());
302
+ UniqueArray<Int32> nodes_to_add;
303
+ faces_map.eachItem ([&](Face face) {
304
+ Int32 face_nb_cell = face.nbCell ();
305
+ if (face_nb_cell == 1 )
306
+ return ;
307
+ for (Node node : face.nodes ()) {
308
+ Int32 node_id = node.localId ();
309
+ if (done_nodes.find (node_id) == done_nodes.end ()) {
310
+ nodes_to_add.add (node_id);
311
+ done_nodes.insert (node_id);
312
+ node.mutableItemBase ().setOwner (A_NULL_RANK, my_rank);
313
+ }
314
+ }
315
+ });
316
+
317
+ info () << " ItemsOwnerBuilder: NB_NODE_TO_ADD=" << nodes_to_add.size ();
318
+ NodeInfoListView nodes (&node_family);
319
+ for (Int32 lid : nodes_to_add) {
320
+ Node node (nodes[lid]);
321
+ Int64 node_uid = node.uniqueId ();
322
+ for (Cell cell : node.cells ()) {
323
+ if (verbose_level >= 2 )
324
+ info () << " ADD lid=" << lid << " uid=" << node_uid << " cell_uid=" << cell.uniqueId () << " owner=" << cell.owner ();
325
+ m_items_owner_info.add (ItemOwnerInfo (node_uid, node_uid, cell.uniqueId (), my_rank, cell.owner ()));
326
+ }
327
+ }
328
+
329
+ // Tri les instances de ItemOwnerInfo et les place les valeurs triées
330
+ // dans items_owner_info.
331
+ _sortInfos ();
332
+ _processSortedInfos (nodes_map);
333
+
334
+ node_family.notifyItemsOwnerChanged ();
335
+ }
336
+
256
337
/* ---------------------------------------------------------------------------*/
257
338
/* ---------------------------------------------------------------------------*/
258
339
/* !
@@ -416,7 +497,7 @@ _processSortedInfos(ItemInternalMap& items_map)
416
497
/* ---------------------------------------------------------------------------*/
417
498
418
499
ItemsOwnerBuilder::
419
- ItemsOwnerBuilder (DynamicMesh * mesh)
500
+ ItemsOwnerBuilder (IMesh * mesh)
420
501
: m_p(std::make_unique<ItemsOwnerBuilderImpl>(mesh))
421
502
{}
422
503
@@ -427,6 +508,9 @@ ItemsOwnerBuilder::
427
508
// pas connu dans le '.h'.
428
509
}
429
510
511
+ /* ---------------------------------------------------------------------------*/
512
+ /* ---------------------------------------------------------------------------*/
513
+
430
514
void ItemsOwnerBuilder::
431
515
computeFacesOwner ()
432
516
{
@@ -436,6 +520,15 @@ computeFacesOwner()
436
520
/* ---------------------------------------------------------------------------*/
437
521
/* ---------------------------------------------------------------------------*/
438
522
523
+ void ItemsOwnerBuilder::
524
+ computeNodesOwner ()
525
+ {
526
+ m_p->computeNodesOwner ();
527
+ }
528
+
529
+ /* ---------------------------------------------------------------------------*/
530
+ /* ---------------------------------------------------------------------------*/
531
+
439
532
} // namespace Arcane::mesh
440
533
441
534
/* ---------------------------------------------------------------------------*/
0 commit comments