Arcane  v3.16.3.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
PolyhedralMesh.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* PolyhedralMesh.cc (C) 2000-2025 */
9/* */
10/* Polyhedral mesh impl using Neo data structure. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/mesh/PolyhedralMesh.h"
15
16#include "ItemFamilyNetwork.h"
17#include "ItemFamilyPolicyMng.h"
18#include "arcane/mesh/MeshExchangeMng.h"
19#include "arcane/core/ISubDomain.h"
20#include "arcane/core/ItemSharedInfo.h"
21#include "arcane/core/ItemTypeInfo.h"
22#include "arcane/core/ItemTypeMng.h"
23#include "arcane/core/VariableBuildInfo.h"
24#include "arcane/core/MeshBuildInfo.h"
26#include "arcane/core/AbstractService.h"
27#include "arcane/core/IMeshFactory.h"
28#include "arcane/core/ItemInternal.h"
29#include "arcane/core/IDoFFamily.h"
30#include "arcane/core/IMeshCompactMng.h"
31#include "arcane/core/IMeshCompacter.h"
32#include "arcane/core/IMeshExchanger.h"
33#include "arcane/core/IGhostLayerMng.h"
34#include "arcane/core/MeshVisitor.h"
35#include "arcane/core/internal/IVariableMngInternal.h"
36#include "arcane/core/internal/IPolyhedralMeshModifier.h"
37#include "arcane/core/internal/IMeshModifierInternal.h"
38
39#include "arcane/mesh/ItemFamily.h"
40#include "arcane/mesh/DynamicMeshKindInfos.h"
41#include "arcane/mesh/UnstructuredMeshUtilities.h"
42#include "arcane/mesh/GhostLayerMng.h"
43#include "arcane/utils/ITraceMng.h"
44#include "arcane/utils/FatalErrorException.h"
45
46#ifdef ARCANE_HAS_POLYHEDRAL_MESH_TOOLS
47
48#include "arcane/core/IMeshMng.h"
49#include "arcane/core/MeshHandle.h"
50#include "arcane/core/IItemFamily.h"
51#include "arcane/core/internal/IMeshInternal.h"
52#include "arcane/core/IVariableSynchronizer.h"
53#include "arcane/mesh/ItemFamilyPolicyMng.h"
54#include "arcane/mesh/ItemFamilySerializer.h"
55#include "arcane/utils/Collection.h"
56#include "arcane/utils/List.h"
57#include "arcane/utils/PlatformUtils.h"
58
59#include "neo/Mesh.h"
60#include "ItemConnectivityMng.h"
61
62#endif
63
64// #define ARCANE_DEBUG_POLYHEDRAL_MESH
65 #define ARCANE_DEBUG_LOAD_BALANCING
66
67#ifdef ARCANE_DEBUG_LOAD_BALANCING
68static bool arcane_debug_load_balancing = true;
69#else
70static bool arcane_debug_load_balancing = false;
71#endif
72
73/*---------------------------------------------------------------------------*/
74/*---------------------------------------------------------------------------*/
75
76void Arcane::mesh::PolyhedralMesh::
77_errorEmptyMesh() const
78{
79 ARCANE_FATAL("Cannot use PolyhedralMesh if Arcane is not linked with lib Neo");
80}
81
82/*---------------------------------------------------------------------------*/
83/*---------------------------------------------------------------------------*/
84
85namespace Arcane
86{
87
88/*---------------------------------------------------------------------------*/
89/*---------------------------------------------------------------------------*/
90
91namespace mesh
92{
93
94 /*---------------------------------------------------------------------------*/
95 /*---------------------------------------------------------------------------*/
96
97 class PolyhedralFamilyPolicyMng
98 : public ItemFamilyPolicyMng
99 {
100 public:
101 PolyhedralFamilyPolicyMng(ItemFamily* family)
102 : ItemFamilyPolicyMng(family)
103 , m_family(family){}
104 public:
105 IItemFamilySerializer* createSerializer(bool use_flags) override
106 {
107 return new ItemFamilySerializer(m_family, nullptr, nullptr); // todo handle mesh incremental builder interface and IItemFamilyModifier
108 }
109 private:
110 ItemFamily* m_family;
111 };
112
113 /*---------------------------------------------------------------------------*/
114 /*---------------------------------------------------------------------------*/
115
116 class PolyhedralFamily
117 : public ItemFamily
118 , public IDoFFamily
119 {
120 ItemSharedInfoWithType* m_shared_info = nullptr;
121 Int32UniqueArray m_empty_connectivity{ 0 };
122 Int32UniqueArray m_empty_connectivity_indexes;
123 Int32UniqueArray m_empty_connectivity_nb_item;
124
125 public:
126
127 inline static const String m_arcane_item_lids_property_name{ "Arcane_Item_Lids" }; // inline used to initialize within the declaration
128 inline static const String m_arcane_remove_item_property_name{ "Arcane_Remove_Items" }; // inline used to initialize within the declaration
129
130 public:
131
132 PolyhedralFamily(IMesh* mesh, eItemKind ik, String name)
133 : ItemFamily(mesh, ik, name)
134 {}
135
136 public:
137
138 void preAllocate(Integer nb_item)
139 {
140 Integer nb_hash = itemsMap().nbBucket();
141 Integer wanted_size = 2 * (nb_item + nbItem());
142 if (nb_hash < wanted_size)
143 itemsMap().resize(wanted_size, true);
144 m_empty_connectivity_indexes.resize(nb_item + nbItem(), 0);
145 m_empty_connectivity_nb_item.resize(nb_item + nbItem(), 0);
146 _updateEmptyConnectivity();
147 }
148
149 ItemInternal* _allocItem(const Int64 uid)
150 {
151 bool need_alloc; // given by alloc
152 ItemInternal* item_internal = ItemFamily::_allocOne(uid, need_alloc);
153 if (!need_alloc)
154 item_internal->setUniqueId(uid);
155 else {
156 _allocateInfos(item_internal, uid, m_shared_info);
157 }
158 item_internal->setOwner(m_sub_domain_id, m_sub_domain_id);
159 return item_internal;
160 }
161
162 void addItems(Int64ConstSmallSpan uids, Int32ArrayView items)
163 {
164 if (uids.empty())
165 return;
166 ARCANE_ASSERT((uids.size() == items.size()), ("one must have items.size==uids.size()"));
167 m_mesh->traceMng()->debug(Arccore::Trace::Highest) << " PolyhedralFamily::addItems ";
168 preAllocate(uids.size());
169 auto index{ 0 };
170 for (auto uid : uids) {
171 ItemInternal* ii = _allocItem(uid);
172 items[index++] = ii->localId();
173 }
174 m_need_prepare_dump = true;
175 _updateItemInternalList();
176 }
177
178 void removeItems(Int32ConstArrayView local_ids)
179 {
180 _removeMany(local_ids);
181 }
182
183 void _updateItemInternalList()
184 {
185 switch (itemKind()) {
186 case IK_Cell:
187 m_item_internal_list->cells = _itemsInternal();
188 break;
189 case IK_Face:
190 m_item_internal_list->faces = _itemsInternal();
191 break;
192 case IK_Edge:
193 m_item_internal_list->edges = _itemsInternal();
194 break;
195 case IK_Node:
196 m_item_internal_list->nodes = _itemsInternal();
197 break;
198 case IK_DoF:
199 case IK_Particle:
200 case IK_Unknown:
201 break;
202 }
203 }
204
205 void _updateEmptyConnectivity()
206 {
207 auto item_internal_connectivity_list = itemInternalConnectivityList();
208 for (auto item_kind = 0; item_kind < ItemInternalConnectivityList::MAX_ITEM_KIND; ++item_kind) {
209 item_internal_connectivity_list->_setConnectivityList(item_kind, m_empty_connectivity);
210 item_internal_connectivity_list->_setConnectivityIndex(item_kind, m_empty_connectivity_indexes);
211 item_internal_connectivity_list->_setConnectivityNbItem(item_kind, m_empty_connectivity_nb_item);
212 }
213 }
214
215 // IItemFamily
217 return this;
218 }
219 // todo bloquer toutes les methodes d'allocation de IItemFamily
220
221 void build() override {
222 ItemFamily::build();
223 m_sub_domain_id = subDomain()->subDomainId();
224 ItemTypeMng* itm = m_mesh->itemTypeMng();
225 ItemTypeInfo* dof_type_info = itm->typeFromId(IT_NullType);
226 m_shared_info = _findSharedInfo(dof_type_info);
227 _updateEmptyConnectivity();
228 ItemFamily::setPolicyMng(new PolyhedralFamilyPolicyMng{this});
229
230 }
231
232 // IDoFFamily
233 String name() const override { return ItemFamily::name(); }
234 String fullName() const override { return ItemFamily::fullName(); }
235 Integer nbItem() const override { return ItemFamily::nbItem(); }
236 ItemGroup allItems() const override { return ItemFamily::allItems(); }
237 void endUpdate() override { info() << "END UPDATE "<< m_name ; return ItemFamily::endUpdate(); }
238 IItemFamily* itemFamily() override { return this; }
239
240
242 auto* polyhedral_mesh_modifier = m_mesh->_internalApi()->polyhedralMeshModifier();
243 ARCANE_CHECK_POINTER(polyhedral_mesh_modifier);
244 polyhedral_mesh_modifier->addItems(dof_uids, dof_lids, ItemFamily::itemKind(), name());
245 return ItemFamily::view(dof_lids);
246 }
247
249 Int32ConstArrayView owners)
250 {
251 ARCANE_NOT_YET_IMPLEMENTED("");
252 ARCANE_UNUSED(dof_uids);
253 ARCANE_UNUSED(owners);
254 return ItemFamily::view(dof_lids);
255 }
256
257 void removeDoFs(Int32ConstArrayView items_local_id){
258 auto* mesh_modifier = m_mesh->_internalApi()->polyhedralMeshModifier();
259 mesh_modifier->removeItems(items_local_id, ItemFamily::itemKind(), m_name);
260 }
261 };
262
263} // namespace mesh
264/*---------------------------------------------------------------------------*/
265/*---------------------------------------------------------------------------*/
266
267} // namespace Arcane
268
269/*---------------------------------------------------------------------------*/
270/*---------------------------------------------------------------------------*/
271
272#ifdef ARCANE_HAS_POLYHEDRAL_MESH_TOOLS
273
274/*---------------------------------------------------------------------------*/
275/*---------------------------------------------------------------------------*/
276
277namespace Arcane
278{
279
280/*---------------------------------------------------------------------------*/
281/*---------------------------------------------------------------------------*/
282
283namespace mesh
284{
285
286 /*---------------------------------------------------------------------------*/
287 /*---------------------------------------------------------------------------*/
288
289 class PolyhedralMeshImpl
290 {
291 ISubDomain* m_subdomain;
292 Neo::Mesh m_mesh{ "Test" };
293
294 template <eItemKind IK>
295 class ItemKindTraits
296 {
297 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_None;
298 };
299
300 static Neo::ItemKind itemKindArcaneToNeo(eItemKind ik)
301 {
302 switch (ik) {
303 case IK_Cell:
304 return Neo::ItemKind::IK_Cell;
305 case IK_Face:
306 return Neo::ItemKind::IK_Face;
307 case IK_Edge:
308 return Neo::ItemKind::IK_Edge;
309 case IK_Node:
310 return Neo::ItemKind::IK_Node;
311 case IK_DoF:
312 return Neo::ItemKind::IK_Dof;
313 case IK_Unknown:
314 case IK_Particle:
315 return Neo::ItemKind::IK_None;
316 }
317 return Neo::ItemKind::IK_Node;
318 }
319
320 public:
321
322 class ItemLocalIds
323 {
324 Neo::FutureItemRange m_future_items;
325
326 public:
327 void fillArrayView(Int32ArrayView local_ids, Neo::EndOfMeshUpdate mesh_state)
328 {
329 auto lids = m_future_items.get(mesh_state);
330 std::copy(lids.begin(),lids.end(),local_ids.begin());
331 }
332 friend class PolyhedralMeshImpl;
333 };
334
335 public:
336
337 explicit PolyhedralMeshImpl(ISubDomain* subDomain)
338 : m_subdomain(subDomain)
339 {}
340
341 public:
342
343 String name() const { return m_mesh.name(); }
344
345 Integer dimension() const { return m_mesh.dimension(); }
346
347 Integer nbNode() const { return m_mesh.nbNodes(); }
348 Integer nbEdge() const { return m_mesh.nbEdges(); }
349 Integer nbFace() const { return m_mesh.nbFaces(); }
350 Integer nbCell() const { return m_mesh.nbCells(); }
351 Integer nbItem(eItemKind ik) const { return m_mesh.nbItems(itemKindArcaneToNeo(ik)); }
352
353 static void _setFaceInfos(Int32 mod_flags, Face& face)
354 {
355 Int32 face_flags = face.itemBase().flags();
356 face_flags &= ~ItemFlags::II_InterfaceFlags;
357 face_flags |= mod_flags;
358 face.mutableItemBase().setFlags(face_flags);
359 }
360
361 /*---------------------------------------------------------------------------*/
362
363 void addFamily(eItemKind ik, const String& name)
364 {
365 m_mesh.addFamily(itemKindArcaneToNeo(ik), name.localstr());
366 }
367
368 /*---------------------------------------------------------------------------*/
369
370 void scheduleAddItems(PolyhedralFamily* arcane_item_family,
371 Int64ConstSmallSpan uids,
372 ItemLocalIds& item_local_ids)
373 {
374 auto& added_items = item_local_ids.m_future_items;
375 auto& item_family = m_mesh.findFamily(itemKindArcaneToNeo(arcane_item_family->itemKind()),
376 arcane_item_family->name().localstr());
377 m_mesh.scheduleAddItems(item_family, std::vector<Int64>{ uids.begin(), uids.end() }, added_items);
378 // add arcane items
379 auto& mesh_graph = m_mesh.internalMeshGraph();
380 item_family.addMeshScalarProperty<Neo::utils::Int32>(PolyhedralFamily::m_arcane_item_lids_property_name.localstr());
381 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ item_family, item_family.lidPropName() },
382 Neo::MeshKernel::OutProperty{ item_family, PolyhedralFamily::m_arcane_item_lids_property_name.localstr() },
383 [arcane_item_family, uids,added_items](Neo::ItemLidsProperty const& lids_property,
384 Neo::MeshScalarPropertyT<Neo::utils::Int32>&) {
385 Int32UniqueArray arcane_items(uids.size());
386 arcane_item_family->addItems(uids, arcane_items);
387 arcane_item_family->traceMng()->debug(Trace::Highest) << arcane_items;
388 // debug check lid matching. maybe to remove if too coostly
389 auto neo_lids = lids_property.values();
390 if (!std::equal(neo_lids.begin(), neo_lids.end(), arcane_items.begin()))
391 if (!std::equal(added_items.new_items.begin(), added_items.new_items.end(), arcane_items.begin()))
392 arcane_item_family->traceMng()->fatal() << "Inconsistent item lids generation between Arcane and Neo.";
393 });
394 }
395
396 /*---------------------------------------------------------------------------*/
397
398 void scheduleRemoveItems(PolyhedralFamily* arcane_item_family,
399 Int32ConstArrayView local_ids)
400 {
401 auto& item_family = m_mesh.findFamily(itemKindArcaneToNeo(arcane_item_family->itemKind()),
402 arcane_item_family->name().localstr());
403 Neo::ItemRange removed_items{Neo::ItemLocalIds{{local_ids.begin(),local_ids.end()},0,0}};
404 m_mesh.scheduleRemoveItems(item_family, removed_items);
405 // Remove Arcane items
406 auto& mesh_graph = m_mesh.internalMeshGraph();
407 item_family.addMeshScalarProperty<Neo::utils::Int32>(PolyhedralFamily::m_arcane_remove_item_property_name.localstr());
408 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ item_family, m_mesh._removeItemPropertyName(item_family) },
409 Neo::MeshKernel::OutProperty{ item_family, PolyhedralFamily::m_arcane_remove_item_property_name.localstr() },
410 [arcane_item_family,local_ids](Neo::MeshScalarPropertyT<Neo::utils::Int32> const&,
411 Neo::MeshScalarPropertyT<Neo::utils::Int32>&) {
412 // plutôt utiliser remove property ?
413 arcane_item_family->removeItems(local_ids);
414 });
415 }
416
417 /*---------------------------------------------------------------------------*/
418
419 void scheduleAddConnectivity(PolyhedralFamily* arcane_source_item_family,
420 ItemLocalIds& source_items,
421 Integer nb_connected_items_per_item,
422 PolyhedralFamily* arcane_target_item_family,
423 Int64ConstArrayView target_items_uids,
424 String const& name)
425 {
426 // add connectivity in Neo
427 _scheduleAddConnectivity(arcane_source_item_family,
428 source_items,
429 nb_connected_items_per_item,
430 arcane_target_item_family,
431 target_items_uids,
432 name);
433 }
434
435 /*---------------------------------------------------------------------------*/
436
437 void scheduleAddConnectivity(PolyhedralFamily* arcane_source_item_family,
438 ItemLocalIds& source_items,
439 Int32ConstSmallSpan nb_connected_items_per_item,
440 PolyhedralFamily* arcane_target_item_family,
441 Int64ConstSmallSpan target_items_uids,
442 String const& connectivity_name)
443 {
444 _scheduleAddConnectivity(arcane_source_item_family,
445 source_items,
446 std::vector<Int32>{ nb_connected_items_per_item.begin(), nb_connected_items_per_item.end() },
447 arcane_target_item_family,
448 target_items_uids,
449 connectivity_name);
450 }
451
452 /*---------------------------------------------------------------------------*/
453
454 // template to handle nb_items_per_item type (an int or an array)
455 template <typename ConnectivitySizeType>
456 void _scheduleAddConnectivity(PolyhedralFamily* arcane_source_item_family,
457 ItemLocalIds& source_items,
458 ConnectivitySizeType&& nb_connected_items_per_item,
459 PolyhedralFamily* arcane_target_item_family,
460 Int64ConstSmallSpan target_item_uids,
461 String const& connectivity_name)
462 {
463 // add connectivity in Neo
464 auto& source_family = m_mesh.findFamily(itemKindArcaneToNeo(arcane_source_item_family->itemKind()),
465 arcane_source_item_family->name().localstr());
466 auto& target_family = m_mesh.findFamily(itemKindArcaneToNeo(arcane_target_item_family->itemKind()),
467 arcane_target_item_family->name().localstr());
468 // Remove connectivities with a null item
469 std::vector<Int64> target_item_uids_filtered;
470 target_item_uids_filtered.reserve(target_item_uids.size());
471 std::copy_if(target_item_uids.begin(),
472 target_item_uids.end(),
473 std::back_inserter(target_item_uids_filtered),
474 [](auto uid) { return uid != NULL_ITEM_UNIQUE_ID; });
475 // Add connectivity in Neo (async)
476 m_mesh.scheduleAddConnectivity(source_family, source_items.m_future_items, target_family,
477 std::forward<ConnectivitySizeType>(nb_connected_items_per_item),
478 std::move(target_item_uids_filtered),
479 connectivity_name.localstr());
480 // Register Neo connectivities in Arcane
481 auto& mesh_graph = m_mesh.internalMeshGraph();
482 std::string connectivity_add_output_property_name = std::string{ "EndOf" } + connectivity_name.localstr() + "Add";
483 source_family.addScalarProperty<Neo::utils::Int32>(connectivity_add_output_property_name);
484 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ source_family, connectivity_name.localstr() },
485 Neo::MeshKernel::OutProperty{ source_family, connectivity_add_output_property_name },
486 [arcane_source_item_family, arcane_target_item_family, &source_family, &target_family, this, connectivity_name](Neo::Mesh::ConnectivityPropertyType const&,
487 Neo::ScalarPropertyT<Neo::utils::Int32>&) {
488 auto item_internal_connectivity_list = arcane_source_item_family->itemInternalConnectivityList();
489 // todo check if families are default families
490 auto connectivity = m_mesh.getConnectivity(source_family, target_family, connectivity_name.localstr());
491 // to access connectivity data (for initializing Arcane connectivities) create a proxy on Neo connectivity
492 auto& connectivity_values = source_family.getConcreteProperty<Neo::Mesh::ConnectivityPropertyType>(connectivity_name.localstr());
493 Neo::MeshArrayPropertyProxyT<Neo::Mesh::ConnectivityPropertyType::PropertyDataType> connectivity_proxy{connectivity_values};
494 auto nb_item_data = connectivity_proxy.arrayPropertyOffsets();
495 auto nb_item_size = connectivity_proxy.arrayPropertyOffsetsSize(); // todo check MeshArrayProperty::size
496 item_internal_connectivity_list->_setConnectivityNbItem(arcane_target_item_family->itemKind(),
497 Int32ArrayView{ Integer(nb_item_size), nb_item_data });
498 auto max_nb_connected_items = connectivity.maxNbConnectedItems();
499 item_internal_connectivity_list->_setMaxNbConnectedItem(arcane_target_item_family->itemKind(), max_nb_connected_items);
500 auto connectivity_values_data = connectivity_proxy.arrayPropertyData();
501 auto connectivity_values_size = connectivity_proxy.arrayPropertyDataSize();
502 item_internal_connectivity_list->_setConnectivityList(arcane_target_item_family->itemKind(),
503 Int32ArrayView{ Integer(connectivity_values_size), connectivity_values_data });
504 auto connectivity_index_data = connectivity_proxy.arrayPropertyIndex();
505 auto connectivity_index_size = connectivity_proxy.arrayPropertyIndexSize();
506 item_internal_connectivity_list->_setConnectivityIndex(arcane_target_item_family->itemKind(),
507 Int32ArrayView{ Integer(connectivity_index_size), connectivity_index_data });
508 });
509 // If FaceToCellConnectivity Add face flags II_Boundary, II_SubdomainBoundary, II_HasFrontCell, II_HasBackCell
510 if (arcane_source_item_family->itemKind() == IK_Face && arcane_target_item_family->itemKind() == IK_Cell) {
511 std::string flag_definition_output_property_name{ "EndOfFlagDefinition" };
512 source_family.addScalarProperty<Neo::utils::Int32>(flag_definition_output_property_name);
513 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ source_family, connectivity_add_output_property_name }, Neo::MeshKernel::OutProperty{ source_family, flag_definition_output_property_name },
514 [arcane_source_item_family, this, target_item_uids, &source_items](Neo::ScalarPropertyT<Neo::utils::Int32> const&, Neo::ScalarPropertyT<Neo::utils::Int32> const&) {
515 auto current_face_index = 0;
516 auto arcane_faces = arcane_source_item_family->itemInfoListView();
517 for (auto face_lid : source_items.m_future_items.new_items) {
518 Face current_face = arcane_faces[face_lid].toFace();
519 if (target_item_uids[2 * current_face_index + 1] == NULL_ITEM_LOCAL_ID) {
520 // if (current_face.frontCell().null()) {
521 // Reste uniquement la back_cell ou aucune maille.
522 Int32 mod_flags = (target_item_uids[2 * current_face_index] != NULL_ITEM_LOCAL_ID) ? (ItemFlags::II_Boundary | ItemFlags::II_HasBackCell | ItemFlags::II_BackCellIsFirst) : 0;
523 _setFaceInfos(mod_flags, current_face);
524 }
525 else if (target_item_uids[2 * current_face_index] == NULL_ITEM_LOCAL_ID) {
526 // Reste uniquement la front cell
527 _setFaceInfos(ItemFlags::II_Boundary | ItemFlags::II_HasFrontCell | ItemFlags::II_FrontCellIsFirst, current_face);
528 }
529 else {
530 // Il y a deux mailles connectées.
531 _setFaceInfos(ItemFlags::II_HasFrontCell | ItemFlags::II_HasBackCell | ItemFlags::II_BackCellIsFirst, current_face);
532 }
533 ++current_face_index;
534 }
535 });
536 }
537 }
538
539 /*---------------------------------------------------------------------------*/
540
541 void scheduleSetItemCoordinates(PolyhedralFamily* item_family, ItemLocalIds& local_ids, Real3ConstSmallSpan item_coords, VariableItemReal3& arcane_coords)
542 {
543 auto& _item_family = m_mesh.findFamily(itemKindArcaneToNeo(item_family->itemKind()), item_family->name().localstr());
544 std::vector<Neo::utils::Real3> _node_coords(item_coords.size());
545 auto node_index = 0;
546 for (auto&& node_coord : item_coords) {
547 _node_coords[node_index++] = Neo::utils::Real3{ node_coord.x, node_coord.y, node_coord.z };
548 }
549 m_mesh.scheduleSetItemCoords(_item_family, local_ids.m_future_items, _node_coords);
550 // Fill Arcane Variable
551 auto& mesh_graph = m_mesh.internalMeshGraph();
552 _item_family.addScalarProperty<Int32>("NoOutProperty42"); // todo remove : create noOutput algo in Neo
553 mesh_graph.addAlgorithm(Neo::MeshKernel::InProperty{ _item_family, m_mesh._itemCoordPropertyName(_item_family) },
554 Neo::MeshKernel::OutProperty{ _item_family, "NoOutProperty42" },
555 [this, item_family, &_item_family, &arcane_coords](Neo::Mesh::CoordPropertyType const& item_coords_property,
556 Neo::ScalarPropertyT<Neo::utils::Int32>&) {
557 // enumerate nodes : ensure again Arcane/Neo local_ids are identicals
558 auto& all_items = _item_family.all();
559 VariableNodeReal3 node_coords{ VariableBuildInfo{ item_family->mesh(), "NodeCoord" } };
560 for (auto item : all_items) {
561 arcane_coords[ItemLocalId{ item }] = { item_coords_property[item].x,
562 item_coords_property[item].y,
563 item_coords_property[item].z };
564 // std::cout << "x y z : " << item_coords_property[item].x << " "
565 // << item_coords_property[item].y << " "
566 // << item_coords_property[item].z;
567 }
568 });
569 }
570
571 /*---------------------------------------------------------------------------*/
572
573 Neo::EndOfMeshUpdate applyScheduledOperations() noexcept
574 {
575 return m_mesh.applyScheduledOperations();
576 }
577
578 };
579
580 template <> class PolyhedralMeshImpl::ItemKindTraits<IK_Cell>
581 {
582 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Cell;
583 };
584 template <> class PolyhedralMeshImpl::ItemKindTraits<IK_Face>
585 {
586 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Face;
587 };
588 template <> class PolyhedralMeshImpl::ItemKindTraits<IK_Edge>
589 {
590 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Edge;
591 };
592 template <> class PolyhedralMeshImpl::ItemKindTraits<IK_Node>
593 {
594 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Node;
595 };
596 template <> class PolyhedralMeshImpl::ItemKindTraits<IK_DoF>
597 {
598 static const Neo::ItemKind item_kind = Neo::ItemKind::IK_Dof;
599 };
600
601} // End namespace mesh
602
603/*---------------------------------------------------------------------------*/
604/*---------------------------------------------------------------------------*/
605
606class mesh::PolyhedralMesh::PolyhedralMeshModifier
607: public IPolyhedralMeshModifier
608{
609 public:
610
611 explicit PolyhedralMeshModifier(PolyhedralMesh* mesh)
612 : m_mesh(mesh)
613 {}
614
615 void addItems(Int64ConstArrayView unique_ids, Int32ArrayView local_ids, eItemKind ik, const String& family_name) override
616 {
617 m_mesh->addItems(unique_ids,local_ids,ik,family_name);
618 }
619
620 void removeItems(Int32ConstArrayView local_ids, eItemKind ik, const String& family_name) override
621 {
622 m_mesh->removeItems(local_ids, ik, family_name);
623 }
624
625 private:
626 PolyhedralMesh* m_mesh;
627};
628
629/*---------------------------------------------------------------------------*/
630/*---------------------------------------------------------------------------*/
631
632class mesh::PolyhedralMesh::InternalApi
633: public IMeshInternal
634, public IMeshModifierInternal
635{
636 public:
637
638 explicit InternalApi(PolyhedralMesh* mesh)
639 : m_mesh(mesh)
640 , m_connectivity_mng(std::make_unique<ItemConnectivityMng>(mesh->traceMng()))
641 , m_polyhedral_mesh_modifier(std::make_unique<PolyhedralMeshModifier>(mesh))
642 {}
643
644 public:
645
646 void setMeshKind(const MeshKind& v) override
647 {
648 if (v.meshStructure() != eMeshStructure::Polyhedral && v.meshAMRKind() != eMeshAMRKind::None) {
649 ARCANE_FATAL("Incompatible mesh structure ({0}) and amr kind ({1}) for Polyhedral mesh {2}. Must be (Polyhedral,None). ",
650 v.meshStructure(),v.meshAMRKind(), m_mesh->name());
651 }
652 m_mesh->m_mesh_kind = v;
653 }
654
655 IItemConnectivityMng* dofConnectivityMng() const noexcept override
656 {
657 return m_connectivity_mng.get();
658 }
659
660 IPolyhedralMeshModifier* polyhedralMeshModifier() const noexcept override
661 {
662 return m_polyhedral_mesh_modifier.get();
663 }
664
665 void removeNeedRemoveMarkedItems() override
666 {
667 m_mesh->traceMng()->warning() << "PolyhedralMesh::removeNeedRemoveMarkedItems() not yet implemented in PolyhedralMesh";
668 }
669 NodeLocalId addNode([[maybe_unused]] ItemUniqueId unique_id) override
670 {
671 ARCANE_THROW(NotImplementedException, "");
672 }
673 FaceLocalId addFace([[maybe_unused]] ItemUniqueId unique_id,
674 [[maybe_unused]] ItemTypeId type_id,
675 [[maybe_unused]] ConstArrayView<Int64> nodes_uid) override
676 {
677 ARCANE_THROW(NotImplementedException, "");
678 }
679 CellLocalId addCell([[maybe_unused]] ItemUniqueId unique_id,
680 [[maybe_unused]] ItemTypeId type_id,
681 [[maybe_unused]] ConstArrayView<Int64> nodes_uid) override
682 {
683 ARCANE_THROW(NotImplementedException, "");
684 }
685
686 private:
687
688 PolyhedralMesh* m_mesh = nullptr;
689 std::unique_ptr<IItemConnectivityMng> m_connectivity_mng = nullptr;
690 std::unique_ptr<IPolyhedralMeshModifier> m_polyhedral_mesh_modifier = nullptr;
691};
692
693/*---------------------------------------------------------------------------*/
694/*---------------------------------------------------------------------------*/
695
696class mesh::PolyhedralMesh::NoCompactionMeshCompacter
697: public IMeshCompacter
698{
699 public:
700 explicit NoCompactionMeshCompacter(PolyhedralMesh* mesh)
701 : m_mesh(mesh)
702 , m_trace_mng(mesh->traceMng()){}
703
704 void doAllActions() override {_info();};
705
706 void beginCompact() override {_info();};
707 void compactVariablesAndGroups() override {_info();};
708 void updateInternalReferences() override {_info();};
709 void endCompact() override {_info();};
710 void finalizeCompact() override {_info();};
711
712 IMesh* mesh() const override {return m_mesh;};
713
714 const ItemFamilyCompactInfos* findCompactInfos(IItemFamily* family) const override {_info(); return nullptr;}
715
716 ePhase phase() const override {_info(); return ePhase::Ended;}
717
718 void setSorted(bool v) override {_info();};
719
720 bool isSorted() const override {_info();return false;};
721
722 ItemFamilyCollection families() const override {_info();return ItemFamilyCollection {};};
723
724 void _setCompactVariablesAndGroups(bool v) override {_info();};
725
726 private:
727 PolyhedralMesh* m_mesh = nullptr;
728 ITraceMng* m_trace_mng = nullptr;
729
730 void _info() const {m_trace_mng->info() << A_FUNCINFO << "No compacting in PolyhedralMesh";}
731};
732
733/*---------------------------------------------------------------------------*/
734/*---------------------------------------------------------------------------*/
735
736class mesh::PolyhedralMesh::NoCompactionMeshCompactMng
737: public IMeshCompactMng
738{
739 public:
740 explicit NoCompactionMeshCompactMng(PolyhedralMesh* mesh)
741 : m_mesh(mesh)
742 , m_trace_mng(mesh->traceMng())
743 , m_mesh_compacter{std::make_unique<NoCompactionMeshCompacter>(m_mesh)}
744 {}
745
746 IMesh* mesh() const override {return m_mesh;}
747 IMeshCompacter* beginCompact() override
748 {
749 _info();
750 return m_mesh_compacter.get();
751 }
752
753 IMeshCompacter* beginCompact(IItemFamily* family) override
754 {
755 ARCANE_UNUSED(family);
756 _info();
757 return m_mesh_compacter.get();
758 };
759
760 void endCompact() override {_info();};
761
762 IMeshCompacter* compacter() override
763 {
764 _info();
765 return m_mesh_compacter.get();
766 };
767
768
769 private:
770 PolyhedralMesh* m_mesh = nullptr;
771 ITraceMng* m_trace_mng = nullptr;
772 std::unique_ptr<IMeshCompacter> m_mesh_compacter = nullptr;
773
774 void _info() const {m_trace_mng->info() << A_FUNCINFO << "No compacting in PolyhedralMesh";}
775};
776
777/*---------------------------------------------------------------------------*/
778/*---------------------------------------------------------------------------*/
779
780mesh::PolyhedralMesh::
781~PolyhedralMesh()
782{
783 m_mesh_handle._setMesh(nullptr);
784}
785
786/*---------------------------------------------------------------------------*/
787/*---------------------------------------------------------------------------*/
788
789ITraceMng* mesh::PolyhedralMesh::
790traceMng()
791{
792 return m_subdomain->traceMng();
793}
794
795/*---------------------------------------------------------------------------*/
796/*---------------------------------------------------------------------------*/
797
798MeshHandle mesh::PolyhedralMesh::
799handle() const
800{
801 return m_mesh_handle;
802}
803
804/*---------------------------------------------------------------------------*/
805/*---------------------------------------------------------------------------*/
806
807mesh::PolyhedralMesh::
808PolyhedralMesh(ISubDomain* subdomain, const MeshBuildInfo& mbi)
809: EmptyMesh{ subdomain->traceMng() }
810, m_name{ mbi.name() }
811, m_subdomain{ subdomain }
812, m_mesh_handle{ m_subdomain->defaultMeshHandle() }
813, m_properties(std::make_unique<Properties>(subdomain->propertyMng(), String("ArcaneMeshProperties_") + m_name))
814, m_mesh{ std::make_unique<mesh::PolyhedralMeshImpl>(m_subdomain) }
815, m_parallel_mng{ mbi.parallelMngRef().get() }
816, m_mesh_part_info{ makeMeshPartInfoFromParallelMng(m_parallel_mng) }
817, m_item_type_mng(ItemTypeMng::_singleton())
818, m_mesh_kind(mbi.meshKind())
819, m_initial_allocator(*this)
820, m_variable_mng{ subdomain->variableMng() }
821, m_mesh_checker{ this }
822, m_internal_api{std::make_unique<InternalApi>(this)}
823, m_compact_mng{std::make_unique<NoCompactionMeshCompactMng>(this)}
824, m_mesh_utilities{std::make_unique<UnstructuredMeshUtilities>(this)}
825, m_mesh_exchange_mng{std::make_unique<MeshExchangeMng>(this)}
826, m_item_family_network{std::make_unique<ItemFamilyNetwork>(m_trace_mng)}
827, m_ghost_layer_mng{std::make_unique<GhostLayerMng>(m_trace_mng)}
828{
829 m_mesh_handle._setMesh(this);
830 m_mesh_item_internal_list.mesh = this;
831 m_default_arcane_families.fill(nullptr);
832}
833
834/*---------------------------------------------------------------------------*/
835/*---------------------------------------------------------------------------*/
836
837void Arcane::mesh::PolyhedralMesh::
838allocateItems(const Arcane::ItemAllocationInfo& item_allocation_info)
839{
840 // Second step read a vtk polyhedral mesh
841 m_subdomain->traceMng()->info() << "--PolyhedralMesh : allocate items --";
842 UniqueArray<PolyhedralMeshImpl::ItemLocalIds> item_local_ids(item_allocation_info.family_infos.size());
843 auto family_index = 0;
844 // Prepare item creation
845 for (auto& family_info : item_allocation_info.family_infos) {
846 bool create_if_needed = true;
847 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name,create_if_needed);
848 m_trace_mng->debug() << " Create items " << family_info.name;
849 m_mesh->scheduleAddItems(item_family, family_info.item_uids, item_local_ids[family_index++]);
850 }
851 // Prepare connectivity creation
852 family_index = 0;
853 for (auto& family_info : item_allocation_info.family_infos) {
854 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name);
855 m_trace_mng->debug(Trace::High) << "Current family " << family_info.name;
856 for (auto& current_connected_family_info : family_info.connected_family_info) {
857 auto connected_family = _findItemFamily(current_connected_family_info.item_kind, current_connected_family_info.name);
858 m_trace_mng->debug(Trace::High) << " Create connectivity " << current_connected_family_info.connectivity_name;
859 // check if connected family exists
860 if (!connected_family) {
861 ARCANE_WARNING((String::format("Cannot find family {0} with kind {1} "
862 "The connectivity between {1} and this family is skipped",
863 current_connected_family_info.name,
864 current_connected_family_info.item_kind,
865 item_family->name())
866 .localstr()));
867 continue;
868 }
869 m_mesh->scheduleAddConnectivity(item_family,
870 item_local_ids[family_index],
871 current_connected_family_info.nb_connected_items_per_item,
872 connected_family,
873 current_connected_family_info.connected_items_uids,
874 current_connected_family_info.connectivity_name);
875 }
876 ++family_index;
877 }
878 // Create items and connectivities
879 m_mesh->applyScheduledOperations();
880 // Create variable for coordinates. This has to be done before call to family::endUpdate. Todo add to the graph
881 for (auto& family_info : item_allocation_info.family_infos) {
882 if (family_info.item_kind != IK_Node && family_info.item_coordinates.empty()) { // variable is created for node even if no coords (parallel)
883 continue;
884 }
885 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name);
886 if (item_family == itemFamily(IK_Node)) { // mesh node coords
887 m_arcane_node_coords = std::make_unique<VariableNodeReal3>(VariableBuildInfo(this, family_info.item_coordinates_variable_name));
888 m_arcane_node_coords->setUsed(true);
889 }
890 else {
891 auto arcane_item_coords_var_ptr = std::make_unique<VariableItemReal3>(VariableBuildInfo(this, family_info.item_coordinates_variable_name),
892 item_family->itemKind());
893 arcane_item_coords_var_ptr->setUsed(true);
894 m_arcane_item_coords.push_back(std::move(arcane_item_coords_var_ptr));
895 }
896 }
897 // Call Arcane ItemFamily endUpdate
898 for (auto& family : m_arcane_families) {
899 family->endUpdate();
900 }
901 endUpdate();
902 // Add coordinates when needed (nodes, or dof, or particles...)
903 family_index = 0;
904 auto index = 0;
905 for (auto& family_info : item_allocation_info.family_infos) {
906 if (family_info.item_coordinates.empty()) {
907 ++family_index;
908 continue;
909 }
910 auto* item_family = _findItemFamily(family_info.item_kind, family_info.name);
911 if (item_family == itemFamily(IK_Node)) { // mesh node coords
912 m_mesh->scheduleSetItemCoordinates(item_family, item_local_ids[family_index], family_info.item_coordinates, *m_arcane_node_coords);
913 }
914 else
915 m_mesh->scheduleSetItemCoordinates(item_family, item_local_ids[family_index], family_info.item_coordinates, *m_arcane_item_coords[index++].get());
916 }
917 m_mesh->applyScheduledOperations();
918 m_is_allocated = true;
919 // indicates mesh contains general Cells
920 itemTypeMng()->setMeshWithGeneralCells(this);
921}
922
923/*---------------------------------------------------------------------------*/
924/*---------------------------------------------------------------------------*/
925
927name() const
928{
929 return m_name;
930}
931
932/*---------------------------------------------------------------------------*/
933/*---------------------------------------------------------------------------*/
934
936dimension()
937{
938 return m_mesh->dimension();
939}
940
941/*---------------------------------------------------------------------------*/
942/*---------------------------------------------------------------------------*/
943
945nbNode()
946{
947 return m_mesh->nbNode();
948}
949
950/*---------------------------------------------------------------------------*/
951/*---------------------------------------------------------------------------*/
952
954nbEdge()
955{
956 return m_mesh->nbEdge();
957}
958
959/*---------------------------------------------------------------------------*/
960/*---------------------------------------------------------------------------*/
961
963nbFace()
964{
965 return m_mesh->nbFace();
966}
967
968/*---------------------------------------------------------------------------*/
969/*---------------------------------------------------------------------------*/
970
972nbCell()
973{
974 return m_mesh->nbCell();
975}
976
977/*---------------------------------------------------------------------------*/
978/*---------------------------------------------------------------------------*/
979
982{
983 return m_mesh->nbItem(ik);
984}
985
986/*---------------------------------------------------------------------------*/
987/*---------------------------------------------------------------------------*/
988
990allNodes()
991{
992 if (m_default_arcane_families[IK_Node])
993 return m_default_arcane_families[IK_Node]->allItems();
994 else
995 return NodeGroup{};
996}
997
998/*---------------------------------------------------------------------------*/
999/*---------------------------------------------------------------------------*/
1000
1002allEdges()
1003{
1004 if (m_default_arcane_families[IK_Edge])
1005 return m_default_arcane_families[IK_Edge]->allItems();
1006 else
1007 return EdgeGroup{};
1008}
1009
1010/*---------------------------------------------------------------------------*/
1011/*---------------------------------------------------------------------------*/
1012
1014allFaces()
1015{
1016 if (m_default_arcane_families[IK_Face])
1017 return m_default_arcane_families[IK_Face]->allItems();
1018 else
1019 return FaceGroup{};
1020}
1021
1022/*---------------------------------------------------------------------------*/
1023/*---------------------------------------------------------------------------*/
1024
1026allCells()
1027{
1028 if (m_default_arcane_families[IK_Cell])
1029 return m_default_arcane_families[IK_Cell]->allItems();
1030 else
1031 return CellGroup{};
1032}
1033
1034/*---------------------------------------------------------------------------*/
1035/*---------------------------------------------------------------------------*/
1036
1038ownNodes()
1039{
1040 if (m_default_arcane_families[IK_Node])
1041 return m_default_arcane_families[IK_Node]->allItems().own();
1042 else
1043 return NodeGroup{};
1044}
1045
1046/*---------------------------------------------------------------------------*/
1047/*---------------------------------------------------------------------------*/
1048
1050ownEdges()
1051{
1052 if (m_default_arcane_families[IK_Edge])
1053 return m_default_arcane_families[IK_Edge]->allItems().own();
1054 else
1055 return EdgeGroup{};
1056}
1057
1058/*---------------------------------------------------------------------------*/
1059/*---------------------------------------------------------------------------*/
1060
1062ownFaces()
1063{
1064 if (m_default_arcane_families[IK_Face])
1065 return m_default_arcane_families[IK_Face]->allItems().own();
1066 else
1067 return FaceGroup{};
1068}
1069
1070/*---------------------------------------------------------------------------*/
1071/*---------------------------------------------------------------------------*/
1072
1074ownCells()
1075{
1076 if (m_default_arcane_families[IK_Cell])
1077 return m_default_arcane_families[IK_Cell]->allItems().own();
1078 else
1079 return CellGroup{};
1080}
1081
1082/*---------------------------------------------------------------------------*/
1083/*---------------------------------------------------------------------------*/
1084
1086outerFaces()
1087{
1088 if (m_default_arcane_families[IK_Cell])
1089 return m_default_arcane_families[IK_Cell]->allItems().outerFaceGroup();
1090 else
1091 return FaceGroup{};
1092}
1093
1094/*---------------------------------------------------------------------------*/
1095/*---------------------------------------------------------------------------*/
1096
1097mesh::PolyhedralFamily* mesh::PolyhedralMesh::
1098_createItemFamily(eItemKind ik, const String& name)
1099{
1100 m_mesh->addFamily(ik, name);
1101 m_arcane_families.push_back(std::make_unique<PolyhedralFamily>(this, ik, name));
1102 auto current_family = m_arcane_families.back().get();
1103 if (m_default_arcane_families[ik] == nullptr) {
1104 m_default_arcane_families[ik] = current_family;
1105 _updateMeshInternalList(ik);
1106 }
1107 m_item_family_collection.add(current_family);
1108 current_family->build();
1109 return current_family;
1110}
1111
1112/*---------------------------------------------------------------------------*/
1113/*---------------------------------------------------------------------------*/
1114
1115IItemFamily* mesh::PolyhedralMesh::
1116createItemFamily(eItemKind ik, const String& name)
1117{
1118 return _createItemFamily(ik, name);
1119}
1120
1121/*---------------------------------------------------------------------------*/
1122/*---------------------------------------------------------------------------*/
1123
1124void mesh::PolyhedralMesh::
1125_createUnitMesh()
1126{
1127 createItemFamily(IK_Cell, "CellFamily");
1128 createItemFamily(IK_Node, "NodeFamily");
1129 auto cell_family = m_default_arcane_families[IK_Cell];
1130 auto node_family = m_default_arcane_families[IK_Node];
1131 Int64UniqueArray cell_uids{ 0 }, node_uids{ 0, 1, 2, 3, 4, 5 };
1132 // todo add a cell_lids struct (containing future)
1133 PolyhedralMeshImpl::ItemLocalIds cell_lids, node_lids;
1134 m_mesh->scheduleAddItems(cell_family, cell_uids.constView(), cell_lids);
1135 m_mesh->scheduleAddItems(node_family, node_uids.constView(), node_lids);
1136 int nb_node = 6;
1137 m_mesh->scheduleAddConnectivity(cell_family, cell_lids, nb_node, node_family, node_uids, String{ "CellToNodes" });
1138 m_mesh->scheduleAddConnectivity(node_family, node_lids, 1, cell_family,
1139 Int64UniqueArray{ 0, 0, 0, 0, 0, 0 }, String{ "NodeToCells" });
1140 m_mesh->applyScheduledOperations();
1141 cell_family->endUpdate();
1142 node_family->endUpdate();
1143 endUpdate();
1144 // Mimic what IMeshModifier::endUpdate would do => default families are completed.
1145 // Families created after a first endUpdate call are not default families
1146}
1147
1148/*---------------------------------------------------------------------------*/
1149/*---------------------------------------------------------------------------*/
1150
1152endUpdate()
1153{
1154 // create empty default families not already created
1155 for (auto ik = 0; ik < NB_ITEM_KIND; ++ik) {
1156 if (m_default_arcane_families[ik] == nullptr && ik != eItemKind::IK_DoF) {
1157 String name = String::concat(itemKindName((eItemKind)ik), "EmptyFamily");
1158 m_empty_arcane_families[ik] = std::make_unique<mesh::PolyhedralFamily>(this, (eItemKind)ik, name);
1159 m_default_arcane_families[ik] = m_empty_arcane_families[ik].get();
1160 }
1161 }
1162 // Wip add a first version of a family network. Should be done automatically in addConectivity
1163 m_item_family_network->addDependency(itemFamily(IK_Cell), itemFamily(IK_Node), nullptr);
1164 m_item_family_network->addDependency(itemFamily(IK_Cell), itemFamily(IK_Face), nullptr);
1165 m_item_family_network->addDependency(itemFamily(IK_Cell), itemFamily(IK_Edge), nullptr);
1166 m_item_family_network->addDependency(itemFamily(IK_Face), itemFamily(IK_Node),nullptr);
1167 m_item_family_network->addDependency(itemFamily(IK_Edge), itemFamily(IK_Node),nullptr);
1168 m_item_family_network->addRelation(itemFamily(IK_Face), itemFamily(IK_Edge),nullptr);
1169 m_item_family_network->addRelation(itemFamily(IK_Face), itemFamily(IK_Face),nullptr);
1170 m_item_family_network->addRelation(itemFamily(IK_Face), itemFamily(IK_Cell),nullptr);
1171 m_item_family_network->addRelation(itemFamily(IK_Edge), itemFamily(IK_Cell),nullptr);
1172 m_item_family_network->addRelation(itemFamily(IK_Node), itemFamily(IK_Cell),nullptr);
1173 m_item_family_network->addRelation(itemFamily(IK_Node), itemFamily(IK_Face),nullptr);
1174 m_item_family_network->addRelation(itemFamily(IK_Node), itemFamily(IK_Edge),nullptr);
1175 m_item_family_network->addRelation(itemFamily(IK_Edge), itemFamily(IK_Face),nullptr);
1176
1177}
1178
1179/*---------------------------------------------------------------------------*/
1180/*---------------------------------------------------------------------------*/
1181
1182IItemFamily* mesh::PolyhedralMesh::
1183nodeFamily()
1184{
1185 return m_default_arcane_families[IK_Node];
1186}
1187
1188/*---------------------------------------------------------------------------*/
1189/*---------------------------------------------------------------------------*/
1190
1191IItemFamily* mesh::PolyhedralMesh::
1192edgeFamily()
1193{
1194 return m_default_arcane_families[IK_Edge];
1195}
1196
1197/*---------------------------------------------------------------------------*/
1198/*---------------------------------------------------------------------------*/
1199
1200IItemFamily* mesh::PolyhedralMesh::
1201faceFamily()
1202{
1203 return m_default_arcane_families[IK_Face];
1204}
1205
1206/*---------------------------------------------------------------------------*/
1207/*---------------------------------------------------------------------------*/
1208
1209IItemFamily* mesh::PolyhedralMesh::
1210cellFamily()
1211{
1212 return m_default_arcane_families[IK_Cell];
1213}
1214
1215void mesh::PolyhedralMesh::
1216_updateMeshInternalList(eItemKind kind)
1217{
1218 switch (kind) {
1219 case IK_Cell:
1220 m_mesh_item_internal_list.cells = m_default_arcane_families[kind]->itemsInternal();
1221 m_mesh_item_internal_list._internalSetCellSharedInfo(m_default_arcane_families[kind]->commonItemSharedInfo());
1222 break;
1223 case IK_Face:
1224 m_mesh_item_internal_list.faces = m_default_arcane_families[kind]->itemsInternal();
1225 m_mesh_item_internal_list._internalSetFaceSharedInfo(m_default_arcane_families[kind]->commonItemSharedInfo());
1226 break;
1227 case IK_Edge:
1228 m_mesh_item_internal_list.edges = m_default_arcane_families[kind]->itemsInternal();
1229 m_mesh_item_internal_list._internalSetEdgeSharedInfo(m_default_arcane_families[kind]->commonItemSharedInfo());
1230 break;
1231 case IK_Node:
1232 m_mesh_item_internal_list.nodes = m_default_arcane_families[kind]->itemsInternal();
1233 m_mesh_item_internal_list._internalSetNodeSharedInfo(m_default_arcane_families[kind]->commonItemSharedInfo());
1234 break;
1235 case IK_DoF:
1236 case IK_Particle:
1237 case IK_Unknown:
1238 break;
1239 }
1240}
1241
1242/*---------------------------------------------------------------------------*/
1243/*---------------------------------------------------------------------------*/
1244
1245mesh::PolyhedralFamily* mesh::PolyhedralMesh::
1246_itemFamily(eItemKind ik)
1247{
1248 return m_default_arcane_families[ik];
1249}
1250
1251/*---------------------------------------------------------------------------*/
1252/*---------------------------------------------------------------------------*/
1253
1254IItemFamily* mesh::PolyhedralMesh::
1256{
1257 return _itemFamily(ik);
1258}
1259
1260/*---------------------------------------------------------------------------*/
1261/*---------------------------------------------------------------------------*/
1262
1263ItemTypeMng* mesh::PolyhedralMesh::
1264itemTypeMng() const
1265{
1266 return m_item_type_mng;
1267}
1268
1269/*---------------------------------------------------------------------------*/
1270/*---------------------------------------------------------------------------*/
1271
1272mesh::PolyhedralFamily* mesh::PolyhedralMesh::
1273_findItemFamily(eItemKind ik, const String& name, bool create_if_needed)
1274{
1275 // Check if is a default family
1276 auto found_family = _itemFamily(ik);
1277 if (found_family) {
1278 if (found_family->name() == name)
1279 return found_family;
1280 }
1281 for (auto& family : m_arcane_families) {
1282 if (family->itemKind() == ik && family->name() == name)
1283 return family.get();
1284 }
1285 if (!create_if_needed)
1286 return nullptr;
1287 return _createItemFamily(ik, name);
1288}
1289
1290/*---------------------------------------------------------------------------*/
1291/*---------------------------------------------------------------------------*/
1292
1293IItemFamily* mesh::PolyhedralMesh::
1294findItemFamily(eItemKind ik, const String& name, bool create_if_needed, bool register_modifier_if_created)
1295{
1296 ARCANE_UNUSED(register_modifier_if_created); // IItemFamilyModifier not yet used in polyhedral mesh
1297 return _findItemFamily(ik, name, create_if_needed);
1298}
1299
1300/*---------------------------------------------------------------------------*/
1301/*---------------------------------------------------------------------------*/
1302
1303mesh::PolyhedralFamily* mesh::PolyhedralMesh::
1304arcaneDefaultFamily(eItemKind ik)
1305{
1306 return m_default_arcane_families[ik];
1307}
1308
1309/*---------------------------------------------------------------------------*/
1310/*---------------------------------------------------------------------------*/
1311
1314{
1315 ARCANE_ASSERT(m_arcane_node_coords, ("Node coordinates not yet loaded."));
1316 return *m_arcane_node_coords;
1317}
1318
1319/*---------------------------------------------------------------------------*/
1320/*---------------------------------------------------------------------------*/
1321
1322ItemGroup mesh::PolyhedralMesh::
1323findGroup(const String& name)
1324{
1325 ItemGroup group;
1326 for (auto& family : m_arcane_families) {
1327 group = family->findGroup(name);
1328 if (!group.null())
1329 return group;
1330 }
1331 return group;
1332}
1333
1334/*---------------------------------------------------------------------------*/
1335/*---------------------------------------------------------------------------*/
1336
1338groups()
1339{
1340 m_all_groups.clear();
1341 for (auto& family : m_arcane_families) {
1342 for (ItemGroupCollection::Enumerator i_group(family->groups()); ++i_group;)
1343 m_all_groups.add(*i_group);
1344 }
1345 return m_all_groups;
1346}
1347
1348/*---------------------------------------------------------------------------*/
1349/*---------------------------------------------------------------------------*/
1350
1353{
1354 for (auto& family : m_arcane_families) {
1355 family->destroyGroups();
1356 }
1357}
1358
1359/*---------------------------------------------------------------------------*/
1360/*---------------------------------------------------------------------------*/
1361
1362IItemFamilyCollection mesh::PolyhedralMesh::
1363itemFamilies()
1364{
1365 return m_item_family_collection;
1366}
1367
1368/*---------------------------------------------------------------------------*/
1369/*---------------------------------------------------------------------------*/
1370
1371IMeshInternal* mesh::PolyhedralMesh::
1373{
1374 return m_internal_api.get();
1375}
1376
1377/*---------------------------------------------------------------------------*/
1378/*---------------------------------------------------------------------------*/
1379
1380IMeshCompactMng* mesh::PolyhedralMesh::
1382{
1383 return m_compact_mng.get();
1384}
1385
1386/*---------------------------------------------------------------------------*/
1387/*---------------------------------------------------------------------------*/
1388
1389void mesh::PolyhedralMesh::
1390addItems(Int64ConstArrayView unique_ids, Int32ArrayView local_ids, eItemKind ik, const String& family_name)
1391{
1392 auto* item_family = _findItemFamily(ik, family_name, false);
1393 PolyhedralMeshImpl::ItemLocalIds item_local_ids;
1394 m_mesh->scheduleAddItems(item_family,unique_ids,item_local_ids);
1395 auto mesh_state = m_mesh->applyScheduledOperations();
1396 item_local_ids.fillArrayView(local_ids,mesh_state);
1397}
1398
1399/*---------------------------------------------------------------------------*/
1400/*---------------------------------------------------------------------------*/
1401
1402void mesh::PolyhedralMesh::
1403removeItems(Int32ConstArrayView local_ids, eItemKind ik, const String& family_name)
1404{
1405 auto* item_family = _findItemFamily(ik, family_name, false);
1406 m_mesh->scheduleRemoveItems(item_family,local_ids);
1407 m_mesh->applyScheduledOperations();
1408}
1409
1410/*---------------------------------------------------------------------------*/
1411/*---------------------------------------------------------------------------*/
1412
1414addNodes(Int64ConstArrayView nodes_uid, Int32ArrayView nodes_lid)
1415{
1416 addItems(nodes_uid, nodes_lid, IK_Node, nodeFamily()->name());
1417}
1418
1419/*---------------------------------------------------------------------------*/
1420/*---------------------------------------------------------------------------*/
1421
1424{
1425 m_trace_mng->info() << "PolyhedralMesh::_exchangeItems() do_compact?=" << "false"
1426 << " nb_exchange=" << 0 << " version=" << 0;
1427 _exchangeItems();
1428 String check_exchange = platform::getEnvironmentVariable("ARCANE_CHECK_EXCHANGE");
1429 if (!check_exchange.null()){
1430 m_mesh_checker.checkGhostCells();
1431 m_trace_mng->pwarning() << "CHECKING SYNCHRONISATION !";
1432 m_mesh_checker.checkVariablesSynchronization();
1433 m_mesh_checker.checkItemGroupsSynchronization();
1434 }
1435 if (checkLevel()>=2)
1436 m_mesh_checker.checkValidMesh();
1437 else if (checkLevel()>=1)
1438 m_mesh_checker.checkValidConnectivity();
1439
1440}
1441
1442/*---------------------------------------------------------------------------*/
1443/*---------------------------------------------------------------------------*/
1444
1445void mesh::PolyhedralMesh::
1446_exchangeItems()
1447{
1448 // todo handle submeshes, cf. DynamicMesh
1449
1450 Trace::Setter mci(traceMng(),_className());
1451
1452 if (!m_is_dynamic)
1453 ARCANE_FATAL("property isDynamic() has to be 'true'");
1454
1455 if (arcane_debug_load_balancing){
1456 // TODO: faire cela dans le MeshExchanger et par famille.
1457 for (auto& family : m_arcane_families) {
1458 family->itemsNewOwner().checkIfSync();
1459 }
1460 }
1461
1462 IMeshExchanger* iexchanger = m_mesh_exchange_mng->beginExchange();
1463
1464 // If no entity to exchange return
1465 if (iexchanger->computeExchangeInfos()){
1466 m_trace_mng->pwarning() << "No load balance is performed";
1467 m_mesh_exchange_mng->endExchange();
1468 return;
1469 }
1470
1471 // Do exchange info
1472 iexchanger->processExchange();
1473
1474 // Remove items no longer on the current subdomain
1475 iexchanger->removeNeededItems();
1476
1477 // Update groups : remove gone entities
1478 // invalidate computed groups
1479 {
1480 auto action = [](ItemGroup& group)
1481 {
1482 if (group.internal()->hasComputeFunctor() || group.isLocalToSubDomain())
1483 group.invalidate();
1484 else
1485 group.internal()->removeSuppressedItems();
1486 };
1487 // todo update submeshes
1488 meshvisitor::visitGroups(this, action);
1489 }
1490
1491 iexchanger->allocateReceivedItems();
1492
1493 // todo update families (endUpdate and compute SynchronizeInfo cf. DynamicMesh::_internalEndUpdateInit(true);)
1494
1495 // Update groups
1496 iexchanger->updateItemGroups();
1497
1498 auto action = [](ItemGroup& group)
1499 {
1500 if (group.hasSynchronizer())
1501 group.synchronizer()->compute();
1502 };
1503
1504 m_trace_mng->info() << "Computing group synchronization information for " << name();
1505 meshvisitor::visitGroups(this,action);
1506
1507 iexchanger->updateVariables();
1508
1509 // todo DynamicMesh::_internalEndUpdateFinal(bool)
1510
1511 iexchanger->finalizeExchange();
1512
1513 // TODO: garantir cet appel en cas d'exception.
1514 m_mesh_exchange_mng->endExchange();
1515
1516 // // todo handle extra ghost
1517 // if (m_extra_ghost_cells_builder->hasBuilder() || m_extra_ghost_particles_builder->hasBuilder())
1518 // this->endUpdate(true,false);
1519 // else
1520 this->endUpdate();
1521
1522}
1523
1524/*---------------------------------------------------------------------------*/
1525/*---------------------------------------------------------------------------*/
1526
1529{
1530 // do nothing for now
1531 auto want_dump = false;
1532 auto need_compact = false;
1533 m_trace_mng->info(4) << "DynamicMesh::prepareForDump() name=" << name()
1534 << " need_compact?=" << need_compact
1535 << " want_dump?=" << want_dump
1536 << " timestamp=" << 0;
1537
1538 {
1540 m_mesh_events.eventObservable(t).notify(MeshEventArgs(this,t));
1541 }
1542
1543 // todo use Properties
1544 if (want_dump) {
1545 for (auto& family : m_arcane_families) {
1546 family->prepareForDump();
1547 }
1548 }
1549
1550 {
1552 m_mesh_events.eventObservable(t).notify(MeshEventArgs(this,t));
1553 }
1554}
1555
1556/*---------------------------------------------------------------------------*/
1557/*---------------------------------------------------------------------------*/
1558
1561{
1562 return allCells().activeCellGroup();
1563}
1564
1565/*---------------------------------------------------------------------------*/
1566/*---------------------------------------------------------------------------*/
1567
1569{
1570 return allCells().ownActiveCellGroup();
1571}
1572
1573/*---------------------------------------------------------------------------*/
1574/*---------------------------------------------------------------------------*/
1575
1577allLevelCells(const Integer& level)
1578{
1579 return allCells().levelCellGroup(level);
1580}
1581
1582/*---------------------------------------------------------------------------*/
1583/*---------------------------------------------------------------------------*/
1584
1586ownLevelCells(const Integer& level)
1587{
1588 return allCells().ownLevelCellGroup(level);
1589}
1590
1591/*---------------------------------------------------------------------------*/
1592/*---------------------------------------------------------------------------*/
1593
1596{
1597 return allCells().activeFaceGroup();
1598}
1599
1600/*---------------------------------------------------------------------------*/
1601/*---------------------------------------------------------------------------*/
1602
1605{
1606 return allCells().ownActiveFaceGroup();
1607}
1608
1609/*---------------------------------------------------------------------------*/
1610/*---------------------------------------------------------------------------*/
1611
1614{
1615 return allCells().innerActiveFaceGroup();
1616}
1617
1618/*---------------------------------------------------------------------------*/
1619/*---------------------------------------------------------------------------*/
1620
1623{
1624 return allCells().outerActiveFaceGroup();
1625}
1626
1627/*---------------------------------------------------------------------------*/
1628/*---------------------------------------------------------------------------*/
1629
1630IMeshUtilities* mesh::PolyhedralMesh::
1631utilities()
1632{
1633 return m_mesh_utilities.get();
1634}
1635
1636/*---------------------------------------------------------------------------*/
1637/*---------------------------------------------------------------------------*/
1638
1641{
1642 IItemFamily* item_family = _itemFamily(ik);
1643 ARCANE_CHECK_POINTER(item_family);
1644 return item_family->itemsNewOwner();
1645}
1646
1647/*---------------------------------------------------------------------------*/
1648/*---------------------------------------------------------------------------*/
1649
1651checkLevel() const
1652{
1653 return m_mesh_checker.checkLevel();
1654}
1655
1656/*---------------------------------------------------------------------------*/
1657/*---------------------------------------------------------------------------*/
1658
1659IItemFamilyNetwork* mesh::PolyhedralMesh::
1661{
1662 return m_item_family_network.get();
1663}
1664
1665/*---------------------------------------------------------------------------*/
1666/*---------------------------------------------------------------------------*/
1667
1668IGhostLayerMng* mesh::PolyhedralMesh::
1669ghostLayerMng() const
1670{
1671 return m_ghost_layer_mng.get();
1672}
1673
1674/*---------------------------------------------------------------------------*/
1675/*---------------------------------------------------------------------------*/
1676
1677IMeshModifierInternal* mesh::PolyhedralMesh::
1679{
1680 return m_internal_api.get();
1681}
1682
1683/*---------------------------------------------------------------------------*/
1684/*---------------------------------------------------------------------------*/
1685
1686
1687} // End namespace Arcane
1688
1689/*---------------------------------------------------------------------------*/
1690/*---------------------------------------------------------------------------*/
1691
1692#else // ARCANE_HAS_POLYHEDRAL_MESH_TOOLS
1693
1694/*---------------------------------------------------------------------------*/
1695/*---------------------------------------------------------------------------*/
1696
1697namespace Arcane::mesh
1698{
1701} // namespace Arcane::mesh
1702
1703/*---------------------------------------------------------------------------*/
1704/*---------------------------------------------------------------------------*/
1705
1706Arcane::mesh::PolyhedralMesh::
1707~PolyhedralMesh() = default;
1708
1709/*---------------------------------------------------------------------------*/
1710/*---------------------------------------------------------------------------*/
1711
1712Arcane::mesh::PolyhedralMesh::
1713PolyhedralMesh(ISubDomain* subdomain, const MeshBuildInfo& mbi)
1714: EmptyMesh{ subdomain->traceMng() }
1715, m_subdomain{ subdomain }
1716, m_mesh{ nullptr }
1717, m_mesh_kind(mbi.meshKind())
1718{
1719}
1720
1721/*---------------------------------------------------------------------------*/
1722/*---------------------------------------------------------------------------*/
1723
1724void Arcane::mesh::PolyhedralMesh::
1725read([[maybe_unused]] const String& filename)
1726{
1727 _errorEmptyMesh();
1728}
1729
1730/*---------------------------------------------------------------------------*/
1731/*---------------------------------------------------------------------------*/
1732
1733void Arcane::mesh::PolyhedralMesh::
1734allocateItems(const Arcane::ItemAllocationInfo& item_allocation_info)
1735{
1736 ARCANE_UNUSED(item_allocation_info);
1737 _errorEmptyMesh();
1738}
1739
1740/*---------------------------------------------------------------------------*/
1741/*---------------------------------------------------------------------------*/
1742
1743#endif // ARCANE_HAS_POLYHEDRAL_MESH_TOOLS
1744
1745/*---------------------------------------------------------------------------*/
1746/*---------------------------------------------------------------------------*/
1747
1748namespace Arcane
1749{
1750
1751class ARCANE_MESH_EXPORT PolyhedralMeshFactory
1752: public AbstractService
1753, public IMeshFactory
1754{
1755 public:
1756
1757 explicit PolyhedralMeshFactory(const ServiceBuildInfo& sbi)
1758 : AbstractService(sbi)
1759 {}
1760
1761 public:
1762
1763 void build() override {}
1764 IPrimaryMesh* createMesh(IMeshMng* mm, const MeshBuildInfo& build_info) override
1765 {
1767 return new mesh::PolyhedralMesh(sd, build_info);
1768 }
1769
1770 static String name() { return "ArcanePolyhedralMeshFactory"; }
1771};
1772
1774 ServiceProperty(PolyhedralMeshFactory::name().localstr(), ST_Application),
1776
1777/*---------------------------------------------------------------------------*/
1778/*---------------------------------------------------------------------------*/
1779
1780#if ARCANE_HAS_POLYHEDRAL_MESH_TOOLS
1781
1782/*---------------------------------------------------------------------------*/
1783/*---------------------------------------------------------------------------*/
1784
1786factoryName() const
1787{
1788 return PolyhedralMeshFactory::name();
1789}
1790
1791/*---------------------------------------------------------------------------*/
1792/*---------------------------------------------------------------------------*/
1793
1794#endif // ARCANE_HAS_POLYHEDRAL_MESH_TOOLS
1795
1796/*---------------------------------------------------------------------------*/
1797/*---------------------------------------------------------------------------*/
1798
1799} // End namespace Arcane
1800
1801/*---------------------------------------------------------------------------*/
1802/*---------------------------------------------------------------------------*/
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Ce fichier contient les différentes fabriques de services et macro pour enregistrer les services.
#define ARCANE_SERVICE_INTERFACE(ainterface)
Macro pour déclarer une interface lors de l'enregistrement d'un service.
AbstractService(const ServiceBuildInfo &)
Constructeur à partir d'un ServiceBuildInfo.
constexpr Integer size() const noexcept
Retourne la taille du tableau.
void clear()
Supprime tous les éléments de la collection.
Definition Collection.h:68
EnumeratorT< ItemGroup > Enumerator
Definition Collection.h:129
Interface d'une famille de DoF.
Definition IDoFFamily.h:33
Gère la sérialisation/désérialisation des entités d'une famille.
Interface d'une famille d'entités.
Definition IItemFamily.h:84
virtual NodeGroup ownNodes()=0
Groupe de tous les noeuds propres au domaine.
virtual IItemFamily * nodeFamily()=0
Retourne la famille des noeuds.
virtual String name() const =0
Nom du maillage.
virtual Integer nbCell()=0
Nombre de mailles du maillage.
virtual CellGroup ownCells()=0
Groupe de toutes les mailles propres au domaine.
virtual FaceGroup ownFaces()=0
Groupe de toutes les faces propres au domaine.
virtual FaceGroup allFaces()=0
Groupe de toutes les faces.
virtual Integer nbEdge()=0
Nombre d'arêtes du maillage.
virtual IItemFamily * itemFamily(eItemKind ik)=0
Retourne la famille d'entité de type ik.
virtual IItemFamily * edgeFamily()=0
Retourne la famille des arêtes.
virtual Integer nbNode()=0
Nombre de noeuds du maillage.
virtual FaceGroup outerFaces()=0
Groupe de toutes les faces sur la frontière.
virtual IItemFamily * findItemFamily(eItemKind ik, const String &name, bool create_if_needed=false, bool register_modifier_if_created=false)=0
Retourne la famille de nom name.
virtual Integer nbItem(eItemKind ik)=0
Nombre d'éléments du genre ik.
virtual Integer dimension()=0
Dimension du maillage (1D, 2D ou 3D).
virtual IItemFamily * faceFamily()=0
Retourne la famille des faces.
virtual EdgeGroup ownEdges()=0
Groupe de toutes les arêtes propres au domaine.
virtual NodeGroup allNodes()=0
Groupe de tous les noeuds.
virtual CellGroup allCells()=0
Groupe de toutes les mailles.
virtual Integer nbFace()=0
Nombre de faces du maillage.
virtual IItemFamily * cellFamily()=0
Retourne la famille des mailles.
virtual IItemFamily * createItemFamily(eItemKind ik, const String &name)=0
Créé une famille de particule de nom name.
virtual EdgeGroup allEdges()=0
Groupe de toutes les arêtes.
Interface du service gérant la lecture d'un maillage.
virtual IPolyhedralMeshModifier * polyhedralMeshModifier() const noexcept=0
Interface du gestionnaire des maillages.
Definition IMeshMng.h:40
virtual IVariableMng * variableMng() const =0
Gestionnaire de variables associé à ce gestionnaire.
virtual void addNodes(Int64ConstArrayView nodes_uid, Int32ArrayView nodes_lid=Int32ArrayView())=0
Ajoute des noeuds.
virtual IMeshModifierInternal * _modifierInternalApi()=0
API interne à Arcane.
virtual VariableNodeReal3 & nodesCoordinates()=0
Coordonnées des noeuds.
virtual FaceGroup outerActiveFaces()=0
Groupe de toutes les faces actives sur la frontière.
virtual void destroyGroups()=0
Détruit tous les groupes de toutes les familles.
virtual IMeshUtilities * utilities()=0
Interface des fonctions utilitaires associée.
virtual CellGroup allLevelCells(const Integer &level)=0
Groupe de toutes les mailles de niveau level.
virtual FaceGroup innerActiveFaces()=0
Groupe de toutes les faces actives.
virtual ItemGroupCollection groups()=0
Liste des groupes.
virtual ItemGroup findGroup(const String &name)=0
Retourne le groupe de nom name ou le groupe nul s'il n'y en a pas.
virtual String factoryName() const =0
Nom de la fabrique utilisée pour créer le maillage.
virtual IMeshInternal * _internalApi()=0
API interne à Arcane.
virtual CellGroup allActiveCells()=0
virtual FaceGroup allActiveFaces()=0
Groupe de toutes les faces actives.
virtual ItemTypeMng * itemTypeMng() const =0
Gestionnaire de types d'entités associé
virtual void prepareForDump()=0
Prépare l'instance en vue d'une protection.
virtual CellGroup ownActiveCells()=0
Groupe de toutes les mailles actives et propres au domaine.
virtual CellGroup ownLevelCells(const Integer &level)=0
Groupe de toutes les mailles propres de niveau level.
virtual IGhostLayerMng * ghostLayerMng() const =0
Gestionnare de couche fantômes associé
virtual FaceGroup ownActiveFaces()=0
Groupe de toutes les faces actives propres au domaine.
virtual IItemFamilyNetwork * itemFamilyNetwork()=0
Interface du réseau de familles (familles connectées)
virtual IMeshCompactMng * _compactMng()=0
virtual Integer checkLevel() const =0
Niveau actuel de vérification.
virtual void exchangeItems()=0
Change les sous-domaines propriétaires des entités.
virtual VariableItemInt32 & itemsNewOwner(eItemKind kind)=0
Variable contenant l'identifiant du sous-domaine propriétaire.
Interface du gestionnaire d'un sous-domaine.
Definition ISubDomain.h:74
virtual Int32 subDomainId() const =0
Numéro du sous-domaine associé à ce gestionnaire.
virtual ISubDomain * internalSubDomain() const =0
Fonction interne temporaire pour récupérer le sous-domaine.
virtual IVariableMngInternal * _internalApi()=0
API interne à Arcane.
Int32 localId() const
Numéro local (au sous-domaine) de l'entité
Sérialisation/Désérialisation des familles d'entités.
Groupe d'entités de maillage.
Definition ItemGroup.h:49
FaceGroup activeFaceGroup() const
Groupe des faces actives.
Definition ItemGroup.cc:352
FaceGroup innerActiveFaceGroup() const
Groupe des faces internes des éléments de ce groupe.
Definition ItemGroup.cc:379
FaceGroup ownActiveFaceGroup() const
Groupe des faces actives propres au domaine des éléments de ce groupe.
Definition ItemGroup.cc:364
CellGroup levelCellGroup(const Integer &level) const
Groupe des mailles de niveau l des éléments de ce groupe.
Definition ItemGroup.cc:329
CellGroup ownActiveCellGroup() const
Groupe des mailles propres actives des éléments de ce groupe.
Definition ItemGroup.cc:317
CellGroup ownLevelCellGroup(const Integer &level) const
Groupe des mailles propres de niveau l des éléments de ce groupe.
Definition ItemGroup.cc:341
FaceGroup outerActiveFaceGroup() const
Groupe des faces externes actives des éléments de ce groupe.
Definition ItemGroup.cc:391
CellGroup activeCellGroup() const
AMR.
Definition ItemGroup.cc:305
FaceGroup outerFaceGroup() const
Groupe des faces externes des éléments de ce groupe.
Definition ItemGroup.cc:290
Structure interne d'une entité de maillage.
Infos sur un type d'entité du maillage.
Gestionnaire des types d'entités d'un maillage.
Definition ItemTypeMng.h:65
ItemTypeInfo * typeFromId(Integer id) const
Type correspondant au numéro id.
Paramètres nécessaires à la construction d'un maillage.
void setOwner(Integer suid, Int32 current_sub_domain)
Positionne le numéro du sous-domaine propriétaire de l'entité.
void build() override
Construction de niveau build du service.
IPrimaryMesh * createMesh(IMeshMng *mm, const MeshBuildInfo &build_info) override
Créé un maillage avec les informations de build_info.
Structure contenant les informations pour créer un service.
Propriétés de création d'un service.
constexpr __host__ __device__ bool empty() const noexcept
Retourne true si le tableau est vide (dimension nulle)
Definition Span.h:375
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
Definition Span.h:212
Chaîne de caractères unicode.
TraceMessage info() const
Flot pour un message d'information.
Famille d'entités.
Definition ItemFamily.h:76
IMesh * mesh() const override
Maillage associé
String fullName() const override
Nom complet de la famille (avec celui du maillage)
Definition ItemFamily.h:131
void endUpdate() override
Notifie la fin de modification de la liste des entités.
eItemKind itemKind() const override
Genre des entités.
ItemInternalConnectivityList * itemInternalConnectivityList()
Accesseur pour les connectivités via Item et ItemInternal.
Definition ItemFamily.h:295
ItemGroup allItems() const override
Groupe de toutes les entités.
Integer nbItem() const override
Nombre d'entités.
ItemVectorView view() override
Vue sur toutes les entités de la famille.
ISubDomain * subDomain() const override
Sous-domaine associé
String name() const override
Nom de la famille.
Definition ItemFamily.h:130
Classe temporaire pour conserver un ItemSharedInfo et un type d'entité.
IItemFamilySerializer * createSerializer(bool use_flags) override
Créé une instance pour la sérialisation des entités. L'instance retournée doit être détruite par l'op...
IDoFFamily * toDoFFamily() override
Retourne l'interface de la famille de particule de cette famille.
DoFVectorView addGhostDoFs(Int64ConstArrayView dof_uids, Int32ArrayView dof_lids, Int32ConstArrayView owners)
L'ajout de fantomes doit etre suivi d'un appel de computeSynchronizeInfos.
void endUpdate() override
Notifie la fin de modification de la liste des entités.
Integer nbItem() const override
Nombre d'entités.
String name() const override
Nom de la famille.
DoFVectorView addDoFs(Int64ConstArrayView dof_uids, Int32ArrayView dof_lids)
En entree les uids des dofs et on recupere leurs lids.
String fullName() const override
Nom complet de la famille (avec celui du maillage)
ItemGroup allItems() const override
Groupe de toutes les entités.
void endUpdate()
Notifie l'instance de la fin de la modification du maillage.
ItemVectorViewT< DoF > DoFVectorView
Vue sur un vecteur de degre de liberte.
Definition ItemTypes.h:315
ItemGroupT< Cell > CellGroup
Groupe de mailles.
Definition ItemTypes.h:183
ItemGroupT< Face > FaceGroup
Groupe de faces.
Definition ItemTypes.h:178
ItemGroupT< Edge > EdgeGroup
Groupe d'arêtes.
Definition ItemTypes.h:173
ItemGroupT< Node > NodeGroup
Groupe de noeuds.
Definition ItemTypes.h:167
#define ARCANE_REGISTER_SERVICE(aclass, a_service_property,...)
Macro pour enregistrer un service.
MeshVariableScalarRefT< Node, Real3 > VariableNodeReal3
Grandeur au noeud de type coordonnées.
ItemVariableScalarRefT< Int32 > VariableItemInt32
Grandeur de type entier 32 bits.
ARCCORE_BASE_EXPORT String getEnvironmentVariable(const String &name)
Variable d'environnement du nom name.
UniqueArray< Int64 > Int64UniqueArray
Tableau dynamique à une dimension d'entiers 64 bits.
Definition UtilsTypes.h:426
Collection< ItemGroup > ItemGroupCollection
Collection de groupes d'éléments du maillage.
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.
Definition UtilsTypes.h:569
Collection< IItemFamily * > ItemFamilyCollection
Collection de familles d'entités.
Collection< IItemFamily * > IItemFamilyCollection
Collection de familles d'entités.
@ ST_Application
Le service s'utilise au niveau de l'application.
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
Definition UtilsTypes.h:567
eMeshEventType
Evènements générés par IMesh.
Definition MeshEvents.h:30
@ EndPrepareDump
Evènement envoyé à la fin de prepareForDump()
Definition MeshEvents.h:34
@ BeginPrepareDump
Evènement envoyé au début de prepareForDump()
Definition MeshEvents.h:32
UniqueArray< Int32 > Int32UniqueArray
Tableau dynamique à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:428
ArrayView< Int32 > Int32ArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:540
eItemKind
Genre d'entité de maillage.
@ IK_Particle
Entité de maillage de genre particule.
@ IK_Node
Entité de maillage de genre noeud.
@ IK_Cell
Entité de maillage de genre maille.
@ IK_Unknown
Entité de maillage de genre inconnu ou non initialisé
@ IK_Face
Entité de maillage de genre face.
@ IK_DoF
Entité de maillage de genre degre de liberte.
@ IK_Edge
Entité de maillage de genre arête.
SmallSpan< const Int64 > Int64ConstSmallSpan
Vue en lecture seule d'un tableau à une dimension d'entiers 64 bits.
Definition UtilsTypes.h:703
const char * itemKindName(eItemKind kind)
Nom du genre d'entité.